{
  "_format": "hh-sol-artifact-1",
  "contractName": "DrawCalculatorHarness",
  "sourceName": "contracts/test/DrawCalculatorHarness.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "contract ITicket",
          "name": "_ticket",
          "type": "address"
        },
        {
          "internalType": "contract IDrawBuffer",
          "name": "_drawBuffer",
          "type": "address"
        },
        {
          "internalType": "contract IPrizeDistributionBuffer",
          "name": "_prizeDistributionBuffer",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "contract ITicket",
          "name": "ticket",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "contract IDrawBuffer",
          "name": "drawBuffer",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "contract IPrizeDistributionBuffer",
          "name": "prizeDistributionBuffer",
          "type": "address"
        }
      ],
      "name": "Deployed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "contract PrizeDistributor",
          "name": "prizeDistributor",
          "type": "address"
        }
      ],
      "name": "PrizeDistributorSet",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "TIERS_LENGTH",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_user",
          "type": "address"
        },
        {
          "internalType": "uint32[]",
          "name": "_drawIds",
          "type": "uint32[]"
        },
        {
          "internalType": "bytes",
          "name": "_pickIndicesForDraws",
          "type": "bytes"
        }
      ],
      "name": "calculate",
      "outputs": [
        {
          "internalType": "uint256[]",
          "name": "",
          "type": "uint256[]"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint8",
              "name": "bitRangeSize",
              "type": "uint8"
            },
            {
              "internalType": "uint8",
              "name": "matchCardinality",
              "type": "uint8"
            },
            {
              "internalType": "uint32",
              "name": "startTimestampOffset",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "endTimestampOffset",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "maxPicksPerUser",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "expiryDuration",
              "type": "uint32"
            },
            {
              "internalType": "uint104",
              "name": "numberOfPicks",
              "type": "uint104"
            },
            {
              "internalType": "uint32[16]",
              "name": "tiers",
              "type": "uint32[16]"
            },
            {
              "internalType": "uint256",
              "name": "prize",
              "type": "uint256"
            }
          ],
          "internalType": "struct IPrizeDistributionSource.PrizeDistribution",
          "name": "_prizeDistribution",
          "type": "tuple"
        },
        {
          "internalType": "uint256",
          "name": "_normalizedUserBalance",
          "type": "uint256"
        }
      ],
      "name": "calculateNumberOfUserPicks",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint8",
              "name": "bitRangeSize",
              "type": "uint8"
            },
            {
              "internalType": "uint8",
              "name": "matchCardinality",
              "type": "uint8"
            },
            {
              "internalType": "uint32",
              "name": "startTimestampOffset",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "endTimestampOffset",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "maxPicksPerUser",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "expiryDuration",
              "type": "uint32"
            },
            {
              "internalType": "uint104",
              "name": "numberOfPicks",
              "type": "uint104"
            },
            {
              "internalType": "uint32[16]",
              "name": "tiers",
              "type": "uint32[16]"
            },
            {
              "internalType": "uint256",
              "name": "prize",
              "type": "uint256"
            }
          ],
          "internalType": "struct IPrizeDistributionSource.PrizeDistribution",
          "name": "_prizeDistribution",
          "type": "tuple"
        },
        {
          "internalType": "uint256",
          "name": "_prizeTierIndex",
          "type": "uint256"
        }
      ],
      "name": "calculatePrizeTierFraction",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_randomNumberThisPick",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_winningRandomNumber",
          "type": "uint256"
        },
        {
          "internalType": "uint256[]",
          "name": "_masks",
          "type": "uint256[]"
        }
      ],
      "name": "calculateTierIndex",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint8",
              "name": "bitRangeSize",
              "type": "uint8"
            },
            {
              "internalType": "uint8",
              "name": "matchCardinality",
              "type": "uint8"
            },
            {
              "internalType": "uint32",
              "name": "startTimestampOffset",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "endTimestampOffset",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "maxPicksPerUser",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "expiryDuration",
              "type": "uint32"
            },
            {
              "internalType": "uint104",
              "name": "numberOfPicks",
              "type": "uint104"
            },
            {
              "internalType": "uint32[16]",
              "name": "tiers",
              "type": "uint32[16]"
            },
            {
              "internalType": "uint256",
              "name": "prize",
              "type": "uint256"
            }
          ],
          "internalType": "struct IPrizeDistributionSource.PrizeDistribution",
          "name": "_prizeDistribution",
          "type": "tuple"
        }
      ],
      "name": "createBitMasks",
      "outputs": [
        {
          "internalType": "uint256[]",
          "name": "",
          "type": "uint256[]"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "drawBuffer",
      "outputs": [
        {
          "internalType": "contract IDrawBuffer",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getDrawBuffer",
      "outputs": [
        {
          "internalType": "contract IDrawBuffer",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_user",
          "type": "address"
        },
        {
          "internalType": "uint32[]",
          "name": "_drawIds",
          "type": "uint32[]"
        }
      ],
      "name": "getNormalizedBalancesForDrawIds",
      "outputs": [
        {
          "internalType": "uint256[]",
          "name": "",
          "type": "uint256[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getPrizeDistributionBuffer",
      "outputs": [
        {
          "internalType": "contract IPrizeDistributionBuffer",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "_bitRangeSize",
          "type": "uint8"
        },
        {
          "internalType": "uint256",
          "name": "_prizeTierIndex",
          "type": "uint256"
        }
      ],
      "name": "numberOfPrizesForIndex",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "prizeDistributionBuffer",
      "outputs": [
        {
          "internalType": "contract IPrizeDistributionBuffer",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "ticket",
      "outputs": [
        {
          "internalType": "contract ITicket",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x60e06040523480156200001157600080fd5b50604051620025f7380380620025f78339810160408190526200003491620001ad565b8282826001600160a01b038316620000935760405162461bcd60e51b815260206004820152601860248201527f4472617743616c632f7469636b65742d6e6f742d7a65726f000000000000000060448201526064015b60405180910390fd5b6001600160a01b038116620000eb5760405162461bcd60e51b815260206004820152601560248201527f4472617743616c632f7064622d6e6f742d7a65726f000000000000000000000060448201526064016200008a565b6001600160a01b038216620001435760405162461bcd60e51b815260206004820152601460248201527f4472617743616c632f64682d6e6f742d7a65726f00000000000000000000000060448201526064016200008a565b6001600160601b0319606084811b821660a05283811b821660805282901b1660c0526040516001600160a01b0382811691848216918616907fc95935a66d15e0da5e412aca0ad27ae891d20b2fb91cf3994b6a3bf2b817808290600090a45050505050506200021a565b600080600060608486031215620001c357600080fd5b8351620001d08162000201565b6020850151909350620001e38162000201565b6040850151909250620001f68162000201565b809150509250925092565b6001600160a01b03811681146200021757600080fd5b50565b60805160601c60a05160601c60c05160601c61236d6200028a6000396000818160e90152818161024b015281816103cb01526105fa0152600081816101b401528181610b630152610bf601526000818161016b01528181610274015281816103180152610569015261236d6000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c80636d4bfa6e1161008c578063aaca392e11610066578063aaca392e14610228578063bd97a25214610249578063ce343bb61461026f578063f8d0ca4c1461029657600080fd5b80636d4bfa6e146101d65780638045fbcf146101e95780639d34ee24146101fc57600080fd5b80634019f2d6116100bd5780634019f2d61461016957806367306cf21461018f5780636cc25db7146101af57600080fd5b80630840bbdd146100e4578063094a2491146101355780633b5564f914610156575b600080fd5b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610148610143366004611d3a565b6102b0565b60405190815260200161012c565b610148610164366004611c25565b6102c5565b7f000000000000000000000000000000000000000000000000000000000000000061010b565b6101a261019d366004611c08565b6102df565b60405161012c9190611e9c565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b6101486101e4366004611c8d565b6102f8565b6101a26101f736600461172b565b610312565b61020f61020a366004611c6f565b61048f565b60405167ffffffffffffffff909116815260200161012c565b61023b61023636600461177e565b61049b565b60405161012c929190611eaf565b7f000000000000000000000000000000000000000000000000000000000000000061010b565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b61029e601081565b60405160ff909116815260200161012c565b60006102bc8383610726565b90505b92915050565b60006102bc6102d936859003850185611c52565b83610774565b60606102bf6102f336849003840184611c52565b6107bf565b60006103058484846108c4565b60ff1690505b9392505050565b606060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0bb78f385856040518363ffffffff1660e01b8152600401610371929190611f14565b60006040518083038186803b15801561038957600080fd5b505afa15801561039d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103c59190810190611949565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d30a5daf86866040518363ffffffff1660e01b8152600401610424929190611f14565b60006040518083038186803b15801561043c57600080fd5b505afa158015610450573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104789190810190611a44565b9050610485868383610963565b9695505050505050565b60006102bc8383610dce565b60608060006104ac84860186611829565b805190915086146105295760405162461bcd60e51b8152602060048201526024808201527f4472617743616c632f696e76616c69642d7069636b2d696e64696365732d6c6560448201527f6e6774680000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6040517fd0bb78f300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0bb78f3906105a0908b908b90600401611f14565b60006040518083038186803b1580156105b857600080fd5b505afa1580156105cc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105f49190810190611949565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d30a5daf8a8a6040518363ffffffff1660e01b8152600401610653929190611f14565b60006040518083038186803b15801561066b57600080fd5b505afa15801561067f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106a79190810190611a44565b905060006106b68b8484610963565b6040517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608e901b1660208201529091506000906034016040516020818303038152906040528051906020012090506107138282868887610e02565b9650965050505050509550959350505050565b6000811561076c576107396001836121e2565b6107469060ff85166121c3565b6001901b6107578360ff86166121c3565b6001901b61076591906121e2565b90506102bf565b5060016102bf565b6000808360e00151836010811061078d5761078d6122b6565b602002015163ffffffff16905060006107aa856000015185610726565b90506107b681836120b3565b95945050505050565b60606000826020015160ff1667ffffffffffffffff8111156107e3576107e36122cc565b60405190808252806020026020018201604052801561080c578160200160208202803683370190505b508351909150600190610820906002612118565b61082a91906121e2565b8160008151811061083d5761083d6122b6565b602090810291909101015260015b836020015160ff168160ff1610156108bd57835160ff168261086e60018461221e565b60ff1681518110610881576108816122b6565b6020026020010151901b828260ff16815181106108a0576108a06122b6565b6020908102919091010152806108b581612280565b91505061084b565b5092915050565b80516000908190815b8160ff168160ff161015610958576000858260ff16815181106108f2576108f26122b6565b6020026020010151905080871681891614610937578360ff168360ff16141561092257600094505050505061030b565b61092c848461221e565b94505050505061030b565b8361094181612280565b94505050808061095090612280565b9150506108cd565b50610485828261221e565b815160609060008167ffffffffffffffff811115610983576109836122cc565b6040519080825280602002602001820160405280156109ac578160200160208202803683370190505b50905060008267ffffffffffffffff8111156109ca576109ca6122cc565b6040519080825280602002602001820160405280156109f3578160200160208202803683370190505b50905060005b838163ffffffff161015610b2257858163ffffffff1681518110610a1f57610a1f6122b6565b60200260200101516040015163ffffffff16878263ffffffff1681518110610a4957610a496122b6565b60200260200101516040015103838263ffffffff1681518110610a6e57610a6e6122b6565b602002602001019067ffffffffffffffff16908167ffffffffffffffff1681525050858163ffffffff1681518110610aa857610aa86122b6565b60200260200101516060015163ffffffff16878263ffffffff1681518110610ad257610ad26122b6565b60200260200101516040015103828263ffffffff1681518110610af757610af76122b6565b67ffffffffffffffff9092166020928302919091019091015280610b1a8161225c565b9150506109f9565b506040517f68c7fd5700000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906368c7fd5790610b9c908b9087908790600401611ddb565b60006040518083038186803b158015610bb457600080fd5b505afa158015610bc8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bf09190810190611b70565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638e6d536a85856040518363ffffffff1660e01b8152600401610c4f929190611f5f565b60006040518083038186803b158015610c6757600080fd5b505afa158015610c7b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ca39190810190611b70565b905060008567ffffffffffffffff811115610cc057610cc06122cc565b604051908082528060200260200182016040528015610ce9578160200160208202803683370190505b50905060005b86811015610dc057828181518110610d0957610d096122b6565b602002602001015160001415610d3e576000828281518110610d2d57610d2d6122b6565b602002602001018181525050610dae565b828181518110610d5057610d506122b6565b6020026020010151848281518110610d6a57610d6a6122b6565b6020026020010151670de0b6b3a7640000610d8591906121c3565b610d8f91906120b3565b828281518110610da157610da16122b6565b6020026020010181815250505b80610db881612241565b915050610cef565b509998505050505050505050565b6000670de0b6b3a76400008360c001516cffffffffffffffffffffffffff1683610df891906121c3565b6102bc91906120b3565b6060806000875167ffffffffffffffff811115610e2157610e216122cc565b604051908082528060200260200182016040528015610e4a578160200160208202803683370190505b5090506000885167ffffffffffffffff811115610e6957610e696122cc565b604051908082528060200260200182016040528015610e9c57816020015b6060815260200190600190039081610e875790505b5090504260005b88518163ffffffff16101561108957868163ffffffff1681518110610eca57610eca6122b6565b602002602001015160a0015163ffffffff16898263ffffffff1681518110610ef457610ef46122b6565b602002602001015160400151610f0a9190612062565b67ffffffffffffffff168267ffffffffffffffff1610610f6c5760405162461bcd60e51b815260206004820152601560248201527f4472617743616c632f647261772d6578706972656400000000000000000000006044820152606401610520565b6000610fb6888363ffffffff1681518110610f8957610f896122b6565b60200260200101518d8463ffffffff1681518110610fa957610fa96122b6565b6020026020010151610dce565b90506110308a8363ffffffff1681518110610fd357610fd36122b6565b6020026020010151600001518267ffffffffffffffff168d8c8663ffffffff1681518110611003576110036122b6565b60200260200101518c8763ffffffff1681518110611023576110236122b6565b60200260200101516110bc565b868463ffffffff1681518110611048576110486122b6565b60200260200101868563ffffffff1681518110611067576110676122b6565b60209081029190910101919091525250806110818161225c565b915050610ea3565b508160405160200161109b9190611e1c565b60405160208183030381529060405293508294505050509550959350505050565b6000606060006110cb846107bf565b85516040805160108082526102208201909252929350909160009160208201610200803683370190505090506000866080015163ffffffff168363ffffffff1611156111595760405162461bcd60e51b815260206004820152601f60248201527f4472617743616c632f657863656564732d6d61782d757365722d7069636b73006044820152606401610520565b60005b8363ffffffff168163ffffffff161015611371578a898263ffffffff1681518110611189576111896122b6565b602002602001015167ffffffffffffffff16106111e85760405162461bcd60e51b815260206004820181905260248201527f4472617743616c632f696e73756666696369656e742d757365722d7069636b736044820152606401610520565b63ffffffff81161561129f57886112006001836121f9565b63ffffffff1681518110611216576112166122b6565b602002602001015167ffffffffffffffff16898263ffffffff1681518110611240576112406122b6565b602002602001015167ffffffffffffffff161161129f5760405162461bcd60e51b815260206004820152601860248201527f4472617743616c632f7069636b732d617363656e64696e6700000000000000006044820152606401610520565b60008a8a8363ffffffff16815181106112ba576112ba6122b6565b60200260200101516040516020016112e692919091825267ffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012060001c9050600061130e828f896108c4565b9050601060ff8216101561135c578360ff168160ff16111561132e578093505b848160ff1681518110611343576113436122b6565b60200260200101805180919061135890612241565b9052505b505080806113699061225c565b91505061115c565b5060008061137f8984611441565b905060005b8360ff16811161140d5760008582815181106113a2576113a26122b6565b602002602001015111156113fb578481815181106113c2576113c26122b6565b60200260200101518282815181106113dc576113dc6122b6565b60200260200101516113ee91906121c3565b6113f8908461204a565b92505b8061140581612241565b915050611384565b50633b9aca008961010001518361142491906121c3565b61142e91906120b3565b9d939c50929a5050505050505050505050565b6060600061145083600161208e565b60ff1667ffffffffffffffff81111561146b5761146b6122cc565b604051908082528060200260200182016040528015611494578160200160208202803683370190505b50905060005b8360ff168160ff16116114e6576114b4858260ff16610774565b828260ff16815181106114c9576114c96122b6565b6020908102919091010152806114de81612280565b91505061149a565b509392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461151257600080fd5b919050565b600082601f83011261152857600080fd5b611530611fd1565b8083856102008601111561154357600080fd5b60005b601081101561156f57813561155a81612300565b84526020938401939190910190600101611546565b509095945050505050565b600082601f83011261158b57600080fd5b611593611fd1565b808385610200860111156115a657600080fd5b60005b601081101561156f5781516115bd81612300565b845260209384019391909101906001016115a9565b60008083601f8401126115e457600080fd5b50813567ffffffffffffffff8111156115fc57600080fd5b6020830191508360208260051b850101111561161757600080fd5b9250929050565b6000610300828403121561163157600080fd5b50919050565b6000610300828403121561164a57600080fd5b611652611f84565b905061165d82611715565b815261166b60208301611715565b602082015261167c604083016116ff565b604082015261168d606083016116ff565b606082015261169e608083016116ff565b60808201526116af60a083016116ff565b60a08201526116c060c083016116e9565b60c08201526116d28360e08401611517565b60e08201526102e082013561010082015292915050565b8035611512816122e2565b8051611512816122e2565b803561151281612300565b805161151281612300565b803561151281612328565b805161151281612328565b60008060006040848603121561174057600080fd5b611749846114ee565b9250602084013567ffffffffffffffff81111561176557600080fd5b611771868287016115d2565b9497909650939450505050565b60008060008060006060868803121561179657600080fd5b61179f866114ee565b9450602086013567ffffffffffffffff808211156117bc57600080fd5b6117c889838a016115d2565b909650945060408801359150808211156117e157600080fd5b818801915088601f8301126117f557600080fd5b81358181111561180457600080fd5b89602082850101111561181657600080fd5b9699959850939650602001949392505050565b6000602080838503121561183c57600080fd5b823567ffffffffffffffff8082111561185457600080fd5b818501915085601f83011261186857600080fd5b813561187b61187682612026565b611ff5565b80828252858201915085850189878560051b880101111561189b57600080fd5b60005b8481101561193a578135868111156118b557600080fd5b8701603f81018c136118c657600080fd5b888101356118d661187682612026565b808282528b82019150604084018f60408560051b87010111156118f857600080fd5b600094505b8385101561192457803561191081612312565b835260019490940193918c01918c016118fd565b508752505050928701929087019060010161189e565b50909998505050505050505050565b6000602080838503121561195c57600080fd5b825167ffffffffffffffff81111561197357600080fd5b8301601f8101851361198457600080fd5b805161199261187682612026565b8181528381019083850160a0808502860187018a10156119b157600080fd5b60009550855b85811015611a355781838c0312156119cd578687fd5b6119d5611fae565b83518152888401516119e681612300565b818a01526040848101516119f981612312565b90820152606084810151611a0c81612312565b90820152608084810151611a1f81612300565b90820152855293870193918101916001016119b7565b50919998505050505050505050565b60006020808385031215611a5757600080fd5b825167ffffffffffffffff811115611a6e57600080fd5b8301601f81018513611a7f57600080fd5b8051611a8d61187682612026565b81815283810190838501610300808502860187018a1015611aad57600080fd5b60009550855b85811015611a355781838c031215611ac9578687fd5b611ad1611f84565b611ada84611720565b8152611ae7898501611720565b898201526040611af881860161170a565b908201526060611b0985820161170a565b908201526080611b1a85820161170a565b9082015260a0611b2b85820161170a565b9082015260c0611b3c8582016116f4565b9082015260e0611b4e8d86830161157a565b908201526102e084015161010082015285529387019391810191600101611ab3565b60006020808385031215611b8357600080fd5b825167ffffffffffffffff811115611b9a57600080fd5b8301601f81018513611bab57600080fd5b8051611bb961187682612026565b80828252848201915084840188868560051b8701011115611bd957600080fd5b600094505b83851015611bfc578051835260019490940193918501918501611bde565b50979650505050505050565b60006103008284031215611c1b57600080fd5b6102bc838361161e565b6000806103208385031215611c3957600080fd5b611c43848461161e565b94610300939093013593505050565b60006103008284031215611c6557600080fd5b6102bc8383611637565b6000806103208385031215611c8357600080fd5b611c438484611637565b600080600060608486031215611ca257600080fd5b833592506020808501359250604085013567ffffffffffffffff811115611cc857600080fd5b8501601f81018713611cd957600080fd5b8035611ce761187682612026565b8082825284820191508484018a868560051b8701011115611d0757600080fd5b600094505b83851015611d2a578035835260019490940193918501918501611d0c565b5080955050505050509250925092565b60008060408385031215611d4d57600080fd5b8235611d5881612328565b946020939093013593505050565b600081518084526020808501945080840160005b83811015611d9657815187529582019590820190600101611d7a565b509495945050505050565b600081518084526020808501945080840160005b83811015611d9657815167ffffffffffffffff1687529582019590820190600101611db5565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000611e0a6060830185611da1565b82810360408401526104858185611da1565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452611e7d858351611d66565b94509285019290850190600101611e43565b5092979650505050505050565b6020815260006102bc6020830184611d66565b604081526000611ec26040830185611d66565b602083820381850152845180835260005b81811015611eee578681018301518482018401528201611ed3565b81811115611eff5760008383860101525b50601f01601f19169190910101949350505050565b60208082528181018390526000908460408401835b86811015611f54578235611f3c81612300565b63ffffffff1682529183019190830190600101611f29565b509695505050505050565b604081526000611f726040830185611da1565b82810360208401526107b68185611da1565b604051610120810167ffffffffffffffff81118282101715611fa857611fa86122cc565b60405290565b60405160a0810167ffffffffffffffff81118282101715611fa857611fa86122cc565b604051610200810167ffffffffffffffff81118282101715611fa857611fa86122cc565b604051601f8201601f1916810167ffffffffffffffff8111828210171561201e5761201e6122cc565b604052919050565b600067ffffffffffffffff821115612040576120406122cc565b5060051b60200190565b6000821982111561205d5761205d6122a0565b500190565b600067ffffffffffffffff808316818516808303821115612085576120856122a0565b01949350505050565b600060ff821660ff84168060ff038211156120ab576120ab6122a0565b019392505050565b6000826120d057634e487b7160e01b600052601260045260246000fd5b500490565b600181815b808511156121105781600019048211156120f6576120f66122a0565b8085161561210357918102915b93841c93908002906120da565b509250929050565b60006102bc60ff841683600082612131575060016102bf565b8161213e575060006102bf565b8160018114612154576002811461215e5761217a565b60019150506102bf565b60ff84111561216f5761216f6122a0565b50506001821b6102bf565b5060208310610133831016604e8410600b841016171561219d575081810a6102bf565b6121a783836120d5565b80600019048211156121bb576121bb6122a0565b029392505050565b60008160001904831182151516156121dd576121dd6122a0565b500290565b6000828210156121f4576121f46122a0565b500390565b600063ffffffff83811690831681811015612216576122166122a0565b039392505050565b600060ff821660ff841680821015612238576122386122a0565b90039392505050565b6000600019821415612255576122556122a0565b5060010190565b600063ffffffff80831681811415612276576122766122a0565b6001019392505050565b600060ff821660ff811415612297576122976122a0565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6cffffffffffffffffffffffffff811681146122fd57600080fd5b50565b63ffffffff811681146122fd57600080fd5b67ffffffffffffffff811681146122fd57600080fd5b60ff811681146122fd57600080fdfea26469706673582212206a125d488fc439371055273ba772b81ba4f430a98aead6f7e08658855ee24b9d64736f6c63430008060033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100df5760003560e01c80636d4bfa6e1161008c578063aaca392e11610066578063aaca392e14610228578063bd97a25214610249578063ce343bb61461026f578063f8d0ca4c1461029657600080fd5b80636d4bfa6e146101d65780638045fbcf146101e95780639d34ee24146101fc57600080fd5b80634019f2d6116100bd5780634019f2d61461016957806367306cf21461018f5780636cc25db7146101af57600080fd5b80630840bbdd146100e4578063094a2491146101355780633b5564f914610156575b600080fd5b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610148610143366004611d3a565b6102b0565b60405190815260200161012c565b610148610164366004611c25565b6102c5565b7f000000000000000000000000000000000000000000000000000000000000000061010b565b6101a261019d366004611c08565b6102df565b60405161012c9190611e9c565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b6101486101e4366004611c8d565b6102f8565b6101a26101f736600461172b565b610312565b61020f61020a366004611c6f565b61048f565b60405167ffffffffffffffff909116815260200161012c565b61023b61023636600461177e565b61049b565b60405161012c929190611eaf565b7f000000000000000000000000000000000000000000000000000000000000000061010b565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b61029e601081565b60405160ff909116815260200161012c565b60006102bc8383610726565b90505b92915050565b60006102bc6102d936859003850185611c52565b83610774565b60606102bf6102f336849003840184611c52565b6107bf565b60006103058484846108c4565b60ff1690505b9392505050565b606060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0bb78f385856040518363ffffffff1660e01b8152600401610371929190611f14565b60006040518083038186803b15801561038957600080fd5b505afa15801561039d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103c59190810190611949565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d30a5daf86866040518363ffffffff1660e01b8152600401610424929190611f14565b60006040518083038186803b15801561043c57600080fd5b505afa158015610450573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104789190810190611a44565b9050610485868383610963565b9695505050505050565b60006102bc8383610dce565b60608060006104ac84860186611829565b805190915086146105295760405162461bcd60e51b8152602060048201526024808201527f4472617743616c632f696e76616c69642d7069636b2d696e64696365732d6c6560448201527f6e6774680000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6040517fd0bb78f300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0bb78f3906105a0908b908b90600401611f14565b60006040518083038186803b1580156105b857600080fd5b505afa1580156105cc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105f49190810190611949565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d30a5daf8a8a6040518363ffffffff1660e01b8152600401610653929190611f14565b60006040518083038186803b15801561066b57600080fd5b505afa15801561067f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106a79190810190611a44565b905060006106b68b8484610963565b6040517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608e901b1660208201529091506000906034016040516020818303038152906040528051906020012090506107138282868887610e02565b9650965050505050509550959350505050565b6000811561076c576107396001836121e2565b6107469060ff85166121c3565b6001901b6107578360ff86166121c3565b6001901b61076591906121e2565b90506102bf565b5060016102bf565b6000808360e00151836010811061078d5761078d6122b6565b602002015163ffffffff16905060006107aa856000015185610726565b90506107b681836120b3565b95945050505050565b60606000826020015160ff1667ffffffffffffffff8111156107e3576107e36122cc565b60405190808252806020026020018201604052801561080c578160200160208202803683370190505b508351909150600190610820906002612118565b61082a91906121e2565b8160008151811061083d5761083d6122b6565b602090810291909101015260015b836020015160ff168160ff1610156108bd57835160ff168261086e60018461221e565b60ff1681518110610881576108816122b6565b6020026020010151901b828260ff16815181106108a0576108a06122b6565b6020908102919091010152806108b581612280565b91505061084b565b5092915050565b80516000908190815b8160ff168160ff161015610958576000858260ff16815181106108f2576108f26122b6565b6020026020010151905080871681891614610937578360ff168360ff16141561092257600094505050505061030b565b61092c848461221e565b94505050505061030b565b8361094181612280565b94505050808061095090612280565b9150506108cd565b50610485828261221e565b815160609060008167ffffffffffffffff811115610983576109836122cc565b6040519080825280602002602001820160405280156109ac578160200160208202803683370190505b50905060008267ffffffffffffffff8111156109ca576109ca6122cc565b6040519080825280602002602001820160405280156109f3578160200160208202803683370190505b50905060005b838163ffffffff161015610b2257858163ffffffff1681518110610a1f57610a1f6122b6565b60200260200101516040015163ffffffff16878263ffffffff1681518110610a4957610a496122b6565b60200260200101516040015103838263ffffffff1681518110610a6e57610a6e6122b6565b602002602001019067ffffffffffffffff16908167ffffffffffffffff1681525050858163ffffffff1681518110610aa857610aa86122b6565b60200260200101516060015163ffffffff16878263ffffffff1681518110610ad257610ad26122b6565b60200260200101516040015103828263ffffffff1681518110610af757610af76122b6565b67ffffffffffffffff9092166020928302919091019091015280610b1a8161225c565b9150506109f9565b506040517f68c7fd5700000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906368c7fd5790610b9c908b9087908790600401611ddb565b60006040518083038186803b158015610bb457600080fd5b505afa158015610bc8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bf09190810190611b70565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638e6d536a85856040518363ffffffff1660e01b8152600401610c4f929190611f5f565b60006040518083038186803b158015610c6757600080fd5b505afa158015610c7b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ca39190810190611b70565b905060008567ffffffffffffffff811115610cc057610cc06122cc565b604051908082528060200260200182016040528015610ce9578160200160208202803683370190505b50905060005b86811015610dc057828181518110610d0957610d096122b6565b602002602001015160001415610d3e576000828281518110610d2d57610d2d6122b6565b602002602001018181525050610dae565b828181518110610d5057610d506122b6565b6020026020010151848281518110610d6a57610d6a6122b6565b6020026020010151670de0b6b3a7640000610d8591906121c3565b610d8f91906120b3565b828281518110610da157610da16122b6565b6020026020010181815250505b80610db881612241565b915050610cef565b509998505050505050505050565b6000670de0b6b3a76400008360c001516cffffffffffffffffffffffffff1683610df891906121c3565b6102bc91906120b3565b6060806000875167ffffffffffffffff811115610e2157610e216122cc565b604051908082528060200260200182016040528015610e4a578160200160208202803683370190505b5090506000885167ffffffffffffffff811115610e6957610e696122cc565b604051908082528060200260200182016040528015610e9c57816020015b6060815260200190600190039081610e875790505b5090504260005b88518163ffffffff16101561108957868163ffffffff1681518110610eca57610eca6122b6565b602002602001015160a0015163ffffffff16898263ffffffff1681518110610ef457610ef46122b6565b602002602001015160400151610f0a9190612062565b67ffffffffffffffff168267ffffffffffffffff1610610f6c5760405162461bcd60e51b815260206004820152601560248201527f4472617743616c632f647261772d6578706972656400000000000000000000006044820152606401610520565b6000610fb6888363ffffffff1681518110610f8957610f896122b6565b60200260200101518d8463ffffffff1681518110610fa957610fa96122b6565b6020026020010151610dce565b90506110308a8363ffffffff1681518110610fd357610fd36122b6565b6020026020010151600001518267ffffffffffffffff168d8c8663ffffffff1681518110611003576110036122b6565b60200260200101518c8763ffffffff1681518110611023576110236122b6565b60200260200101516110bc565b868463ffffffff1681518110611048576110486122b6565b60200260200101868563ffffffff1681518110611067576110676122b6565b60209081029190910101919091525250806110818161225c565b915050610ea3565b508160405160200161109b9190611e1c565b60405160208183030381529060405293508294505050509550959350505050565b6000606060006110cb846107bf565b85516040805160108082526102208201909252929350909160009160208201610200803683370190505090506000866080015163ffffffff168363ffffffff1611156111595760405162461bcd60e51b815260206004820152601f60248201527f4472617743616c632f657863656564732d6d61782d757365722d7069636b73006044820152606401610520565b60005b8363ffffffff168163ffffffff161015611371578a898263ffffffff1681518110611189576111896122b6565b602002602001015167ffffffffffffffff16106111e85760405162461bcd60e51b815260206004820181905260248201527f4472617743616c632f696e73756666696369656e742d757365722d7069636b736044820152606401610520565b63ffffffff81161561129f57886112006001836121f9565b63ffffffff1681518110611216576112166122b6565b602002602001015167ffffffffffffffff16898263ffffffff1681518110611240576112406122b6565b602002602001015167ffffffffffffffff161161129f5760405162461bcd60e51b815260206004820152601860248201527f4472617743616c632f7069636b732d617363656e64696e6700000000000000006044820152606401610520565b60008a8a8363ffffffff16815181106112ba576112ba6122b6565b60200260200101516040516020016112e692919091825267ffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012060001c9050600061130e828f896108c4565b9050601060ff8216101561135c578360ff168160ff16111561132e578093505b848160ff1681518110611343576113436122b6565b60200260200101805180919061135890612241565b9052505b505080806113699061225c565b91505061115c565b5060008061137f8984611441565b905060005b8360ff16811161140d5760008582815181106113a2576113a26122b6565b602002602001015111156113fb578481815181106113c2576113c26122b6565b60200260200101518282815181106113dc576113dc6122b6565b60200260200101516113ee91906121c3565b6113f8908461204a565b92505b8061140581612241565b915050611384565b50633b9aca008961010001518361142491906121c3565b61142e91906120b3565b9d939c50929a5050505050505050505050565b6060600061145083600161208e565b60ff1667ffffffffffffffff81111561146b5761146b6122cc565b604051908082528060200260200182016040528015611494578160200160208202803683370190505b50905060005b8360ff168160ff16116114e6576114b4858260ff16610774565b828260ff16815181106114c9576114c96122b6565b6020908102919091010152806114de81612280565b91505061149a565b509392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461151257600080fd5b919050565b600082601f83011261152857600080fd5b611530611fd1565b8083856102008601111561154357600080fd5b60005b601081101561156f57813561155a81612300565b84526020938401939190910190600101611546565b509095945050505050565b600082601f83011261158b57600080fd5b611593611fd1565b808385610200860111156115a657600080fd5b60005b601081101561156f5781516115bd81612300565b845260209384019391909101906001016115a9565b60008083601f8401126115e457600080fd5b50813567ffffffffffffffff8111156115fc57600080fd5b6020830191508360208260051b850101111561161757600080fd5b9250929050565b6000610300828403121561163157600080fd5b50919050565b6000610300828403121561164a57600080fd5b611652611f84565b905061165d82611715565b815261166b60208301611715565b602082015261167c604083016116ff565b604082015261168d606083016116ff565b606082015261169e608083016116ff565b60808201526116af60a083016116ff565b60a08201526116c060c083016116e9565b60c08201526116d28360e08401611517565b60e08201526102e082013561010082015292915050565b8035611512816122e2565b8051611512816122e2565b803561151281612300565b805161151281612300565b803561151281612328565b805161151281612328565b60008060006040848603121561174057600080fd5b611749846114ee565b9250602084013567ffffffffffffffff81111561176557600080fd5b611771868287016115d2565b9497909650939450505050565b60008060008060006060868803121561179657600080fd5b61179f866114ee565b9450602086013567ffffffffffffffff808211156117bc57600080fd5b6117c889838a016115d2565b909650945060408801359150808211156117e157600080fd5b818801915088601f8301126117f557600080fd5b81358181111561180457600080fd5b89602082850101111561181657600080fd5b9699959850939650602001949392505050565b6000602080838503121561183c57600080fd5b823567ffffffffffffffff8082111561185457600080fd5b818501915085601f83011261186857600080fd5b813561187b61187682612026565b611ff5565b80828252858201915085850189878560051b880101111561189b57600080fd5b60005b8481101561193a578135868111156118b557600080fd5b8701603f81018c136118c657600080fd5b888101356118d661187682612026565b808282528b82019150604084018f60408560051b87010111156118f857600080fd5b600094505b8385101561192457803561191081612312565b835260019490940193918c01918c016118fd565b508752505050928701929087019060010161189e565b50909998505050505050505050565b6000602080838503121561195c57600080fd5b825167ffffffffffffffff81111561197357600080fd5b8301601f8101851361198457600080fd5b805161199261187682612026565b8181528381019083850160a0808502860187018a10156119b157600080fd5b60009550855b85811015611a355781838c0312156119cd578687fd5b6119d5611fae565b83518152888401516119e681612300565b818a01526040848101516119f981612312565b90820152606084810151611a0c81612312565b90820152608084810151611a1f81612300565b90820152855293870193918101916001016119b7565b50919998505050505050505050565b60006020808385031215611a5757600080fd5b825167ffffffffffffffff811115611a6e57600080fd5b8301601f81018513611a7f57600080fd5b8051611a8d61187682612026565b81815283810190838501610300808502860187018a1015611aad57600080fd5b60009550855b85811015611a355781838c031215611ac9578687fd5b611ad1611f84565b611ada84611720565b8152611ae7898501611720565b898201526040611af881860161170a565b908201526060611b0985820161170a565b908201526080611b1a85820161170a565b9082015260a0611b2b85820161170a565b9082015260c0611b3c8582016116f4565b9082015260e0611b4e8d86830161157a565b908201526102e084015161010082015285529387019391810191600101611ab3565b60006020808385031215611b8357600080fd5b825167ffffffffffffffff811115611b9a57600080fd5b8301601f81018513611bab57600080fd5b8051611bb961187682612026565b80828252848201915084840188868560051b8701011115611bd957600080fd5b600094505b83851015611bfc578051835260019490940193918501918501611bde565b50979650505050505050565b60006103008284031215611c1b57600080fd5b6102bc838361161e565b6000806103208385031215611c3957600080fd5b611c43848461161e565b94610300939093013593505050565b60006103008284031215611c6557600080fd5b6102bc8383611637565b6000806103208385031215611c8357600080fd5b611c438484611637565b600080600060608486031215611ca257600080fd5b833592506020808501359250604085013567ffffffffffffffff811115611cc857600080fd5b8501601f81018713611cd957600080fd5b8035611ce761187682612026565b8082825284820191508484018a868560051b8701011115611d0757600080fd5b600094505b83851015611d2a578035835260019490940193918501918501611d0c565b5080955050505050509250925092565b60008060408385031215611d4d57600080fd5b8235611d5881612328565b946020939093013593505050565b600081518084526020808501945080840160005b83811015611d9657815187529582019590820190600101611d7a565b509495945050505050565b600081518084526020808501945080840160005b83811015611d9657815167ffffffffffffffff1687529582019590820190600101611db5565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000611e0a6060830185611da1565b82810360408401526104858185611da1565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611e8f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452611e7d858351611d66565b94509285019290850190600101611e43565b5092979650505050505050565b6020815260006102bc6020830184611d66565b604081526000611ec26040830185611d66565b602083820381850152845180835260005b81811015611eee578681018301518482018401528201611ed3565b81811115611eff5760008383860101525b50601f01601f19169190910101949350505050565b60208082528181018390526000908460408401835b86811015611f54578235611f3c81612300565b63ffffffff1682529183019190830190600101611f29565b509695505050505050565b604081526000611f726040830185611da1565b82810360208401526107b68185611da1565b604051610120810167ffffffffffffffff81118282101715611fa857611fa86122cc565b60405290565b60405160a0810167ffffffffffffffff81118282101715611fa857611fa86122cc565b604051610200810167ffffffffffffffff81118282101715611fa857611fa86122cc565b604051601f8201601f1916810167ffffffffffffffff8111828210171561201e5761201e6122cc565b604052919050565b600067ffffffffffffffff821115612040576120406122cc565b5060051b60200190565b6000821982111561205d5761205d6122a0565b500190565b600067ffffffffffffffff808316818516808303821115612085576120856122a0565b01949350505050565b600060ff821660ff84168060ff038211156120ab576120ab6122a0565b019392505050565b6000826120d057634e487b7160e01b600052601260045260246000fd5b500490565b600181815b808511156121105781600019048211156120f6576120f66122a0565b8085161561210357918102915b93841c93908002906120da565b509250929050565b60006102bc60ff841683600082612131575060016102bf565b8161213e575060006102bf565b8160018114612154576002811461215e5761217a565b60019150506102bf565b60ff84111561216f5761216f6122a0565b50506001821b6102bf565b5060208310610133831016604e8410600b841016171561219d575081810a6102bf565b6121a783836120d5565b80600019048211156121bb576121bb6122a0565b029392505050565b60008160001904831182151516156121dd576121dd6122a0565b500290565b6000828210156121f4576121f46122a0565b500390565b600063ffffffff83811690831681811015612216576122166122a0565b039392505050565b600060ff821660ff841680821015612238576122386122a0565b90039392505050565b6000600019821415612255576122556122a0565b5060010190565b600063ffffffff80831681811415612276576122766122a0565b6001019392505050565b600060ff821660ff811415612297576122976122a0565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6cffffffffffffffffffffffffff811681146122fd57600080fd5b50565b63ffffffff811681146122fd57600080fd5b67ffffffffffffffff811681146122fd57600080fd5b60ff811681146122fd57600080fdfea26469706673582212206a125d488fc439371055273ba772b81ba4f430a98aead6f7e08658855ee24b9d64736f6c63430008060033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
