{
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_upgradeBeacon",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "_initializationCalldata",
          "type": "bytes"
        }
      ],
      "stateMutability": "payable",
      "type": "constructor"
    },
    {
      "stateMutability": "payable",
      "type": "fallback"
    },
    {
      "stateMutability": "payable",
      "type": "receive"
    }
  ],
  "bytecode": {
    "object": "0x60a06040526040516105623803806105628339818101604052604081101561002657600080fd5b81516020830180516040519294929383019291908464010000000082111561004d57600080fd5b90830190602082018581111561006257600080fd5b825164010000000081118282018810171561007c57600080fd5b82525081516020918201929091019080838360005b838110156100a9578181015183820152602001610091565b50505050905090810190601f1680156100d65780820380516001836020036101000a031916815260200191505b506040525050506100f0826101d060201b6100291760201c565b610134576040805162461bcd60e51b815260206004820152601060248201526f18995858dbdb880858dbdb9d1c9858dd60821b604482015290519081900360640190fd5b6001600160601b0319606083901b166080526000610151836101d6565b9050610166816101d060201b6100291760201c565b6101b7576040805162461bcd60e51b815260206004820152601f60248201527f626561636f6e20696d706c656d656e746174696f6e2021636f6e747261637400604482015290519081900360640190fd5b8151156101c8576101c881836102d6565b50505061038f565b3b151590565b604051600090819081906001600160a01b0385169082818181855afa9150503d8060008114610221576040519150601f19603f3d011682016040523d82523d6000602084013e610226565b606091505b50915091508181906102b65760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561027b578181015183820152602001610263565b50505050905090810190601f1680156102a85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508080602001905160208110156102cc57600080fd5b5051949350505050565b6000826001600160a01b0316826040518082805190602001908083835b602083106103125780518252601f1990920191602091820191016102f3565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114610372576040519150601f19603f3d011682016040523d82523d6000602084013e610377565b606091505b505090508061038a573d6000803e3d6000fd5b505050565b60805160601c6101b76103ab60003980603652506101b76000f3fe60806040523661001357610011610017565b005b6100115b61002761002261002f565b61005f565b565b3b151590565b600061005a7f0000000000000000000000000000000000000000000000000000000000000000610083565b905090565b3660008037600080366000845af43d6000803e80801561007e573d6000f35b3d6000fd5b6040516000908190819073ffffffffffffffffffffffffffffffffffffffff85169082818181855afa9150503d80600081146100db576040519150601f19603f3d011682016040523d82523d6000602084013e6100e0565b606091505b509150915081819061018a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561014f578181015183820152602001610137565b50505050905090810190601f16801561017c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508080602001905160208110156101a057600080fd5b505194935050505056fea164736f6c6343000706000a",
    "sourceMap": "1122:6036:78:-:0;;;1961:740;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1961:740:78;;;;;;;;;;-1:-1:-1;1961:740:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2126:34;2145:14;2126:18;;;;;:34;;:::i;:::-;2118:63;;;;;-1:-1:-1;2118:63:78;;;;;;;;;;;;-1:-1:-1;2118:63:78;;;;;;;;;;;;;;;-1:-1:-1;2225:30:78;;;-1:-1:-1;2225:30:78;;;2318:23;2344:34;2225:30;2344:18;:34::i;:::-;2318:60;;2409:35;2428:15;2409:18;;;;;:35;;:::i;:::-;2388:113;;;;;-1:-1:-1;;;2388:113:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;2581:30;;:34;2577:118;;2631:53;2643:15;2660:23;2631:11;:53::i;:::-;1961:740;;;1122:6036;;726:413:29;1086:20;1124:8;;;726:413::o;6598:558:78:-;6849:29;;6696:23;;;;;;-1:-1:-1;6849:25:78;;;6696:23;6849:29;6696:23;6849:29;:25;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6810:68;;;;6979:3;6991:11;6971:33;;;;;-1:-1:-1;6971:33:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7126:11;7115:34;;;;;;;;;;;;;;;-1:-1:-1;7115:34:78;;6598:558;-1:-1:-1;;;;6598:558:78:o;3562:534::-;3771:8;3785:15;-1:-1:-1;;;;;3785:28:78;3814:23;3785:53;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3785:53:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3770:68;;;3938:3;3933:157;;4005:16;4002:1;;3984:38;4049:16;4002:1;4039:27;3966:114;3562:534;;;:::o;1122:6036::-;;;;;;;;;;;;",
    "linkReferences": {}
  },
  "deployedBytecode": {
    "object": "0x60806040523661001357610011610017565b005b6100115b61002761002261002f565b61005f565b565b3b151590565b600061005a7f0000000000000000000000000000000000000000000000000000000000000000610083565b905090565b3660008037600080366000845af43d6000803e80801561007e573d6000f35b3d6000fd5b6040516000908190819073ffffffffffffffffffffffffffffffffffffffff85169082818181855afa9150503d80600081146100db576040519150601f19603f3d011682016040523d82523d6000602084013e6100e0565b606091505b509150915081819061018a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561014f578181015183820152602001610137565b50505050905090810190601f16801561017c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508080602001905160208110156101a057600080fd5b505194935050505056fea164736f6c6343000706000a",
    "sourceMap": "1122:6036:78:-:0;;;;;;3095:11;:9;:11::i;:::-;1122:6036;;2956:11;4220:77;4259:31;4269:20;:18;:20::i;:::-;4259:9;:31::i;:::-;4220:77::o;726:413:29:-;1086:20;1124:8;;;726:413::o;5983:173:78:-;6059:23;6116:33;6135:13;6116:18;:33::i;:::-;6098:51;;5983:173;:::o;4736:1065::-;5066:14;5063:1;5060;5047:34;5424:1;5405;5373:14;5354:1;5321:15;5298:5;5268:171;5535:16;5532:1;5529;5514:38;5572:6;5639:66;;;;5754:16;5751:1;5744:27;5639:66;5674:16;5671:1;5664:27;6598:558;6849:29;;6696:23;;;;;;6849:25;;;;6696:23;6849:29;6696:23;6849:29;:25;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6810:68;;;;6979:3;6991:11;6971:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7126:11;7115:34;;;;;;;;;;;;;;;-1:-1:-1;7115:34:78;;6598:558;-1:-1:-1;;;;6598:558:78:o",
    "linkReferences": {},
    "immutableReferences": {
      "46491": [
        {
          "start": 54,
          "length": 32
        }
      ]
    }
  },
  "methodIdentifiers": {},
  "ast": {
    "absolutePath": "packages/contracts-core/contracts/upgrade/UpgradeBeaconProxy.sol",
    "id": 46643,
    "exportedSymbols": {
      "Address": [
        28026
      ],
      "UpgradeBeaconProxy": [
        46642
      ]
    },
    "nodeType": "SourceUnit",
    "src": "32:7127:78",
    "nodes": [
      {
        "id": 46486,
        "nodeType": "PragmaDirective",
        "src": "32:22:78",
        "literals": [
          "solidity",
          "0.7",
          ".6"
        ]
      },
      {
        "id": 46488,
        "nodeType": "ImportDirective",
        "src": "102:66:78",
        "absolutePath": "node_modules/@openzeppelin/contracts/utils/Address.sol",
        "file": "@openzeppelin/contracts/utils/Address.sol",
        "scope": 46643,
        "sourceUnit": 28027,
        "symbolAliases": [
          {
            "foreign": {
              "id": 46487,
              "name": "Address",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "src": "110:7:78",
              "typeDescriptions": {}
            }
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 46642,
        "nodeType": "ContractDefinition",
        "src": "1122:6036:78",
        "nodes": [
          {
            "id": 46491,
            "nodeType": "VariableDeclaration",
            "src": "1285:39:78",
            "constant": false,
            "mutability": "immutable",
            "name": "upgradeBeacon",
            "scope": 46642,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 46490,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "1285:7:78",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "visibility": "private"
          },
          {
            "id": 46537,
            "nodeType": "FunctionDefinition",
            "src": "1961:740:78",
            "body": {
              "id": 46536,
              "nodeType": "Block",
              "src": "2055:646:78",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "id": 46502,
                            "name": "_upgradeBeacon",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 46494,
                            "src": "2145:14:78",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "expression": {
                            "id": 46500,
                            "name": "Address",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 28026,
                            "src": "2126:7:78",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_Address_$28026_$",
                              "typeString": "type(library Address)"
                            }
                          },
                          "id": 46501,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "isContract",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 27750,
                          "src": "2126:18:78",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                            "typeString": "function (address) view returns (bool)"
                          }
                        },
                        "id": 46503,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2126:34:78",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "626561636f6e2021636f6e7472616374",
                        "id": 46504,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2162:18:78",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_d6fa84775b2f5d8dc72e8983563c49fd6df479405c5f9def94921322ed3ad41c",
                          "typeString": "literal_string \"beacon !contract\""
                        },
                        "value": "beacon !contract"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_d6fa84775b2f5d8dc72e8983563c49fd6df479405c5f9def94921322ed3ad41c",
                          "typeString": "literal_string \"beacon !contract\""
                        }
                      ],
                      "id": 46499,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "2118:7:78",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 46505,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2118:63:78",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 46506,
                  "nodeType": "ExpressionStatement",
                  "src": "2118:63:78"
                },
                {
                  "expression": {
                    "id": 46509,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 46507,
                      "name": "upgradeBeacon",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46491,
                      "src": "2225:13:78",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 46508,
                      "name": "_upgradeBeacon",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46494,
                      "src": "2241:14:78",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "2225:30:78",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 46510,
                  "nodeType": "ExpressionStatement",
                  "src": "2225:30:78"
                },
                {
                  "assignments": [
                    46512
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 46512,
                      "mutability": "mutable",
                      "name": "_implementation",
                      "nodeType": "VariableDeclaration",
                      "scope": 46536,
                      "src": "2318:23:78",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 46511,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "2318:7:78",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 46516,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 46514,
                        "name": "_upgradeBeacon",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46494,
                        "src": "2363:14:78",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 46513,
                      "name": "_getImplementation",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        46605,
                        46641
                      ],
                      "referencedDeclaration": 46641,
                      "src": "2344:18:78",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_address_$",
                        "typeString": "function (address) view returns (address)"
                      }
                    },
                    "id": 46515,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2344:34:78",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "2318:60:78"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "id": 46520,
                            "name": "_implementation",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 46512,
                            "src": "2428:15:78",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "expression": {
                            "id": 46518,
                            "name": "Address",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 28026,
                            "src": "2409:7:78",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_Address_$28026_$",
                              "typeString": "type(library Address)"
                            }
                          },
                          "id": 46519,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "isContract",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 27750,
                          "src": "2409:18:78",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                            "typeString": "function (address) view returns (bool)"
                          }
                        },
                        "id": 46521,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2409:35:78",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "626561636f6e20696d706c656d656e746174696f6e2021636f6e7472616374",
                        "id": 46522,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2458:33:78",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_1885e83655ef1ce5d48047c111cf8c2459adf32b677f5b8e678f940b377eea04",
                          "typeString": "literal_string \"beacon implementation !contract\""
                        },
                        "value": "beacon implementation !contract"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_1885e83655ef1ce5d48047c111cf8c2459adf32b677f5b8e678f940b377eea04",
                          "typeString": "literal_string \"beacon implementation !contract\""
                        }
                      ],
                      "id": 46517,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "2388:7:78",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 46523,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2388:113:78",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 46524,
                  "nodeType": "ExpressionStatement",
                  "src": "2388:113:78"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 46528,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 46525,
                        "name": "_initializationCalldata",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46496,
                        "src": "2581:23:78",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      },
                      "id": 46526,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "src": "2581:30:78",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 46527,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "2614:1:78",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "2581:34:78",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 46535,
                  "nodeType": "IfStatement",
                  "src": "2577:118:78",
                  "trueBody": {
                    "id": 46534,
                    "nodeType": "Block",
                    "src": "2617:78:78",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "id": 46530,
                              "name": "_implementation",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 46512,
                              "src": "2643:15:78",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "id": 46531,
                              "name": "_initializationCalldata",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 46496,
                              "src": "2660:23:78",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 46529,
                            "name": "_initialize",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 46574,
                            "src": "2631:11:78",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (address,bytes memory)"
                            }
                          },
                          "id": 46532,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2631:53:78",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 46533,
                        "nodeType": "ExpressionStatement",
                        "src": "2631:53:78"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 46492,
              "nodeType": "StructuredDocumentation",
              "src": "1377:579:78",
              "text": " @notice Validate that the Upgrade Beacon is a contract, then set its\n address immutably within this contract.\n Validate that the implementation is also a contract,\n Then call the initialization function defined at the implementation.\n The deployment will revert and pass along the\n revert reason if the initialization function reverts.\n @param _upgradeBeacon Address of the Upgrade Beacon to be stored immutably in the contract\n @param _initializationCalldata Calldata supplied when calling the initialization function"
            },
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "parameters": {
              "id": 46497,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 46494,
                  "mutability": "mutable",
                  "name": "_upgradeBeacon",
                  "nodeType": "VariableDeclaration",
                  "scope": 46537,
                  "src": "1973:22:78",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 46493,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1973:7:78",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 46496,
                  "mutability": "mutable",
                  "name": "_initializationCalldata",
                  "nodeType": "VariableDeclaration",
                  "scope": 46537,
                  "src": "1997:36:78",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 46495,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "1997:5:78",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1972:62:78"
            },
            "returnParameters": {
              "id": 46498,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2055:0:78"
            },
            "scope": 46642,
            "stateMutability": "payable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "id": 46545,
            "nodeType": "FunctionDefinition",
            "src": "2918:56:78",
            "body": {
              "id": 46544,
              "nodeType": "Block",
              "src": "2946:28:78",
              "statements": [
                {
                  "expression": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 46541,
                      "name": "_fallback",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46584,
                      "src": "2956:9:78",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 46542,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2956:11:78",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 46543,
                  "nodeType": "ExpressionStatement",
                  "src": "2956:11:78"
                }
              ]
            },
            "documentation": {
              "id": 46538,
              "nodeType": "StructuredDocumentation",
              "src": "2760:153:78",
              "text": " @notice Forwards all calls with data to _fallback()\n No public functions are declared on the contract, so all calls hit fallback"
            },
            "implemented": true,
            "kind": "fallback",
            "modifiers": [],
            "name": "",
            "parameters": {
              "id": 46539,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2926:2:78"
            },
            "returnParameters": {
              "id": 46540,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2946:0:78"
            },
            "scope": 46642,
            "stateMutability": "payable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 46553,
            "nodeType": "FunctionDefinition",
            "src": "3058:55:78",
            "body": {
              "id": 46552,
              "nodeType": "Block",
              "src": "3085:28:78",
              "statements": [
                {
                  "expression": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 46549,
                      "name": "_fallback",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46584,
                      "src": "3095:9:78",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 46550,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3095:11:78",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 46551,
                  "nodeType": "ExpressionStatement",
                  "src": "3095:11:78"
                }
              ]
            },
            "documentation": {
              "id": 46546,
              "nodeType": "StructuredDocumentation",
              "src": "2980:73:78",
              "text": " @notice Forwards all calls with no data to _fallback()"
            },
            "implemented": true,
            "kind": "receive",
            "modifiers": [],
            "name": "",
            "parameters": {
              "id": 46547,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3065:2:78"
            },
            "returnParameters": {
              "id": 46548,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3085:0:78"
            },
            "scope": 46642,
            "stateMutability": "payable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 46574,
            "nodeType": "FunctionDefinition",
            "src": "3562:534:78",
            "body": {
              "id": 46573,
              "nodeType": "Block",
              "src": "3676:420:78",
              "statements": [
                {
                  "assignments": [
                    46562,
                    null
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 46562,
                      "mutability": "mutable",
                      "name": "_ok",
                      "nodeType": "VariableDeclaration",
                      "scope": 46573,
                      "src": "3771:8:78",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 46561,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "3771:4:78",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "visibility": "internal"
                    },
                    null
                  ],
                  "id": 46567,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 46565,
                        "name": "_initializationCalldata",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46558,
                        "src": "3814:23:78",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "expression": {
                        "id": 46563,
                        "name": "_implementation",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46556,
                        "src": "3785:15:78",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "id": 46564,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "delegatecall",
                      "nodeType": "MemberAccess",
                      "src": "3785:28:78",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_baredelegatecall_nonpayable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                        "typeString": "function (bytes memory) returns (bool,bytes memory)"
                      }
                    },
                    "id": 46566,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3785:53:78",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                      "typeString": "tuple(bool,bytes memory)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3770:68:78"
                },
                {
                  "condition": {
                    "id": 46569,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "!",
                    "prefix": true,
                    "src": "3937:4:78",
                    "subExpression": {
                      "id": 46568,
                      "name": "_ok",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46562,
                      "src": "3938:3:78",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 46572,
                  "nodeType": "IfStatement",
                  "src": "3933:157:78",
                  "trueBody": {
                    "id": 46571,
                    "nodeType": "Block",
                    "src": "3943:147:78",
                    "statements": [
                      {
                        "AST": {
                          "nodeType": "YulBlock",
                          "src": "3966:114:78",
                          "statements": [
                            {
                              "expression": {
                                "arguments": [
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "3999:1:78",
                                    "type": "",
                                    "value": "0"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "4002:1:78",
                                    "type": "",
                                    "value": "0"
                                  },
                                  {
                                    "arguments": [],
                                    "functionName": {
                                      "name": "returndatasize",
                                      "nodeType": "YulIdentifier",
                                      "src": "4005:14:78"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "4005:16:78"
                                  }
                                ],
                                "functionName": {
                                  "name": "returndatacopy",
                                  "nodeType": "YulIdentifier",
                                  "src": "3984:14:78"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "3984:38:78"
                              },
                              "nodeType": "YulExpressionStatement",
                              "src": "3984:38:78"
                            },
                            {
                              "expression": {
                                "arguments": [
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "4046:1:78",
                                    "type": "",
                                    "value": "0"
                                  },
                                  {
                                    "arguments": [],
                                    "functionName": {
                                      "name": "returndatasize",
                                      "nodeType": "YulIdentifier",
                                      "src": "4049:14:78"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "4049:16:78"
                                  }
                                ],
                                "functionName": {
                                  "name": "revert",
                                  "nodeType": "YulIdentifier",
                                  "src": "4039:6:78"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "4039:27:78"
                              },
                              "nodeType": "YulExpressionStatement",
                              "src": "4039:27:78"
                            }
                          ]
                        },
                        "evmVersion": "istanbul",
                        "externalReferences": [],
                        "id": 46570,
                        "nodeType": "InlineAssembly",
                        "src": "3957:123:78"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 46554,
              "nodeType": "StructuredDocumentation",
              "src": "3171:386:78",
              "text": " @notice Call the initialization function on the implementation\n Used at deployment to initialize the proxy\n based on the logic for initialization defined at the implementation\n @param _implementation - Contract to which the initalization is delegated\n @param _initializationCalldata - Calldata supplied when calling the initialization function"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_initialize",
            "parameters": {
              "id": 46559,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 46556,
                  "mutability": "mutable",
                  "name": "_implementation",
                  "nodeType": "VariableDeclaration",
                  "scope": 46574,
                  "src": "3592:23:78",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 46555,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3592:7:78",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 46558,
                  "mutability": "mutable",
                  "name": "_initializationCalldata",
                  "nodeType": "VariableDeclaration",
                  "scope": 46574,
                  "src": "3625:36:78",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 46557,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "3625:5:78",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3582:85:78"
            },
            "returnParameters": {
              "id": 46560,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3676:0:78"
            },
            "scope": 46642,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "private"
          },
          {
            "id": 46584,
            "nodeType": "FunctionDefinition",
            "src": "4220:77:78",
            "body": {
              "id": 46583,
              "nodeType": "Block",
              "src": "4249:48:78",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "id": 46579,
                          "name": "_getImplementation",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [
                            46605,
                            46641
                          ],
                          "referencedDeclaration": 46605,
                          "src": "4269:18:78",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                            "typeString": "function () view returns (address)"
                          }
                        },
                        "id": 46580,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "4269:20:78",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 46578,
                      "name": "_delegate",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46592,
                      "src": "4259:9:78",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 46581,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4259:31:78",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 46582,
                  "nodeType": "ExpressionStatement",
                  "src": "4259:31:78"
                }
              ]
            },
            "documentation": {
              "id": 46575,
              "nodeType": "StructuredDocumentation",
              "src": "4102:113:78",
              "text": " @notice Delegates function calls to the implementation contract returned by the Upgrade Beacon"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_fallback",
            "parameters": {
              "id": 46576,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4238:2:78"
            },
            "returnParameters": {
              "id": 46577,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4249:0:78"
            },
            "scope": 46642,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "private"
          },
          {
            "id": 46592,
            "nodeType": "FunctionDefinition",
            "src": "4736:1065:78",
            "body": {
              "id": 46591,
              "nodeType": "Block",
              "src": "4788:1013:78",
              "statements": [
                {
                  "AST": {
                    "nodeType": "YulBlock",
                    "src": "4807:988:78",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "5060:1:78",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "5063:1:78",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "arguments": [],
                              "functionName": {
                                "name": "calldatasize",
                                "nodeType": "YulIdentifier",
                                "src": "5066:12:78"
                              },
                              "nodeType": "YulFunctionCall",
                              "src": "5066:14:78"
                            }
                          ],
                          "functionName": {
                            "name": "calldatacopy",
                            "nodeType": "YulIdentifier",
                            "src": "5047:12:78"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "5047:34:78"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "5047:34:78"
                      },
                      {
                        "nodeType": "YulVariableDeclaration",
                        "src": "5254:185:78",
                        "value": {
                          "arguments": [
                            {
                              "arguments": [],
                              "functionName": {
                                "name": "gas",
                                "nodeType": "YulIdentifier",
                                "src": "5298:3:78"
                              },
                              "nodeType": "YulFunctionCall",
                              "src": "5298:5:78"
                            },
                            {
                              "name": "_implementation",
                              "nodeType": "YulIdentifier",
                              "src": "5321:15:78"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "5354:1:78",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "arguments": [],
                              "functionName": {
                                "name": "calldatasize",
                                "nodeType": "YulIdentifier",
                                "src": "5373:12:78"
                              },
                              "nodeType": "YulFunctionCall",
                              "src": "5373:14:78"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "5405:1:78",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "5424:1:78",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "delegatecall",
                            "nodeType": "YulIdentifier",
                            "src": "5268:12:78"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "5268:171:78"
                        },
                        "variables": [
                          {
                            "name": "result",
                            "nodeType": "YulTypedName",
                            "src": "5258:6:78",
                            "type": ""
                          }
                        ]
                      },
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "5529:1:78",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "5532:1:78",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "arguments": [],
                              "functionName": {
                                "name": "returndatasize",
                                "nodeType": "YulIdentifier",
                                "src": "5535:14:78"
                              },
                              "nodeType": "YulFunctionCall",
                              "src": "5535:16:78"
                            }
                          ],
                          "functionName": {
                            "name": "returndatacopy",
                            "nodeType": "YulIdentifier",
                            "src": "5514:14:78"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "5514:38:78"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "5514:38:78"
                      },
                      {
                        "cases": [
                          {
                            "body": {
                              "nodeType": "YulBlock",
                              "src": "5646:59:78",
                              "statements": [
                                {
                                  "expression": {
                                    "arguments": [
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "5671:1:78",
                                        "type": "",
                                        "value": "0"
                                      },
                                      {
                                        "arguments": [],
                                        "functionName": {
                                          "name": "returndatasize",
                                          "nodeType": "YulIdentifier",
                                          "src": "5674:14:78"
                                        },
                                        "nodeType": "YulFunctionCall",
                                        "src": "5674:16:78"
                                      }
                                    ],
                                    "functionName": {
                                      "name": "revert",
                                      "nodeType": "YulIdentifier",
                                      "src": "5664:6:78"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "5664:27:78"
                                  },
                                  "nodeType": "YulExpressionStatement",
                                  "src": "5664:27:78"
                                }
                              ]
                            },
                            "nodeType": "YulCase",
                            "src": "5639:66:78",
                            "value": {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "5644:1:78",
                              "type": "",
                              "value": "0"
                            }
                          },
                          {
                            "body": {
                              "nodeType": "YulBlock",
                              "src": "5726:59:78",
                              "statements": [
                                {
                                  "expression": {
                                    "arguments": [
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "5751:1:78",
                                        "type": "",
                                        "value": "0"
                                      },
                                      {
                                        "arguments": [],
                                        "functionName": {
                                          "name": "returndatasize",
                                          "nodeType": "YulIdentifier",
                                          "src": "5754:14:78"
                                        },
                                        "nodeType": "YulFunctionCall",
                                        "src": "5754:16:78"
                                      }
                                    ],
                                    "functionName": {
                                      "name": "return",
                                      "nodeType": "YulIdentifier",
                                      "src": "5744:6:78"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "5744:27:78"
                                  },
                                  "nodeType": "YulExpressionStatement",
                                  "src": "5744:27:78"
                                }
                              ]
                            },
                            "nodeType": "YulCase",
                            "src": "5718:67:78",
                            "value": "default"
                          }
                        ],
                        "expression": {
                          "name": "result",
                          "nodeType": "YulIdentifier",
                          "src": "5572:6:78"
                        },
                        "nodeType": "YulSwitch",
                        "src": "5565:220:78"
                      }
                    ]
                  },
                  "evmVersion": "istanbul",
                  "externalReferences": [
                    {
                      "declaration": 46587,
                      "isOffset": false,
                      "isSlot": false,
                      "src": "5321:15:78",
                      "valueSize": 1
                    }
                  ],
                  "id": 46590,
                  "nodeType": "InlineAssembly",
                  "src": "4798:997:78"
                }
              ]
            },
            "documentation": {
              "id": 46585,
              "nodeType": "StructuredDocumentation",
              "src": "4303:428:78",
              "text": " @notice Delegate function execution to the implementation contract\n @dev This is a low level function that doesn't return to its internal\n call site. It will return whatever is returned by the implementation to the\n external caller, reverting and returning the revert data if implementation\n reverts.\n @param _implementation - Address to which the function execution is delegated"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_delegate",
            "parameters": {
              "id": 46588,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 46587,
                  "mutability": "mutable",
                  "name": "_implementation",
                  "nodeType": "VariableDeclaration",
                  "scope": 46592,
                  "src": "4755:23:78",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 46586,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4755:7:78",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4754:25:78"
            },
            "returnParameters": {
              "id": 46589,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4788:0:78"
            },
            "scope": 46642,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "private"
          },
          {
            "id": 46605,
            "nodeType": "FunctionDefinition",
            "src": "5983:173:78",
            "body": {
              "id": 46604,
              "nodeType": "Block",
              "src": "6088:68:78",
              "statements": [
                {
                  "expression": {
                    "id": 46602,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 46598,
                      "name": "_implementation",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46596,
                      "src": "6098:15:78",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "arguments": [
                        {
                          "id": 46600,
                          "name": "upgradeBeacon",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 46491,
                          "src": "6135:13:78",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "id": 46599,
                        "name": "_getImplementation",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [
                          46605,
                          46641
                        ],
                        "referencedDeclaration": 46641,
                        "src": "6116:18:78",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_address_$",
                          "typeString": "function (address) view returns (address)"
                        }
                      },
                      "id": 46601,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "6116:33:78",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "6098:51:78",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 46603,
                  "nodeType": "ExpressionStatement",
                  "src": "6098:51:78"
                }
              ]
            },
            "documentation": {
              "id": 46593,
              "nodeType": "StructuredDocumentation",
              "src": "5807:171:78",
              "text": " @notice Call the Upgrade Beacon to get the current implementation contract address\n @return _implementation Address of the current implementation."
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_getImplementation",
            "parameters": {
              "id": 46594,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6010:2:78"
            },
            "returnParameters": {
              "id": 46597,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 46596,
                  "mutability": "mutable",
                  "name": "_implementation",
                  "nodeType": "VariableDeclaration",
                  "scope": 46605,
                  "src": "6059:23:78",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 46595,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6059:7:78",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "6058:25:78"
            },
            "scope": 46642,
            "stateMutability": "view",
            "virtual": false,
            "visibility": "private"
          },
          {
            "id": 46641,
            "nodeType": "FunctionDefinition",
            "src": "6598:558:78",
            "body": {
              "id": 46640,
              "nodeType": "Block",
              "src": "6725:431:78",
              "statements": [
                {
                  "assignments": [
                    46614,
                    46616
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 46614,
                      "mutability": "mutable",
                      "name": "_ok",
                      "nodeType": "VariableDeclaration",
                      "scope": 46640,
                      "src": "6811:8:78",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 46613,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "6811:4:78",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 46616,
                      "mutability": "mutable",
                      "name": "_returnData",
                      "nodeType": "VariableDeclaration",
                      "scope": 46640,
                      "src": "6821:24:78",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes_memory_ptr",
                        "typeString": "bytes"
                      },
                      "typeName": {
                        "id": 46615,
                        "name": "bytes",
                        "nodeType": "ElementaryTypeName",
                        "src": "6821:5:78",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_storage_ptr",
                          "typeString": "bytes"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 46621,
                  "initialValue": {
                    "arguments": [
                      {
                        "hexValue": "",
                        "id": 46619,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "6875:2:78",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                          "typeString": "literal_string \"\""
                        },
                        "value": ""
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                          "typeString": "literal_string \"\""
                        }
                      ],
                      "expression": {
                        "id": 46617,
                        "name": "_upgradeBeacon",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46608,
                        "src": "6849:14:78",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "id": 46618,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "staticcall",
                      "nodeType": "MemberAccess",
                      "src": "6849:25:78",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_barestaticcall_view$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                        "typeString": "function (bytes memory) view returns (bool,bytes memory)"
                      }
                    },
                    "id": 46620,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6849:29:78",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                      "typeString": "tuple(bool,bytes memory)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "6810:68:78"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 46623,
                        "name": "_ok",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46614,
                        "src": "6979:3:78",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "arguments": [
                          {
                            "id": 46626,
                            "name": "_returnData",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 46616,
                            "src": "6991:11:78",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes memory"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes memory"
                            }
                          ],
                          "id": 46625,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "6984:6:78",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_string_storage_ptr_$",
                            "typeString": "type(string storage pointer)"
                          },
                          "typeName": {
                            "id": 46624,
                            "name": "string",
                            "nodeType": "ElementaryTypeName",
                            "src": "6984:6:78",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 46627,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "6984:19:78",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 46622,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "6971:7:78",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 46628,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6971:33:78",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 46629,
                  "nodeType": "ExpressionStatement",
                  "src": "6971:33:78"
                },
                {
                  "expression": {
                    "id": 46638,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 46630,
                      "name": "_implementation",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46611,
                      "src": "7097:15:78",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "arguments": [
                        {
                          "id": 46633,
                          "name": "_returnData",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 46616,
                          "src": "7126:11:78",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        {
                          "components": [
                            {
                              "id": 46635,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "7140:7:78",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 46634,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "7140:7:78",
                                "typeDescriptions": {}
                              }
                            }
                          ],
                          "id": 46636,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "7139:9:78",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          },
                          {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          }
                        ],
                        "expression": {
                          "id": 46631,
                          "name": "abi",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -1,
                          "src": "7115:3:78",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_abi",
                            "typeString": "abi"
                          }
                        },
                        "id": 46632,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "memberName": "decode",
                        "nodeType": "MemberAccess",
                        "src": "7115:10:78",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                          "typeString": "function () pure"
                        }
                      },
                      "id": 46637,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "7115:34:78",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address_payable",
                        "typeString": "address payable"
                      }
                    },
                    "src": "7097:52:78",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 46639,
                  "nodeType": "ExpressionStatement",
                  "src": "7097:52:78"
                }
              ]
            },
            "documentation": {
              "id": 46606,
              "nodeType": "StructuredDocumentation",
              "src": "6162:431:78",
              "text": " @notice Call the Upgrade Beacon to get the current implementation contract address\n @dev _upgradeBeacon is passed as a parameter so that\n we can also use this function in the constructor,\n where we can't access immutable variables.\n @param _upgradeBeacon Address of the UpgradeBeacon storing the current implementation\n @return _implementation Address of the current implementation."
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_getImplementation",
            "parameters": {
              "id": 46609,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 46608,
                  "mutability": "mutable",
                  "name": "_upgradeBeacon",
                  "nodeType": "VariableDeclaration",
                  "scope": 46641,
                  "src": "6626:22:78",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 46607,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6626:7:78",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "6625:24:78"
            },
            "returnParameters": {
              "id": 46612,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 46611,
                  "mutability": "mutable",
                  "name": "_implementation",
                  "nodeType": "VariableDeclaration",
                  "scope": 46641,
                  "src": "6696:23:78",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 46610,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6696:7:78",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "6695:25:78"
            },
            "scope": 46642,
            "stateMutability": "view",
            "virtual": false,
            "visibility": "private"
          }
        ],
        "abstract": false,
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": {
          "id": 46489,
          "nodeType": "StructuredDocumentation",
          "src": "170:951:78",
          "text": " @title UpgradeBeaconProxy\n @notice\n Proxy contract which delegates all logic, including initialization,\n to an implementation contract.\n The implementation contract is stored within an Upgrade Beacon contract;\n the implementation contract can be changed by performing an upgrade on the Upgrade Beacon contract.\n The Upgrade Beacon contract for this Proxy is immutably specified at deployment.\n @dev This implementation combines the gas savings of keeping the UpgradeBeacon address outside of contract storage\n found in 0age's implementation:\n https://github.com/dharma-eng/dharma-smart-wallet/blob/master/contracts/proxies/smart-wallet/UpgradeBeaconProxyV1.sol\n With the added safety checks that the UpgradeBeacon and implementation are contracts at time of deployment\n found in OpenZeppelin's implementation:\n https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/proxy/beacon/BeaconProxy.sol"
        },
        "fullyImplemented": true,
        "linearizedBaseContracts": [
          46642
        ],
        "name": "UpgradeBeaconProxy",
        "scope": 46643
      }
    ],
    "license": "MIT"
  },
  "id": 78
}