{
  "contractName": "Registry",
  "abi": [
    {
      "constant": false,
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "_newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "name": "_opened",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "name": "previousOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipRenounced",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "constant": false,
      "inputs": [],
      "name": "open",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "_identifier",
          "type": "string"
        },
        {
          "name": "_version",
          "type": "uint256"
        },
        {
          "name": "_template",
          "type": "address"
        }
      ],
      "name": "register",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "numberOfIdentifiers",
      "outputs": [
        {
          "name": "size",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "_index",
          "type": "uint256"
        }
      ],
      "name": "identifierAt",
      "outputs": [
        {
          "name": "identifier",
          "type": "string"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "_identifier",
          "type": "string"
        }
      ],
      "name": "versionsOf",
      "outputs": [
        {
          "name": "version",
          "type": "uint256[]"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "_identifier",
          "type": "string"
        },
        {
          "name": "_version",
          "type": "uint256"
        }
      ],
      "name": "templateOf",
      "outputs": [
        {
          "name": "template",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "_identifier",
          "type": "string"
        }
      ],
      "name": "latestTemplateOf",
      "outputs": [
        {
          "name": "template",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x608060405234801561001057600080fd5b506040516020806113f383398101806040528101908080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600060146101000a81548160ff021916908315150217905550506113568061009d6000396000f3006080604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063121a42c0146100a957806324d48c0d1461014f5780632a4798da1461017a5780632cf5cf8b146102235780635147fba1146102e15780635dc1aad314610394578063715018a6146104275780638da5cb5b1461043e578063f2fde38b14610495578063fcfff16f146104d8575b600080fd5b3480156100b557600080fd5b506100d4600480360381019080803590602001909291905050506104ef565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101145780820151818401526020810190506100f9565b50505050905090810190601f1680156101415780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015b57600080fd5b506101646105aa565b6040518082815260200191505060405180910390f35b34801561018657600080fd5b506101e1600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506105b7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561022f57600080fd5b5061028a600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506106eb565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156102cd5780820151818401526020810190506102b2565b505050509050019250505060405180910390f35b3480156102ed57600080fd5b50610352600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001909291905050506107ae565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103a057600080fd5b50610425600480360381019080803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610855565b005b34801561043357600080fd5b5061043c610f85565b005b34801561044a57600080fd5b50610453611087565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104a157600080fd5b506104d6600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110ac565b005b3480156104e457600080fd5b506104ed611113565b005b606060018281548110151561050057fe5b906000526020600020018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561059e5780601f106105735761010080835404028352916020019161059e565b820191906000526020600020905b81548152906001019060200180831161058157829003601f168201915b50505050509050919050565b6000600180549050905090565b6000806003836040518082805190602001908083835b6020831015156105f257805182526020820191506020810190506020830392506105cd565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902090506004836040518082805190602001908083835b60208310151561065f578051825260208201915060208101905060208303925061063a565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260018480549050038154811015156106a957fe5b9060005260206000200154815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b60606003826040518082805190602001908083835b6020831015156107255780518252602082019150602081019050602083039250610700565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806020026020016040519081016040528092919081815260200182805480156107a257602002820191906000526020600020905b81548152602001906001019080831161078e575b50505050509050919050565b60006004836040518082805190602001908083835b6020831015156107e857805182526020820191506020810190506020830392506107c3565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b600080600060149054906101000a900460ff16806108bf57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156108ca57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff166301ffc9a7806040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180827c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001915050602060405180830381600087803b15801561097757600080fd5b505af115801561098b573d6000803e3d6000fd5b505050506040513d60208110156109a157600080fd5b810190808051906020019092919050505015156109bd57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff166301ffc9a763d48445ff6040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180827c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001915050602060405180830381600087803b158015610a6e57600080fd5b505af1158015610a82573d6000803e3d6000fd5b505050506040513d6020811015610a9857600080fd5b81019080805190602001909291905050501515610ab457600080fd5b6002856040518082805190602001908083835b602083101515610aec5780518252602082019150602081019050602083039250610ac7565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161480610ba857503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b1515610c42576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001807f6964656e74696669657220616c7265616479207265676973746572656420627981526020017f20616e6f746865722072656769737472616e740000000000000000000000000081525060400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d61576001859080600181540180825580915050906001820390600052602060002001600090919290919091509080519060200190610cb4929190611285565b5050336002866040518082805190602001908083835b602083101515610cef5780518252602082019150602081019050602083039250610cca565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6003856040518082805190602001908083835b602083101515610d995780518252602082019150602081019050602083039250610d74565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390209050600081805490501115610e9857806001828054905003815481101515610df057fe5b906000526020600020015484111515610e97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f6e65772076657273696f6e206d7573742062652067726561746572207468616e81526020017f206f6c642076657273696f6e730000000000000000000000000000000000000081525060400191505060405180910390fd5b5b80849080600181540180825580915050906001820390600052602060002001600090919290919091505550826004866040518082805190602001908083835b602083101515610efc5780518252602082019150602081019050602083039250610ed7565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610fe057600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a260008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561110757600080fd5b6111108161118b565b50565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561116e57600080fd5b6001600060146101000a81548160ff021916908315150217905550565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156111c757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106112c657805160ff19168380011785556112f4565b828001600101855582156112f4579182015b828111156112f35782518255916020019190600101906112d8565b5b5090506113019190611305565b5090565b61132791905b8082111561132357600081600090555060010161130b565b5090565b905600a165627a7a723058203c4cf6901909326c971da91f5539dd3ce0a458e3132ccbac3c9daec69fe559df0029",
  "deployedBytecode": "0x6080604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063121a42c0146100a957806324d48c0d1461014f5780632a4798da1461017a5780632cf5cf8b146102235780635147fba1146102e15780635dc1aad314610394578063715018a6146104275780638da5cb5b1461043e578063f2fde38b14610495578063fcfff16f146104d8575b600080fd5b3480156100b557600080fd5b506100d4600480360381019080803590602001909291905050506104ef565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101145780820151818401526020810190506100f9565b50505050905090810190601f1680156101415780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015b57600080fd5b506101646105aa565b6040518082815260200191505060405180910390f35b34801561018657600080fd5b506101e1600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506105b7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561022f57600080fd5b5061028a600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506106eb565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156102cd5780820151818401526020810190506102b2565b505050509050019250505060405180910390f35b3480156102ed57600080fd5b50610352600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001909291905050506107ae565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103a057600080fd5b50610425600480360381019080803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610855565b005b34801561043357600080fd5b5061043c610f85565b005b34801561044a57600080fd5b50610453611087565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104a157600080fd5b506104d6600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110ac565b005b3480156104e457600080fd5b506104ed611113565b005b606060018281548110151561050057fe5b906000526020600020018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561059e5780601f106105735761010080835404028352916020019161059e565b820191906000526020600020905b81548152906001019060200180831161058157829003601f168201915b50505050509050919050565b6000600180549050905090565b6000806003836040518082805190602001908083835b6020831015156105f257805182526020820191506020810190506020830392506105cd565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902090506004836040518082805190602001908083835b60208310151561065f578051825260208201915060208101905060208303925061063a565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260018480549050038154811015156106a957fe5b9060005260206000200154815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b60606003826040518082805190602001908083835b6020831015156107255780518252602082019150602081019050602083039250610700565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806020026020016040519081016040528092919081815260200182805480156107a257602002820191906000526020600020905b81548152602001906001019080831161078e575b50505050509050919050565b60006004836040518082805190602001908083835b6020831015156107e857805182526020820191506020810190506020830392506107c3565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b600080600060149054906101000a900460ff16806108bf57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156108ca57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff166301ffc9a7806040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180827c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001915050602060405180830381600087803b15801561097757600080fd5b505af115801561098b573d6000803e3d6000fd5b505050506040513d60208110156109a157600080fd5b810190808051906020019092919050505015156109bd57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff166301ffc9a763d48445ff6040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180827c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001915050602060405180830381600087803b158015610a6e57600080fd5b505af1158015610a82573d6000803e3d6000fd5b505050506040513d6020811015610a9857600080fd5b81019080805190602001909291905050501515610ab457600080fd5b6002856040518082805190602001908083835b602083101515610aec5780518252602082019150602081019050602083039250610ac7565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161480610ba857503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b1515610c42576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001807f6964656e74696669657220616c7265616479207265676973746572656420627981526020017f20616e6f746865722072656769737472616e740000000000000000000000000081525060400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d61576001859080600181540180825580915050906001820390600052602060002001600090919290919091509080519060200190610cb4929190611285565b5050336002866040518082805190602001908083835b602083101515610cef5780518252602082019150602081019050602083039250610cca565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6003856040518082805190602001908083835b602083101515610d995780518252602082019150602081019050602083039250610d74565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390209050600081805490501115610e9857806001828054905003815481101515610df057fe5b906000526020600020015484111515610e97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f6e65772076657273696f6e206d7573742062652067726561746572207468616e81526020017f206f6c642076657273696f6e730000000000000000000000000000000000000081525060400191505060405180910390fd5b5b80849080600181540180825580915050906001820390600052602060002001600090919290919091505550826004866040518082805190602001908083835b602083101515610efc5780518252602082019150602081019050602083039250610ed7565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610fe057600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a260008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561110757600080fd5b6111108161118b565b50565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561116e57600080fd5b6001600060146101000a81548160ff021916908315150217905550565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156111c757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106112c657805160ff19168380011785556112f4565b828001600101855582156112f4579182015b828111156112f35782518255916020019190600101906112d8565b5b5090506113019190611305565b5090565b61132791905b8082111561132357600081600090555060010161130b565b5090565b905600a165627a7a723058203c4cf6901909326c971da91f5539dd3ce0a458e3132ccbac3c9daec69fe559df0029",
  "sourceMap": "141:2670:17:-;;;407:76;8:9:-1;5:2;;;30:1;27;20:12;5:2;407:76:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;575:10:39;567:5;;:18;;;;;;;;;;;;;;;;;;469:7:17;460:6;;:16;;;;;;;;;;;;;;;;;;407:76;141:2670;;;;;;",
  "deployedSourceMap": "141:2670:17:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2116:118;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2116:118:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;2116:118:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2005:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2005:105:17;;;;;;;;;;;;;;;;;;;;;;;2557:252;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2557:252:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2240:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2240:134:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;2240:134:17;;;;;;;;;;;;;;;;;2380:171;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2380:171:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1003:996;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1003:996:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1001:111:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1001:111:39;;;;;;238:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;238:20:39;;;;;;;;;;;;;;;;;;;;;;;;;;;1274:103;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1274:103:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;567:63:17;;8:9:-1;5:2;;;30:1;27;20:12;5:2;567:63:17;;;;;;2116:118;2172:17;2208:11;2220:6;2208:19;;;;;;;;;;;;;;;;;2201:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2116:118;;;:::o;2005:105::-;2057:9;2085:11;:18;;;;2078:25;;2005:105;:::o;2557:252::-;2624:17;2653:23;2679:20;2700:11;2679:33;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2679:33:17;;;;;;;;;;;;;;;;;;;;;2653:59;;2729:29;2759:11;2729:42;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2729:42:17;;;;;;;;;;;;;;;;;;;;;:73;2772:8;2799:1;2781:8;:15;;;;:19;2772:29;;;;;;;;;;;;;;;;;;2729:73;;;;;;;;;;;;;;;;;;;;;2722:80;;2557:252;;;;:::o;2240:134::-;2301:14;2334:20;2355:11;2334:33;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2334:33:17;;;;;;;;;;;;;;;;;;;;;2327:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2240:134;;;:::o;2380:171::-;2456:17;2492:29;2522:11;2492:42;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2492:42:17;;;;;;;;;;;;;;;;;;;;;:52;2535:8;2492:52;;;;;;;;;;;;;;;;;;;;;2485:59;;2380:171;;;;:::o;1003:996::-;1321:18;1669:23;1101:6;;;;;;;;;;;:29;;;;1125:5;;;;;;;;;;;1111:19;;:10;:19;;;1101:29;1093:38;;;;;;;;1180:9;:27;;;1208:10;1180:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1180:39:17;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1180:39:17;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1180:39:17;;;;;;;;;;;;;;;;1172:48;;;;;;;;1270:9;:27;;;1298:10;1270:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1270:39:17;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1270:39:17;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1270:39:17;;;;;;;;;;;;;;;;1262:48;;;;;;;;1342:22;1365:11;1342:35;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1342:35:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1321:56;;1417:1;1395:24;;:10;:24;;;:52;;;;1437:10;1423:24;;:10;:24;;;1395:52;1387:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1539:1;1517:24;;:10;:24;;;1513:146;;;1557:11;1574;1557:29;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;1557:29:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;1638:10;1600:22;1623:11;1600:35;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1600:35:17;;;;;;;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;1513:146;1695:20;1716:11;1695:33;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1695:33:17;;;;;;;;;;;;;;;;;;;;;1669:59;;1760:1;1742:8;:15;;;;:19;1738:148;;;1796:8;1823:1;1805:8;:15;;;;:19;1796:29;;;;;;;;;;;;;;;;;;1785:8;:40;1777:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1738:148;1895:8;1909;1895:23;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;1895:23:17;;;;;;;;;;;;;;;;;;;;;;1983:9;1928:29;1958:11;1928:42;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1928:42:17;;;;;;;;;;;;;;;;;;;;;:52;1971:8;1928:52;;;;;;;;;;;;:64;;;;;;;;;;;;;;;;;;1003:996;;;;;:::o;1001:111:39:-;719:5;;;;;;;;;;;705:19;;:10;:19;;;697:28;;;;;;;;1077:5;;;;;;;;;;;1058:25;;;;;;;;;;;;1105:1;1089:5;;:18;;;;;;;;;;;;;;;;;;1001:111::o;238:20::-;;;;;;;;;;;;;:::o;1274:103::-;719:5;;;;;;;;;;;705:19;;:10;:19;;;697:28;;;;;;;;1343:29;1362:9;1343:18;:29::i;:::-;1274:103;:::o;567:63:17:-;719:5:39;;;;;;;;;;;705:19;;:10;:19;;;697:28;;;;;;;;619:4:17;610:6;;:13;;;;;;;;;;;;;;;;;;567:63::o;1512:171:39:-;1603:1;1582:23;;:9;:23;;;;1574:32;;;;;;;;1645:9;1617:38;;1638:5;;;;;;;;;;;1617:38;;;;;;;;;;;;1669:9;1661:5;;:17;;;;;;;;;;;;;;;;;;1512:171;:::o;141:2670:17:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o",
  "source": "pragma solidity ^0.4.24;\n\nimport \"../template/Template.sol\";\n\n/**\n * @title Registry\n * @notice Registry maintains Contracts by version.\n */\ncontract Registry is Ownable {\n    bool opened;\n    string[] identifiers;\n    mapping(string => address) registrantOfIdentifier;\n    mapping(string => uint[]) versionsOfIdentifier;\n    mapping(string => mapping(uint => Template)) templateOfVersionOfIdentifier;\n\n    constructor(bool _opened) Ownable() public {\n        opened = _opened;\n    }\n\n    /**\n     * @notice Open the Registry so that anyone can register.\n     */\n    function open() onlyOwner public {\n        opened = true;\n    }\n\n    /**\n     * @notice Registers a new `Template`.\n     * @param _identifier If any template was registered for the same identifier, the registrant of the templates must be the same.\n     * @param _version If any template was registered for the same identifier, new version must be greater than the old one.\n     * @param _template Template to be registered.\n     */\n    function register(string _identifier, uint _version, Template _template) public {\n        require(opened || msg.sender == owner);\n\n        // InterfaceId_ERC165\n        require(_template.supportsInterface(0x01ffc9a7));\n        // InterfaceId_Template\n        require(_template.supportsInterface(0xd48445ff));\n\n        address registrant = registrantOfIdentifier[_identifier];\n        require(registrant == address(0) || registrant == msg.sender, \"identifier already registered by another registrant\");\n        if (registrant == address(0)) {\n            identifiers.push(_identifier);\n            registrantOfIdentifier[_identifier] = msg.sender;\n        }\n\n        uint[] storage versions = versionsOfIdentifier[_identifier];\n        if (versions.length > 0) {\n            require(_version > versions[versions.length - 1], \"new version must be greater than old versions\");\n        }\n        versions.push(_version);\n        templateOfVersionOfIdentifier[_identifier][_version] = _template;\n    }\n\n    function numberOfIdentifiers() public view returns (uint size) {\n        return identifiers.length;\n    }\n\n    function identifierAt(uint _index) public view returns (string identifier) {\n        return identifiers[_index];\n    }\n\n    function versionsOf(string _identifier) public view returns (uint[] version) {\n        return versionsOfIdentifier[_identifier];\n    }\n\n    function templateOf(string _identifier, uint _version) public view returns (Template template) {\n        return templateOfVersionOfIdentifier[_identifier][_version];\n    }\n\n    function latestTemplateOf(string _identifier) public view returns (Template template) {\n        uint[] storage versions = versionsOfIdentifier[_identifier];\n        return templateOfVersionOfIdentifier[_identifier][versions[versions.length - 1]];\n    }\n}\n",
  "sourcePath": "tokenboost-solidity/contracts/registry/Registry.sol",
  "ast": {
    "absolutePath": "tokenboost-solidity/contracts/registry/Registry.sol",
    "exportedSymbols": {
      "Registry": [
        2212
      ]
    },
    "id": 2213,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 1976,
        "literals": [
          "solidity",
          "^",
          "0.4",
          ".24"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:24:17"
      },
      {
        "absolutePath": "tokenboost-solidity/contracts/template/Template.sol",
        "file": "../template/Template.sol",
        "id": 1977,
        "nodeType": "ImportDirective",
        "scope": 2213,
        "sourceUnit": 3129,
        "src": "26:34:17",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 1978,
              "name": "Ownable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 6426,
              "src": "162:7:17",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Ownable_$6426",
                "typeString": "contract Ownable"
              }
            },
            "id": 1979,
            "nodeType": "InheritanceSpecifier",
            "src": "162:7:17"
          }
        ],
        "contractDependencies": [
          6426
        ],
        "contractKind": "contract",
        "documentation": "@title Registry\n@notice Registry maintains Contracts by version.",
        "fullyImplemented": true,
        "id": 2212,
        "linearizedBaseContracts": [
          2212,
          6426
        ],
        "name": "Registry",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "id": 1981,
            "name": "opened",
            "nodeType": "VariableDeclaration",
            "scope": 2212,
            "src": "176:11:17",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_bool",
              "typeString": "bool"
            },
            "typeName": {
              "id": 1980,
              "name": "bool",
              "nodeType": "ElementaryTypeName",
              "src": "176:4:17",
              "typeDescriptions": {
                "typeIdentifier": "t_bool",
                "typeString": "bool"
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 1984,
            "name": "identifiers",
            "nodeType": "VariableDeclaration",
            "scope": 2212,
            "src": "193:20:17",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_array$_t_string_storage_$dyn_storage",
              "typeString": "string[]"
            },
            "typeName": {
              "baseType": {
                "id": 1982,
                "name": "string",
                "nodeType": "ElementaryTypeName",
                "src": "193:6:17",
                "typeDescriptions": {
                  "typeIdentifier": "t_string_storage_ptr",
                  "typeString": "string"
                }
              },
              "id": 1983,
              "length": null,
              "nodeType": "ArrayTypeName",
              "src": "193:8:17",
              "typeDescriptions": {
                "typeIdentifier": "t_array$_t_string_storage_$dyn_storage_ptr",
                "typeString": "string[]"
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 1988,
            "name": "registrantOfIdentifier",
            "nodeType": "VariableDeclaration",
            "scope": 2212,
            "src": "219:49:17",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_string_memory_$_t_address_$",
              "typeString": "mapping(string => address)"
            },
            "typeName": {
              "id": 1987,
              "keyType": {
                "id": 1985,
                "name": "string",
                "nodeType": "ElementaryTypeName",
                "src": "227:6:17",
                "typeDescriptions": {
                  "typeIdentifier": "t_string_storage_ptr",
                  "typeString": "string"
                }
              },
              "nodeType": "Mapping",
              "src": "219:26:17",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_string_memory_$_t_address_$",
                "typeString": "mapping(string => address)"
              },
              "valueType": {
                "id": 1986,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "237:7:17",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 1993,
            "name": "versionsOfIdentifier",
            "nodeType": "VariableDeclaration",
            "scope": 2212,
            "src": "274:46:17",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_string_memory_$_t_array$_t_uint256_$dyn_storage_$",
              "typeString": "mapping(string => uint256[])"
            },
            "typeName": {
              "id": 1992,
              "keyType": {
                "id": 1989,
                "name": "string",
                "nodeType": "ElementaryTypeName",
                "src": "282:6:17",
                "typeDescriptions": {
                  "typeIdentifier": "t_string_storage_ptr",
                  "typeString": "string"
                }
              },
              "nodeType": "Mapping",
              "src": "274:25:17",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_string_memory_$_t_array$_t_uint256_$dyn_storage_$",
                "typeString": "mapping(string => uint256[])"
              },
              "valueType": {
                "baseType": {
                  "id": 1990,
                  "name": "uint",
                  "nodeType": "ElementaryTypeName",
                  "src": "292:4:17",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "id": 1991,
                "length": null,
                "nodeType": "ArrayTypeName",
                "src": "292:6:17",
                "typeDescriptions": {
                  "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                  "typeString": "uint256[]"
                }
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 1999,
            "name": "templateOfVersionOfIdentifier",
            "nodeType": "VariableDeclaration",
            "scope": 2212,
            "src": "326:74:17",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_string_memory_$_t_mapping$_t_uint256_$_t_contract$_Template_$3128_$_$",
              "typeString": "mapping(string => mapping(uint256 => contract Template))"
            },
            "typeName": {
              "id": 1998,
              "keyType": {
                "id": 1994,
                "name": "string",
                "nodeType": "ElementaryTypeName",
                "src": "334:6:17",
                "typeDescriptions": {
                  "typeIdentifier": "t_string_storage_ptr",
                  "typeString": "string"
                }
              },
              "nodeType": "Mapping",
              "src": "326:44:17",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_string_memory_$_t_mapping$_t_uint256_$_t_contract$_Template_$3128_$_$",
                "typeString": "mapping(string => mapping(uint256 => contract Template))"
              },
              "valueType": {
                "id": 1997,
                "keyType": {
                  "id": 1995,
                  "name": "uint",
                  "nodeType": "ElementaryTypeName",
                  "src": "352:4:17",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "nodeType": "Mapping",
                "src": "344:25:17",
                "typeDescriptions": {
                  "typeIdentifier": "t_mapping$_t_uint256_$_t_contract$_Template_$3128_$",
                  "typeString": "mapping(uint256 => contract Template)"
                },
                "valueType": {
                  "contractScope": null,
                  "id": 1996,
                  "name": "Template",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 3128,
                  "src": "360:8:17",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_Template_$3128",
                    "typeString": "contract Template"
                  }
                }
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 2010,
              "nodeType": "Block",
              "src": "450:33:17",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2008,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 2006,
                      "name": "opened",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1981,
                      "src": "460:6:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 2007,
                      "name": "_opened",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2001,
                      "src": "469:7:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "460:16:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 2009,
                  "nodeType": "ExpressionStatement",
                  "src": "460:16:17"
                }
              ]
            },
            "documentation": null,
            "id": 2011,
            "implemented": true,
            "isConstructor": true,
            "isDeclaredConst": false,
            "modifiers": [
              {
                "arguments": [],
                "id": 2004,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 2003,
                  "name": "Ownable",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 6426,
                  "src": "433:7:17",
                  "typeDescriptions": {
                    "typeIdentifier": "t_type$_t_contract$_Ownable_$6426_$",
                    "typeString": "type(contract Ownable)"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "433:9:17"
              }
            ],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2002,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2001,
                  "name": "_opened",
                  "nodeType": "VariableDeclaration",
                  "scope": 2011,
                  "src": "419:12:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 2000,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "419:4:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "418:14:17"
            },
            "payable": false,
            "returnParameters": {
              "id": 2005,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "450:0:17"
            },
            "scope": 2212,
            "src": "407:76:17",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2020,
              "nodeType": "Block",
              "src": "600:30:17",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2018,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 2016,
                      "name": "opened",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1981,
                      "src": "610:6:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "hexValue": "74727565",
                      "id": 2017,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "619:4:17",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "true"
                    },
                    "src": "610:13:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 2019,
                  "nodeType": "ExpressionStatement",
                  "src": "610:13:17"
                }
              ]
            },
            "documentation": "@notice Open the Registry so that anyone can register.",
            "id": 2021,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [
              {
                "arguments": null,
                "id": 2014,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 2013,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 6374,
                  "src": "583:9:17",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "583:9:17"
              }
            ],
            "name": "open",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2012,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "580:2:17"
            },
            "payable": false,
            "returnParameters": {
              "id": 2015,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "600:0:17"
            },
            "scope": 2212,
            "src": "567:63:17",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2133,
              "nodeType": "Block",
              "src": "1083:916:17",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 2036,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 2031,
                          "name": "opened",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1981,
                          "src": "1101:6:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "||",
                        "rightExpression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 2035,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2032,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6516,
                              "src": "1111:3:17",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 2033,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "1111:10:17",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2034,
                            "name": "owner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6344,
                            "src": "1125:5:17",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "1111:19:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "src": "1101:29:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 2030,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        6519,
                        6520
                      ],
                      "referencedDeclaration": 6519,
                      "src": "1093:7:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 2037,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1093:38:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2038,
                  "nodeType": "ExpressionStatement",
                  "src": "1093:38:17"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "hexValue": "30783031666663396137",
                            "id": 2042,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1208:10:17",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_33540519_by_1",
                              "typeString": "int_const 33540519"
                            },
                            "value": "0x01ffc9a7"
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_rational_33540519_by_1",
                              "typeString": "int_const 33540519"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "id": 2040,
                            "name": "_template",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2027,
                            "src": "1180:9:17",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_Template_$3128",
                              "typeString": "contract Template"
                            }
                          },
                          "id": 2041,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "supportsInterface",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 6227,
                          "src": "1180:27:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_view$_t_bytes4_$returns$_t_bool_$",
                            "typeString": "function (bytes4) view external returns (bool)"
                          }
                        },
                        "id": 2043,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1180:39:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 2039,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        6519,
                        6520
                      ],
                      "referencedDeclaration": 6519,
                      "src": "1172:7:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 2044,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1172:48:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2045,
                  "nodeType": "ExpressionStatement",
                  "src": "1172:48:17"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "hexValue": "30786434383434356666",
                            "id": 2049,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1298:10:17",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_3565438463_by_1",
                              "typeString": "int_const 3565438463"
                            },
                            "value": "0xd48445ff"
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_rational_3565438463_by_1",
                              "typeString": "int_const 3565438463"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "id": 2047,
                            "name": "_template",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2027,
                            "src": "1270:9:17",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_Template_$3128",
                              "typeString": "contract Template"
                            }
                          },
                          "id": 2048,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "supportsInterface",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 6227,
                          "src": "1270:27:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_view$_t_bytes4_$returns$_t_bool_$",
                            "typeString": "function (bytes4) view external returns (bool)"
                          }
                        },
                        "id": 2050,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1270:39:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 2046,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        6519,
                        6520
                      ],
                      "referencedDeclaration": 6519,
                      "src": "1262:7:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 2051,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1262:48:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2052,
                  "nodeType": "ExpressionStatement",
                  "src": "1262:48:17"
                },
                {
                  "assignments": [
                    2054
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2054,
                      "name": "registrant",
                      "nodeType": "VariableDeclaration",
                      "scope": 2134,
                      "src": "1321:18:17",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 2053,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "1321:7:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2058,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 2055,
                      "name": "registrantOfIdentifier",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1988,
                      "src": "1342:22:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_string_memory_$_t_address_$",
                        "typeString": "mapping(string memory => address)"
                      }
                    },
                    "id": 2057,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 2056,
                      "name": "_identifier",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2023,
                      "src": "1365:11:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string memory"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "1342:35:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1321:56:17"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 2069,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 2064,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2060,
                            "name": "registrant",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2054,
                            "src": "1395:10:17",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 2062,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "1417:1:17",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                }
                              ],
                              "id": 2061,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "1409:7:17",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": "address"
                            },
                            "id": 2063,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1409:10:17",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "1395:24:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "||",
                        "rightExpression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 2068,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2065,
                            "name": "registrant",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2054,
                            "src": "1423:10:17",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2066,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6516,
                              "src": "1437:3:17",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 2067,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "1437:10:17",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "1423:24:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "src": "1395:52:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "6964656e74696669657220616c7265616479207265676973746572656420627920616e6f746865722072656769737472616e74",
                        "id": 2070,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1449:53:17",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_faeeb43006dd2a2d8192ee02e35388d89c7b7a43ba10842f1371e6803352e3a0",
                          "typeString": "literal_string \"identifier already registered by another registrant\""
                        },
                        "value": "identifier already registered by another registrant"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_faeeb43006dd2a2d8192ee02e35388d89c7b7a43ba10842f1371e6803352e3a0",
                          "typeString": "literal_string \"identifier already registered by another registrant\""
                        }
                      ],
                      "id": 2059,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        6519,
                        6520
                      ],
                      "referencedDeclaration": 6520,
                      "src": "1387:7:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 2071,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1387:116:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2072,
                  "nodeType": "ExpressionStatement",
                  "src": "1387:116:17"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 2077,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 2073,
                      "name": "registrant",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2054,
                      "src": "1517:10:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 2075,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "1539:1:17",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          }
                        ],
                        "id": 2074,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "1531:7:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 2076,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1531:10:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "1517:24:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 2092,
                  "nodeType": "IfStatement",
                  "src": "1513:146:17",
                  "trueBody": {
                    "id": 2091,
                    "nodeType": "Block",
                    "src": "1543:116:17",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2081,
                              "name": "_identifier",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2023,
                              "src": "1574:11:17",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2078,
                              "name": "identifiers",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1984,
                              "src": "1557:11:17",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_string_storage_$dyn_storage",
                                "typeString": "string storage ref[] storage ref"
                              }
                            },
                            "id": 2080,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "push",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "1557:16:17",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_arraypush_nonpayable$_t_string_storage_$returns$_t_uint256_$",
                              "typeString": "function (string storage ref) returns (uint256)"
                            }
                          },
                          "id": 2082,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1557:29:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2083,
                        "nodeType": "ExpressionStatement",
                        "src": "1557:29:17"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2089,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 2084,
                              "name": "registrantOfIdentifier",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1988,
                              "src": "1600:22:17",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_string_memory_$_t_address_$",
                                "typeString": "mapping(string memory => address)"
                              }
                            },
                            "id": 2086,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 2085,
                              "name": "_identifier",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2023,
                              "src": "1623:11:17",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "1600:35:17",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2087,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6516,
                              "src": "1638:3:17",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 2088,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "1638:10:17",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "1600:48:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 2090,
                        "nodeType": "ExpressionStatement",
                        "src": "1600:48:17"
                      }
                    ]
                  }
                },
                {
                  "assignments": [
                    2096
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2096,
                      "name": "versions",
                      "nodeType": "VariableDeclaration",
                      "scope": 2134,
                      "src": "1669:23:17",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                        "typeString": "uint256[]"
                      },
                      "typeName": {
                        "baseType": {
                          "id": 2094,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "1669:4:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2095,
                        "length": null,
                        "nodeType": "ArrayTypeName",
                        "src": "1669:6:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                          "typeString": "uint256[]"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2100,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 2097,
                      "name": "versionsOfIdentifier",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1993,
                      "src": "1695:20:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_string_memory_$_t_array$_t_uint256_$dyn_storage_$",
                        "typeString": "mapping(string memory => uint256[] storage ref)"
                      }
                    },
                    "id": 2099,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 2098,
                      "name": "_identifier",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2023,
                      "src": "1716:11:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string memory"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "1695:33:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                      "typeString": "uint256[] storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1669:59:17"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2104,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 2101,
                        "name": "versions",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2096,
                        "src": "1742:8:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                          "typeString": "uint256[] storage pointer"
                        }
                      },
                      "id": 2102,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "1742:15:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 2103,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "1760:1:17",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "1742:19:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 2118,
                  "nodeType": "IfStatement",
                  "src": "1738:148:17",
                  "trueBody": {
                    "id": 2117,
                    "nodeType": "Block",
                    "src": "1763:123:17",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 2113,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 2106,
                                "name": "_version",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2025,
                                "src": "1785:8:17",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">",
                              "rightExpression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 2107,
                                  "name": "versions",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2096,
                                  "src": "1796:8:17",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                                    "typeString": "uint256[] storage pointer"
                                  }
                                },
                                "id": 2112,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 2111,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2108,
                                      "name": "versions",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2096,
                                      "src": "1805:8:17",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                                        "typeString": "uint256[] storage pointer"
                                      }
                                    },
                                    "id": 2109,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "length",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": null,
                                    "src": "1805:15:17",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "-",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "hexValue": "31",
                                    "id": 2110,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "1823:1:17",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_1_by_1",
                                      "typeString": "int_const 1"
                                    },
                                    "value": "1"
                                  },
                                  "src": "1805:19:17",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "1796:29:17",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "1785:40:17",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "6e65772076657273696f6e206d7573742062652067726561746572207468616e206f6c642076657273696f6e73",
                              "id": 2114,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1827:47:17",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_84af631d96a11561f73c00920facc80e291b89fed573b87cd93b3ee81e36640a",
                                "typeString": "literal_string \"new version must be greater than old versions\""
                              },
                              "value": "new version must be greater than old versions"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_84af631d96a11561f73c00920facc80e291b89fed573b87cd93b3ee81e36640a",
                                "typeString": "literal_string \"new version must be greater than old versions\""
                              }
                            ],
                            "id": 2105,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              6519,
                              6520
                            ],
                            "referencedDeclaration": 6520,
                            "src": "1777:7:17",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2115,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1777:98:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2116,
                        "nodeType": "ExpressionStatement",
                        "src": "1777:98:17"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 2122,
                        "name": "_version",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2025,
                        "src": "1909:8:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 2119,
                        "name": "versions",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2096,
                        "src": "1895:8:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                          "typeString": "uint256[] storage pointer"
                        }
                      },
                      "id": 2121,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "push",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "1895:13:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_arraypush_nonpayable$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (uint256) returns (uint256)"
                      }
                    },
                    "id": 2123,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1895:23:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 2124,
                  "nodeType": "ExpressionStatement",
                  "src": "1895:23:17"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2131,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 2125,
                          "name": "templateOfVersionOfIdentifier",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1999,
                          "src": "1928:29:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_string_memory_$_t_mapping$_t_uint256_$_t_contract$_Template_$3128_$_$",
                            "typeString": "mapping(string memory => mapping(uint256 => contract Template))"
                          }
                        },
                        "id": 2128,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 2126,
                          "name": "_identifier",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2023,
                          "src": "1958:11:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "1928:42:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint256_$_t_contract$_Template_$3128_$",
                          "typeString": "mapping(uint256 => contract Template)"
                        }
                      },
                      "id": 2129,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 2127,
                        "name": "_version",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2025,
                        "src": "1971:8:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "1928:52:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_Template_$3128",
                        "typeString": "contract Template"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 2130,
                      "name": "_template",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2027,
                      "src": "1983:9:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_Template_$3128",
                        "typeString": "contract Template"
                      }
                    },
                    "src": "1928:64:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Template_$3128",
                      "typeString": "contract Template"
                    }
                  },
                  "id": 2132,
                  "nodeType": "ExpressionStatement",
                  "src": "1928:64:17"
                }
              ]
            },
            "documentation": "@notice Registers a new `Template`.\n@param _identifier If any template was registered for the same identifier, the registrant of the templates must be the same.\n@param _version If any template was registered for the same identifier, new version must be greater than the old one.\n@param _template Template to be registered.",
            "id": 2134,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "register",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2028,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2023,
                  "name": "_identifier",
                  "nodeType": "VariableDeclaration",
                  "scope": 2134,
                  "src": "1021:18:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 2022,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1021:6:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2025,
                  "name": "_version",
                  "nodeType": "VariableDeclaration",
                  "scope": 2134,
                  "src": "1041:13:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2024,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "1041:4:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2027,
                  "name": "_template",
                  "nodeType": "VariableDeclaration",
                  "scope": 2134,
                  "src": "1056:18:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_Template_$3128",
                    "typeString": "contract Template"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2026,
                    "name": "Template",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3128,
                    "src": "1056:8:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Template_$3128",
                      "typeString": "contract Template"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1020:55:17"
            },
            "payable": false,
            "returnParameters": {
              "id": 2029,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1083:0:17"
            },
            "scope": 2212,
            "src": "1003:996:17",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2142,
              "nodeType": "Block",
              "src": "2068:42:17",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "expression": {
                      "argumentTypes": null,
                      "id": 2139,
                      "name": "identifiers",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1984,
                      "src": "2085:11:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_array$_t_string_storage_$dyn_storage",
                        "typeString": "string storage ref[] storage ref"
                      }
                    },
                    "id": 2140,
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "length",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": null,
                    "src": "2085:18:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 2138,
                  "id": 2141,
                  "nodeType": "Return",
                  "src": "2078:25:17"
                }
              ]
            },
            "documentation": null,
            "id": 2143,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "numberOfIdentifiers",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2135,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2033:2:17"
            },
            "payable": false,
            "returnParameters": {
              "id": 2138,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2137,
                  "name": "size",
                  "nodeType": "VariableDeclaration",
                  "scope": 2143,
                  "src": "2057:9:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2136,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "2057:4:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2056:11:17"
            },
            "scope": 2212,
            "src": "2005:105:17",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2154,
              "nodeType": "Block",
              "src": "2191:43:17",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 2150,
                      "name": "identifiers",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1984,
                      "src": "2208:11:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_array$_t_string_storage_$dyn_storage",
                        "typeString": "string storage ref[] storage ref"
                      }
                    },
                    "id": 2152,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 2151,
                      "name": "_index",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2145,
                      "src": "2220:6:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2208:19:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage",
                      "typeString": "string storage ref"
                    }
                  },
                  "functionReturnParameters": 2149,
                  "id": 2153,
                  "nodeType": "Return",
                  "src": "2201:26:17"
                }
              ]
            },
            "documentation": null,
            "id": 2155,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "identifierAt",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2146,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2145,
                  "name": "_index",
                  "nodeType": "VariableDeclaration",
                  "scope": 2155,
                  "src": "2138:11:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2144,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "2138:4:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2137:13:17"
            },
            "payable": false,
            "returnParameters": {
              "id": 2149,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2148,
                  "name": "identifier",
                  "nodeType": "VariableDeclaration",
                  "scope": 2155,
                  "src": "2172:17:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 2147,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2172:6:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2171:19:17"
            },
            "scope": 2212,
            "src": "2116:118:17",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2167,
              "nodeType": "Block",
              "src": "2317:57:17",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 2163,
                      "name": "versionsOfIdentifier",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1993,
                      "src": "2334:20:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_string_memory_$_t_array$_t_uint256_$dyn_storage_$",
                        "typeString": "mapping(string memory => uint256[] storage ref)"
                      }
                    },
                    "id": 2165,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 2164,
                      "name": "_identifier",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2157,
                      "src": "2355:11:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string memory"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2334:33:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                      "typeString": "uint256[] storage ref"
                    }
                  },
                  "functionReturnParameters": 2162,
                  "id": 2166,
                  "nodeType": "Return",
                  "src": "2327:40:17"
                }
              ]
            },
            "documentation": null,
            "id": 2168,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "versionsOf",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2158,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2157,
                  "name": "_identifier",
                  "nodeType": "VariableDeclaration",
                  "scope": 2168,
                  "src": "2260:18:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 2156,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2260:6:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2259:20:17"
            },
            "payable": false,
            "returnParameters": {
              "id": 2162,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2161,
                  "name": "version",
                  "nodeType": "VariableDeclaration",
                  "scope": 2168,
                  "src": "2301:14:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                    "typeString": "uint256[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 2159,
                      "name": "uint",
                      "nodeType": "ElementaryTypeName",
                      "src": "2301:4:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 2160,
                    "length": null,
                    "nodeType": "ArrayTypeName",
                    "src": "2301:6:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                      "typeString": "uint256[]"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2300:16:17"
            },
            "scope": 2212,
            "src": "2240:134:17",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2183,
              "nodeType": "Block",
              "src": "2475:76:17",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 2177,
                        "name": "templateOfVersionOfIdentifier",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1999,
                        "src": "2492:29:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_string_memory_$_t_mapping$_t_uint256_$_t_contract$_Template_$3128_$_$",
                          "typeString": "mapping(string memory => mapping(uint256 => contract Template))"
                        }
                      },
                      "id": 2179,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 2178,
                        "name": "_identifier",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2170,
                        "src": "2522:11:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "2492:42:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_uint256_$_t_contract$_Template_$3128_$",
                        "typeString": "mapping(uint256 => contract Template)"
                      }
                    },
                    "id": 2181,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 2180,
                      "name": "_version",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2172,
                      "src": "2535:8:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2492:52:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Template_$3128",
                      "typeString": "contract Template"
                    }
                  },
                  "functionReturnParameters": 2176,
                  "id": 2182,
                  "nodeType": "Return",
                  "src": "2485:59:17"
                }
              ]
            },
            "documentation": null,
            "id": 2184,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "templateOf",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2173,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2170,
                  "name": "_identifier",
                  "nodeType": "VariableDeclaration",
                  "scope": 2184,
                  "src": "2400:18:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 2169,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2400:6:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2172,
                  "name": "_version",
                  "nodeType": "VariableDeclaration",
                  "scope": 2184,
                  "src": "2420:13:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2171,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "2420:4:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2399:35:17"
            },
            "payable": false,
            "returnParameters": {
              "id": 2176,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2175,
                  "name": "template",
                  "nodeType": "VariableDeclaration",
                  "scope": 2184,
                  "src": "2456:17:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_Template_$3128",
                    "typeString": "contract Template"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2174,
                    "name": "Template",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3128,
                    "src": "2456:8:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Template_$3128",
                      "typeString": "contract Template"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2455:19:17"
            },
            "scope": 2212,
            "src": "2380:171:17",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2210,
              "nodeType": "Block",
              "src": "2643:166:17",
              "statements": [
                {
                  "assignments": [
                    2194
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2194,
                      "name": "versions",
                      "nodeType": "VariableDeclaration",
                      "scope": 2211,
                      "src": "2653:23:17",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                        "typeString": "uint256[]"
                      },
                      "typeName": {
                        "baseType": {
                          "id": 2192,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "2653:4:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2193,
                        "length": null,
                        "nodeType": "ArrayTypeName",
                        "src": "2653:6:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                          "typeString": "uint256[]"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2198,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 2195,
                      "name": "versionsOfIdentifier",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1993,
                      "src": "2679:20:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_string_memory_$_t_array$_t_uint256_$dyn_storage_$",
                        "typeString": "mapping(string memory => uint256[] storage ref)"
                      }
                    },
                    "id": 2197,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 2196,
                      "name": "_identifier",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2186,
                      "src": "2700:11:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string memory"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2679:33:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                      "typeString": "uint256[] storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "2653:59:17"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 2199,
                        "name": "templateOfVersionOfIdentifier",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1999,
                        "src": "2729:29:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_string_memory_$_t_mapping$_t_uint256_$_t_contract$_Template_$3128_$_$",
                          "typeString": "mapping(string memory => mapping(uint256 => contract Template))"
                        }
                      },
                      "id": 2201,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 2200,
                        "name": "_identifier",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2186,
                        "src": "2759:11:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "2729:42:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_uint256_$_t_contract$_Template_$3128_$",
                        "typeString": "mapping(uint256 => contract Template)"
                      }
                    },
                    "id": 2208,
                    "indexExpression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 2202,
                        "name": "versions",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2194,
                        "src": "2772:8:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                          "typeString": "uint256[] storage pointer"
                        }
                      },
                      "id": 2207,
                      "indexExpression": {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 2206,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 2203,
                            "name": "versions",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2194,
                            "src": "2781:8:17",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                              "typeString": "uint256[] storage pointer"
                            }
                          },
                          "id": 2204,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "2781:15:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "-",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "31",
                          "id": 2205,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "2799:1:17",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_1_by_1",
                            "typeString": "int_const 1"
                          },
                          "value": "1"
                        },
                        "src": "2781:19:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "2772:29:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2729:73:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Template_$3128",
                      "typeString": "contract Template"
                    }
                  },
                  "functionReturnParameters": 2190,
                  "id": 2209,
                  "nodeType": "Return",
                  "src": "2722:80:17"
                }
              ]
            },
            "documentation": null,
            "id": 2211,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "latestTemplateOf",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2187,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2186,
                  "name": "_identifier",
                  "nodeType": "VariableDeclaration",
                  "scope": 2211,
                  "src": "2583:18:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 2185,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2583:6:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2582:20:17"
            },
            "payable": false,
            "returnParameters": {
              "id": 2190,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2189,
                  "name": "template",
                  "nodeType": "VariableDeclaration",
                  "scope": 2211,
                  "src": "2624:17:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_Template_$3128",
                    "typeString": "contract Template"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2188,
                    "name": "Template",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3128,
                    "src": "2624:8:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Template_$3128",
                      "typeString": "contract Template"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2623:19:17"
            },
            "scope": 2212,
            "src": "2557:252:17",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          }
        ],
        "scope": 2213,
        "src": "141:2670:17"
      }
    ],
    "src": "0:2812:17"
  },
  "legacyAST": {
    "absolutePath": "tokenboost-solidity/contracts/registry/Registry.sol",
    "exportedSymbols": {
      "Registry": [
        2212
      ]
    },
    "id": 2213,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 1976,
        "literals": [
          "solidity",
          "^",
          "0.4",
          ".24"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:24:17"
      },
      {
        "absolutePath": "tokenboost-solidity/contracts/template/Template.sol",
        "file": "../template/Template.sol",
        "id": 1977,
        "nodeType": "ImportDirective",
        "scope": 2213,
        "sourceUnit": 3129,
        "src": "26:34:17",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 1978,
              "name": "Ownable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 6426,
              "src": "162:7:17",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Ownable_$6426",
                "typeString": "contract Ownable"
              }
            },
            "id": 1979,
            "nodeType": "InheritanceSpecifier",
            "src": "162:7:17"
          }
        ],
        "contractDependencies": [
          6426
        ],
        "contractKind": "contract",
        "documentation": "@title Registry\n@notice Registry maintains Contracts by version.",
        "fullyImplemented": true,
        "id": 2212,
        "linearizedBaseContracts": [
          2212,
          6426
        ],
        "name": "Registry",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "id": 1981,
            "name": "opened",
            "nodeType": "VariableDeclaration",
            "scope": 2212,
            "src": "176:11:17",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_bool",
              "typeString": "bool"
            },
            "typeName": {
              "id": 1980,
              "name": "bool",
              "nodeType": "ElementaryTypeName",
              "src": "176:4:17",
              "typeDescriptions": {
                "typeIdentifier": "t_bool",
                "typeString": "bool"
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 1984,
            "name": "identifiers",
            "nodeType": "VariableDeclaration",
            "scope": 2212,
            "src": "193:20:17",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_array$_t_string_storage_$dyn_storage",
              "typeString": "string[]"
            },
            "typeName": {
              "baseType": {
                "id": 1982,
                "name": "string",
                "nodeType": "ElementaryTypeName",
                "src": "193:6:17",
                "typeDescriptions": {
                  "typeIdentifier": "t_string_storage_ptr",
                  "typeString": "string"
                }
              },
              "id": 1983,
              "length": null,
              "nodeType": "ArrayTypeName",
              "src": "193:8:17",
              "typeDescriptions": {
                "typeIdentifier": "t_array$_t_string_storage_$dyn_storage_ptr",
                "typeString": "string[]"
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 1988,
            "name": "registrantOfIdentifier",
            "nodeType": "VariableDeclaration",
            "scope": 2212,
            "src": "219:49:17",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_string_memory_$_t_address_$",
              "typeString": "mapping(string => address)"
            },
            "typeName": {
              "id": 1987,
              "keyType": {
                "id": 1985,
                "name": "string",
                "nodeType": "ElementaryTypeName",
                "src": "227:6:17",
                "typeDescriptions": {
                  "typeIdentifier": "t_string_storage_ptr",
                  "typeString": "string"
                }
              },
              "nodeType": "Mapping",
              "src": "219:26:17",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_string_memory_$_t_address_$",
                "typeString": "mapping(string => address)"
              },
              "valueType": {
                "id": 1986,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "237:7:17",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 1993,
            "name": "versionsOfIdentifier",
            "nodeType": "VariableDeclaration",
            "scope": 2212,
            "src": "274:46:17",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_string_memory_$_t_array$_t_uint256_$dyn_storage_$",
              "typeString": "mapping(string => uint256[])"
            },
            "typeName": {
              "id": 1992,
              "keyType": {
                "id": 1989,
                "name": "string",
                "nodeType": "ElementaryTypeName",
                "src": "282:6:17",
                "typeDescriptions": {
                  "typeIdentifier": "t_string_storage_ptr",
                  "typeString": "string"
                }
              },
              "nodeType": "Mapping",
              "src": "274:25:17",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_string_memory_$_t_array$_t_uint256_$dyn_storage_$",
                "typeString": "mapping(string => uint256[])"
              },
              "valueType": {
                "baseType": {
                  "id": 1990,
                  "name": "uint",
                  "nodeType": "ElementaryTypeName",
                  "src": "292:4:17",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "id": 1991,
                "length": null,
                "nodeType": "ArrayTypeName",
                "src": "292:6:17",
                "typeDescriptions": {
                  "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                  "typeString": "uint256[]"
                }
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 1999,
            "name": "templateOfVersionOfIdentifier",
            "nodeType": "VariableDeclaration",
            "scope": 2212,
            "src": "326:74:17",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_string_memory_$_t_mapping$_t_uint256_$_t_contract$_Template_$3128_$_$",
              "typeString": "mapping(string => mapping(uint256 => contract Template))"
            },
            "typeName": {
              "id": 1998,
              "keyType": {
                "id": 1994,
                "name": "string",
                "nodeType": "ElementaryTypeName",
                "src": "334:6:17",
                "typeDescriptions": {
                  "typeIdentifier": "t_string_storage_ptr",
                  "typeString": "string"
                }
              },
              "nodeType": "Mapping",
              "src": "326:44:17",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_string_memory_$_t_mapping$_t_uint256_$_t_contract$_Template_$3128_$_$",
                "typeString": "mapping(string => mapping(uint256 => contract Template))"
              },
              "valueType": {
                "id": 1997,
                "keyType": {
                  "id": 1995,
                  "name": "uint",
                  "nodeType": "ElementaryTypeName",
                  "src": "352:4:17",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "nodeType": "Mapping",
                "src": "344:25:17",
                "typeDescriptions": {
                  "typeIdentifier": "t_mapping$_t_uint256_$_t_contract$_Template_$3128_$",
                  "typeString": "mapping(uint256 => contract Template)"
                },
                "valueType": {
                  "contractScope": null,
                  "id": 1996,
                  "name": "Template",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 3128,
                  "src": "360:8:17",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_Template_$3128",
                    "typeString": "contract Template"
                  }
                }
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 2010,
              "nodeType": "Block",
              "src": "450:33:17",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2008,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 2006,
                      "name": "opened",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1981,
                      "src": "460:6:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 2007,
                      "name": "_opened",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2001,
                      "src": "469:7:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "460:16:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 2009,
                  "nodeType": "ExpressionStatement",
                  "src": "460:16:17"
                }
              ]
            },
            "documentation": null,
            "id": 2011,
            "implemented": true,
            "isConstructor": true,
            "isDeclaredConst": false,
            "modifiers": [
              {
                "arguments": [],
                "id": 2004,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 2003,
                  "name": "Ownable",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 6426,
                  "src": "433:7:17",
                  "typeDescriptions": {
                    "typeIdentifier": "t_type$_t_contract$_Ownable_$6426_$",
                    "typeString": "type(contract Ownable)"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "433:9:17"
              }
            ],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2002,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2001,
                  "name": "_opened",
                  "nodeType": "VariableDeclaration",
                  "scope": 2011,
                  "src": "419:12:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 2000,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "419:4:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "418:14:17"
            },
            "payable": false,
            "returnParameters": {
              "id": 2005,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "450:0:17"
            },
            "scope": 2212,
            "src": "407:76:17",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2020,
              "nodeType": "Block",
              "src": "600:30:17",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2018,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 2016,
                      "name": "opened",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1981,
                      "src": "610:6:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "hexValue": "74727565",
                      "id": 2017,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "619:4:17",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "true"
                    },
                    "src": "610:13:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 2019,
                  "nodeType": "ExpressionStatement",
                  "src": "610:13:17"
                }
              ]
            },
            "documentation": "@notice Open the Registry so that anyone can register.",
            "id": 2021,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [
              {
                "arguments": null,
                "id": 2014,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 2013,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 6374,
                  "src": "583:9:17",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "583:9:17"
              }
            ],
            "name": "open",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2012,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "580:2:17"
            },
            "payable": false,
            "returnParameters": {
              "id": 2015,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "600:0:17"
            },
            "scope": 2212,
            "src": "567:63:17",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2133,
              "nodeType": "Block",
              "src": "1083:916:17",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 2036,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 2031,
                          "name": "opened",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1981,
                          "src": "1101:6:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "||",
                        "rightExpression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 2035,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2032,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6516,
                              "src": "1111:3:17",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 2033,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "1111:10:17",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2034,
                            "name": "owner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6344,
                            "src": "1125:5:17",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "1111:19:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "src": "1101:29:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 2030,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        6519,
                        6520
                      ],
                      "referencedDeclaration": 6519,
                      "src": "1093:7:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 2037,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1093:38:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2038,
                  "nodeType": "ExpressionStatement",
                  "src": "1093:38:17"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "hexValue": "30783031666663396137",
                            "id": 2042,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1208:10:17",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_33540519_by_1",
                              "typeString": "int_const 33540519"
                            },
                            "value": "0x01ffc9a7"
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_rational_33540519_by_1",
                              "typeString": "int_const 33540519"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "id": 2040,
                            "name": "_template",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2027,
                            "src": "1180:9:17",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_Template_$3128",
                              "typeString": "contract Template"
                            }
                          },
                          "id": 2041,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "supportsInterface",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 6227,
                          "src": "1180:27:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_view$_t_bytes4_$returns$_t_bool_$",
                            "typeString": "function (bytes4) view external returns (bool)"
                          }
                        },
                        "id": 2043,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1180:39:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 2039,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        6519,
                        6520
                      ],
                      "referencedDeclaration": 6519,
                      "src": "1172:7:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 2044,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1172:48:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2045,
                  "nodeType": "ExpressionStatement",
                  "src": "1172:48:17"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "hexValue": "30786434383434356666",
                            "id": 2049,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1298:10:17",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_3565438463_by_1",
                              "typeString": "int_const 3565438463"
                            },
                            "value": "0xd48445ff"
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_rational_3565438463_by_1",
                              "typeString": "int_const 3565438463"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "id": 2047,
                            "name": "_template",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2027,
                            "src": "1270:9:17",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_Template_$3128",
                              "typeString": "contract Template"
                            }
                          },
                          "id": 2048,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "supportsInterface",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 6227,
                          "src": "1270:27:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_view$_t_bytes4_$returns$_t_bool_$",
                            "typeString": "function (bytes4) view external returns (bool)"
                          }
                        },
                        "id": 2050,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1270:39:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 2046,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        6519,
                        6520
                      ],
                      "referencedDeclaration": 6519,
                      "src": "1262:7:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 2051,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1262:48:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2052,
                  "nodeType": "ExpressionStatement",
                  "src": "1262:48:17"
                },
                {
                  "assignments": [
                    2054
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2054,
                      "name": "registrant",
                      "nodeType": "VariableDeclaration",
                      "scope": 2134,
                      "src": "1321:18:17",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 2053,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "1321:7:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2058,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 2055,
                      "name": "registrantOfIdentifier",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1988,
                      "src": "1342:22:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_string_memory_$_t_address_$",
                        "typeString": "mapping(string memory => address)"
                      }
                    },
                    "id": 2057,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 2056,
                      "name": "_identifier",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2023,
                      "src": "1365:11:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string memory"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "1342:35:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1321:56:17"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 2069,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 2064,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2060,
                            "name": "registrant",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2054,
                            "src": "1395:10:17",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 2062,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "1417:1:17",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                }
                              ],
                              "id": 2061,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "1409:7:17",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": "address"
                            },
                            "id": 2063,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1409:10:17",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "1395:24:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "||",
                        "rightExpression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 2068,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2065,
                            "name": "registrant",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2054,
                            "src": "1423:10:17",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2066,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6516,
                              "src": "1437:3:17",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 2067,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "1437:10:17",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "1423:24:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "src": "1395:52:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "6964656e74696669657220616c7265616479207265676973746572656420627920616e6f746865722072656769737472616e74",
                        "id": 2070,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1449:53:17",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_faeeb43006dd2a2d8192ee02e35388d89c7b7a43ba10842f1371e6803352e3a0",
                          "typeString": "literal_string \"identifier already registered by another registrant\""
                        },
                        "value": "identifier already registered by another registrant"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_faeeb43006dd2a2d8192ee02e35388d89c7b7a43ba10842f1371e6803352e3a0",
                          "typeString": "literal_string \"identifier already registered by another registrant\""
                        }
                      ],
                      "id": 2059,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        6519,
                        6520
                      ],
                      "referencedDeclaration": 6520,
                      "src": "1387:7:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 2071,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1387:116:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2072,
                  "nodeType": "ExpressionStatement",
                  "src": "1387:116:17"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 2077,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 2073,
                      "name": "registrant",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2054,
                      "src": "1517:10:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 2075,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "1539:1:17",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          }
                        ],
                        "id": 2074,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "1531:7:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 2076,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1531:10:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "1517:24:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 2092,
                  "nodeType": "IfStatement",
                  "src": "1513:146:17",
                  "trueBody": {
                    "id": 2091,
                    "nodeType": "Block",
                    "src": "1543:116:17",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2081,
                              "name": "_identifier",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2023,
                              "src": "1574:11:17",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2078,
                              "name": "identifiers",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1984,
                              "src": "1557:11:17",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_string_storage_$dyn_storage",
                                "typeString": "string storage ref[] storage ref"
                              }
                            },
                            "id": 2080,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "push",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "1557:16:17",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_arraypush_nonpayable$_t_string_storage_$returns$_t_uint256_$",
                              "typeString": "function (string storage ref) returns (uint256)"
                            }
                          },
                          "id": 2082,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1557:29:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2083,
                        "nodeType": "ExpressionStatement",
                        "src": "1557:29:17"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2089,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 2084,
                              "name": "registrantOfIdentifier",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1988,
                              "src": "1600:22:17",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_string_memory_$_t_address_$",
                                "typeString": "mapping(string memory => address)"
                              }
                            },
                            "id": 2086,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 2085,
                              "name": "_identifier",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2023,
                              "src": "1623:11:17",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "1600:35:17",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2087,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6516,
                              "src": "1638:3:17",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 2088,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "1638:10:17",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "1600:48:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 2090,
                        "nodeType": "ExpressionStatement",
                        "src": "1600:48:17"
                      }
                    ]
                  }
                },
                {
                  "assignments": [
                    2096
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2096,
                      "name": "versions",
                      "nodeType": "VariableDeclaration",
                      "scope": 2134,
                      "src": "1669:23:17",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                        "typeString": "uint256[]"
                      },
                      "typeName": {
                        "baseType": {
                          "id": 2094,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "1669:4:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2095,
                        "length": null,
                        "nodeType": "ArrayTypeName",
                        "src": "1669:6:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                          "typeString": "uint256[]"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2100,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 2097,
                      "name": "versionsOfIdentifier",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1993,
                      "src": "1695:20:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_string_memory_$_t_array$_t_uint256_$dyn_storage_$",
                        "typeString": "mapping(string memory => uint256[] storage ref)"
                      }
                    },
                    "id": 2099,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 2098,
                      "name": "_identifier",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2023,
                      "src": "1716:11:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string memory"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "1695:33:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                      "typeString": "uint256[] storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1669:59:17"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2104,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 2101,
                        "name": "versions",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2096,
                        "src": "1742:8:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                          "typeString": "uint256[] storage pointer"
                        }
                      },
                      "id": 2102,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "1742:15:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 2103,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "1760:1:17",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "1742:19:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 2118,
                  "nodeType": "IfStatement",
                  "src": "1738:148:17",
                  "trueBody": {
                    "id": 2117,
                    "nodeType": "Block",
                    "src": "1763:123:17",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 2113,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 2106,
                                "name": "_version",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2025,
                                "src": "1785:8:17",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">",
                              "rightExpression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 2107,
                                  "name": "versions",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2096,
                                  "src": "1796:8:17",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                                    "typeString": "uint256[] storage pointer"
                                  }
                                },
                                "id": 2112,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 2111,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2108,
                                      "name": "versions",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2096,
                                      "src": "1805:8:17",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                                        "typeString": "uint256[] storage pointer"
                                      }
                                    },
                                    "id": 2109,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "length",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": null,
                                    "src": "1805:15:17",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "-",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "hexValue": "31",
                                    "id": 2110,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "1823:1:17",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_1_by_1",
                                      "typeString": "int_const 1"
                                    },
                                    "value": "1"
                                  },
                                  "src": "1805:19:17",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "1796:29:17",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "1785:40:17",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "6e65772076657273696f6e206d7573742062652067726561746572207468616e206f6c642076657273696f6e73",
                              "id": 2114,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1827:47:17",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_84af631d96a11561f73c00920facc80e291b89fed573b87cd93b3ee81e36640a",
                                "typeString": "literal_string \"new version must be greater than old versions\""
                              },
                              "value": "new version must be greater than old versions"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_84af631d96a11561f73c00920facc80e291b89fed573b87cd93b3ee81e36640a",
                                "typeString": "literal_string \"new version must be greater than old versions\""
                              }
                            ],
                            "id": 2105,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              6519,
                              6520
                            ],
                            "referencedDeclaration": 6520,
                            "src": "1777:7:17",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2115,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1777:98:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2116,
                        "nodeType": "ExpressionStatement",
                        "src": "1777:98:17"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 2122,
                        "name": "_version",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2025,
                        "src": "1909:8:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 2119,
                        "name": "versions",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2096,
                        "src": "1895:8:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                          "typeString": "uint256[] storage pointer"
                        }
                      },
                      "id": 2121,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "push",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "1895:13:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_arraypush_nonpayable$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (uint256) returns (uint256)"
                      }
                    },
                    "id": 2123,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1895:23:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 2124,
                  "nodeType": "ExpressionStatement",
                  "src": "1895:23:17"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2131,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 2125,
                          "name": "templateOfVersionOfIdentifier",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1999,
                          "src": "1928:29:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_string_memory_$_t_mapping$_t_uint256_$_t_contract$_Template_$3128_$_$",
                            "typeString": "mapping(string memory => mapping(uint256 => contract Template))"
                          }
                        },
                        "id": 2128,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 2126,
                          "name": "_identifier",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2023,
                          "src": "1958:11:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "1928:42:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint256_$_t_contract$_Template_$3128_$",
                          "typeString": "mapping(uint256 => contract Template)"
                        }
                      },
                      "id": 2129,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 2127,
                        "name": "_version",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2025,
                        "src": "1971:8:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "1928:52:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_Template_$3128",
                        "typeString": "contract Template"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 2130,
                      "name": "_template",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2027,
                      "src": "1983:9:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_Template_$3128",
                        "typeString": "contract Template"
                      }
                    },
                    "src": "1928:64:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Template_$3128",
                      "typeString": "contract Template"
                    }
                  },
                  "id": 2132,
                  "nodeType": "ExpressionStatement",
                  "src": "1928:64:17"
                }
              ]
            },
            "documentation": "@notice Registers a new `Template`.\n@param _identifier If any template was registered for the same identifier, the registrant of the templates must be the same.\n@param _version If any template was registered for the same identifier, new version must be greater than the old one.\n@param _template Template to be registered.",
            "id": 2134,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "register",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2028,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2023,
                  "name": "_identifier",
                  "nodeType": "VariableDeclaration",
                  "scope": 2134,
                  "src": "1021:18:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 2022,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1021:6:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2025,
                  "name": "_version",
                  "nodeType": "VariableDeclaration",
                  "scope": 2134,
                  "src": "1041:13:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2024,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "1041:4:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2027,
                  "name": "_template",
                  "nodeType": "VariableDeclaration",
                  "scope": 2134,
                  "src": "1056:18:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_Template_$3128",
                    "typeString": "contract Template"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2026,
                    "name": "Template",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3128,
                    "src": "1056:8:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Template_$3128",
                      "typeString": "contract Template"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1020:55:17"
            },
            "payable": false,
            "returnParameters": {
              "id": 2029,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1083:0:17"
            },
            "scope": 2212,
            "src": "1003:996:17",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2142,
              "nodeType": "Block",
              "src": "2068:42:17",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "expression": {
                      "argumentTypes": null,
                      "id": 2139,
                      "name": "identifiers",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1984,
                      "src": "2085:11:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_array$_t_string_storage_$dyn_storage",
                        "typeString": "string storage ref[] storage ref"
                      }
                    },
                    "id": 2140,
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "length",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": null,
                    "src": "2085:18:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 2138,
                  "id": 2141,
                  "nodeType": "Return",
                  "src": "2078:25:17"
                }
              ]
            },
            "documentation": null,
            "id": 2143,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "numberOfIdentifiers",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2135,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2033:2:17"
            },
            "payable": false,
            "returnParameters": {
              "id": 2138,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2137,
                  "name": "size",
                  "nodeType": "VariableDeclaration",
                  "scope": 2143,
                  "src": "2057:9:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2136,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "2057:4:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2056:11:17"
            },
            "scope": 2212,
            "src": "2005:105:17",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2154,
              "nodeType": "Block",
              "src": "2191:43:17",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 2150,
                      "name": "identifiers",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1984,
                      "src": "2208:11:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_array$_t_string_storage_$dyn_storage",
                        "typeString": "string storage ref[] storage ref"
                      }
                    },
                    "id": 2152,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 2151,
                      "name": "_index",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2145,
                      "src": "2220:6:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2208:19:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage",
                      "typeString": "string storage ref"
                    }
                  },
                  "functionReturnParameters": 2149,
                  "id": 2153,
                  "nodeType": "Return",
                  "src": "2201:26:17"
                }
              ]
            },
            "documentation": null,
            "id": 2155,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "identifierAt",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2146,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2145,
                  "name": "_index",
                  "nodeType": "VariableDeclaration",
                  "scope": 2155,
                  "src": "2138:11:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2144,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "2138:4:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2137:13:17"
            },
            "payable": false,
            "returnParameters": {
              "id": 2149,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2148,
                  "name": "identifier",
                  "nodeType": "VariableDeclaration",
                  "scope": 2155,
                  "src": "2172:17:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 2147,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2172:6:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2171:19:17"
            },
            "scope": 2212,
            "src": "2116:118:17",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2167,
              "nodeType": "Block",
              "src": "2317:57:17",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 2163,
                      "name": "versionsOfIdentifier",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1993,
                      "src": "2334:20:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_string_memory_$_t_array$_t_uint256_$dyn_storage_$",
                        "typeString": "mapping(string memory => uint256[] storage ref)"
                      }
                    },
                    "id": 2165,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 2164,
                      "name": "_identifier",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2157,
                      "src": "2355:11:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string memory"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2334:33:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                      "typeString": "uint256[] storage ref"
                    }
                  },
                  "functionReturnParameters": 2162,
                  "id": 2166,
                  "nodeType": "Return",
                  "src": "2327:40:17"
                }
              ]
            },
            "documentation": null,
            "id": 2168,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "versionsOf",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2158,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2157,
                  "name": "_identifier",
                  "nodeType": "VariableDeclaration",
                  "scope": 2168,
                  "src": "2260:18:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 2156,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2260:6:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2259:20:17"
            },
            "payable": false,
            "returnParameters": {
              "id": 2162,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2161,
                  "name": "version",
                  "nodeType": "VariableDeclaration",
                  "scope": 2168,
                  "src": "2301:14:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                    "typeString": "uint256[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 2159,
                      "name": "uint",
                      "nodeType": "ElementaryTypeName",
                      "src": "2301:4:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 2160,
                    "length": null,
                    "nodeType": "ArrayTypeName",
                    "src": "2301:6:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                      "typeString": "uint256[]"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2300:16:17"
            },
            "scope": 2212,
            "src": "2240:134:17",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2183,
              "nodeType": "Block",
              "src": "2475:76:17",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 2177,
                        "name": "templateOfVersionOfIdentifier",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1999,
                        "src": "2492:29:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_string_memory_$_t_mapping$_t_uint256_$_t_contract$_Template_$3128_$_$",
                          "typeString": "mapping(string memory => mapping(uint256 => contract Template))"
                        }
                      },
                      "id": 2179,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 2178,
                        "name": "_identifier",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2170,
                        "src": "2522:11:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "2492:42:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_uint256_$_t_contract$_Template_$3128_$",
                        "typeString": "mapping(uint256 => contract Template)"
                      }
                    },
                    "id": 2181,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 2180,
                      "name": "_version",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2172,
                      "src": "2535:8:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2492:52:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Template_$3128",
                      "typeString": "contract Template"
                    }
                  },
                  "functionReturnParameters": 2176,
                  "id": 2182,
                  "nodeType": "Return",
                  "src": "2485:59:17"
                }
              ]
            },
            "documentation": null,
            "id": 2184,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "templateOf",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2173,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2170,
                  "name": "_identifier",
                  "nodeType": "VariableDeclaration",
                  "scope": 2184,
                  "src": "2400:18:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 2169,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2400:6:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2172,
                  "name": "_version",
                  "nodeType": "VariableDeclaration",
                  "scope": 2184,
                  "src": "2420:13:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2171,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "2420:4:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2399:35:17"
            },
            "payable": false,
            "returnParameters": {
              "id": 2176,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2175,
                  "name": "template",
                  "nodeType": "VariableDeclaration",
                  "scope": 2184,
                  "src": "2456:17:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_Template_$3128",
                    "typeString": "contract Template"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2174,
                    "name": "Template",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3128,
                    "src": "2456:8:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Template_$3128",
                      "typeString": "contract Template"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2455:19:17"
            },
            "scope": 2212,
            "src": "2380:171:17",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2210,
              "nodeType": "Block",
              "src": "2643:166:17",
              "statements": [
                {
                  "assignments": [
                    2194
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2194,
                      "name": "versions",
                      "nodeType": "VariableDeclaration",
                      "scope": 2211,
                      "src": "2653:23:17",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                        "typeString": "uint256[]"
                      },
                      "typeName": {
                        "baseType": {
                          "id": 2192,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "2653:4:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2193,
                        "length": null,
                        "nodeType": "ArrayTypeName",
                        "src": "2653:6:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                          "typeString": "uint256[]"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2198,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 2195,
                      "name": "versionsOfIdentifier",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1993,
                      "src": "2679:20:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_string_memory_$_t_array$_t_uint256_$dyn_storage_$",
                        "typeString": "mapping(string memory => uint256[] storage ref)"
                      }
                    },
                    "id": 2197,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 2196,
                      "name": "_identifier",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2186,
                      "src": "2700:11:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string memory"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2679:33:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                      "typeString": "uint256[] storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "2653:59:17"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 2199,
                        "name": "templateOfVersionOfIdentifier",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1999,
                        "src": "2729:29:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_string_memory_$_t_mapping$_t_uint256_$_t_contract$_Template_$3128_$_$",
                          "typeString": "mapping(string memory => mapping(uint256 => contract Template))"
                        }
                      },
                      "id": 2201,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 2200,
                        "name": "_identifier",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2186,
                        "src": "2759:11:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "2729:42:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_uint256_$_t_contract$_Template_$3128_$",
                        "typeString": "mapping(uint256 => contract Template)"
                      }
                    },
                    "id": 2208,
                    "indexExpression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 2202,
                        "name": "versions",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2194,
                        "src": "2772:8:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                          "typeString": "uint256[] storage pointer"
                        }
                      },
                      "id": 2207,
                      "indexExpression": {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 2206,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 2203,
                            "name": "versions",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2194,
                            "src": "2781:8:17",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                              "typeString": "uint256[] storage pointer"
                            }
                          },
                          "id": 2204,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "2781:15:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "-",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "31",
                          "id": 2205,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "2799:1:17",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_1_by_1",
                            "typeString": "int_const 1"
                          },
                          "value": "1"
                        },
                        "src": "2781:19:17",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "2772:29:17",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2729:73:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Template_$3128",
                      "typeString": "contract Template"
                    }
                  },
                  "functionReturnParameters": 2190,
                  "id": 2209,
                  "nodeType": "Return",
                  "src": "2722:80:17"
                }
              ]
            },
            "documentation": null,
            "id": 2211,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "latestTemplateOf",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2187,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2186,
                  "name": "_identifier",
                  "nodeType": "VariableDeclaration",
                  "scope": 2211,
                  "src": "2583:18:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 2185,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2583:6:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2582:20:17"
            },
            "payable": false,
            "returnParameters": {
              "id": 2190,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2189,
                  "name": "template",
                  "nodeType": "VariableDeclaration",
                  "scope": 2211,
                  "src": "2624:17:17",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_Template_$3128",
                    "typeString": "contract Template"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2188,
                    "name": "Template",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3128,
                    "src": "2624:8:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Template_$3128",
                      "typeString": "contract Template"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2623:19:17"
            },
            "scope": 2212,
            "src": "2557:252:17",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          }
        ],
        "scope": 2213,
        "src": "141:2670:17"
      }
    ],
    "src": "0:2812:17"
  },
  "compiler": {
    "name": "solc",
    "version": "0.4.24+commit.e67f0147.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "2.0.1",
  "updatedAt": "2018-09-18T23:48:50.050Z"
}