{
  "contractName": "BytesLib",
  "abi": [],
  "metadata": "{\"compiler\":{\"version\":\"0.5.10+commit.5a6ea5b1\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"https://github.com/GNSPS *\",\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"@summa-tx/bitcoin-spv-sol/contracts/BytesLib.sol\":\"BytesLib\"},\"evmVersion\":\"petersburg\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@summa-tx/bitcoin-spv-sol/contracts/BytesLib.sol\":{\"keccak256\":\"0x16296b4a97cdac10bb9cd4666d29310fe25897b7644dc04ad053ae09d4aeea9c\",\"urls\":[\"bzzr://27b097b56c0dc070a4e80572e01ffc28d26d83490f56fe0947a4d62ab09e1c48\",\"dweb:/ipfs/QmXwiQCVL8MS3R2NDWwTozngTjrD3SmWmZ6fbNGgQiwdDd\"]}},\"version\":1}",
  "bytecode": "0x60556023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea265627a7a723058200cbee2a2e686117695f3e37ad90001348168a4ae85a8ea99e85252028636e26c64736f6c634300050a0032",
  "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea265627a7a723058200cbee2a2e686117695f3e37ad90001348168a4ae85a8ea99e85252028636e26c64736f6c634300050a0032",
  "sourceMap": "1360:15202:6:-;;132:2:-1;166:7;155:9;146:7;137:37;255:7;249:14;246:1;241:23;235:4;232:33;222:2;;269:9;222:2;293:9;290:1;283:20;323:4;314:7;306:22;347:7;338;331:24",
  "deployedSourceMap": "1360:15202:6:-;;;;;;;;",
  "source": "pragma solidity ^0.5.10;\n\n/*\n\nhttps://github.com/GNSPS/solidity-bytes-utils/\n\nThis is free and unencumbered software released into the public domain.\n\nAnyone is free to copy, modify, publish, use, compile, sell, or\ndistribute this software, either in source code form or as a compiled\nbinary, for any purpose, commercial or non-commercial, and by any\nmeans.\n\nIn jurisdictions that recognize copyright laws, the author or authors\nof this software dedicate any and all copyright interest in the\nsoftware to the public domain. We make this dedication for the benefit\nof the public at large and to the detriment of our heirs and\nsuccessors. We intend this dedication to be an overt act of\nrelinquishment in perpetuity of all present and future rights to this\nsoftware under copyright law.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n\nFor more information, please refer to <https://unlicense.org>\n*/\n\n\n/** @title BytesLib **/\n/** @author https://github.com/GNSPS **/\n\nlibrary BytesLib {\n    function concat(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bytes memory) {\n        bytes memory tempBytes;\n\n        assembly {\n            // Get a location of some free memory and store it in tempBytes as\n            // Solidity does for memory variables.\n            tempBytes := mload(0x40)\n\n            // Store the length of the first bytes array at the beginning of\n            // the memory for tempBytes.\n            let length := mload(_preBytes)\n            mstore(tempBytes, length)\n\n            // Maintain a memory counter for the current write location in the\n            // temp bytes array by adding the 32 bytes for the array length to\n            // the starting location.\n            let mc := add(tempBytes, 0x20)\n            // Stop copying when the memory counter reaches the length of the\n            // first bytes array.\n            let end := add(mc, length)\n\n            for {\n                // Initialize a copy counter to the start of the _preBytes data,\n                // 32 bytes into its memory.\n                let cc := add(_preBytes, 0x20)\n            } lt(mc, end) {\n                // Increase both counters by 32 bytes each iteration.\n                mc := add(mc, 0x20)\n                cc := add(cc, 0x20)\n            } {\n                // Write the _preBytes data into the tempBytes memory 32 bytes\n                // at a time.\n                mstore(mc, mload(cc))\n            }\n\n            // Add the length of _postBytes to the current length of tempBytes\n            // and store it as the new length in the first 32 bytes of the\n            // tempBytes memory.\n            length := mload(_postBytes)\n            mstore(tempBytes, add(length, mload(tempBytes)))\n\n            // Move the memory counter back from a multiple of 0x20 to the\n            // actual end of the _preBytes data.\n            mc := end\n            // Stop copying when the memory counter reaches the new combined\n            // length of the arrays.\n            end := add(mc, length)\n\n            for {\n                let cc := add(_postBytes, 0x20)\n            } lt(mc, end) {\n                mc := add(mc, 0x20)\n                cc := add(cc, 0x20)\n            } {\n                mstore(mc, mload(cc))\n            }\n\n            // Update the free-memory pointer by padding our last write location\n            // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\n            // next 32 byte block, then round down to the nearest multiple of\n            // 32. If the sum of the length of the two arrays is zero then add\n            // one before rounding down to leave a blank 32 bytes (the length block with 0).\n            mstore(0x40, and(\n                add(add(end, iszero(add(length, mload(_preBytes)))), 31),\n                not(31) // Round down to the nearest 32 bytes.\n            ))\n        }\n\n        return tempBytes;\n    }\n\n    function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal {\n        assembly {\n            // Read the first 32 bytes of _preBytes storage, which is the length\n            // of the array. (We don't need to use the offset into the slot\n            // because arrays use the entire slot.)\n            let fslot := sload(_preBytes_slot)\n            // Arrays of 31 bytes or less have an even value in their slot,\n            // while longer arrays have an odd value. The actual length is\n            // the slot divided by two for odd values, and the lowest order\n            // byte divided by two for even values.\n            // If the slot is even, bitwise and the slot with 255 and divide by\n            // two to get the length. If the slot is odd, bitwise and the slot\n            // with -1 and divide by two.\n            let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\n            let mlength := mload(_postBytes)\n            let newlength := add(slength, mlength)\n            // slength can contain both the length and contents of the array\n            // if length < 32 bytes so let's prepare for that\n            // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\n            switch add(lt(slength, 32), lt(newlength, 32))\n            case 2 {\n                // Since the new array still fits in the slot, we just need to\n                // update the contents of the slot.\n                // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length\n                sstore(\n                    _preBytes_slot,\n                    // all the modifications to the slot are inside this\n                    // next block\n                    add(\n                        // we can just add to the slot contents because the\n                        // bytes we want to change are the LSBs\n                        fslot,\n                        add(\n                            mul(\n                                div(\n                                    // load the bytes from memory\n                                    mload(add(_postBytes, 0x20)),\n                                    // zero all bytes to the right\n                                    exp(0x100, sub(32, mlength))\n                        ),\n                        // and now shift left the number of bytes to\n                        // leave space for the length in the slot\n                        exp(0x100, sub(32, newlength))\n                        ),\n                        // increase length by the double of the memory\n                        // bytes length\n                        mul(mlength, 2)\n                        )\n                    )\n                )\n            }\n            case 1 {\n                // The stored value fits in the slot, but the combined value\n                // will exceed it.\n                // get the keccak hash to get the contents of the array\n                mstore(0x0, _preBytes_slot)\n                let sc := add(keccak256(0x0, 0x20), div(slength, 32))\n\n                // save new length\n                sstore(_preBytes_slot, add(mul(newlength, 2), 1))\n\n                // The contents of the _postBytes array start 32 bytes into\n                // the structure. Our first read should obtain the `submod`\n                // bytes that can fit into the unused space in the last word\n                // of the stored array. To get this, we read 32 bytes starting\n                // from `submod`, so the data we read overlaps with the array\n                // contents by `submod` bytes. Masking the lowest-order\n                // `submod` bytes allows us to add that value directly to the\n                // stored value.\n\n                let submod := sub(32, slength)\n                let mc := add(_postBytes, submod)\n                let end := add(_postBytes, mlength)\n                let mask := sub(exp(0x100, submod), 1)\n\n                sstore(\n                    sc,\n                    add(\n                        and(\n                            fslot,\n                            0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00\n                    ),\n                    and(mload(mc), mask)\n                    )\n                )\n\n                for {\n                    mc := add(mc, 0x20)\n                    sc := add(sc, 1)\n                } lt(mc, end) {\n                    sc := add(sc, 1)\n                    mc := add(mc, 0x20)\n                } {\n                    sstore(sc, mload(mc))\n                }\n\n                mask := exp(0x100, sub(mc, end))\n\n                sstore(sc, mul(div(mload(mc), mask), mask))\n            }\n            default {\n                // get the keccak hash to get the contents of the array\n                mstore(0x0, _preBytes_slot)\n                // Start copying to the last used word of the stored array.\n                let sc := add(keccak256(0x0, 0x20), div(slength, 32))\n\n                // save new length\n                sstore(_preBytes_slot, add(mul(newlength, 2), 1))\n\n                // Copy over the first `submod` bytes of the new data as in\n                // case 1 above.\n                let slengthmod := mod(slength, 32)\n                let mlengthmod := mod(mlength, 32)\n                let submod := sub(32, slengthmod)\n                let mc := add(_postBytes, submod)\n                let end := add(_postBytes, mlength)\n                let mask := sub(exp(0x100, submod), 1)\n\n                sstore(sc, add(sload(sc), and(mload(mc), mask)))\n\n                for {\n                    sc := add(sc, 1)\n                    mc := add(mc, 0x20)\n                } lt(mc, end) {\n                    sc := add(sc, 1)\n                    mc := add(mc, 0x20)\n                } {\n                    sstore(sc, mload(mc))\n                }\n\n                mask := exp(0x100, sub(mc, end))\n\n                sstore(sc, mul(div(mload(mc), mask), mask))\n            }\n        }\n    }\n\n    function slice(bytes memory _bytes, uint _start, uint _length) internal  pure returns (bytes memory res) {\n        require(_bytes.length >= (_start + _length), \"Slice out of bounds\");\n\n        assembly {\n            // Alloc bytes array with additional 32 bytes afterspace and assign it's size\n            res := mload(0x40)\n            mstore(0x40, add(add(res, 64), _length))\n            mstore(res, _length)\n\n            // Compute distance between source and destination pointers\n            let diff := sub(res, add(_bytes, _start))\n\n            for {\n                let src := add(add(_bytes, 32), _start)\n                let end := add(src, _length)\n            } lt(src, end) {\n                src := add(src, 32)\n            } {\n                mstore(add(src, diff), mload(src))\n            }\n        }\n    }\n\n    function toAddress(bytes memory _bytes, uint _start) internal  pure returns (address) {\n        require(_bytes.length >= (_start + 20), \"Address conversion out of bounds.\");\n        address tempAddress;\n\n        assembly {\n            tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\n        }\n\n        return tempAddress;\n    }\n\n    function toUint(bytes memory _bytes, uint _start) internal  pure returns (uint256) {\n        require(_bytes.length >= (_start + 32), \"Uint conversion out of bounds.\");\n        uint256 tempUint;\n\n        assembly {\n            tempUint := mload(add(add(_bytes, 0x20), _start))\n        }\n\n        return tempUint;\n    }\n\n    function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) {\n        bool success = true;\n\n        assembly {\n            let length := mload(_preBytes)\n\n            // if lengths don't match the arrays are not equal\n            switch eq(length, mload(_postBytes))\n            case 1 {\n                // cb is a circuit breaker in the for loop since there's\n                //  no said feature for inline assembly loops\n                // cb = 1 - don't breaker\n                // cb = 0 - break\n                let cb := 1\n\n                let mc := add(_preBytes, 0x20)\n                let end := add(mc, length)\n\n                for {\n                    let cc := add(_postBytes, 0x20)\n                    // the next line is the loop condition:\n                    // while(uint(mc < end) + cb == 2)\n                } eq(add(lt(mc, end), cb), 2) {\n                    mc := add(mc, 0x20)\n                    cc := add(cc, 0x20)\n                } {\n                    // if any of these checks fails then arrays are not equal\n                    if iszero(eq(mload(mc), mload(cc))) {\n                        // unsuccess:\n                        success := 0\n                        cb := 0\n                    }\n                }\n            }\n            default {\n                // unsuccess:\n                success := 0\n            }\n        }\n\n        return success;\n    }\n\n    function equalStorage(bytes storage _preBytes, bytes memory _postBytes) internal view returns (bool) {\n        bool success = true;\n\n        assembly {\n            // we know _preBytes_offset is 0\n            let fslot := sload(_preBytes_slot)\n            // Decode the length of the stored array like in concatStorage().\n            let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\n            let mlength := mload(_postBytes)\n\n            // if lengths don't match the arrays are not equal\n            switch eq(slength, mlength)\n            case 1 {\n                // slength can contain both the length and contents of the array\n                // if length < 32 bytes so let's prepare for that\n                // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\n                if iszero(iszero(slength)) {\n                    switch lt(slength, 32)\n                    case 1 {\n                        // blank the last byte which is the length\n                        fslot := mul(div(fslot, 0x100), 0x100)\n\n                        if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {\n                            // unsuccess:\n                            success := 0\n                        }\n                    }\n                    default {\n                        // cb is a circuit breaker in the for loop since there's\n                        //  no said feature for inline assembly loops\n                        // cb = 1 - don't breaker\n                        // cb = 0 - break\n                        let cb := 1\n\n                        // get the keccak hash to get the contents of the array\n                        mstore(0x0, _preBytes_slot)\n                        let sc := keccak256(0x0, 0x20)\n\n                        let mc := add(_postBytes, 0x20)\n                        let end := add(mc, mlength)\n\n                        // the next line is the loop condition:\n                        // while(uint(mc < end) + cb == 2)\n                        for {} eq(add(lt(mc, end), cb), 2) {\n                            sc := add(sc, 1)\n                            mc := add(mc, 0x20)\n                        } {\n                            if iszero(eq(sload(sc), mload(mc))) {\n                                // unsuccess:\n                                success := 0\n                                cb := 0\n                            }\n                        }\n                    }\n                }\n            }\n            default {\n                // unsuccess:\n                success := 0\n            }\n        }\n\n        return success;\n    }\n\n    function toBytes32(bytes memory _source) pure internal returns (bytes32 result) {\n        bytes memory tempEmptyStringTest = bytes(_source);\n        if (tempEmptyStringTest.length == 0) {\n            return 0x0;\n        }\n\n        assembly {\n            result := mload(add(_source, 32))\n        }\n    }\n\n    function keccak256Slice(bytes memory _bytes, uint _start, uint _length) pure internal returns (bytes32 result) {\n        require(_bytes.length >= (_start + _length), \"Slice out of bounds\");\n\n        assembly {\n            result := keccak256(add(add(_bytes, 32), _start), _length)\n        }\n    }\n}\n",
  "sourcePath": "@summa-tx/bitcoin-spv-sol/contracts/BytesLib.sol",
  "ast": {
    "absolutePath": "@summa-tx/bitcoin-spv-sol/contracts/BytesLib.sol",
    "exportedSymbols": {
      "BytesLib": [
        4269
      ]
    },
    "id": 4270,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 4084,
        "literals": [
          "solidity",
          "^",
          "0.5",
          ".10"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:24:6"
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "library",
        "documentation": "@author https://github.com/GNSPS *",
        "fullyImplemented": true,
        "id": 4269,
        "linearizedBaseContracts": [
          4269
        ],
        "name": "BytesLib",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": {
              "id": 4099,
              "nodeType": "Block",
              "src": "1485:2807:6",
              "statements": [
                {
                  "assignments": [
                    4094
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 4094,
                      "name": "tempBytes",
                      "nodeType": "VariableDeclaration",
                      "scope": 4099,
                      "src": "1495:22:6",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes_memory_ptr",
                        "typeString": "bytes"
                      },
                      "typeName": {
                        "id": 4093,
                        "name": "bytes",
                        "nodeType": "ElementaryTypeName",
                        "src": "1495:5:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_storage_ptr",
                          "typeString": "bytes"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 4095,
                  "initialValue": null,
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1495:22:6"
                },
                {
                  "externalReferences": [
                    {
                      "tempBytes": {
                        "declaration": 4094,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "1681:9:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_preBytes": {
                        "declaration": 4086,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "1857:9:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "tempBytes": {
                        "declaration": 4094,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "2129:9:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "tempBytes": {
                        "declaration": 4094,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "1887:9:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_preBytes": {
                        "declaration": 4086,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "2472:9:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_postBytes": {
                        "declaration": 4088,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "3470:10:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_postBytes": {
                        "declaration": 4088,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "3052:10:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "tempBytes": {
                        "declaration": 4094,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "3083:9:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "tempBytes": {
                        "declaration": 4094,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "3112:9:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_preBytes": {
                        "declaration": 4086,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "4152:9:6",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 4096,
                  "nodeType": "InlineAssembly",
                  "operations": "{\n    tempBytes := mload(0x40)\n    let length := mload(_preBytes)\n    mstore(tempBytes, length)\n    let mc := add(tempBytes, 0x20)\n    let end := add(mc, length)\n    for {\n        let cc := add(_preBytes, 0x20)\n    }\n    lt(mc, end)\n    {\n        mc := add(mc, 0x20)\n        cc := add(cc, 0x20)\n    }\n    { mstore(mc, mload(cc)) }\n    length := mload(_postBytes)\n    mstore(tempBytes, add(length, mload(tempBytes)))\n    mc := end\n    end := add(mc, length)\n    for {\n        let cc := add(_postBytes, 0x20)\n    }\n    lt(mc, end)\n    {\n        mc := add(mc, 0x20)\n        cc := add(cc, 0x20)\n    }\n    { mstore(mc, mload(cc)) }\n    mstore(0x40, and(add(add(end, iszero(add(length, mload(_preBytes)))), 31), not(31)))\n}",
                  "src": "1528:2731:6"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 4097,
                    "name": "tempBytes",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 4094,
                    "src": "4276:9:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_memory_ptr",
                      "typeString": "bytes memory"
                    }
                  },
                  "functionReturnParameters": 4092,
                  "id": 4098,
                  "nodeType": "Return",
                  "src": "4269:16:6"
                }
              ]
            },
            "documentation": null,
            "id": 4100,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "concat",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4089,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4086,
                  "name": "_preBytes",
                  "nodeType": "VariableDeclaration",
                  "scope": 4100,
                  "src": "1399:22:6",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4085,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "1399:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4088,
                  "name": "_postBytes",
                  "nodeType": "VariableDeclaration",
                  "scope": 4100,
                  "src": "1423:23:6",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4087,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "1423:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1398:49:6"
            },
            "returnParameters": {
              "id": 4092,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4091,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 4100,
                  "src": "1471:12:6",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4090,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "1471:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1470:14:6"
            },
            "scope": 4269,
            "src": "1383:2909:6",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 4108,
              "nodeType": "Block",
              "src": "4380:5959:6",
              "statements": [
                {
                  "externalReferences": [
                    {
                      "_preBytes_slot": {
                        "declaration": 4102,
                        "isOffset": false,
                        "isSlot": true,
                        "src": "4641:14:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_postBytes": {
                        "declaration": 4104,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "5259:10:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_preBytes_slot": {
                        "declaration": 4102,
                        "isOffset": false,
                        "isSlot": true,
                        "src": "5935:14:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_preBytes_slot": {
                        "declaration": 4102,
                        "isOffset": false,
                        "isSlot": true,
                        "src": "7325:14:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_postBytes": {
                        "declaration": 4104,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "6465:10:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_postBytes": {
                        "declaration": 4104,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "8212:10:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_preBytes_slot": {
                        "declaration": 4102,
                        "isOffset": false,
                        "isSlot": true,
                        "src": "7470:14:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_postBytes": {
                        "declaration": 4104,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "8161:10:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_preBytes_slot": {
                        "declaration": 4102,
                        "isOffset": false,
                        "isSlot": true,
                        "src": "9161:14:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_preBytes_slot": {
                        "declaration": 4102,
                        "isOffset": false,
                        "isSlot": true,
                        "src": "9382:14:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_postBytes": {
                        "declaration": 4104,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "9717:10:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_postBytes": {
                        "declaration": 4104,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "9768:10:6",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 4107,
                  "nodeType": "InlineAssembly",
                  "operations": "{\n    let fslot := sload(_preBytes_slot)\n    let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\n    let mlength := mload(_postBytes)\n    let newlength := add(slength, mlength)\n    switch add(lt(slength, 32), lt(newlength, 32))\n    case 2 {\n        sstore(_preBytes_slot, add(fslot, add(mul(div(mload(add(_postBytes, 0x20)), exp(0x100, sub(32, mlength))), exp(0x100, sub(32, newlength))), mul(mlength, 2))))\n    }\n    case 1 {\n        mstore(0x0, _preBytes_slot)\n        let sc := add(keccak256(0x0, 0x20), div(slength, 32))\n        sstore(_preBytes_slot, add(mul(newlength, 2), 1))\n        let submod := sub(32, slength)\n        let mc := add(_postBytes, submod)\n        let end := add(_postBytes, mlength)\n        let mask := sub(exp(0x100, submod), 1)\n        sstore(sc, add(and(fslot, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00), and(mload(mc), mask)))\n        for {\n            mc := add(mc, 0x20)\n            sc := add(sc, 1)\n        }\n        lt(mc, end)\n        {\n            sc := add(sc, 1)\n            mc := add(mc, 0x20)\n        }\n        { sstore(sc, mload(mc)) }\n        mask := exp(0x100, sub(mc, end))\n        sstore(sc, mul(div(mload(mc), mask), mask))\n    }\n    default {\n        mstore(0x0, _preBytes_slot)\n        let sc := add(keccak256(0x0, 0x20), div(slength, 32))\n        sstore(_preBytes_slot, add(mul(newlength, 2), 1))\n        let slengthmod := mod(slength, 32)\n        let mlengthmod := mod(mlength, 32)\n        let submod := sub(32, slengthmod)\n        let mc := add(_postBytes, submod)\n        let end := add(_postBytes, mlength)\n        let mask := sub(exp(0x100, submod), 1)\n        sstore(sc, add(sload(sc), and(mload(mc), mask)))\n        for {\n            sc := add(sc, 1)\n            mc := add(mc, 0x20)\n        }\n        lt(mc, end)\n        {\n            sc := add(sc, 1)\n            mc := add(mc, 0x20)\n        }\n        { sstore(sc, mload(mc)) }\n        mask := exp(0x100, sub(mc, end))\n        sstore(sc, mul(div(mload(mc), mask), mask))\n    }\n}",
                  "src": "4390:5943:6"
                }
              ]
            },
            "documentation": null,
            "id": 4109,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "concatStorage",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4105,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4102,
                  "name": "_preBytes",
                  "nodeType": "VariableDeclaration",
                  "scope": 4109,
                  "src": "4321:23:6",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_storage_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4101,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "4321:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4104,
                  "name": "_postBytes",
                  "nodeType": "VariableDeclaration",
                  "scope": 4109,
                  "src": "4346:23:6",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4103,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "4346:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4320:50:6"
            },
            "returnParameters": {
              "id": 4106,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4380:0:6"
            },
            "scope": 4269,
            "src": "4298:6041:6",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 4132,
              "nodeType": "Block",
              "src": "10450:714:6",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 4127,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 4121,
                            "name": "_bytes",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4111,
                            "src": "10468:6:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes memory"
                            }
                          },
                          "id": 4122,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "10468:13:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 4125,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 4123,
                                "name": "_start",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4113,
                                "src": "10486:6:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "+",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 4124,
                                "name": "_length",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4115,
                                "src": "10495:7:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "10486:16:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 4126,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "10485:18:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "10468:35:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "536c696365206f7574206f6620626f756e6473",
                        "id": 4128,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "10505:21:6",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_f1c269d7eab972b2fd4d87a15c317e920493e7eea923de7e48c0ebcb7f611fa9",
                          "typeString": "literal_string \"Slice out of bounds\""
                        },
                        "value": "Slice out of bounds"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_f1c269d7eab972b2fd4d87a15c317e920493e7eea923de7e48c0ebcb7f611fa9",
                          "typeString": "literal_string \"Slice out of bounds\""
                        }
                      ],
                      "id": 4120,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5026,
                        5027
                      ],
                      "referencedDeclaration": 5027,
                      "src": "10460:7:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 4129,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "10460:67:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 4130,
                  "nodeType": "ExpressionStatement",
                  "src": "10460:67:6"
                },
                {
                  "externalReferences": [
                    {
                      "res": {
                        "declaration": 4118,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "10651:3:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_bytes": {
                        "declaration": 4111,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "10866:6:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_start": {
                        "declaration": 4113,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "10874:6:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_length": {
                        "declaration": 4115,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "10713:7:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "res": {
                        "declaration": 4118,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "10703:3:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "res": {
                        "declaration": 4118,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "10742:3:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_length": {
                        "declaration": 4115,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "10747:7:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "res": {
                        "declaration": 4118,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "10857:3:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_bytes": {
                        "declaration": 4111,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "10937:6:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_start": {
                        "declaration": 4113,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "10950:6:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_length": {
                        "declaration": 4115,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "10994:7:6",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 4131,
                  "nodeType": "InlineAssembly",
                  "operations": "{\n    res := mload(0x40)\n    mstore(0x40, add(add(res, 64), _length))\n    mstore(res, _length)\n    let diff := sub(res, add(_bytes, _start))\n    for {\n        let src := add(add(_bytes, 32), _start)\n        let end := add(src, _length)\n    }\n    lt(src, end)\n    { src := add(src, 32) }\n    {\n        mstore(add(src, diff), mload(src))\n    }\n}",
                  "src": "10538:620:6"
                }
              ]
            },
            "documentation": null,
            "id": 4133,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "slice",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4116,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4111,
                  "name": "_bytes",
                  "nodeType": "VariableDeclaration",
                  "scope": 4133,
                  "src": "10360:19:6",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4110,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "10360:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4113,
                  "name": "_start",
                  "nodeType": "VariableDeclaration",
                  "scope": 4133,
                  "src": "10381:11:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 4112,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "10381:4:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4115,
                  "name": "_length",
                  "nodeType": "VariableDeclaration",
                  "scope": 4133,
                  "src": "10394:12:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 4114,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "10394:4:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "10359:48:6"
            },
            "returnParameters": {
              "id": 4119,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4118,
                  "name": "res",
                  "nodeType": "VariableDeclaration",
                  "scope": 4133,
                  "src": "10432:16:6",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4117,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "10432:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "10431:18:6"
            },
            "scope": 4269,
            "src": "10345:819:6",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 4159,
              "nodeType": "Block",
              "src": "11256:280:6",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 4149,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 4143,
                            "name": "_bytes",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4135,
                            "src": "11274:6:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes memory"
                            }
                          },
                          "id": 4144,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "11274:13:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 4147,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 4145,
                                "name": "_start",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4137,
                                "src": "11292:6:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "+",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "3230",
                                "id": 4146,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "11301:2:6",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_20_by_1",
                                  "typeString": "int_const 20"
                                },
                                "value": "20"
                              },
                              "src": "11292:11:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 4148,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "11291:13:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "11274:30:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "4164647265737320636f6e76657273696f6e206f7574206f6620626f756e64732e",
                        "id": 4150,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "11306:35:6",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_3181add2f98e784f646c1ef936b3a8c6a87d5ec668aceb489a343dc808291b79",
                          "typeString": "literal_string \"Address conversion out of bounds.\""
                        },
                        "value": "Address conversion out of bounds."
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_3181add2f98e784f646c1ef936b3a8c6a87d5ec668aceb489a343dc808291b79",
                          "typeString": "literal_string \"Address conversion out of bounds.\""
                        }
                      ],
                      "id": 4142,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5026,
                        5027
                      ],
                      "referencedDeclaration": 5027,
                      "src": "11266:7:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 4151,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "11266:76:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 4152,
                  "nodeType": "ExpressionStatement",
                  "src": "11266:76:6"
                },
                {
                  "assignments": [
                    4154
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 4154,
                      "name": "tempAddress",
                      "nodeType": "VariableDeclaration",
                      "scope": 4159,
                      "src": "11352:19:6",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 4153,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "11352:7:6",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 4155,
                  "initialValue": null,
                  "nodeType": "VariableDeclarationStatement",
                  "src": "11352:19:6"
                },
                {
                  "externalReferences": [
                    {
                      "tempAddress": {
                        "declaration": 4154,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "11405:11:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_bytes": {
                        "declaration": 4135,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "11438:6:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_start": {
                        "declaration": 4137,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "11453:6:6",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 4156,
                  "nodeType": "InlineAssembly",
                  "operations": "{\n    tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\n}",
                  "src": "11382:119:6"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 4157,
                    "name": "tempAddress",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 4154,
                    "src": "11518:11:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 4141,
                  "id": 4158,
                  "nodeType": "Return",
                  "src": "11511:18:6"
                }
              ]
            },
            "documentation": null,
            "id": 4160,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "toAddress",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4138,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4135,
                  "name": "_bytes",
                  "nodeType": "VariableDeclaration",
                  "scope": 4160,
                  "src": "11189:19:6",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4134,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "11189:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4137,
                  "name": "_start",
                  "nodeType": "VariableDeclaration",
                  "scope": 4160,
                  "src": "11210:11:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 4136,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "11210:4:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "11188:34:6"
            },
            "returnParameters": {
              "id": 4141,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4140,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 4160,
                  "src": "11247:7:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4139,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "11247:7:6",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "11246:9:6"
            },
            "scope": 4269,
            "src": "11170:366:6",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 4186,
              "nodeType": "Block",
              "src": "11625:234:6",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 4176,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 4170,
                            "name": "_bytes",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4162,
                            "src": "11643:6:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes memory"
                            }
                          },
                          "id": 4171,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "11643:13:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 4174,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 4172,
                                "name": "_start",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4164,
                                "src": "11661:6:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "+",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "3332",
                                "id": 4173,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "11670:2:6",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_32_by_1",
                                  "typeString": "int_const 32"
                                },
                                "value": "32"
                              },
                              "src": "11661:11:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 4175,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "11660:13:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "11643:30:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "55696e7420636f6e76657273696f6e206f7574206f6620626f756e64732e",
                        "id": 4177,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "11675:32:6",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_8a652cf2416458d88f5f21292c53d59bfaf053b0555363202b6264b9a63dface",
                          "typeString": "literal_string \"Uint conversion out of bounds.\""
                        },
                        "value": "Uint conversion out of bounds."
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_8a652cf2416458d88f5f21292c53d59bfaf053b0555363202b6264b9a63dface",
                          "typeString": "literal_string \"Uint conversion out of bounds.\""
                        }
                      ],
                      "id": 4169,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5026,
                        5027
                      ],
                      "referencedDeclaration": 5027,
                      "src": "11635:7:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 4178,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "11635:73:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 4179,
                  "nodeType": "ExpressionStatement",
                  "src": "11635:73:6"
                },
                {
                  "assignments": [
                    4181
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 4181,
                      "name": "tempUint",
                      "nodeType": "VariableDeclaration",
                      "scope": 4186,
                      "src": "11718:16:6",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 4180,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "11718:7:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 4182,
                  "initialValue": null,
                  "nodeType": "VariableDeclarationStatement",
                  "src": "11718:16:6"
                },
                {
                  "externalReferences": [
                    {
                      "tempUint": {
                        "declaration": 4181,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "11768:8:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_bytes": {
                        "declaration": 4162,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "11794:6:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_start": {
                        "declaration": 4164,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "11809:6:6",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 4183,
                  "nodeType": "InlineAssembly",
                  "operations": "{\n    tempUint := mload(add(add(_bytes, 0x20), _start))\n}",
                  "src": "11745:82:6"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 4184,
                    "name": "tempUint",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 4181,
                    "src": "11844:8:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 4168,
                  "id": 4185,
                  "nodeType": "Return",
                  "src": "11837:15:6"
                }
              ]
            },
            "documentation": null,
            "id": 4187,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "toUint",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4165,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4162,
                  "name": "_bytes",
                  "nodeType": "VariableDeclaration",
                  "scope": 4187,
                  "src": "11558:19:6",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4161,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "11558:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4164,
                  "name": "_start",
                  "nodeType": "VariableDeclaration",
                  "scope": 4187,
                  "src": "11579:11:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 4163,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "11579:4:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "11557:34:6"
            },
            "returnParameters": {
              "id": 4168,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4167,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 4187,
                  "src": "11616:7:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 4166,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "11616:7:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "11615:9:6"
            },
            "scope": 4269,
            "src": "11542:317:6",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 4203,
              "nodeType": "Block",
              "src": "11958:1328:6",
              "statements": [
                {
                  "assignments": [
                    4197
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 4197,
                      "name": "success",
                      "nodeType": "VariableDeclaration",
                      "scope": 4203,
                      "src": "11968:12:6",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 4196,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "11968:4:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 4199,
                  "initialValue": {
                    "argumentTypes": null,
                    "hexValue": "74727565",
                    "id": 4198,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "11983:4:6",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "true"
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "11968:19:6"
                },
                {
                  "externalReferences": [
                    {
                      "_preBytes": {
                        "declaration": 4189,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "12041:9:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_postBytes": {
                        "declaration": 4191,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "12152:10:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_preBytes": {
                        "declaration": 4189,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "12456:9:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_postBytes": {
                        "declaration": 4191,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "12573:10:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "success": {
                        "declaration": 4197,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "13052:7:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "success": {
                        "declaration": 4197,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "13219:7:6",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 4200,
                  "nodeType": "InlineAssembly",
                  "operations": "{\n    let length := mload(_preBytes)\n    switch eq(length, mload(_postBytes))\n    case 1 {\n        let cb := 1\n        let mc := add(_preBytes, 0x20)\n        let end := add(mc, length)\n        for {\n            let cc := add(_postBytes, 0x20)\n        }\n        eq(add(lt(mc, end), cb), 2)\n        {\n            mc := add(mc, 0x20)\n            cc := add(cc, 0x20)\n        }\n        {\n            if iszero(eq(mload(mc), mload(cc)))\n            {\n                success := 0\n                cb := 0\n            }\n        }\n    }\n    default { success := 0 }\n}",
                  "src": "11998:1257:6"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 4201,
                    "name": "success",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 4197,
                    "src": "13272:7:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 4195,
                  "id": 4202,
                  "nodeType": "Return",
                  "src": "13265:14:6"
                }
              ]
            },
            "documentation": null,
            "id": 4204,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "equal",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4192,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4189,
                  "name": "_preBytes",
                  "nodeType": "VariableDeclaration",
                  "scope": 4204,
                  "src": "11880:22:6",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4188,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "11880:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4191,
                  "name": "_postBytes",
                  "nodeType": "VariableDeclaration",
                  "scope": 4204,
                  "src": "11904:23:6",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4190,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "11904:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "11879:49:6"
            },
            "returnParameters": {
              "id": 4195,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4194,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 4204,
                  "src": "11952:4:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 4193,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "11952:4:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "11951:6:6"
            },
            "scope": 4269,
            "src": "11865:1421:6",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 4220,
              "nodeType": "Block",
              "src": "13393:2556:6",
              "statements": [
                {
                  "assignments": [
                    4214
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 4214,
                      "name": "success",
                      "nodeType": "VariableDeclaration",
                      "scope": 4220,
                      "src": "13403:12:6",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 4213,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "13403:4:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 4216,
                  "initialValue": {
                    "argumentTypes": null,
                    "hexValue": "74727565",
                    "id": 4215,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "13418:4:6",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "true"
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "13403:19:6"
                },
                {
                  "externalReferences": [
                    {
                      "_preBytes_slot": {
                        "declaration": 4206,
                        "isOffset": false,
                        "isSlot": true,
                        "src": "13520:14:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_postBytes": {
                        "declaration": 4208,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "13736:10:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_postBytes": {
                        "declaration": 4208,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "14441:10:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "success": {
                        "declaration": 4214,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "14534:7:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_postBytes": {
                        "declaration": 4208,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "15131:10:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_preBytes_slot": {
                        "declaration": 4206,
                        "isOffset": false,
                        "isSlot": true,
                        "src": "15021:14:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "success": {
                        "declaration": 4214,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "15651:7:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "success": {
                        "declaration": 4214,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "15882:7:6",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 4217,
                  "nodeType": "InlineAssembly",
                  "operations": "{\n    let fslot := sload(_preBytes_slot)\n    let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\n    let mlength := mload(_postBytes)\n    switch eq(slength, mlength)\n    case 1 {\n        if iszero(iszero(slength))\n        {\n            switch lt(slength, 32)\n            case 1 {\n                fslot := mul(div(fslot, 0x100), 0x100)\n                if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) { success := 0 }\n            }\n            default {\n                let cb := 1\n                mstore(0x0, _preBytes_slot)\n                let sc := keccak256(0x0, 0x20)\n                let mc := add(_postBytes, 0x20)\n                let end := add(mc, mlength)\n                for { }\n                eq(add(lt(mc, end), cb), 2)\n                {\n                    sc := add(sc, 1)\n                    mc := add(mc, 0x20)\n                }\n                {\n                    if iszero(eq(sload(sc), mload(mc)))\n                    {\n                        success := 0\n                        cb := 0\n                    }\n                }\n            }\n        }\n    }\n    default { success := 0 }\n}",
                  "src": "13433:2485:6"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 4218,
                    "name": "success",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 4214,
                    "src": "15935:7:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 4212,
                  "id": 4219,
                  "nodeType": "Return",
                  "src": "15928:14:6"
                }
              ]
            },
            "documentation": null,
            "id": 4221,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "equalStorage",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4209,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4206,
                  "name": "_preBytes",
                  "nodeType": "VariableDeclaration",
                  "scope": 4221,
                  "src": "13314:23:6",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_storage_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4205,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "13314:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4208,
                  "name": "_postBytes",
                  "nodeType": "VariableDeclaration",
                  "scope": 4221,
                  "src": "13339:23:6",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4207,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "13339:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13313:50:6"
            },
            "returnParameters": {
              "id": 4212,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4211,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 4221,
                  "src": "13387:4:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 4210,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "13387:4:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13386:6:6"
            },
            "scope": 4269,
            "src": "13292:2657:6",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 4243,
              "nodeType": "Block",
              "src": "16035:223:6",
              "statements": [
                {
                  "assignments": [
                    4229
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 4229,
                      "name": "tempEmptyStringTest",
                      "nodeType": "VariableDeclaration",
                      "scope": 4243,
                      "src": "16045:32:6",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes_memory_ptr",
                        "typeString": "bytes"
                      },
                      "typeName": {
                        "id": 4228,
                        "name": "bytes",
                        "nodeType": "ElementaryTypeName",
                        "src": "16045:5:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_storage_ptr",
                          "typeString": "bytes"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 4233,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 4231,
                        "name": "_source",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4223,
                        "src": "16086:7:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 4230,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "ElementaryTypeNameExpression",
                      "src": "16080:5:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                        "typeString": "type(bytes storage pointer)"
                      },
                      "typeName": "bytes"
                    },
                    "id": 4232,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "16080:14:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_memory_ptr",
                      "typeString": "bytes memory"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "16045:49:6"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 4237,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 4234,
                        "name": "tempEmptyStringTest",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4229,
                        "src": "16108:19:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      },
                      "id": 4235,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "16108:26:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 4236,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "16138:1:6",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "16108:31:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 4241,
                  "nodeType": "IfStatement",
                  "src": "16104:72:6",
                  "trueBody": {
                    "id": 4240,
                    "nodeType": "Block",
                    "src": "16141:35:6",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "307830",
                          "id": 4238,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "16162:3:6",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0x0"
                        },
                        "functionReturnParameters": 4227,
                        "id": 4239,
                        "nodeType": "Return",
                        "src": "16155:10:6"
                      }
                    ]
                  }
                },
                {
                  "externalReferences": [
                    {
                      "result": {
                        "declaration": 4226,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "16209:6:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_source": {
                        "declaration": 4223,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "16229:7:6",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 4242,
                  "nodeType": "InlineAssembly",
                  "operations": "{\n    result := mload(add(_source, 32))\n}",
                  "src": "16186:66:6"
                }
              ]
            },
            "documentation": null,
            "id": 4244,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "toBytes32",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4224,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4223,
                  "name": "_source",
                  "nodeType": "VariableDeclaration",
                  "scope": 4244,
                  "src": "15974:20:6",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4222,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "15974:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "15973:22:6"
            },
            "returnParameters": {
              "id": 4227,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4226,
                  "name": "result",
                  "nodeType": "VariableDeclaration",
                  "scope": 4244,
                  "src": "16019:14:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 4225,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "16019:7:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "16018:16:6"
            },
            "scope": 4269,
            "src": "15955:303:6",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 4267,
              "nodeType": "Block",
              "src": "16375:185:6",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 4262,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 4256,
                            "name": "_bytes",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4246,
                            "src": "16393:6:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes memory"
                            }
                          },
                          "id": 4257,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "16393:13:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 4260,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 4258,
                                "name": "_start",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4248,
                                "src": "16411:6:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "+",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 4259,
                                "name": "_length",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4250,
                                "src": "16420:7:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "16411:16:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 4261,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "16410:18:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "16393:35:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "536c696365206f7574206f6620626f756e6473",
                        "id": 4263,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "16430:21:6",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_f1c269d7eab972b2fd4d87a15c317e920493e7eea923de7e48c0ebcb7f611fa9",
                          "typeString": "literal_string \"Slice out of bounds\""
                        },
                        "value": "Slice out of bounds"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_f1c269d7eab972b2fd4d87a15c317e920493e7eea923de7e48c0ebcb7f611fa9",
                          "typeString": "literal_string \"Slice out of bounds\""
                        }
                      ],
                      "id": 4255,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5026,
                        5027
                      ],
                      "referencedDeclaration": 5027,
                      "src": "16385:7:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 4264,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "16385:67:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 4265,
                  "nodeType": "ExpressionStatement",
                  "src": "16385:67:6"
                },
                {
                  "externalReferences": [
                    {
                      "result": {
                        "declaration": 4253,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "16486:6:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_bytes": {
                        "declaration": 4246,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "16514:6:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_start": {
                        "declaration": 4248,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "16527:6:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_length": {
                        "declaration": 4250,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "16536:7:6",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 4266,
                  "nodeType": "InlineAssembly",
                  "operations": "{\n    result := keccak256(add(add(_bytes, 32), _start), _length)\n}",
                  "src": "16463:91:6"
                }
              ]
            },
            "documentation": null,
            "id": 4268,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "keccak256Slice",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4251,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4246,
                  "name": "_bytes",
                  "nodeType": "VariableDeclaration",
                  "scope": 4268,
                  "src": "16288:19:6",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4245,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "16288:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4248,
                  "name": "_start",
                  "nodeType": "VariableDeclaration",
                  "scope": 4268,
                  "src": "16309:11:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 4247,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "16309:4:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4250,
                  "name": "_length",
                  "nodeType": "VariableDeclaration",
                  "scope": 4268,
                  "src": "16322:12:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 4249,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "16322:4:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "16287:48:6"
            },
            "returnParameters": {
              "id": 4254,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4253,
                  "name": "result",
                  "nodeType": "VariableDeclaration",
                  "scope": 4268,
                  "src": "16359:14:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 4252,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "16359:7:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "16358:16:6"
            },
            "scope": 4269,
            "src": "16264:296:6",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          }
        ],
        "scope": 4270,
        "src": "1360:15202:6"
      }
    ],
    "src": "0:16563:6"
  },
  "legacyAST": {
    "absolutePath": "@summa-tx/bitcoin-spv-sol/contracts/BytesLib.sol",
    "exportedSymbols": {
      "BytesLib": [
        4269
      ]
    },
    "id": 4270,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 4084,
        "literals": [
          "solidity",
          "^",
          "0.5",
          ".10"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:24:6"
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "library",
        "documentation": "@author https://github.com/GNSPS *",
        "fullyImplemented": true,
        "id": 4269,
        "linearizedBaseContracts": [
          4269
        ],
        "name": "BytesLib",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": {
              "id": 4099,
              "nodeType": "Block",
              "src": "1485:2807:6",
              "statements": [
                {
                  "assignments": [
                    4094
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 4094,
                      "name": "tempBytes",
                      "nodeType": "VariableDeclaration",
                      "scope": 4099,
                      "src": "1495:22:6",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes_memory_ptr",
                        "typeString": "bytes"
                      },
                      "typeName": {
                        "id": 4093,
                        "name": "bytes",
                        "nodeType": "ElementaryTypeName",
                        "src": "1495:5:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_storage_ptr",
                          "typeString": "bytes"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 4095,
                  "initialValue": null,
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1495:22:6"
                },
                {
                  "externalReferences": [
                    {
                      "tempBytes": {
                        "declaration": 4094,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "1681:9:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_preBytes": {
                        "declaration": 4086,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "1857:9:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "tempBytes": {
                        "declaration": 4094,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "2129:9:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "tempBytes": {
                        "declaration": 4094,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "1887:9:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_preBytes": {
                        "declaration": 4086,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "2472:9:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_postBytes": {
                        "declaration": 4088,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "3470:10:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_postBytes": {
                        "declaration": 4088,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "3052:10:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "tempBytes": {
                        "declaration": 4094,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "3083:9:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "tempBytes": {
                        "declaration": 4094,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "3112:9:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_preBytes": {
                        "declaration": 4086,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "4152:9:6",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 4096,
                  "nodeType": "InlineAssembly",
                  "operations": "{\n    tempBytes := mload(0x40)\n    let length := mload(_preBytes)\n    mstore(tempBytes, length)\n    let mc := add(tempBytes, 0x20)\n    let end := add(mc, length)\n    for {\n        let cc := add(_preBytes, 0x20)\n    }\n    lt(mc, end)\n    {\n        mc := add(mc, 0x20)\n        cc := add(cc, 0x20)\n    }\n    { mstore(mc, mload(cc)) }\n    length := mload(_postBytes)\n    mstore(tempBytes, add(length, mload(tempBytes)))\n    mc := end\n    end := add(mc, length)\n    for {\n        let cc := add(_postBytes, 0x20)\n    }\n    lt(mc, end)\n    {\n        mc := add(mc, 0x20)\n        cc := add(cc, 0x20)\n    }\n    { mstore(mc, mload(cc)) }\n    mstore(0x40, and(add(add(end, iszero(add(length, mload(_preBytes)))), 31), not(31)))\n}",
                  "src": "1528:2731:6"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 4097,
                    "name": "tempBytes",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 4094,
                    "src": "4276:9:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_memory_ptr",
                      "typeString": "bytes memory"
                    }
                  },
                  "functionReturnParameters": 4092,
                  "id": 4098,
                  "nodeType": "Return",
                  "src": "4269:16:6"
                }
              ]
            },
            "documentation": null,
            "id": 4100,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "concat",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4089,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4086,
                  "name": "_preBytes",
                  "nodeType": "VariableDeclaration",
                  "scope": 4100,
                  "src": "1399:22:6",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4085,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "1399:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4088,
                  "name": "_postBytes",
                  "nodeType": "VariableDeclaration",
                  "scope": 4100,
                  "src": "1423:23:6",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4087,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "1423:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1398:49:6"
            },
            "returnParameters": {
              "id": 4092,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4091,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 4100,
                  "src": "1471:12:6",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4090,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "1471:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1470:14:6"
            },
            "scope": 4269,
            "src": "1383:2909:6",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 4108,
              "nodeType": "Block",
              "src": "4380:5959:6",
              "statements": [
                {
                  "externalReferences": [
                    {
                      "_preBytes_slot": {
                        "declaration": 4102,
                        "isOffset": false,
                        "isSlot": true,
                        "src": "4641:14:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_postBytes": {
                        "declaration": 4104,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "5259:10:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_preBytes_slot": {
                        "declaration": 4102,
                        "isOffset": false,
                        "isSlot": true,
                        "src": "5935:14:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_preBytes_slot": {
                        "declaration": 4102,
                        "isOffset": false,
                        "isSlot": true,
                        "src": "7325:14:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_postBytes": {
                        "declaration": 4104,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "6465:10:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_postBytes": {
                        "declaration": 4104,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "8212:10:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_preBytes_slot": {
                        "declaration": 4102,
                        "isOffset": false,
                        "isSlot": true,
                        "src": "7470:14:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_postBytes": {
                        "declaration": 4104,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "8161:10:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_preBytes_slot": {
                        "declaration": 4102,
                        "isOffset": false,
                        "isSlot": true,
                        "src": "9161:14:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_preBytes_slot": {
                        "declaration": 4102,
                        "isOffset": false,
                        "isSlot": true,
                        "src": "9382:14:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_postBytes": {
                        "declaration": 4104,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "9717:10:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_postBytes": {
                        "declaration": 4104,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "9768:10:6",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 4107,
                  "nodeType": "InlineAssembly",
                  "operations": "{\n    let fslot := sload(_preBytes_slot)\n    let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\n    let mlength := mload(_postBytes)\n    let newlength := add(slength, mlength)\n    switch add(lt(slength, 32), lt(newlength, 32))\n    case 2 {\n        sstore(_preBytes_slot, add(fslot, add(mul(div(mload(add(_postBytes, 0x20)), exp(0x100, sub(32, mlength))), exp(0x100, sub(32, newlength))), mul(mlength, 2))))\n    }\n    case 1 {\n        mstore(0x0, _preBytes_slot)\n        let sc := add(keccak256(0x0, 0x20), div(slength, 32))\n        sstore(_preBytes_slot, add(mul(newlength, 2), 1))\n        let submod := sub(32, slength)\n        let mc := add(_postBytes, submod)\n        let end := add(_postBytes, mlength)\n        let mask := sub(exp(0x100, submod), 1)\n        sstore(sc, add(and(fslot, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00), and(mload(mc), mask)))\n        for {\n            mc := add(mc, 0x20)\n            sc := add(sc, 1)\n        }\n        lt(mc, end)\n        {\n            sc := add(sc, 1)\n            mc := add(mc, 0x20)\n        }\n        { sstore(sc, mload(mc)) }\n        mask := exp(0x100, sub(mc, end))\n        sstore(sc, mul(div(mload(mc), mask), mask))\n    }\n    default {\n        mstore(0x0, _preBytes_slot)\n        let sc := add(keccak256(0x0, 0x20), div(slength, 32))\n        sstore(_preBytes_slot, add(mul(newlength, 2), 1))\n        let slengthmod := mod(slength, 32)\n        let mlengthmod := mod(mlength, 32)\n        let submod := sub(32, slengthmod)\n        let mc := add(_postBytes, submod)\n        let end := add(_postBytes, mlength)\n        let mask := sub(exp(0x100, submod), 1)\n        sstore(sc, add(sload(sc), and(mload(mc), mask)))\n        for {\n            sc := add(sc, 1)\n            mc := add(mc, 0x20)\n        }\n        lt(mc, end)\n        {\n            sc := add(sc, 1)\n            mc := add(mc, 0x20)\n        }\n        { sstore(sc, mload(mc)) }\n        mask := exp(0x100, sub(mc, end))\n        sstore(sc, mul(div(mload(mc), mask), mask))\n    }\n}",
                  "src": "4390:5943:6"
                }
              ]
            },
            "documentation": null,
            "id": 4109,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "concatStorage",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4105,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4102,
                  "name": "_preBytes",
                  "nodeType": "VariableDeclaration",
                  "scope": 4109,
                  "src": "4321:23:6",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_storage_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4101,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "4321:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4104,
                  "name": "_postBytes",
                  "nodeType": "VariableDeclaration",
                  "scope": 4109,
                  "src": "4346:23:6",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4103,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "4346:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4320:50:6"
            },
            "returnParameters": {
              "id": 4106,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4380:0:6"
            },
            "scope": 4269,
            "src": "4298:6041:6",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 4132,
              "nodeType": "Block",
              "src": "10450:714:6",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 4127,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 4121,
                            "name": "_bytes",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4111,
                            "src": "10468:6:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes memory"
                            }
                          },
                          "id": 4122,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "10468:13:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 4125,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 4123,
                                "name": "_start",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4113,
                                "src": "10486:6:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "+",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 4124,
                                "name": "_length",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4115,
                                "src": "10495:7:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "10486:16:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 4126,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "10485:18:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "10468:35:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "536c696365206f7574206f6620626f756e6473",
                        "id": 4128,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "10505:21:6",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_f1c269d7eab972b2fd4d87a15c317e920493e7eea923de7e48c0ebcb7f611fa9",
                          "typeString": "literal_string \"Slice out of bounds\""
                        },
                        "value": "Slice out of bounds"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_f1c269d7eab972b2fd4d87a15c317e920493e7eea923de7e48c0ebcb7f611fa9",
                          "typeString": "literal_string \"Slice out of bounds\""
                        }
                      ],
                      "id": 4120,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5026,
                        5027
                      ],
                      "referencedDeclaration": 5027,
                      "src": "10460:7:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 4129,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "10460:67:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 4130,
                  "nodeType": "ExpressionStatement",
                  "src": "10460:67:6"
                },
                {
                  "externalReferences": [
                    {
                      "res": {
                        "declaration": 4118,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "10651:3:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_bytes": {
                        "declaration": 4111,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "10866:6:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_start": {
                        "declaration": 4113,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "10874:6:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_length": {
                        "declaration": 4115,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "10713:7:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "res": {
                        "declaration": 4118,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "10703:3:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "res": {
                        "declaration": 4118,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "10742:3:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_length": {
                        "declaration": 4115,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "10747:7:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "res": {
                        "declaration": 4118,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "10857:3:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_bytes": {
                        "declaration": 4111,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "10937:6:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_start": {
                        "declaration": 4113,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "10950:6:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_length": {
                        "declaration": 4115,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "10994:7:6",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 4131,
                  "nodeType": "InlineAssembly",
                  "operations": "{\n    res := mload(0x40)\n    mstore(0x40, add(add(res, 64), _length))\n    mstore(res, _length)\n    let diff := sub(res, add(_bytes, _start))\n    for {\n        let src := add(add(_bytes, 32), _start)\n        let end := add(src, _length)\n    }\n    lt(src, end)\n    { src := add(src, 32) }\n    {\n        mstore(add(src, diff), mload(src))\n    }\n}",
                  "src": "10538:620:6"
                }
              ]
            },
            "documentation": null,
            "id": 4133,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "slice",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4116,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4111,
                  "name": "_bytes",
                  "nodeType": "VariableDeclaration",
                  "scope": 4133,
                  "src": "10360:19:6",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4110,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "10360:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4113,
                  "name": "_start",
                  "nodeType": "VariableDeclaration",
                  "scope": 4133,
                  "src": "10381:11:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 4112,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "10381:4:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4115,
                  "name": "_length",
                  "nodeType": "VariableDeclaration",
                  "scope": 4133,
                  "src": "10394:12:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 4114,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "10394:4:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "10359:48:6"
            },
            "returnParameters": {
              "id": 4119,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4118,
                  "name": "res",
                  "nodeType": "VariableDeclaration",
                  "scope": 4133,
                  "src": "10432:16:6",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4117,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "10432:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "10431:18:6"
            },
            "scope": 4269,
            "src": "10345:819:6",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 4159,
              "nodeType": "Block",
              "src": "11256:280:6",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 4149,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 4143,
                            "name": "_bytes",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4135,
                            "src": "11274:6:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes memory"
                            }
                          },
                          "id": 4144,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "11274:13:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 4147,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 4145,
                                "name": "_start",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4137,
                                "src": "11292:6:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "+",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "3230",
                                "id": 4146,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "11301:2:6",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_20_by_1",
                                  "typeString": "int_const 20"
                                },
                                "value": "20"
                              },
                              "src": "11292:11:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 4148,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "11291:13:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "11274:30:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "4164647265737320636f6e76657273696f6e206f7574206f6620626f756e64732e",
                        "id": 4150,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "11306:35:6",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_3181add2f98e784f646c1ef936b3a8c6a87d5ec668aceb489a343dc808291b79",
                          "typeString": "literal_string \"Address conversion out of bounds.\""
                        },
                        "value": "Address conversion out of bounds."
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_3181add2f98e784f646c1ef936b3a8c6a87d5ec668aceb489a343dc808291b79",
                          "typeString": "literal_string \"Address conversion out of bounds.\""
                        }
                      ],
                      "id": 4142,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5026,
                        5027
                      ],
                      "referencedDeclaration": 5027,
                      "src": "11266:7:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 4151,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "11266:76:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 4152,
                  "nodeType": "ExpressionStatement",
                  "src": "11266:76:6"
                },
                {
                  "assignments": [
                    4154
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 4154,
                      "name": "tempAddress",
                      "nodeType": "VariableDeclaration",
                      "scope": 4159,
                      "src": "11352:19:6",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 4153,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "11352:7:6",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 4155,
                  "initialValue": null,
                  "nodeType": "VariableDeclarationStatement",
                  "src": "11352:19:6"
                },
                {
                  "externalReferences": [
                    {
                      "tempAddress": {
                        "declaration": 4154,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "11405:11:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_bytes": {
                        "declaration": 4135,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "11438:6:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_start": {
                        "declaration": 4137,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "11453:6:6",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 4156,
                  "nodeType": "InlineAssembly",
                  "operations": "{\n    tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\n}",
                  "src": "11382:119:6"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 4157,
                    "name": "tempAddress",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 4154,
                    "src": "11518:11:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 4141,
                  "id": 4158,
                  "nodeType": "Return",
                  "src": "11511:18:6"
                }
              ]
            },
            "documentation": null,
            "id": 4160,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "toAddress",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4138,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4135,
                  "name": "_bytes",
                  "nodeType": "VariableDeclaration",
                  "scope": 4160,
                  "src": "11189:19:6",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4134,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "11189:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4137,
                  "name": "_start",
                  "nodeType": "VariableDeclaration",
                  "scope": 4160,
                  "src": "11210:11:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 4136,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "11210:4:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "11188:34:6"
            },
            "returnParameters": {
              "id": 4141,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4140,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 4160,
                  "src": "11247:7:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4139,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "11247:7:6",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "11246:9:6"
            },
            "scope": 4269,
            "src": "11170:366:6",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 4186,
              "nodeType": "Block",
              "src": "11625:234:6",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 4176,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 4170,
                            "name": "_bytes",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4162,
                            "src": "11643:6:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes memory"
                            }
                          },
                          "id": 4171,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "11643:13:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 4174,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 4172,
                                "name": "_start",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4164,
                                "src": "11661:6:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "+",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "3332",
                                "id": 4173,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "11670:2:6",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_32_by_1",
                                  "typeString": "int_const 32"
                                },
                                "value": "32"
                              },
                              "src": "11661:11:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 4175,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "11660:13:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "11643:30:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "55696e7420636f6e76657273696f6e206f7574206f6620626f756e64732e",
                        "id": 4177,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "11675:32:6",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_8a652cf2416458d88f5f21292c53d59bfaf053b0555363202b6264b9a63dface",
                          "typeString": "literal_string \"Uint conversion out of bounds.\""
                        },
                        "value": "Uint conversion out of bounds."
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_8a652cf2416458d88f5f21292c53d59bfaf053b0555363202b6264b9a63dface",
                          "typeString": "literal_string \"Uint conversion out of bounds.\""
                        }
                      ],
                      "id": 4169,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5026,
                        5027
                      ],
                      "referencedDeclaration": 5027,
                      "src": "11635:7:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 4178,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "11635:73:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 4179,
                  "nodeType": "ExpressionStatement",
                  "src": "11635:73:6"
                },
                {
                  "assignments": [
                    4181
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 4181,
                      "name": "tempUint",
                      "nodeType": "VariableDeclaration",
                      "scope": 4186,
                      "src": "11718:16:6",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 4180,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "11718:7:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 4182,
                  "initialValue": null,
                  "nodeType": "VariableDeclarationStatement",
                  "src": "11718:16:6"
                },
                {
                  "externalReferences": [
                    {
                      "tempUint": {
                        "declaration": 4181,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "11768:8:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_bytes": {
                        "declaration": 4162,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "11794:6:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_start": {
                        "declaration": 4164,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "11809:6:6",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 4183,
                  "nodeType": "InlineAssembly",
                  "operations": "{\n    tempUint := mload(add(add(_bytes, 0x20), _start))\n}",
                  "src": "11745:82:6"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 4184,
                    "name": "tempUint",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 4181,
                    "src": "11844:8:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 4168,
                  "id": 4185,
                  "nodeType": "Return",
                  "src": "11837:15:6"
                }
              ]
            },
            "documentation": null,
            "id": 4187,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "toUint",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4165,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4162,
                  "name": "_bytes",
                  "nodeType": "VariableDeclaration",
                  "scope": 4187,
                  "src": "11558:19:6",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4161,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "11558:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4164,
                  "name": "_start",
                  "nodeType": "VariableDeclaration",
                  "scope": 4187,
                  "src": "11579:11:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 4163,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "11579:4:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "11557:34:6"
            },
            "returnParameters": {
              "id": 4168,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4167,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 4187,
                  "src": "11616:7:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 4166,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "11616:7:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "11615:9:6"
            },
            "scope": 4269,
            "src": "11542:317:6",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 4203,
              "nodeType": "Block",
              "src": "11958:1328:6",
              "statements": [
                {
                  "assignments": [
                    4197
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 4197,
                      "name": "success",
                      "nodeType": "VariableDeclaration",
                      "scope": 4203,
                      "src": "11968:12:6",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 4196,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "11968:4:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 4199,
                  "initialValue": {
                    "argumentTypes": null,
                    "hexValue": "74727565",
                    "id": 4198,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "11983:4:6",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "true"
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "11968:19:6"
                },
                {
                  "externalReferences": [
                    {
                      "_preBytes": {
                        "declaration": 4189,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "12041:9:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_postBytes": {
                        "declaration": 4191,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "12152:10:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_preBytes": {
                        "declaration": 4189,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "12456:9:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_postBytes": {
                        "declaration": 4191,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "12573:10:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "success": {
                        "declaration": 4197,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "13052:7:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "success": {
                        "declaration": 4197,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "13219:7:6",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 4200,
                  "nodeType": "InlineAssembly",
                  "operations": "{\n    let length := mload(_preBytes)\n    switch eq(length, mload(_postBytes))\n    case 1 {\n        let cb := 1\n        let mc := add(_preBytes, 0x20)\n        let end := add(mc, length)\n        for {\n            let cc := add(_postBytes, 0x20)\n        }\n        eq(add(lt(mc, end), cb), 2)\n        {\n            mc := add(mc, 0x20)\n            cc := add(cc, 0x20)\n        }\n        {\n            if iszero(eq(mload(mc), mload(cc)))\n            {\n                success := 0\n                cb := 0\n            }\n        }\n    }\n    default { success := 0 }\n}",
                  "src": "11998:1257:6"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 4201,
                    "name": "success",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 4197,
                    "src": "13272:7:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 4195,
                  "id": 4202,
                  "nodeType": "Return",
                  "src": "13265:14:6"
                }
              ]
            },
            "documentation": null,
            "id": 4204,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "equal",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4192,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4189,
                  "name": "_preBytes",
                  "nodeType": "VariableDeclaration",
                  "scope": 4204,
                  "src": "11880:22:6",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4188,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "11880:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4191,
                  "name": "_postBytes",
                  "nodeType": "VariableDeclaration",
                  "scope": 4204,
                  "src": "11904:23:6",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4190,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "11904:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "11879:49:6"
            },
            "returnParameters": {
              "id": 4195,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4194,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 4204,
                  "src": "11952:4:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 4193,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "11952:4:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "11951:6:6"
            },
            "scope": 4269,
            "src": "11865:1421:6",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 4220,
              "nodeType": "Block",
              "src": "13393:2556:6",
              "statements": [
                {
                  "assignments": [
                    4214
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 4214,
                      "name": "success",
                      "nodeType": "VariableDeclaration",
                      "scope": 4220,
                      "src": "13403:12:6",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 4213,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "13403:4:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 4216,
                  "initialValue": {
                    "argumentTypes": null,
                    "hexValue": "74727565",
                    "id": 4215,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "13418:4:6",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "true"
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "13403:19:6"
                },
                {
                  "externalReferences": [
                    {
                      "_preBytes_slot": {
                        "declaration": 4206,
                        "isOffset": false,
                        "isSlot": true,
                        "src": "13520:14:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_postBytes": {
                        "declaration": 4208,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "13736:10:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_postBytes": {
                        "declaration": 4208,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "14441:10:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "success": {
                        "declaration": 4214,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "14534:7:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_postBytes": {
                        "declaration": 4208,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "15131:10:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_preBytes_slot": {
                        "declaration": 4206,
                        "isOffset": false,
                        "isSlot": true,
                        "src": "15021:14:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "success": {
                        "declaration": 4214,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "15651:7:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "success": {
                        "declaration": 4214,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "15882:7:6",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 4217,
                  "nodeType": "InlineAssembly",
                  "operations": "{\n    let fslot := sload(_preBytes_slot)\n    let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\n    let mlength := mload(_postBytes)\n    switch eq(slength, mlength)\n    case 1 {\n        if iszero(iszero(slength))\n        {\n            switch lt(slength, 32)\n            case 1 {\n                fslot := mul(div(fslot, 0x100), 0x100)\n                if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) { success := 0 }\n            }\n            default {\n                let cb := 1\n                mstore(0x0, _preBytes_slot)\n                let sc := keccak256(0x0, 0x20)\n                let mc := add(_postBytes, 0x20)\n                let end := add(mc, mlength)\n                for { }\n                eq(add(lt(mc, end), cb), 2)\n                {\n                    sc := add(sc, 1)\n                    mc := add(mc, 0x20)\n                }\n                {\n                    if iszero(eq(sload(sc), mload(mc)))\n                    {\n                        success := 0\n                        cb := 0\n                    }\n                }\n            }\n        }\n    }\n    default { success := 0 }\n}",
                  "src": "13433:2485:6"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 4218,
                    "name": "success",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 4214,
                    "src": "15935:7:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 4212,
                  "id": 4219,
                  "nodeType": "Return",
                  "src": "15928:14:6"
                }
              ]
            },
            "documentation": null,
            "id": 4221,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "equalStorage",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4209,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4206,
                  "name": "_preBytes",
                  "nodeType": "VariableDeclaration",
                  "scope": 4221,
                  "src": "13314:23:6",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_storage_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4205,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "13314:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4208,
                  "name": "_postBytes",
                  "nodeType": "VariableDeclaration",
                  "scope": 4221,
                  "src": "13339:23:6",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4207,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "13339:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13313:50:6"
            },
            "returnParameters": {
              "id": 4212,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4211,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 4221,
                  "src": "13387:4:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 4210,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "13387:4:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13386:6:6"
            },
            "scope": 4269,
            "src": "13292:2657:6",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 4243,
              "nodeType": "Block",
              "src": "16035:223:6",
              "statements": [
                {
                  "assignments": [
                    4229
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 4229,
                      "name": "tempEmptyStringTest",
                      "nodeType": "VariableDeclaration",
                      "scope": 4243,
                      "src": "16045:32:6",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes_memory_ptr",
                        "typeString": "bytes"
                      },
                      "typeName": {
                        "id": 4228,
                        "name": "bytes",
                        "nodeType": "ElementaryTypeName",
                        "src": "16045:5:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_storage_ptr",
                          "typeString": "bytes"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 4233,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 4231,
                        "name": "_source",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4223,
                        "src": "16086:7:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 4230,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "ElementaryTypeNameExpression",
                      "src": "16080:5:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                        "typeString": "type(bytes storage pointer)"
                      },
                      "typeName": "bytes"
                    },
                    "id": 4232,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "16080:14:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_memory_ptr",
                      "typeString": "bytes memory"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "16045:49:6"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 4237,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 4234,
                        "name": "tempEmptyStringTest",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4229,
                        "src": "16108:19:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      },
                      "id": 4235,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "16108:26:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 4236,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "16138:1:6",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "16108:31:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 4241,
                  "nodeType": "IfStatement",
                  "src": "16104:72:6",
                  "trueBody": {
                    "id": 4240,
                    "nodeType": "Block",
                    "src": "16141:35:6",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "307830",
                          "id": 4238,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "16162:3:6",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0x0"
                        },
                        "functionReturnParameters": 4227,
                        "id": 4239,
                        "nodeType": "Return",
                        "src": "16155:10:6"
                      }
                    ]
                  }
                },
                {
                  "externalReferences": [
                    {
                      "result": {
                        "declaration": 4226,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "16209:6:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_source": {
                        "declaration": 4223,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "16229:7:6",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 4242,
                  "nodeType": "InlineAssembly",
                  "operations": "{\n    result := mload(add(_source, 32))\n}",
                  "src": "16186:66:6"
                }
              ]
            },
            "documentation": null,
            "id": 4244,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "toBytes32",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4224,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4223,
                  "name": "_source",
                  "nodeType": "VariableDeclaration",
                  "scope": 4244,
                  "src": "15974:20:6",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4222,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "15974:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "15973:22:6"
            },
            "returnParameters": {
              "id": 4227,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4226,
                  "name": "result",
                  "nodeType": "VariableDeclaration",
                  "scope": 4244,
                  "src": "16019:14:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 4225,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "16019:7:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "16018:16:6"
            },
            "scope": 4269,
            "src": "15955:303:6",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 4267,
              "nodeType": "Block",
              "src": "16375:185:6",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 4262,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 4256,
                            "name": "_bytes",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4246,
                            "src": "16393:6:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes memory"
                            }
                          },
                          "id": 4257,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "16393:13:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 4260,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 4258,
                                "name": "_start",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4248,
                                "src": "16411:6:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "+",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 4259,
                                "name": "_length",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4250,
                                "src": "16420:7:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "16411:16:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 4261,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "16410:18:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "16393:35:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "536c696365206f7574206f6620626f756e6473",
                        "id": 4263,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "16430:21:6",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_f1c269d7eab972b2fd4d87a15c317e920493e7eea923de7e48c0ebcb7f611fa9",
                          "typeString": "literal_string \"Slice out of bounds\""
                        },
                        "value": "Slice out of bounds"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_f1c269d7eab972b2fd4d87a15c317e920493e7eea923de7e48c0ebcb7f611fa9",
                          "typeString": "literal_string \"Slice out of bounds\""
                        }
                      ],
                      "id": 4255,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5026,
                        5027
                      ],
                      "referencedDeclaration": 5027,
                      "src": "16385:7:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 4264,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "16385:67:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 4265,
                  "nodeType": "ExpressionStatement",
                  "src": "16385:67:6"
                },
                {
                  "externalReferences": [
                    {
                      "result": {
                        "declaration": 4253,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "16486:6:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_bytes": {
                        "declaration": 4246,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "16514:6:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_start": {
                        "declaration": 4248,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "16527:6:6",
                        "valueSize": 1
                      }
                    },
                    {
                      "_length": {
                        "declaration": 4250,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "16536:7:6",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 4266,
                  "nodeType": "InlineAssembly",
                  "operations": "{\n    result := keccak256(add(add(_bytes, 32), _start), _length)\n}",
                  "src": "16463:91:6"
                }
              ]
            },
            "documentation": null,
            "id": 4268,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "keccak256Slice",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4251,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4246,
                  "name": "_bytes",
                  "nodeType": "VariableDeclaration",
                  "scope": 4268,
                  "src": "16288:19:6",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 4245,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "16288:5:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4248,
                  "name": "_start",
                  "nodeType": "VariableDeclaration",
                  "scope": 4268,
                  "src": "16309:11:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 4247,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "16309:4:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4250,
                  "name": "_length",
                  "nodeType": "VariableDeclaration",
                  "scope": 4268,
                  "src": "16322:12:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 4249,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "16322:4:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "16287:48:6"
            },
            "returnParameters": {
              "id": 4254,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4253,
                  "name": "result",
                  "nodeType": "VariableDeclaration",
                  "scope": 4268,
                  "src": "16359:14:6",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 4252,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "16359:7:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "16358:16:6"
            },
            "scope": 4269,
            "src": "16264:296:6",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          }
        ],
        "scope": 4270,
        "src": "1360:15202:6"
      }
    ],
    "src": "0:16563:6"
  },
  "compiler": {
    "name": "solc",
    "version": "0.5.10+commit.5a6ea5b1.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.0.23",
  "updatedAt": "2020-04-08T00:07:28.199Z",
  "devdoc": {
    "author": "https://github.com/GNSPS *",
    "methods": {}
  },
  "userdoc": {
    "methods": {}
  }
}