{
  "_format": "hh-sol-artifact-1",
  "contractName": "ERC20StakingERC20RewardsLinearPoolMock",
  "sourceName": "contracts/mocks/staking/linear/ERC20StakingERC20RewardsLinearPoolMock.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "contract IERC20",
          "name": "stakingToken",
          "type": "address"
        },
        {
          "internalType": "contract IERC20",
          "name": "rewardToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "rewardHolder",
          "type": "address"
        },
        {
          "internalType": "uint8",
          "name": "scalingFactorDecimals",
          "type": "uint8"
        },
        {
          "internalType": "contract IForwarderRegistry",
          "name": "forwarderRegistry",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "FailedCall",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "IllegalInterfaceId",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InconsistentArrayLengths",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "tokenContract",
          "type": "address"
        }
      ],
      "name": "IncorrectTokenContractType",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "balance",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "needed",
          "type": "uint256"
        }
      ],
      "name": "InsufficientBalance",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "claimable",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "claimed",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "unclaimed",
          "type": "uint256"
        }
      ],
      "name": "InvalidClaimSum",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidDuration",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "requested",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "recoverable",
          "type": "uint256"
        }
      ],
      "name": "InvalidRecoveryAmount",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidRewardAmount",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidStakeAmount",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidToken",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidWithdrawAmount",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "NotContractOwner",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "staker",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "stake",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "withdraw",
          "type": "uint256"
        }
      ],
      "name": "NotEnoughStake",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "NotRoleHolder",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ReentrancyGuardReentrantCall",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "currentRewardRate",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "newRewardRate",
          "type": "uint256"
        }
      ],
      "name": "RewardDilution",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "RewardOverflow",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "SafeERC20FailedOperation",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ScalingFactorOutOfBounds",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "staker",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "claimData",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "claimed",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "unclaimed",
          "type": "uint256"
        }
      ],
      "name": "Claimed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "rewarder",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "reward",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "duration",
          "type": "uint256"
        }
      ],
      "name": "RewardAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "rewardHolder",
          "type": "address"
        }
      ],
      "name": "RewardHolderSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "operator",
          "type": "address"
        }
      ],
      "name": "RoleGranted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "operator",
          "type": "address"
        }
      ],
      "name": "RoleRevoked",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "staker",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "stakeData",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "stakePoints",
          "type": "uint256"
        }
      ],
      "name": "Staked",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "staker",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "withdrawData",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "stakePoints",
          "type": "uint256"
        }
      ],
      "name": "Withdrawn",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "REWARDER_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "REWARD_TOKEN",
      "outputs": [
        {
          "internalType": "contract IERC20",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SCALING_FACTOR",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "STAKING_TOKEN",
      "outputs": [
        {
          "internalType": "contract IERC20",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "__msgData",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "reward",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "duration",
          "type": "uint256"
        }
      ],
      "name": "addReward",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "claimData",
          "type": "bytes"
        }
      ],
      "name": "claim",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "distributionEnd",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "earned",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "forwarderRegistry",
      "outputs": [
        {
          "internalType": "contract IForwarderRegistry",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "grantRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "hasRole",
      "outputs": [
        {
          "internalType": "bool",
          "name": "hasRole_",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "forwarder",
          "type": "address"
        }
      ],
      "name": "isTrustedForwarder",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "lastTimeRewardApplicable",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "lastUpdated",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "name": "onERC20Received",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address[]",
          "name": "accounts",
          "type": "address[]"
        },
        {
          "internalType": "contract IERC20[]",
          "name": "tokens",
          "type": "address[]"
        },
        {
          "internalType": "uint256[]",
          "name": "amounts",
          "type": "uint256[]"
        }
      ],
      "name": "recoverERC20s",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address[]",
          "name": "accounts",
          "type": "address[]"
        },
        {
          "internalType": "contract IERC721[]",
          "name": "contracts",
          "type": "address[]"
        },
        {
          "internalType": "uint256[]",
          "name": "tokenIds",
          "type": "uint256[]"
        }
      ],
      "name": "recoverERC721s",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address payable[]",
          "name": "accounts",
          "type": "address[]"
        },
        {
          "internalType": "uint256[]",
          "name": "amounts",
          "type": "uint256[]"
        }
      ],
      "name": "recoverETH",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        }
      ],
      "name": "renounceRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "revokeRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "rewardHolder",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "rewardPerStakePoint",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "staker",
          "type": "address"
        }
      ],
      "name": "rewardPerStakePointPaid",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "paid",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "rewardPerStakePointStored",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "rewardRate",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "staker",
          "type": "address"
        }
      ],
      "name": "rewards",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "reward",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "rewardHolder_",
          "type": "address"
        }
      ],
      "name": "setRewardHolder",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "stakeData",
          "type": "bytes"
        }
      ],
      "name": "stake",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "staker",
          "type": "address"
        }
      ],
      "name": "staked",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "stakePoints",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalStaked",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "withdrawData",
          "type": "bytes"
        }
      ],
      "name": "withdraw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x6101003461025557601f612ff338819003918201601f19168301916001600160401b0383118484101761025a5780849260a0946040528339810103126102555761004881610270565b61005460208301610270565b60408301516001600160a01b03811693919291908490036102555760608101519060ff82168092036102555760800151906001600160a01b038216820361025557336101f6575b7fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d916307f5828d60e41b600052826020526040600020600160ff198254161790556001600055608052604d8110156101e557604d81116101cf57600a0a60a052634fc3585960e01b6000526020526040600020600160ff1982541617905560c05260e0528060018060a01b03196009541617600955604051907f92c047df6e363693ec05d0bd21ac0dbc9951c94b023c16966a58dd78f0e27d29600080a2612d6e90816102858239608051818181611fa5015281816126dd015281816129460152612b63015260a051818181610557015281816107ed0152611172015260c051818181611484015281816118dc01528181611ef80152818161207e0152612227015260e05181818161083d0152610cb40152f35b634e487b7160e01b600052601160045260246000fd5b63a54ad6c560e01b60005260046000fd5b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a361009b565b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036102555756fe6080604052600436101561001257600080fd5b6000803560e01c80628cc262146122b357806301ffc9a71461224b5780630479d644146121dc5780630700037d146121795780630968f26414611fc95780632b4c9f1614611f5a5780632c9d0b8014611f215780632d1e0c0214611d2e5780632f2ff15d14611b8a57806331e66e1e14611b385780634fc3585914611876578063569c93d214611824578063572b6c05146117d85780636806cc931461169c57806373c8a9581461146c57806375c93bb9146110b65780637b0a47ee1461107a57806380faa57d14611039578063817b1cd214610ffd5780638580cf7614610fa45780638bb9c5bf14610e3f5780638da5cb5b14610dcd57806391d1485414610d3b57806398807d8414610cd857806399248ea714610c695780639d696e3614610c2d578063c3666c361461096e578063c5c8f7701461090b578063c63ff8dd14610765578063d0b06f5d14610729578063d547741f1461057a578063ef4cadc514610521578063efa90b54146104e5578063f2fde38b146103bf5763f7ba94bd1461019d57600080fd5b346103bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760043567ffffffffffffffff81116103ba576101ec9036906004016123ad565b60243567ffffffffffffffff81116103b65761020c9036906004016123ad565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061024d61292f565b9254169116908103610389575081810361036157845b81811061026e578580f35b610279818387612725565b3573ffffffffffffffffffffffffffffffffffffffff811680910361035d576102a3828587612725565b359081471061032d578780809381935af13d15610325573d906102c5826125a7565b916102d36040519384612537565b82523d88602084013e5b156102eb5750600101610263565b80518790156102fd5750602081519101fd5b807fd6bda2750000000000000000000000000000000000000000000000000000000060049252fd5b6060906102dd565b60448883477fcf479181000000000000000000000000000000000000000000000000000000008352600452602452fd5b8680fd5b6004857f65825336000000000000000000000000000000000000000000000000000000008152fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b8380fd5b505b80fd5b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576103f76122f5565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc9061042161292f565b9073ffffffffffffffffffffffffffffffffffffffff8084541692168281036104ba575073ffffffffffffffffffffffffffffffffffffffff1691828203610467578380f35b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a33880808380f35b7f2ef4875e000000000000000000000000000000000000000000000000000000008552600452602484fd5b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576020600554604051908152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346103bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576004356105b561231d565b6105bd61292f565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361038957507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22818552806020526040852073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541661066f578480f35b7ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9361071e918387526020526040862073ffffffffffffffffffffffffffffffffffffffff851660005260205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690556040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b0390a1388080808480f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576020600254604051908152f35b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760043567ffffffffffffffff81116103ba576107b5903690600401612340565b6107bd6128f4565b6107c561292f565b916107cf83612862565b6107d8836124cd565b91826107e7575b846001815580f35b939192937f000000000000000000000000000000000000000000000000000000000000000061081681866125e1565b9381156108de57610861858873ffffffffffffffffffffffffffffffffffffffff600954167f0000000000000000000000000000000000000000000000000000000000000000612ae2565b50600094069273ffffffffffffffffffffffffffffffffffffffff7f019eda09011e476781de26947e4b78ee0a834e7182f5ff2eb62bcf8c523f42ca9495961694858752600760205260408720556108c660405193849360608552606085019161236e565b9060208301528560408301520390a2388080806107df565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526012600452fd5b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57604060209173ffffffffffffffffffffffffffffffffffffffff61095d6122f5565b168152600883522054604051908152f35b50346103bc5761097d366123de565b929490939092917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806109c361292f565b9254169116908103610c025750808214801590610bf8575b610bd057865b8281106109ec578780f35b73ffffffffffffffffffffffffffffffffffffffff610a14610a0f83858b612725565b612764565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610bc5578a91610b88575b5015610b5d575073ffffffffffffffffffffffffffffffffffffffff610aa2610a0f83858b612725565b169088610ab3610a0f83878a612725565b92610abf83888b612725565b3590803b15610b59576040517f42842e0e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff95909516602486015260448501919091528390606490829084905af191898315610b4d57600193610b3d575b5050016109e1565b610b4691612537565b3889610b35565b604051903d90823e3d90fd5b8280fd5b7f986b9f1f000000000000000000000000000000000000000000000000000000008952600452602488fd5b90506020813d8211610bbd575b81610ba260209383612537565b81010312610bb957610bb3906128e7565b38610a78565b8980fd5b3d9150610b95565b6040513d8c823e3d90fd5b6004877f65825336000000000000000000000000000000000000000000000000000000008152fd5b50828214156109db565b7f2ef4875e000000000000000000000000000000000000000000000000000000008852600452602487fd5b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576020600454604051908152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57604060209173ffffffffffffffffffffffffffffffffffffffff610d2a6122f5565b168152600683522054604051908152f35b50346103bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760ff6040602092610d7a61231d565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004358352855273ffffffffffffffffffffffffffffffffffffffff8383209116825284522054166040519015158152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5750602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57600435907fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610e9c61292f565b90838352806020526040832073ffffffffffffffffffffffffffffffffffffffff8316845260205260ff60408420541615610f5e578383526020908152604080842073ffffffffffffffffffffffffffffffffffffffff9390931680855292825280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051948552908401829052830152907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b90606090a180f35b5073ffffffffffffffffffffffffffffffffffffffff906044937f7aa7288200000000000000000000000000000000000000000000000000000000845260045216602452fd5b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760206040517f72657761726465720000000000000000000000000000000000000000000000008152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576020600154604051908152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576020611072612785565b604051908152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576020600354604051908152f35b5060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576004356024356110ef61292f565b907fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b227f726577617264657200000000000000000000000000000000000000000000000085526020526040842073ffffffffffffffffffffffffffffffffffffffff8316855260205260ff604085205416156114065782156113de5780156113b6577f00000000000000000000000000000000000000000000000000000000000000008084029084820414809102901561138e576111aa61261a565b6004556005544210801590611383575b611373575b600554906111cd83426124c0565b914281116112365750928273ffffffffffffffffffffffffffffffffffffffff9261121b6040957f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474976125e1565b6003556005555b42600255835195865260208601521692a280f35b9160039391935461125061124a4286612471565b826124ad565b8501948510948515029461134b578382116112bf575050507f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474926040926112b76112b073ffffffffffffffffffffffffffffffffffffffff944290612471565b80926125e1565b600355611222565b916112cd91935080946125e1565b9080821061131d57509260409273ffffffffffffffffffffffffffffffffffffffff927f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec847495600355600555611222565b7f19e2447d000000000000000000000000000000000000000000000000000000008752600452602452604485fd5b6004887f50082065000000000000000000000000000000000000000000000000000000008152fd5b61137b612785565b6002556111bf565b5060015415156111ba565b6004857f50082065000000000000000000000000000000000000000000000000000000008152fd5b6004847f76166401000000000000000000000000000000000000000000000000000000008152fd5b6004847f38539865000000000000000000000000000000000000000000000000000000008152fd5b60448473ffffffffffffffffffffffffffffffffffffffff847f7aa728820000000000000000000000000000000000000000000000000000000083527f726577617264657200000000000000000000000000000000000000000000000060045216602452fd5b50346103bc5761147b366123de565b929493909291867f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815b81848a81841061164957505050508161157d575b50507fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061151061292f565b9254169116908103610c025750808214801590611573575b610bd057865b828110611539578780f35b8061156d61154d610a0f600194868c612725565b61155b610a0f84888c612725565b61156684898b612725565b3591612a7e565b0161152e565b5082821415611528565b6020602491604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa801561163e578990611606575b6115cf915060015490612471565b90818111156114cf577f15c38d3e000000000000000000000000000000000000000000000000000000008952600452602452604487fd5b506020813d602011611636575b8161162060209383612537565b81010312611632576115cf90516115c1565b8880fd5b3d9150611613565b6040513d8b823e3d90fd5b610a0f8473ffffffffffffffffffffffffffffffffffffffff9361166c93612725565b161461167b575b6001016114bb565b9161169460019161168d85898b612725565b35906124c0565b929050611673565b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576116d46122f5565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061171361292f565b92541691169081036117ad575073ffffffffffffffffffffffffffffffffffffffff60095491169073ffffffffffffffffffffffffffffffffffffffff8116820361175c578280f35b7fffffffffffffffffffffffff00000000000000000000000000000000000000001681176009557f92c047df6e363693ec05d0bd21ac0dbc9951c94b023c16966a58dd78f0e27d298280a238808280f35b7f2ef4875e000000000000000000000000000000000000000000000000000000008352600452602482fd5b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57602061181a6118156122f5565b6126c6565b6040519015158152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b50346103bc5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576118ae6122f5565b506118b761231d565b9060643567ffffffffffffffff81116103ba576118d8903690600401612340565b50507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff81163303611b105760405192604435602085015260208452611933604085612537565b604051916020830184815261198484611958604082019860408a526060830190612683565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101865285612537565b61198c6128f4565b61199583612862565b835184019060408560208401930312611b0c576119b1906128e7565b955167ffffffffffffffff8111611b0c57840181603f82011215611b0c5760208101516119dd816125a7565b916119eb6040519384612537565b818352602083019360408284010111611b0857602092611a118593846040879501612660565b805101010312611b0457518095611af1575b905015611ac9578373ffffffffffffffffffffffffffffffffffffffff7ff4679d394f1f97f1a3df1d73e193866ec5a813168ad5fa6958f9be21b10a594e92611a6f60019788546124c0565b87551692838552600660205260408520611a8a8382546124c0565b9055611a9b60405192839283612846565b0390a25560206040517f4fc35859000000000000000000000000000000000000000000000000000000008152f35b6004837f040ef8ec000000000000000000000000000000000000000000000000000000008152fd5b611afd91833091612ae2565b3884611a23565b8480fd5b8780fd5b8580fd5b6004827fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57611b6f612b4c565b611b8660405192839260208452602084019161236e565b0390f35b50346103bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57600435611bc561231d565b611bcd61292f565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff84169081036104ba57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22818552806020526040852073ffffffffffffffffffffffffffffffffffffffff8416865260205260ff60408620541615611c7e578480f35b7f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9361071e918387526020526040862073ffffffffffffffffffffffffffffffffffffffff851687526020526040862060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790556040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760043567ffffffffffffffff81116103ba57611d79903690600401612340565b611d8161292f565b60405192611da884611958602082019360018552604083019660408852606084019161236e565b611db06128f4565b611db982612862565b835184019060408560208401930312611b0c57611dd5906128e7565b925167ffffffffffffffff8111611b0c57840181603f82011215611b0c57602081015190611e02826125a7565b91611e106040519384612537565b808352602083019360408383010111611b0857602092611e368492866040819601612660565b805101010312611b04575191611ef0575b8115611ec8579073ffffffffffffffffffffffffffffffffffffffff7ff4679d394f1f97f1a3df1d73e193866ec5a813168ad5fa6958f9be21b10a594e92611e91836001546124c0565b6001551692838552600660205260408520611ead8382546124c0565b9055611ebe60405192839283612846565b0390a26001815580f35b6004847f040ef8ec000000000000000000000000000000000000000000000000000000008152fd5b611f1c8230837f0000000000000000000000000000000000000000000000000000000000000000612ae2565b611e47565b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57602061107261261a565b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760043567ffffffffffffffff81116103ba57612019903690600401612340565b61202161292f565b908361202c826125a7565b9361203a6040519586612537565b82855260208501923681830111610b59578060209285378501015261205d6128f4565b61206682612862565b60208181855186010103126103b65751906120a282827f0000000000000000000000000000000000000000000000000000000000000000612a7e565b81156121515773ffffffffffffffffffffffffffffffffffffffff16918284526006602052604084205482811061211d5790827faae638dec0d864ccb08558c28981bcfaee41330f57c4911cbe2d8432d0fb729e939285875260066020520360408620558160015403600155611ebe60405192839283612846565b905083927f2b6a77580000000000000000000000000000000000000000000000000000000060649552600452602452604452fd5b6004847fdb73cdf0000000000000000000000000000000000000000000000000000000008152fd5b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57604060209173ffffffffffffffffffffffffffffffffffffffff6121cb6122f5565b168152600783522054604051908152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57600435907fffffffff00000000000000000000000000000000000000000000000000000000821682036103bc57602061181a83612797565b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760206110726122f06122f5565b6124cd565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361231857565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361231857565b9181601f840112156123185782359167ffffffffffffffff8311612318576020838186019501011161231857565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9181601f840112156123185782359167ffffffffffffffff8311612318576020808501948460051b01011161231857565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126123185760043567ffffffffffffffff81116123185781612427916004016123ad565b9290929160243567ffffffffffffffff8111612318578161244a916004016123ad565b929092916044359067ffffffffffffffff82116123185761246d916004016123ad565b9091565b9190820391821161247e57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181029291811591840414171561247e57565b9190820180921161247e57565b73ffffffffffffffffffffffffffffffffffffffff612534911680600052600660205261251f60406000205461251961250461261a565b84600052600860205260406000205490612471565b906124ad565b906000526007602052604060002054906124c0565b90565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761257857604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161257857601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b81156125eb570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600154801561265957612534906126536004549161264e61264561263c612785565b60025490612471565b600354906124ad565b6125e1565b906124c0565b5060045490565b60005b8381106126735750506000910152565b8181015183820152602001612663565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936126bf81518092818752878088019101612660565b0116010190565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690811561271e5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b91908110156127355760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036123185790565b60055480421060001461253457504290565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114612840577f01ffc9a700000000000000000000000000000000000000000000000000000000811461283a576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b92919061285d602091604086526040860190612683565b930152565b61286a61261a565b60045560055442108015906128dc575b6128cc575b73ffffffffffffffffffffffffffffffffffffffff811690816128a0575050565b6128a9906124cd565b816000526007602052604060002055600454906000526008602052604060002055565b6128d4612785565b60025561287f565b50600154151561287a565b5190811515820361231857565b600260005414612905576002600055565b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015612a6f573233148015612a74575b612a6f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156129b7575b5061253457503390565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115612a6357600091612a29575b50386129ad565b90506020813d602011612a5b575b81612a4460209383612537565b8101031261231857612a55906128e7565b38612a22565b3d9150612a37565b6040513d6000823e3d90fd5b503390565b5060183610612976565b612ae09273ffffffffffffffffffffffffffffffffffffffff604051937fa9059cbb000000000000000000000000000000000000000000000000000000006020860152166024840152604483015260448252612adb606483612537565b612cad565b565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff9283166024820152929091166044830152606480830193909352918152612ae091612adb608483612537565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015612c9b573233148015612ca3575b612c9b57803314908115612bdf575b50612bae576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116123185760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115612a6357600091612c61575b5038612ba2565b90506020813d602011612c93575b81612c7c60209383612537565b8101031261231857612c8d906128e7565b38612c5a565b3d9150612c6f565b506000903690565b5060183610612b93565b906000602091828151910182855af115612a63576000513d612d2f575073ffffffffffffffffffffffffffffffffffffffff81163b155b612ceb5750565b73ffffffffffffffffffffffffffffffffffffffff907f5274afe7000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b60011415612ce456fea26469706673582212209627cb29688aeecd923ac9c52dc6c9b2ee969d050ad0dafa58e900884f3d79eb64736f6c634300081e0033",
  "deployedBytecode": "0x6080604052600436101561001257600080fd5b6000803560e01c80628cc262146122b357806301ffc9a71461224b5780630479d644146121dc5780630700037d146121795780630968f26414611fc95780632b4c9f1614611f5a5780632c9d0b8014611f215780632d1e0c0214611d2e5780632f2ff15d14611b8a57806331e66e1e14611b385780634fc3585914611876578063569c93d214611824578063572b6c05146117d85780636806cc931461169c57806373c8a9581461146c57806375c93bb9146110b65780637b0a47ee1461107a57806380faa57d14611039578063817b1cd214610ffd5780638580cf7614610fa45780638bb9c5bf14610e3f5780638da5cb5b14610dcd57806391d1485414610d3b57806398807d8414610cd857806399248ea714610c695780639d696e3614610c2d578063c3666c361461096e578063c5c8f7701461090b578063c63ff8dd14610765578063d0b06f5d14610729578063d547741f1461057a578063ef4cadc514610521578063efa90b54146104e5578063f2fde38b146103bf5763f7ba94bd1461019d57600080fd5b346103bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760043567ffffffffffffffff81116103ba576101ec9036906004016123ad565b60243567ffffffffffffffff81116103b65761020c9036906004016123ad565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061024d61292f565b9254169116908103610389575081810361036157845b81811061026e578580f35b610279818387612725565b3573ffffffffffffffffffffffffffffffffffffffff811680910361035d576102a3828587612725565b359081471061032d578780809381935af13d15610325573d906102c5826125a7565b916102d36040519384612537565b82523d88602084013e5b156102eb5750600101610263565b80518790156102fd5750602081519101fd5b807fd6bda2750000000000000000000000000000000000000000000000000000000060049252fd5b6060906102dd565b60448883477fcf479181000000000000000000000000000000000000000000000000000000008352600452602452fd5b8680fd5b6004857f65825336000000000000000000000000000000000000000000000000000000008152fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b8380fd5b505b80fd5b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576103f76122f5565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc9061042161292f565b9073ffffffffffffffffffffffffffffffffffffffff8084541692168281036104ba575073ffffffffffffffffffffffffffffffffffffffff1691828203610467578380f35b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a33880808380f35b7f2ef4875e000000000000000000000000000000000000000000000000000000008552600452602484fd5b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576020600554604051908152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346103bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576004356105b561231d565b6105bd61292f565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361038957507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22818552806020526040852073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541661066f578480f35b7ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9361071e918387526020526040862073ffffffffffffffffffffffffffffffffffffffff851660005260205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690556040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b0390a1388080808480f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576020600254604051908152f35b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760043567ffffffffffffffff81116103ba576107b5903690600401612340565b6107bd6128f4565b6107c561292f565b916107cf83612862565b6107d8836124cd565b91826107e7575b846001815580f35b939192937f000000000000000000000000000000000000000000000000000000000000000061081681866125e1565b9381156108de57610861858873ffffffffffffffffffffffffffffffffffffffff600954167f0000000000000000000000000000000000000000000000000000000000000000612ae2565b50600094069273ffffffffffffffffffffffffffffffffffffffff7f019eda09011e476781de26947e4b78ee0a834e7182f5ff2eb62bcf8c523f42ca9495961694858752600760205260408720556108c660405193849360608552606085019161236e565b9060208301528560408301520390a2388080806107df565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526012600452fd5b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57604060209173ffffffffffffffffffffffffffffffffffffffff61095d6122f5565b168152600883522054604051908152f35b50346103bc5761097d366123de565b929490939092917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806109c361292f565b9254169116908103610c025750808214801590610bf8575b610bd057865b8281106109ec578780f35b73ffffffffffffffffffffffffffffffffffffffff610a14610a0f83858b612725565b612764565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610bc5578a91610b88575b5015610b5d575073ffffffffffffffffffffffffffffffffffffffff610aa2610a0f83858b612725565b169088610ab3610a0f83878a612725565b92610abf83888b612725565b3590803b15610b59576040517f42842e0e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff95909516602486015260448501919091528390606490829084905af191898315610b4d57600193610b3d575b5050016109e1565b610b4691612537565b3889610b35565b604051903d90823e3d90fd5b8280fd5b7f986b9f1f000000000000000000000000000000000000000000000000000000008952600452602488fd5b90506020813d8211610bbd575b81610ba260209383612537565b81010312610bb957610bb3906128e7565b38610a78565b8980fd5b3d9150610b95565b6040513d8c823e3d90fd5b6004877f65825336000000000000000000000000000000000000000000000000000000008152fd5b50828214156109db565b7f2ef4875e000000000000000000000000000000000000000000000000000000008852600452602487fd5b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576020600454604051908152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57604060209173ffffffffffffffffffffffffffffffffffffffff610d2a6122f5565b168152600683522054604051908152f35b50346103bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760ff6040602092610d7a61231d565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004358352855273ffffffffffffffffffffffffffffffffffffffff8383209116825284522054166040519015158152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5750602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57600435907fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610e9c61292f565b90838352806020526040832073ffffffffffffffffffffffffffffffffffffffff8316845260205260ff60408420541615610f5e578383526020908152604080842073ffffffffffffffffffffffffffffffffffffffff9390931680855292825280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051948552908401829052830152907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b90606090a180f35b5073ffffffffffffffffffffffffffffffffffffffff906044937f7aa7288200000000000000000000000000000000000000000000000000000000845260045216602452fd5b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760206040517f72657761726465720000000000000000000000000000000000000000000000008152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576020600154604051908152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576020611072612785565b604051908152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576020600354604051908152f35b5060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576004356024356110ef61292f565b907fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b227f726577617264657200000000000000000000000000000000000000000000000085526020526040842073ffffffffffffffffffffffffffffffffffffffff8316855260205260ff604085205416156114065782156113de5780156113b6577f00000000000000000000000000000000000000000000000000000000000000008084029084820414809102901561138e576111aa61261a565b6004556005544210801590611383575b611373575b600554906111cd83426124c0565b914281116112365750928273ffffffffffffffffffffffffffffffffffffffff9261121b6040957f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474976125e1565b6003556005555b42600255835195865260208601521692a280f35b9160039391935461125061124a4286612471565b826124ad565b8501948510948515029461134b578382116112bf575050507f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474926040926112b76112b073ffffffffffffffffffffffffffffffffffffffff944290612471565b80926125e1565b600355611222565b916112cd91935080946125e1565b9080821061131d57509260409273ffffffffffffffffffffffffffffffffffffffff927f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec847495600355600555611222565b7f19e2447d000000000000000000000000000000000000000000000000000000008752600452602452604485fd5b6004887f50082065000000000000000000000000000000000000000000000000000000008152fd5b61137b612785565b6002556111bf565b5060015415156111ba565b6004857f50082065000000000000000000000000000000000000000000000000000000008152fd5b6004847f76166401000000000000000000000000000000000000000000000000000000008152fd5b6004847f38539865000000000000000000000000000000000000000000000000000000008152fd5b60448473ffffffffffffffffffffffffffffffffffffffff847f7aa728820000000000000000000000000000000000000000000000000000000083527f726577617264657200000000000000000000000000000000000000000000000060045216602452fd5b50346103bc5761147b366123de565b929493909291867f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815b81848a81841061164957505050508161157d575b50507fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061151061292f565b9254169116908103610c025750808214801590611573575b610bd057865b828110611539578780f35b8061156d61154d610a0f600194868c612725565b61155b610a0f84888c612725565b61156684898b612725565b3591612a7e565b0161152e565b5082821415611528565b6020602491604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa801561163e578990611606575b6115cf915060015490612471565b90818111156114cf577f15c38d3e000000000000000000000000000000000000000000000000000000008952600452602452604487fd5b506020813d602011611636575b8161162060209383612537565b81010312611632576115cf90516115c1565b8880fd5b3d9150611613565b6040513d8b823e3d90fd5b610a0f8473ffffffffffffffffffffffffffffffffffffffff9361166c93612725565b161461167b575b6001016114bb565b9161169460019161168d85898b612725565b35906124c0565b929050611673565b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576116d46122f5565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061171361292f565b92541691169081036117ad575073ffffffffffffffffffffffffffffffffffffffff60095491169073ffffffffffffffffffffffffffffffffffffffff8116820361175c578280f35b7fffffffffffffffffffffffff00000000000000000000000000000000000000001681176009557f92c047df6e363693ec05d0bd21ac0dbc9951c94b023c16966a58dd78f0e27d298280a238808280f35b7f2ef4875e000000000000000000000000000000000000000000000000000000008352600452602482fd5b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57602061181a6118156122f5565b6126c6565b6040519015158152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b50346103bc5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576118ae6122f5565b506118b761231d565b9060643567ffffffffffffffff81116103ba576118d8903690600401612340565b50507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff81163303611b105760405192604435602085015260208452611933604085612537565b604051916020830184815261198484611958604082019860408a526060830190612683565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101865285612537565b61198c6128f4565b61199583612862565b835184019060408560208401930312611b0c576119b1906128e7565b955167ffffffffffffffff8111611b0c57840181603f82011215611b0c5760208101516119dd816125a7565b916119eb6040519384612537565b818352602083019360408284010111611b0857602092611a118593846040879501612660565b805101010312611b0457518095611af1575b905015611ac9578373ffffffffffffffffffffffffffffffffffffffff7ff4679d394f1f97f1a3df1d73e193866ec5a813168ad5fa6958f9be21b10a594e92611a6f60019788546124c0565b87551692838552600660205260408520611a8a8382546124c0565b9055611a9b60405192839283612846565b0390a25560206040517f4fc35859000000000000000000000000000000000000000000000000000000008152f35b6004837f040ef8ec000000000000000000000000000000000000000000000000000000008152fd5b611afd91833091612ae2565b3884611a23565b8480fd5b8780fd5b8580fd5b6004827fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57611b6f612b4c565b611b8660405192839260208452602084019161236e565b0390f35b50346103bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57600435611bc561231d565b611bcd61292f565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff84169081036104ba57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22818552806020526040852073ffffffffffffffffffffffffffffffffffffffff8416865260205260ff60408620541615611c7e578480f35b7f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9361071e918387526020526040862073ffffffffffffffffffffffffffffffffffffffff851687526020526040862060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790556040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760043567ffffffffffffffff81116103ba57611d79903690600401612340565b611d8161292f565b60405192611da884611958602082019360018552604083019660408852606084019161236e565b611db06128f4565b611db982612862565b835184019060408560208401930312611b0c57611dd5906128e7565b925167ffffffffffffffff8111611b0c57840181603f82011215611b0c57602081015190611e02826125a7565b91611e106040519384612537565b808352602083019360408383010111611b0857602092611e368492866040819601612660565b805101010312611b04575191611ef0575b8115611ec8579073ffffffffffffffffffffffffffffffffffffffff7ff4679d394f1f97f1a3df1d73e193866ec5a813168ad5fa6958f9be21b10a594e92611e91836001546124c0565b6001551692838552600660205260408520611ead8382546124c0565b9055611ebe60405192839283612846565b0390a26001815580f35b6004847f040ef8ec000000000000000000000000000000000000000000000000000000008152fd5b611f1c8230837f0000000000000000000000000000000000000000000000000000000000000000612ae2565b611e47565b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57602061107261261a565b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760043567ffffffffffffffff81116103ba57612019903690600401612340565b61202161292f565b908361202c826125a7565b9361203a6040519586612537565b82855260208501923681830111610b59578060209285378501015261205d6128f4565b61206682612862565b60208181855186010103126103b65751906120a282827f0000000000000000000000000000000000000000000000000000000000000000612a7e565b81156121515773ffffffffffffffffffffffffffffffffffffffff16918284526006602052604084205482811061211d5790827faae638dec0d864ccb08558c28981bcfaee41330f57c4911cbe2d8432d0fb729e939285875260066020520360408620558160015403600155611ebe60405192839283612846565b905083927f2b6a77580000000000000000000000000000000000000000000000000000000060649552600452602452604452fd5b6004847fdb73cdf0000000000000000000000000000000000000000000000000000000008152fd5b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57604060209173ffffffffffffffffffffffffffffffffffffffff6121cb6122f5565b168152600783522054604051908152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57600435907fffffffff00000000000000000000000000000000000000000000000000000000821682036103bc57602061181a83612797565b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760206110726122f06122f5565b6124cd565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361231857565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361231857565b9181601f840112156123185782359167ffffffffffffffff8311612318576020838186019501011161231857565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9181601f840112156123185782359167ffffffffffffffff8311612318576020808501948460051b01011161231857565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126123185760043567ffffffffffffffff81116123185781612427916004016123ad565b9290929160243567ffffffffffffffff8111612318578161244a916004016123ad565b929092916044359067ffffffffffffffff82116123185761246d916004016123ad565b9091565b9190820391821161247e57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181029291811591840414171561247e57565b9190820180921161247e57565b73ffffffffffffffffffffffffffffffffffffffff612534911680600052600660205261251f60406000205461251961250461261a565b84600052600860205260406000205490612471565b906124ad565b906000526007602052604060002054906124c0565b90565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761257857604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161257857601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b81156125eb570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600154801561265957612534906126536004549161264e61264561263c612785565b60025490612471565b600354906124ad565b6125e1565b906124c0565b5060045490565b60005b8381106126735750506000910152565b8181015183820152602001612663565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936126bf81518092818752878088019101612660565b0116010190565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690811561271e5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b91908110156127355760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036123185790565b60055480421060001461253457504290565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114612840577f01ffc9a700000000000000000000000000000000000000000000000000000000811461283a576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b92919061285d602091604086526040860190612683565b930152565b61286a61261a565b60045560055442108015906128dc575b6128cc575b73ffffffffffffffffffffffffffffffffffffffff811690816128a0575050565b6128a9906124cd565b816000526007602052604060002055600454906000526008602052604060002055565b6128d4612785565b60025561287f565b50600154151561287a565b5190811515820361231857565b600260005414612905576002600055565b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015612a6f573233148015612a74575b612a6f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156129b7575b5061253457503390565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115612a6357600091612a29575b50386129ad565b90506020813d602011612a5b575b81612a4460209383612537565b8101031261231857612a55906128e7565b38612a22565b3d9150612a37565b6040513d6000823e3d90fd5b503390565b5060183610612976565b612ae09273ffffffffffffffffffffffffffffffffffffffff604051937fa9059cbb000000000000000000000000000000000000000000000000000000006020860152166024840152604483015260448252612adb606483612537565b612cad565b565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff9283166024820152929091166044830152606480830193909352918152612ae091612adb608483612537565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015612c9b573233148015612ca3575b612c9b57803314908115612bdf575b50612bae576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116123185760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115612a6357600091612c61575b5038612ba2565b90506020813d602011612c93575b81612c7c60209383612537565b8101031261231857612c8d906128e7565b38612c5a565b3d9150612c6f565b506000903690565b5060183610612b93565b906000602091828151910182855af115612a63576000513d612d2f575073ffffffffffffffffffffffffffffffffffffffff81163b155b612ceb5750565b73ffffffffffffffffffffffffffffffffffffffff907f5274afe7000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b60011415612ce456fea26469706673582212209627cb29688aeecd923ac9c52dc6c9b2ee969d050ad0dafa58e900884f3d79eb64736f6c634300081e0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
