@keep-network/tbtc-v2 0.1.1-dev.55 → 0.1.1-dev.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/artifacts/Bank.json +3 -3
  2. package/artifacts/Bridge.json +515 -191
  3. package/artifacts/Deposit.json +7 -7
  4. package/artifacts/DepositSweep.json +76 -0
  5. package/artifacts/EcdsaDkgValidator.json +1 -1
  6. package/artifacts/EcdsaInactivity.json +1 -1
  7. package/artifacts/Fraud.json +7 -7
  8. package/artifacts/KeepRegistry.json +1 -1
  9. package/artifacts/KeepStake.json +2 -2
  10. package/artifacts/KeepToken.json +2 -2
  11. package/artifacts/KeepTokenStaking.json +1 -1
  12. package/artifacts/MovingFunds.json +40 -10
  13. package/artifacts/NuCypherStakingEscrow.json +1 -1
  14. package/artifacts/NuCypherToken.json +2 -2
  15. package/artifacts/RandomBeaconStub.json +1 -1
  16. package/artifacts/Redemption.json +9 -9
  17. package/artifacts/ReimbursementPool.json +2 -2
  18. package/artifacts/Relay.json +9 -9
  19. package/artifacts/SortitionPool.json +2 -2
  20. package/artifacts/T.json +2 -2
  21. package/artifacts/TBTC.json +3 -3
  22. package/artifacts/TBTCToken.json +3 -3
  23. package/artifacts/TokenStaking.json +1 -1
  24. package/artifacts/TokenholderGovernor.json +9 -9
  25. package/artifacts/TokenholderTimelock.json +8 -8
  26. package/artifacts/VendingMachine.json +10 -10
  27. package/artifacts/VendingMachineKeep.json +1 -1
  28. package/artifacts/VendingMachineNuCypher.json +1 -1
  29. package/artifacts/WalletRegistry.json +2 -2
  30. package/artifacts/WalletRegistryGovernance.json +2 -2
  31. package/artifacts/Wallets.json +9 -9
  32. package/artifacts/solcInputs/{6d69fc514efd874ebb1cb86b04981772.json → 5dd2a7c685770548b7ea9ce25e179326.json} +9 -9
  33. package/build/contracts/GovernanceUtils.sol/GovernanceUtils.dbg.json +1 -1
  34. package/build/contracts/bank/Bank.sol/Bank.dbg.json +1 -1
  35. package/build/contracts/bridge/BitcoinTx.sol/BitcoinTx.dbg.json +1 -1
  36. package/build/contracts/bridge/BitcoinTx.sol/BitcoinTx.json +2 -2
  37. package/build/contracts/bridge/Bridge.sol/Bridge.dbg.json +1 -1
  38. package/build/contracts/bridge/Bridge.sol/Bridge.json +266 -103
  39. package/build/contracts/bridge/BridgeState.sol/BridgeState.dbg.json +1 -1
  40. package/build/contracts/bridge/BridgeState.sol/BridgeState.json +8 -2
  41. package/build/contracts/bridge/Deposit.sol/Deposit.dbg.json +1 -1
  42. package/build/contracts/bridge/Deposit.sol/Deposit.json +2 -2
  43. package/build/contracts/bridge/DepositSweep.sol/DepositSweep.dbg.json +4 -0
  44. package/build/contracts/bridge/{Sweep.sol/Sweep.json → DepositSweep.sol/DepositSweep.json} +4 -4
  45. package/build/contracts/bridge/EcdsaLib.sol/EcdsaLib.dbg.json +1 -1
  46. package/build/contracts/bridge/Fraud.sol/Fraud.dbg.json +1 -1
  47. package/build/contracts/bridge/Fraud.sol/Fraud.json +2 -2
  48. package/build/contracts/bridge/IRelay.sol/IRelay.dbg.json +1 -1
  49. package/build/contracts/bridge/MovingFunds.sol/MovingFunds.dbg.json +1 -1
  50. package/build/contracts/bridge/MovingFunds.sol/MovingFunds.json +21 -2
  51. package/build/contracts/bridge/Redemption.sol/OutboundTx.dbg.json +1 -1
  52. package/build/contracts/bridge/Redemption.sol/OutboundTx.json +2 -2
  53. package/build/contracts/bridge/Redemption.sol/Redemption.dbg.json +1 -1
  54. package/build/contracts/bridge/Redemption.sol/Redemption.json +2 -2
  55. package/build/contracts/bridge/VendingMachine.sol/VendingMachine.dbg.json +1 -1
  56. package/build/contracts/bridge/Wallets.sol/Wallets.dbg.json +1 -1
  57. package/build/contracts/bridge/Wallets.sol/Wallets.json +2 -2
  58. package/build/contracts/token/TBTC.sol/TBTC.dbg.json +1 -1
  59. package/build/contracts/vault/IVault.sol/IVault.dbg.json +1 -1
  60. package/build/contracts/vault/TBTCVault.sol/TBTCVault.dbg.json +1 -1
  61. package/contracts/bridge/BitcoinTx.sol +69 -0
  62. package/contracts/bridge/Bridge.sol +90 -8
  63. package/contracts/bridge/BridgeState.sol +34 -3
  64. package/contracts/bridge/{Sweep.sol → DepositSweep.sol} +30 -18
  65. package/contracts/bridge/MovingFunds.sol +469 -76
  66. package/deploy/05_deploy_bridge.ts +5 -2
  67. package/export.json +313 -56
  68. package/package.json +1 -1
  69. package/artifacts/Sweep.json +0 -76
  70. package/build/contracts/bridge/Sweep.sol/Sweep.dbg.json +0 -4
@@ -85,8 +85,8 @@
85
85
  "type": "event"
86
86
  }
87
87
  ],
88
- "bytecode": "0x613c9361003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361061004b5760003560e01c80637333b36914610050578063a164de6e14610072578063a76558b314610092575b600080fd5b81801561005c57600080fd5b5061007061006b3660046134e1565b6100b2565b005b81801561007e57600080fd5b5061007061008d366004613560565b610853565b81801561009e57600080fd5b506100706100ad3660046135f8565b610bf2565b6001600160601b031985166000908152601987016020526040902060016002820154600160a01b900460ff1660058111156100ef576100ef6136b3565b146101415760405162461bcd60e51b815260206004820152601c60248201527f57616c6c6574206d75737420626520696e204c6976652073746174650000000060448201526064015b60405180910390fd5b60018101548061019d5760405162461bcd60e51b815260206004820152602160248201527f4e6f206d61696e205554584f20666f722074686520676976656e2077616c6c656044820152601d60fa1b6064820152608401610138565b8086356101b06040890160208a016136dd565b6101c060608a0160408b016136f8565b6040516020016101fd9392919092835260e09190911b6001600160e01b031916602083015260c01b6001600160c01b0319166024820152602c0190565b60405160208183030381529060405280519060200120146102605760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964206d61696e205554584f2064617461000000000000000000006044820152606401610138565b6000610292600060c01b878760405160200161027e93929190613713565b604051602081830303815290604052611165565b9050600081511161030b5760405162461bcd60e51b815260206004820152602e60248201527f52656465656d6572206f757470757420736372697074206d757374206265206160448201527f207374616e6461726420747970650000000000000000000000000000000000006064820152608401610138565b80805190602001208860405160200161033491906001600160601b031991909116815260140190565b6040516020818303038152906040528051906020012014156103be5760405162461bcd60e51b815260206004820152603760248201527f52656465656d6572206f757470757420736372697074206d757374206e6f742060448201527f706f696e7420746f207468652077616c6c657420504b480000000000000000006064820152608401610138565b600a89015467ffffffffffffffff90811690851610156104205760405162461bcd60e51b815260206004820152601b60248201527f526564656d7074696f6e20616d6f756e7420746f6f20736d616c6c00000000006044820152606401610138565b600088878760405160200161043793929190613737565b60408051808303601f1901815291815281516020928301206000818152600e8e01909352912060010154909150600160801b900463ffffffff161561050a5760405162461bcd60e51b815260206004820152604a60248201527f546865726520697320612070656e64696e6720726564656d7074696f6e20726560448201527f71756573742066726f6d20746869732077616c6c657420746f2074686520736160648201527f6d65206164647265737300000000000000000000000000000000000000000000608482015260a401610138565b600a8a015460009068010000000000000000900467ffffffffffffffff16610533576000610558565b600a8b01546105589068010000000000000000900467ffffffffffffffff1687613787565b600a8c0154909150600160801b900467ffffffffffffffff1661057b82886137ae565b60028701805460009061059990849067ffffffffffffffff166137d7565b82546101009290920a67ffffffffffffffff81810219909316918316021790915560028801541690506105d260608c0160408d016136f8565b67ffffffffffffffff16101561062a5760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e742077616c6c65742066756e6473000000000000006044820152606401610138565b6040518060a00160405280336001600160a01b031681526020018867ffffffffffffffff1681526020018367ffffffffffffffff1681526020018267ffffffffffffffff1681526020014263ffffffff168152508c600e01600085815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160010160106101000a81548163ffffffff021916908363ffffffff1602179055509050507f97a0199072f487232635d50ab75860891afe0b91c976ed2fc76502c4d82d0d958b8a8a338b87876040516107b2979695949392919061382c565b60405180910390a18b546040517f7c6db49c00000000000000000000000000000000000000000000000000000000815233600482015230602482015267ffffffffffffffff891660448201526001600160a01b0390911690637c6db49c90606401600060405180830381600087803b15801561082d57600080fd5b505af1158015610841573d6000803e3d6000fd5b50505050505050505050505050505050565b600061086086868661140b565b90506108b1866108736020880188613890565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508892508791506116fb9050565b6001600160601b03198216600090815260198701602052604090206002810154600160a01b900460ff1660018160058111156108ef576108ef6136b3565b148061090c5750600281600581111561090a5761090a6136b3565b145b61097e5760405162461bcd60e51b815260206004820152602b60248201527f57616c6c6574206d75737420626520696e204c697665206f72204d6f76696e6760448201527f46756e64732073746174650000000000000000000000000000000000000000006064820152608401610138565b60006109cd8961099160408b018b613890565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9250611955915050565b606081015190915067ffffffffffffffff1615610a4e578381604001518260600151604051602001610a2c9392919092835260e09190911b6001600160e01b031916602083015260c01b6001600160c01b0319166024820152602c0190565b60408051601f1981840301815291905280516020909101206001840155610a56565b600060018401555b8051600284018054600090610a7690849067ffffffffffffffff166137ae565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fa45596c10f758d32ec8cca64a0fbfe776052b08fdb3f026e0a87f52118bf8fbe8585604051610ae29291906001600160601b0319929092168252602082015260400190565b60405180910390a1885481516040517f392aee4300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526001600160a01b039091169063392aee4390602401600060405180830381600087803b158015610b5457600080fd5b505af1158015610b68573d6000803e3d6000fd5b50508a546004808d015460208601516040516356a6d9ef60e01b81526001600160a01b039283169381019390935267ffffffffffffffff16602483015290911692506356a6d9ef91506044015b600060405180830381600087803b158015610bcf57600080fd5b505af1158015610be3573d6000803e3d6000fd5b50505050505050505050505050565b6000858383604051602001610c0993929190613737565b60408051808303601f1901815282825280516020918201206000818152600e8c01835283902060a08501845280546001600160a01b0381168652600160a01b900467ffffffffffffffff9081169386019390935260010154808316938501939093526801000000000000000083049091166060840152600160801b90910463ffffffff1660808301819052909250610ced5760405162461bcd60e51b815260206004820152602160248201527f526564656d7074696f6e207265717565737420646f6573206e6f7420657869736044820152601d60fa1b6064820152608401610138565b4288600b0154826080015163ffffffff16610d0891906138d7565b10610d7a5760405162461bcd60e51b8152602060048201526024808201527f526564656d7074696f6e207265717565737420686173206e6f742074696d656460448201527f206f7574000000000000000000000000000000000000000000000000000000006064820152608401610138565b6001600160601b0319871660009081526019890160209081526040918290209183015190830151610dab91906137ae565b600282018054600090610dc990849067ffffffffffffffff166137ae565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060016005811115610e0257610e026136b3565b6002820154600160a01b900460ff166005811115610e2257610e226136b3565b1480610e4c5750600280820154600160a01b900460ff166005811115610e4a57610e4a6136b3565b145b80610e76575060056002820154600160a01b900460ff166005811115610e7457610e746136b3565b145b610ee85760405162461bcd60e51b815260206004820152603b60248201527f5468652077616c6c6574206d75737420626520696e204c6976652c204d6f766960448201527f6e6746756e6473206f72205465726d696e6174656420737461746500000000006064820152608401610138565b6000838152600f8a016020908152604080832085518154878501516001600160a01b039092166001600160e01b031991821617600160a01b67ffffffffffffffff93841602178355878401516001938401805460608b015160808c01519386167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117680100000000000000009190951602939093177fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff16600160801b63ffffffff9092169190910217909155600e8e019093529220805490911681558101805473ffffffffffffffffffffffffffffffffffffffff191690556002820154600160a01b900460ff166005811115611007576110076136b3565b14806110315750600280820154600160a01b900460ff16600581111561102f5761102f6136b3565b145b156110e2576110408989611a8c565b6002890154600c8a0154600d8b015483546040517fd8dc404d0000000000000000000000000000000000000000000000000000000081526001600160a01b039094169363d8dc404d936110af936bffffffffffffffffffffffff9091169290913391908e908e906004016138ef565b600060405180830381600087803b1580156110c957600080fd5b505af11580156110dd573d6000803e3d6000fd5b505050505b7f013dddc8debc4730cd01232fdcea9ae6013689837732356c187fe5edb9a8a8d588868660405161111593929190613971565b60405180910390a18854825160208401516040516356a6d9ef60e01b81526001600160a01b03928316600482015267ffffffffffffffff90911660248201529116906356a6d9ef90604401610bb5565b606060008260088151811061117c5761117c61399a565b0160200151835160f89190911c91506111968260096139b0565b60ff16146111b4575050604080516020810190915260008152919050565b826009815181106111c7576111c761399a565b016020015160f81c61126d5760028160ff1610156111f5575050604080516020810190915260008152919050565b600083600a8151811061120a5761120a61399a565b016020015160f81c905061121f6002836139d5565b60ff168114158061123d57508060201415801561123d575080601414155b1561125957505060408051602081019091526000815292915050565b61126584600b83611b81565b949350505050565b600061127a846008611c4b565b90507f1976a900000000000000000000000000000000000000000000000000000000007fffffff0000000000000000000000000000000000000000000000000000000000821614156113575783600b815181106112d9576112d961399a565b60209101015160f81c601414158061132e5750611304600285516112fd91906139f8565b8590611c4b565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191661222b60f21b14155b1561134a57505060408051602081019091526000815292915050565b61126584600c6014611b81565b7f17a91400000000000000000000000000000000000000000000000000000000007fffffff0000000000000000000000000000000000000000000000000000000000821614156113f45783600185516113b091906139f8565b815181106113c0576113c061399a565b60209101015160f81c6087146113e757505060408051602081019091526000815292915050565b61126584600b6014611b81565b505050604080516020810190915260008152919050565b600061145761141d6020850185613890565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c6392505050565b6114a35760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420696e70757420766563746f722070726f76696465640000006044820152606401610138565b6114ed6114b36040850185613890565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611d1392505050565b6115395760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964206f757470757420766563746f722070726f766964656400006044820152606401610138565b61159c6115496020850185613a0f565b6115566020860186613890565b6115636040880188613890565b61157360808a0160608b01613a0f565b60405160200161158896959493929190613a39565b604051602081830303815290604052611db6565b90506116376115eb6115b16040850185613890565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ddd92505050565b6115f58480613890565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869493925050506020860135611dea565b6116a95760405162461bcd60e51b815260206004820152603c60248201527f5478206d65726b6c652070726f6f66206973206e6f742076616c696420666f7260448201527f2070726f76696465642068656164657220616e642074782068617368000000006064820152608401610138565b6116f4846116ba6040850185613890565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e2692505050565b9392505050565b6001600160601b031981166000908152601985016020526040902060010154806117675760405162461bcd60e51b815260206004820152601d60248201527f4e6f206d61696e205554584f20666f7220676976656e2077616c6c65740000006044820152606401610138565b80833561177a60408601602087016136dd565b61178a60608701604088016136f8565b6040516020016117c79392919092835260e09190911b6001600160e01b031916602083015260c01b6001600160c01b0319166024820152602c0190565b604051602081830303815290604052805190602001201461182a5760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964206d61696e205554584f2064617461000000000000000000006044820152606401610138565b60008061183686612195565b9092509050843582148015611865575063ffffffff811661185d60408701602088016136dd565b63ffffffff16145b6118d75760405162461bcd60e51b815260206004820152603f60248201527f4f7574626f756e64207472616e73616374696f6e20696e707574206d7573742060448201527f706f696e7420746f207468652077616c6c65742773206d61696e205554584f006064820152608401610138565b600160158801600087356118f160408a0160208b016136dd565b60405160200161191892919091825260e01b6001600160e01b031916602082015260240190565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff191691151591909117905550505050505050565b6040805160808101825260008082526020820181905291810182905260608101829052908061198385612270565b909250905060006119958360016138d7565b6040517f1976a9140000000000000000000000000000000000000000000000000000000060208201526001600160601b03198716602482015261222b60f21b6038820152909150600090603a0160408051601f198184030181529082905280516020918201207f1600140000000000000000000000000000000000000000000000000000000000918301919091526001600160601b0319881660238301529150600090603701604051602081830303815290604052805190602001209050611a7f898989604051806080016040528088815260200189815260200187815260200186815250612287565b9998505050505050505050565b6001600160601b031981166000908152601983016020526040902060020154600160a01b900460ff166001816005811115611ac957611ac96136b3565b1480611ae657506002816005811115611ae457611ae46136b3565b145b611b585760405162461bcd60e51b815260206004820152603160248201527f45434453412077616c6c6574206d75737420626520696e204c697665206f722060448201527f4d6f76696e6746756e64732073746174650000000000000000000000000000006064820152608401610138565b6001816005811115611b6c57611b6c6136b3565b1415611b7c57611b7c8383612486565b505050565b606081611b9d57506040805160208101909152600081526116f4565b6000611ba983856138d7565b90508381118015611bbb575080855110155b611c075760405162461bcd60e51b815260206004820152601360248201527f536c696365206f7574206f6620626f756e6473000000000000000000000000006044820152606401610138565b604051915082604083010160405282825283850182038460208701018481015b80821015611c4057815183830152602082019150611c27565b505050509392505050565b6000611c5a8383016020015190565b90505b92915050565b6000806000611c7184612270565b9092509050801580611c84575060001982145b15611c93575060009392505050565b6000611ca08360016138d7565b905060005b82811015611d065785518210611cc15750600095945050505050565b6000611ccd87846125cc565b9050600019811415611ce6575060009695505050505050565b611cf081846138d7565b9250508080611cfe90613a7b565b915050611ca5565b5093519093149392505050565b6000806000611d2184612270565b9092509050801580611d34575060001982145b15611d43575060009392505050565b6000611d508360016138d7565b905060005b82811015611d065785518210611d715750600095945050505050565b6000611d7d8784612617565b9050600019811415611d96575060009695505050505050565b611da081846138d7565b9250508080611dae90613a7b565b915050611d55565b60006020600083516020850160025afa50602060006020600060025afa5050600051919050565b6044810151600090611c5d565b60008385148015611df9575081155b8015611e0457508251155b15611e1157506001611265565b611e1d8584868561267d565b95945050505050565b6001820154604080517f113764be00000000000000000000000000000000000000000000000000000000815290516001600160a01b0390921691600091839163113764be91600480820192602092909190829003018186803b158015611e8b57600080fd5b505afa158015611e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec39190613a96565b90506000826001600160a01b0316632b97be246040518163ffffffff1660e01b815260040160206040518083038186803b158015611f0057600080fd5b505afa158015611f14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f389190613a96565b9050600080611f4e611f4987612725565b6127ba565b905083811415611f6057839150611fde565b82811415611f7057829150611fde565b60405162461bcd60e51b815260206004820152602560248201527f4e6f742061742063757272656e74206f722070726576696f757320646966666960448201527f63756c74790000000000000000000000000000000000000000000000000000006064820152608401610138565b6000611fe9876127e2565b90506000198114156120635760405162461bcd60e51b815260206004820152602360248201527f496e76616c6964206c656e677468206f6620746865206865616465727320636860448201527f61696e00000000000000000000000000000000000000000000000000000000006064820152608401610138565b6001198114156120b55760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206865616465727320636861696e00000000000000000000006044820152606401610138565b6002198114156121075760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420776f726b20696e2061206865616465720000006044820152606401610138565b60038801546121169084613aaf565b81101561218b5760405162461bcd60e51b815260206004820152603360248201527f496e73756666696369656e7420616363756d756c61746564206469666669637560448201527f6c747920696e2068656164657220636861696e000000000000000000000000006064820152608401610138565b5050505050505050565b60008060006121a384612270565b9150508060011461221c5760405162461bcd60e51b815260206004820152602d60248201527f4f7574626f756e64207472616e73616374696f6e206d7573742068617665206160448201527f2073696e676c6520696e707574000000000000000000000000000000000000006064820152608401610138565b600061222885826129e9565b905061223381612bcf565b935061226761224182612bdc565b60d881901c63ff00ff001662ff00ff60e89290921c9190911617601081811b91901c1790565b92505050915091565b60008061227e836000612be9565b91509150915091565b604080516080810182526000808252602082018190529181018290526060810182905290805b83602001518110156124095783516000906122c9908890612617565b85519091506000906122dd90899084611b81565b905060006122ea82612d67565b90506000612308600880855161230091906139f8565b859190611b81565b9050866060015167ffffffffffffffff166000148015612344575060408801518151602083012014806123445750606088015181516020830120145b801561235a575060008267ffffffffffffffff16115b156123805763ffffffff8516604088015267ffffffffffffffff821660608801526123da565b60008061238f8d8c8587612dde565b9150915081896000018181516123a591906137d7565b67ffffffffffffffff169052506020890180518291906123c69083906137d7565b67ffffffffffffffff169052506001975050505b83886000018181516123ec91906138d7565b9052508493506124019250839150613a7b9050565b9150506122ad565b508061247d5760405162461bcd60e51b815260206004820152603b60248201527f526564656d7074696f6e207472616e73616374696f6e206d7573742070726f6360448201527f657373206174206c65617374206f6e6520726564656d7074696f6e00000000006064820152608401610138565b50949350505050565b6001600160601b031981166000908152601983016020526040902060018101546124b9576124b4838361316d565b61254c565b60028101805463ffffffff42166c01000000000000000000000000027fffffffffffffffffffffff00ffffffff00000000ffffffffffffffffffffffff909116177402000000000000000000000000000000000000000017905580546040516001600160601b0319841691907fbdc9ce990a067e5fd3a5d8dfc68e27e9f221aaa3fe55265e0b7e93c460b3efe290600090a35b601783015460601b6001600160601b031990811690831614156125895760178301805473ffffffffffffffffffffffffffffffffffffffff191690555b601783018054600160a01b900463ffffffff169060146125a883613ace565b91906101000a81548163ffffffff021916908363ffffffff16021790555050505050565b60008060006125db8585613209565b90925090506000198214156125f65760001992505050611c5d565b806126028360256138d7565b61260c91906138d7565b611e1d9060046138d7565b60006126248260096138d7565b835110156126355750600019611c5d565b60008061264c856126478660086138d7565b612be9565b90925090506000198214156126675760001992505050611c5d565b806126738360096138d7565b611e1d91906138d7565b60006020845161268d9190613aee565b1561269a57506000611265565b83516126a857506000611265565b818560005b8651811015612718576126c1600284613aee565b600114156126e6576126df6126d98883016020015190565b8361324b565b91506126ff565b6126fc826126f78984016020015190565b61324b565b91505b60019290921c916127116020826138d7565b90506126ad565b5090931495945050505050565b600080612733836048611c4b565b60e81c9050600083604b8151811061274d5761274d61399a565b016020015160f81c9050600061278183600060108262ffffff16901c8261ff001660108462ffffff16901b17179050919050565b62ffffff16905060006127956003846139d5565b60ff1690506127a681610100613be6565b6127b09083613aaf565b9695505050505050565b6000611c5d7bffff000000000000000000000000000000000000000000000000000083613257565b6000605082516127f29190613aee565b156128005750600019919050565b506040805160808101909152605081526000908190815b84518110156129e15761282b858383613263565b801561284b5761283b82846132f8565b61284b5750600119949350505050565b600061285683612725565b905061286183611db6565b9350806129a58560008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b600882901c7eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff161790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b601082901c7dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff161790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b602082901c7bffffffff00000000ffffffff00000000ffffffff00000000ffffffff1617905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b604082901c77ffffffffffffffff0000000000000000ffffffffffffffff16179050608081901b608082901c179050919050565b11156129b8575060021995945050505050565b6129cb6129c4826127ba565b8690613321565b94506129da90506050826138d7565b9050612817565b505050919050565b60606000806129f785612270565b9092509050600019821415612a745760405162461bcd60e51b815260206004820152602260248201527f52656164206f76657272756e20647572696e6720566172496e7420706172736960448201527f6e670000000000000000000000000000000000000000000000000000000000006064820152608401610138565b808410612ac35760405162461bcd60e51b815260206004820152601060248201527f56696e2072656164206f76657272756e000000000000000000000000000000006044820152606401610138565b600080612ad18460016138d7565b905060005b86811015612b5a57612ae888836125cc565b9250600019831415612b3c5760405162461bcd60e51b815260206004820152601760248201527f42616420566172496e7420696e207363726970745369670000000000000000006044820152606401610138565b612b4683836138d7565b915080612b5281613a7b565b915050612ad6565b50612b6587826125cc565b9150600019821415612bb95760405162461bcd60e51b815260206004820152601760248201527f42616420566172496e7420696e207363726970745369670000000000000000006044820152606401610138565b612bc4878284611b81565b979650505050505050565b6020810151600090611c5d565b6000611c5d826020611c4b565b6000806000612bf8858561337f565b905060ff8116612c2a576000858581518110612c1657612c1661399a565b016020015190935060f81c9150612d609050565b83612c368260016139b0565b60ff16612c4391906138d7565b85511015612c5a5760001960009250925050612d60565b60008160ff1660021415612c9f57612c94612c80612c798760016138d7565b8890611c4b565b62ffff0060e882901c1660f89190911c1790565b61ffff169050612d56565b8160ff1660041415612cc957612cbc612241612c798760016138d7565b63ffffffff169050612d56565b8160ff1660081415612d5657612d49612ce6612c798760016138d7565b60c01c64ff000000ff600882811c91821665ff000000ff009390911b92831617601090811b67ffffffffffffffff1666ff00ff00ff00ff9290921667ff00ff00ff00ff009093169290921790911c65ffff0000ffff1617602081811c91901b1790565b67ffffffffffffffff1690505b60ff909116925090505b9250929050565b600080612d738361340b565b60c01c905060006112658264ff000000ff600882811c91821665ff000000ff009390911b92831617601090811b67ffffffffffffffff1666ff00ff00ff00ff9290921667ff00ff00ff00ff009093169290921790911c65ffff0000ffff1617602081811c91901b1790565b60008060008585604051602001612df6929190613bf2565b60408051808303601f1901815291815281516020928301206000818152600e8b01909352912060010154909150600160801b900463ffffffff1615612fb3576000818152600e88016020526040812060018101548154919291612e6d9167ffffffffffffffff90811691600160a01b9004166137ae565b600183015490915067ffffffffffffffff80881691612e9a916801000000000000000090910416836137ae565b67ffffffffffffffff1611158015612ec657508067ffffffffffffffff168667ffffffffffffffff1611155b612f5e5760405162461bcd60e51b815260206004820152604660248201527f4f75747075742076616c7565206973206e6f742077697468696e20746865206160448201527f636365707461626c652072616e6765206f66207468652070656e64696e67207260648201527f6571756573740000000000000000000000000000000000000000000000000000608482015260a401610138565b6001918201546000848152600e8b016020526040902080546001600160e01b0319168155909201805473ffffffffffffffffffffffffffffffffffffffff19169055935067ffffffffffffffff169150613163565b6000818152600f8801602052604090206001810154600160801b900463ffffffff166130465760405162461bcd60e51b8152602060048201526024808201527f4f75747075742069732061206e6f6e2d72657175657374656420726564656d7060448201527f74696f6e000000000000000000000000000000000000000000000000000000006064820152608401610138565b6001810154815460009161306f9167ffffffffffffffff91821691600160a01b909104166137ae565b600183015490915067ffffffffffffffff8088169161309c916801000000000000000090910416836137ae565b67ffffffffffffffff16111580156130c857508067ffffffffffffffff168667ffffffffffffffff1611155b6131605760405162461bcd60e51b815260206004820152604860248201527f4f75747075742076616c7565206973206e6f742077697468696e20746865206160448201527f636365707461626c652072616e6765206f66207468652074696d6564206f757460648201527f2072657175657374000000000000000000000000000000000000000000000000608482015260a401610138565b50505b5094509492505050565b6001600160601b03198116600081815260198401602052604080822060028101805463ffffffff4216600160801b027fffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff9091161774030000000000000000000000000000000000000000179055805491519093927f68cb496f5e64383745876664ef119840f154a729c03ba866b8aecb5c9f53d51691a3505050565b6000806132178360256138d7565b8451101561322c575060001990506000612d60565b60008061323e866126478760246138d7565b9097909650945050505050565b6000611c5a8383613417565b6000611c5a8284613c49565b8151600061327182846138d7565b90508281118015613283575080855110155b6132cf5760405162461bcd60e51b815260206004820152601360248201527f536c696365206f7574206f6620626f756e6473000000000000000000000000006044820152606401610138565b826020860101602085018382015b8083101561218b5782518252602092830192909101906132dd565b60008061330484613445565b9050828114613317576000915050611c5d565b5060019392505050565b600061332d82846138d7565b905082811015611c5d5760405162461bcd60e51b815260206004820152601960248201527f4f766572666c6f7720647572696e67206164646974696f6e2e000000000000006044820152606401610138565b60008282815181106133935761339361399a565b60209101015160f81c60ff14156133ac57506008611c5d565b8282815181106133be576133be61399a565b60209101015160f81c60fe14156133d757506004611c5d565b8282815181106133e9576133e961399a565b60209101015160f81c60fd141561340257506002611c5d565b50600092915050565b6000611c5d8282611c4b565b60008260005281602052602060006040600060025afa50602060006020600060025afa505060005192915050565b6024810151600090611c5d565b80356001600160601b03198116811461346a57600080fd5b919050565b60006060828403121561348157600080fd5b50919050565b60008083601f84011261349957600080fd5b50813567ffffffffffffffff8111156134b157600080fd5b602083019150836020828501011115612d6057600080fd5b803567ffffffffffffffff8116811461346a57600080fd5b60008060008060008060e087890312156134fa57600080fd5b8635955061350a60208801613452565b9450613519886040890161346f565b935060a087013567ffffffffffffffff81111561353557600080fd5b61354189828a01613487565b9094509250613554905060c088016134c9565b90509295509295509295565b600080600080600060e0868803121561357857600080fd5b85359450602086013567ffffffffffffffff8082111561359757600080fd5b908701906080828a0312156135ab57600080fd5b909450604087013590808211156135c157600080fd5b506135ce8882890161346f565b9350506135de876060880161346f565b91506135ec60c08701613452565b90509295509295909350565b6000806000806000806080878903121561361157600080fd5b8635955061362160208801613452565b9450604087013567ffffffffffffffff8082111561363e57600080fd5b818901915089601f83011261365257600080fd5b81358181111561366157600080fd5b8a60208260051b850101111561367657600080fd5b60208301965080955050606089013591508082111561369457600080fd5b506136a189828a01613487565b979a9699509497509295939492505050565b634e487b7160e01b600052602160045260246000fd5b803563ffffffff8116811461346a57600080fd5b6000602082840312156136ef57600080fd5b611c5a826136c9565b60006020828403121561370a57600080fd5b611c5a826134c9565b6001600160c01b031984168152818360088301376000910160080190815292915050565b6001600160601b031984168152818360148301376000910160140190815292915050565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600067ffffffffffffffff808416806137a2576137a261375b565b92169190910492915050565b600067ffffffffffffffff838116908316818110156137cf576137cf613771565b039392505050565b600067ffffffffffffffff8083168185168083038211156137fa576137fa613771565b01949350505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6bffffffffffffffffffffffff198816815260c06020820152600061385560c08301888a613803565b6001600160a01b039690961660408301525067ffffffffffffffff9384166060820152918316608083015290911660a0909101529392505050565b6000808335601e198436030181126138a757600080fd5b83018035915067ffffffffffffffff8211156138c257600080fd5b602001915036819003821315612d6057600080fd5b600082198211156138ea576138ea613771565b500190565b600060a082016bffffffffffffffffffffffff89168352602088818501526001600160a01b038816604085015286606085015260a060808501528185835260c08501905086925060005b868110156139625763ffffffff61394f856136c9565b1682529282019290820190600101613939565b509a9950505050505050505050565b6bffffffffffffffffffffffff1984168152604060208201526000611e1d604083018486613803565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff84168060ff038211156139cd576139cd613771565b019392505050565b600060ff821660ff8416808210156139ef576139ef613771565b90039392505050565b600082821015613a0a57613a0a613771565b500390565b600060208284031215613a2157600080fd5b81356001600160e01b0319811681146116f457600080fd5b60006001600160e01b03198089168352868860048501378683016004810160008152868882375093169390920160048101939093525050600801949350505050565b6000600019821415613a8f57613a8f613771565b5060010190565b600060208284031215613aa857600080fd5b5051919050565b6000816000190483118215151615613ac957613ac9613771565b500290565b600063ffffffff821680613ae457613ae4613771565b6000190192915050565b600082613afd57613afd61375b565b500690565b600181815b80851115613b3d578160001904821115613b2357613b23613771565b80851615613b3057918102915b93841c9390800290613b07565b509250929050565b600082613b5457506001611c5d565b81613b6157506000611c5d565b8160018114613b775760028114613b8157613b9d565b6001915050611c5d565b60ff841115613b9257613b92613771565b50506001821b611c5d565b5060208310610133831016604e8410600b8410161715613bc0575081810a611c5d565b613bca8383613b02565b8060001904821115613bde57613bde613771565b029392505050565b6000611c5a8383613b45565b6bffffffffffffffffffffffff19831681526000825160005b81811015613c285760208186018101516014868401015201613c0b565b81811115613c3a576000601483860101525b50919091016014019392505050565b600082613c5857613c5861375b565b50049056fea26469706673582212204f2929db77c8678a2836b4a45fc3546c879a2c41d0af26d506fc00afcdafe0b064736f6c63430008090033",
89
- "deployedBytecode": "0x730000000000000000000000000000000000000000301460806040526004361061004b5760003560e01c80637333b36914610050578063a164de6e14610072578063a76558b314610092575b600080fd5b81801561005c57600080fd5b5061007061006b3660046134e1565b6100b2565b005b81801561007e57600080fd5b5061007061008d366004613560565b610853565b81801561009e57600080fd5b506100706100ad3660046135f8565b610bf2565b6001600160601b031985166000908152601987016020526040902060016002820154600160a01b900460ff1660058111156100ef576100ef6136b3565b146101415760405162461bcd60e51b815260206004820152601c60248201527f57616c6c6574206d75737420626520696e204c6976652073746174650000000060448201526064015b60405180910390fd5b60018101548061019d5760405162461bcd60e51b815260206004820152602160248201527f4e6f206d61696e205554584f20666f722074686520676976656e2077616c6c656044820152601d60fa1b6064820152608401610138565b8086356101b06040890160208a016136dd565b6101c060608a0160408b016136f8565b6040516020016101fd9392919092835260e09190911b6001600160e01b031916602083015260c01b6001600160c01b0319166024820152602c0190565b60405160208183030381529060405280519060200120146102605760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964206d61696e205554584f2064617461000000000000000000006044820152606401610138565b6000610292600060c01b878760405160200161027e93929190613713565b604051602081830303815290604052611165565b9050600081511161030b5760405162461bcd60e51b815260206004820152602e60248201527f52656465656d6572206f757470757420736372697074206d757374206265206160448201527f207374616e6461726420747970650000000000000000000000000000000000006064820152608401610138565b80805190602001208860405160200161033491906001600160601b031991909116815260140190565b6040516020818303038152906040528051906020012014156103be5760405162461bcd60e51b815260206004820152603760248201527f52656465656d6572206f757470757420736372697074206d757374206e6f742060448201527f706f696e7420746f207468652077616c6c657420504b480000000000000000006064820152608401610138565b600a89015467ffffffffffffffff90811690851610156104205760405162461bcd60e51b815260206004820152601b60248201527f526564656d7074696f6e20616d6f756e7420746f6f20736d616c6c00000000006044820152606401610138565b600088878760405160200161043793929190613737565b60408051808303601f1901815291815281516020928301206000818152600e8e01909352912060010154909150600160801b900463ffffffff161561050a5760405162461bcd60e51b815260206004820152604a60248201527f546865726520697320612070656e64696e6720726564656d7074696f6e20726560448201527f71756573742066726f6d20746869732077616c6c657420746f2074686520736160648201527f6d65206164647265737300000000000000000000000000000000000000000000608482015260a401610138565b600a8a015460009068010000000000000000900467ffffffffffffffff16610533576000610558565b600a8b01546105589068010000000000000000900467ffffffffffffffff1687613787565b600a8c0154909150600160801b900467ffffffffffffffff1661057b82886137ae565b60028701805460009061059990849067ffffffffffffffff166137d7565b82546101009290920a67ffffffffffffffff81810219909316918316021790915560028801541690506105d260608c0160408d016136f8565b67ffffffffffffffff16101561062a5760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e742077616c6c65742066756e6473000000000000006044820152606401610138565b6040518060a00160405280336001600160a01b031681526020018867ffffffffffffffff1681526020018367ffffffffffffffff1681526020018267ffffffffffffffff1681526020014263ffffffff168152508c600e01600085815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160010160106101000a81548163ffffffff021916908363ffffffff1602179055509050507f97a0199072f487232635d50ab75860891afe0b91c976ed2fc76502c4d82d0d958b8a8a338b87876040516107b2979695949392919061382c565b60405180910390a18b546040517f7c6db49c00000000000000000000000000000000000000000000000000000000815233600482015230602482015267ffffffffffffffff891660448201526001600160a01b0390911690637c6db49c90606401600060405180830381600087803b15801561082d57600080fd5b505af1158015610841573d6000803e3d6000fd5b50505050505050505050505050505050565b600061086086868661140b565b90506108b1866108736020880188613890565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508892508791506116fb9050565b6001600160601b03198216600090815260198701602052604090206002810154600160a01b900460ff1660018160058111156108ef576108ef6136b3565b148061090c5750600281600581111561090a5761090a6136b3565b145b61097e5760405162461bcd60e51b815260206004820152602b60248201527f57616c6c6574206d75737420626520696e204c697665206f72204d6f76696e6760448201527f46756e64732073746174650000000000000000000000000000000000000000006064820152608401610138565b60006109cd8961099160408b018b613890565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9250611955915050565b606081015190915067ffffffffffffffff1615610a4e578381604001518260600151604051602001610a2c9392919092835260e09190911b6001600160e01b031916602083015260c01b6001600160c01b0319166024820152602c0190565b60408051601f1981840301815291905280516020909101206001840155610a56565b600060018401555b8051600284018054600090610a7690849067ffffffffffffffff166137ae565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fa45596c10f758d32ec8cca64a0fbfe776052b08fdb3f026e0a87f52118bf8fbe8585604051610ae29291906001600160601b0319929092168252602082015260400190565b60405180910390a1885481516040517f392aee4300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526001600160a01b039091169063392aee4390602401600060405180830381600087803b158015610b5457600080fd5b505af1158015610b68573d6000803e3d6000fd5b50508a546004808d015460208601516040516356a6d9ef60e01b81526001600160a01b039283169381019390935267ffffffffffffffff16602483015290911692506356a6d9ef91506044015b600060405180830381600087803b158015610bcf57600080fd5b505af1158015610be3573d6000803e3d6000fd5b50505050505050505050505050565b6000858383604051602001610c0993929190613737565b60408051808303601f1901815282825280516020918201206000818152600e8c01835283902060a08501845280546001600160a01b0381168652600160a01b900467ffffffffffffffff9081169386019390935260010154808316938501939093526801000000000000000083049091166060840152600160801b90910463ffffffff1660808301819052909250610ced5760405162461bcd60e51b815260206004820152602160248201527f526564656d7074696f6e207265717565737420646f6573206e6f7420657869736044820152601d60fa1b6064820152608401610138565b4288600b0154826080015163ffffffff16610d0891906138d7565b10610d7a5760405162461bcd60e51b8152602060048201526024808201527f526564656d7074696f6e207265717565737420686173206e6f742074696d656460448201527f206f7574000000000000000000000000000000000000000000000000000000006064820152608401610138565b6001600160601b0319871660009081526019890160209081526040918290209183015190830151610dab91906137ae565b600282018054600090610dc990849067ffffffffffffffff166137ae565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060016005811115610e0257610e026136b3565b6002820154600160a01b900460ff166005811115610e2257610e226136b3565b1480610e4c5750600280820154600160a01b900460ff166005811115610e4a57610e4a6136b3565b145b80610e76575060056002820154600160a01b900460ff166005811115610e7457610e746136b3565b145b610ee85760405162461bcd60e51b815260206004820152603b60248201527f5468652077616c6c6574206d75737420626520696e204c6976652c204d6f766960448201527f6e6746756e6473206f72205465726d696e6174656420737461746500000000006064820152608401610138565b6000838152600f8a016020908152604080832085518154878501516001600160a01b039092166001600160e01b031991821617600160a01b67ffffffffffffffff93841602178355878401516001938401805460608b015160808c01519386167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117680100000000000000009190951602939093177fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff16600160801b63ffffffff9092169190910217909155600e8e019093529220805490911681558101805473ffffffffffffffffffffffffffffffffffffffff191690556002820154600160a01b900460ff166005811115611007576110076136b3565b14806110315750600280820154600160a01b900460ff16600581111561102f5761102f6136b3565b145b156110e2576110408989611a8c565b6002890154600c8a0154600d8b015483546040517fd8dc404d0000000000000000000000000000000000000000000000000000000081526001600160a01b039094169363d8dc404d936110af936bffffffffffffffffffffffff9091169290913391908e908e906004016138ef565b600060405180830381600087803b1580156110c957600080fd5b505af11580156110dd573d6000803e3d6000fd5b505050505b7f013dddc8debc4730cd01232fdcea9ae6013689837732356c187fe5edb9a8a8d588868660405161111593929190613971565b60405180910390a18854825160208401516040516356a6d9ef60e01b81526001600160a01b03928316600482015267ffffffffffffffff90911660248201529116906356a6d9ef90604401610bb5565b606060008260088151811061117c5761117c61399a565b0160200151835160f89190911c91506111968260096139b0565b60ff16146111b4575050604080516020810190915260008152919050565b826009815181106111c7576111c761399a565b016020015160f81c61126d5760028160ff1610156111f5575050604080516020810190915260008152919050565b600083600a8151811061120a5761120a61399a565b016020015160f81c905061121f6002836139d5565b60ff168114158061123d57508060201415801561123d575080601414155b1561125957505060408051602081019091526000815292915050565b61126584600b83611b81565b949350505050565b600061127a846008611c4b565b90507f1976a900000000000000000000000000000000000000000000000000000000007fffffff0000000000000000000000000000000000000000000000000000000000821614156113575783600b815181106112d9576112d961399a565b60209101015160f81c601414158061132e5750611304600285516112fd91906139f8565b8590611c4b565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191661222b60f21b14155b1561134a57505060408051602081019091526000815292915050565b61126584600c6014611b81565b7f17a91400000000000000000000000000000000000000000000000000000000007fffffff0000000000000000000000000000000000000000000000000000000000821614156113f45783600185516113b091906139f8565b815181106113c0576113c061399a565b60209101015160f81c6087146113e757505060408051602081019091526000815292915050565b61126584600b6014611b81565b505050604080516020810190915260008152919050565b600061145761141d6020850185613890565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c6392505050565b6114a35760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420696e70757420766563746f722070726f76696465640000006044820152606401610138565b6114ed6114b36040850185613890565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611d1392505050565b6115395760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964206f757470757420766563746f722070726f766964656400006044820152606401610138565b61159c6115496020850185613a0f565b6115566020860186613890565b6115636040880188613890565b61157360808a0160608b01613a0f565b60405160200161158896959493929190613a39565b604051602081830303815290604052611db6565b90506116376115eb6115b16040850185613890565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ddd92505050565b6115f58480613890565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869493925050506020860135611dea565b6116a95760405162461bcd60e51b815260206004820152603c60248201527f5478206d65726b6c652070726f6f66206973206e6f742076616c696420666f7260448201527f2070726f76696465642068656164657220616e642074782068617368000000006064820152608401610138565b6116f4846116ba6040850185613890565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e2692505050565b9392505050565b6001600160601b031981166000908152601985016020526040902060010154806117675760405162461bcd60e51b815260206004820152601d60248201527f4e6f206d61696e205554584f20666f7220676976656e2077616c6c65740000006044820152606401610138565b80833561177a60408601602087016136dd565b61178a60608701604088016136f8565b6040516020016117c79392919092835260e09190911b6001600160e01b031916602083015260c01b6001600160c01b0319166024820152602c0190565b604051602081830303815290604052805190602001201461182a5760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964206d61696e205554584f2064617461000000000000000000006044820152606401610138565b60008061183686612195565b9092509050843582148015611865575063ffffffff811661185d60408701602088016136dd565b63ffffffff16145b6118d75760405162461bcd60e51b815260206004820152603f60248201527f4f7574626f756e64207472616e73616374696f6e20696e707574206d7573742060448201527f706f696e7420746f207468652077616c6c65742773206d61696e205554584f006064820152608401610138565b600160158801600087356118f160408a0160208b016136dd565b60405160200161191892919091825260e01b6001600160e01b031916602082015260240190565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff191691151591909117905550505050505050565b6040805160808101825260008082526020820181905291810182905260608101829052908061198385612270565b909250905060006119958360016138d7565b6040517f1976a9140000000000000000000000000000000000000000000000000000000060208201526001600160601b03198716602482015261222b60f21b6038820152909150600090603a0160408051601f198184030181529082905280516020918201207f1600140000000000000000000000000000000000000000000000000000000000918301919091526001600160601b0319881660238301529150600090603701604051602081830303815290604052805190602001209050611a7f898989604051806080016040528088815260200189815260200187815260200186815250612287565b9998505050505050505050565b6001600160601b031981166000908152601983016020526040902060020154600160a01b900460ff166001816005811115611ac957611ac96136b3565b1480611ae657506002816005811115611ae457611ae46136b3565b145b611b585760405162461bcd60e51b815260206004820152603160248201527f45434453412077616c6c6574206d75737420626520696e204c697665206f722060448201527f4d6f76696e6746756e64732073746174650000000000000000000000000000006064820152608401610138565b6001816005811115611b6c57611b6c6136b3565b1415611b7c57611b7c8383612486565b505050565b606081611b9d57506040805160208101909152600081526116f4565b6000611ba983856138d7565b90508381118015611bbb575080855110155b611c075760405162461bcd60e51b815260206004820152601360248201527f536c696365206f7574206f6620626f756e6473000000000000000000000000006044820152606401610138565b604051915082604083010160405282825283850182038460208701018481015b80821015611c4057815183830152602082019150611c27565b505050509392505050565b6000611c5a8383016020015190565b90505b92915050565b6000806000611c7184612270565b9092509050801580611c84575060001982145b15611c93575060009392505050565b6000611ca08360016138d7565b905060005b82811015611d065785518210611cc15750600095945050505050565b6000611ccd87846125cc565b9050600019811415611ce6575060009695505050505050565b611cf081846138d7565b9250508080611cfe90613a7b565b915050611ca5565b5093519093149392505050565b6000806000611d2184612270565b9092509050801580611d34575060001982145b15611d43575060009392505050565b6000611d508360016138d7565b905060005b82811015611d065785518210611d715750600095945050505050565b6000611d7d8784612617565b9050600019811415611d96575060009695505050505050565b611da081846138d7565b9250508080611dae90613a7b565b915050611d55565b60006020600083516020850160025afa50602060006020600060025afa5050600051919050565b6044810151600090611c5d565b60008385148015611df9575081155b8015611e0457508251155b15611e1157506001611265565b611e1d8584868561267d565b95945050505050565b6001820154604080517f113764be00000000000000000000000000000000000000000000000000000000815290516001600160a01b0390921691600091839163113764be91600480820192602092909190829003018186803b158015611e8b57600080fd5b505afa158015611e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec39190613a96565b90506000826001600160a01b0316632b97be246040518163ffffffff1660e01b815260040160206040518083038186803b158015611f0057600080fd5b505afa158015611f14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f389190613a96565b9050600080611f4e611f4987612725565b6127ba565b905083811415611f6057839150611fde565b82811415611f7057829150611fde565b60405162461bcd60e51b815260206004820152602560248201527f4e6f742061742063757272656e74206f722070726576696f757320646966666960448201527f63756c74790000000000000000000000000000000000000000000000000000006064820152608401610138565b6000611fe9876127e2565b90506000198114156120635760405162461bcd60e51b815260206004820152602360248201527f496e76616c6964206c656e677468206f6620746865206865616465727320636860448201527f61696e00000000000000000000000000000000000000000000000000000000006064820152608401610138565b6001198114156120b55760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206865616465727320636861696e00000000000000000000006044820152606401610138565b6002198114156121075760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420776f726b20696e2061206865616465720000006044820152606401610138565b60038801546121169084613aaf565b81101561218b5760405162461bcd60e51b815260206004820152603360248201527f496e73756666696369656e7420616363756d756c61746564206469666669637560448201527f6c747920696e2068656164657220636861696e000000000000000000000000006064820152608401610138565b5050505050505050565b60008060006121a384612270565b9150508060011461221c5760405162461bcd60e51b815260206004820152602d60248201527f4f7574626f756e64207472616e73616374696f6e206d7573742068617665206160448201527f2073696e676c6520696e707574000000000000000000000000000000000000006064820152608401610138565b600061222885826129e9565b905061223381612bcf565b935061226761224182612bdc565b60d881901c63ff00ff001662ff00ff60e89290921c9190911617601081811b91901c1790565b92505050915091565b60008061227e836000612be9565b91509150915091565b604080516080810182526000808252602082018190529181018290526060810182905290805b83602001518110156124095783516000906122c9908890612617565b85519091506000906122dd90899084611b81565b905060006122ea82612d67565b90506000612308600880855161230091906139f8565b859190611b81565b9050866060015167ffffffffffffffff166000148015612344575060408801518151602083012014806123445750606088015181516020830120145b801561235a575060008267ffffffffffffffff16115b156123805763ffffffff8516604088015267ffffffffffffffff821660608801526123da565b60008061238f8d8c8587612dde565b9150915081896000018181516123a591906137d7565b67ffffffffffffffff169052506020890180518291906123c69083906137d7565b67ffffffffffffffff169052506001975050505b83886000018181516123ec91906138d7565b9052508493506124019250839150613a7b9050565b9150506122ad565b508061247d5760405162461bcd60e51b815260206004820152603b60248201527f526564656d7074696f6e207472616e73616374696f6e206d7573742070726f6360448201527f657373206174206c65617374206f6e6520726564656d7074696f6e00000000006064820152608401610138565b50949350505050565b6001600160601b031981166000908152601983016020526040902060018101546124b9576124b4838361316d565b61254c565b60028101805463ffffffff42166c01000000000000000000000000027fffffffffffffffffffffff00ffffffff00000000ffffffffffffffffffffffff909116177402000000000000000000000000000000000000000017905580546040516001600160601b0319841691907fbdc9ce990a067e5fd3a5d8dfc68e27e9f221aaa3fe55265e0b7e93c460b3efe290600090a35b601783015460601b6001600160601b031990811690831614156125895760178301805473ffffffffffffffffffffffffffffffffffffffff191690555b601783018054600160a01b900463ffffffff169060146125a883613ace565b91906101000a81548163ffffffff021916908363ffffffff16021790555050505050565b60008060006125db8585613209565b90925090506000198214156125f65760001992505050611c5d565b806126028360256138d7565b61260c91906138d7565b611e1d9060046138d7565b60006126248260096138d7565b835110156126355750600019611c5d565b60008061264c856126478660086138d7565b612be9565b90925090506000198214156126675760001992505050611c5d565b806126738360096138d7565b611e1d91906138d7565b60006020845161268d9190613aee565b1561269a57506000611265565b83516126a857506000611265565b818560005b8651811015612718576126c1600284613aee565b600114156126e6576126df6126d98883016020015190565b8361324b565b91506126ff565b6126fc826126f78984016020015190565b61324b565b91505b60019290921c916127116020826138d7565b90506126ad565b5090931495945050505050565b600080612733836048611c4b565b60e81c9050600083604b8151811061274d5761274d61399a565b016020015160f81c9050600061278183600060108262ffffff16901c8261ff001660108462ffffff16901b17179050919050565b62ffffff16905060006127956003846139d5565b60ff1690506127a681610100613be6565b6127b09083613aaf565b9695505050505050565b6000611c5d7bffff000000000000000000000000000000000000000000000000000083613257565b6000605082516127f29190613aee565b156128005750600019919050565b506040805160808101909152605081526000908190815b84518110156129e15761282b858383613263565b801561284b5761283b82846132f8565b61284b5750600119949350505050565b600061285683612725565b905061286183611db6565b9350806129a58560008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b600882901c7eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff161790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b601082901c7dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff161790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b602082901c7bffffffff00000000ffffffff00000000ffffffff00000000ffffffff1617905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b604082901c77ffffffffffffffff0000000000000000ffffffffffffffff16179050608081901b608082901c179050919050565b11156129b8575060021995945050505050565b6129cb6129c4826127ba565b8690613321565b94506129da90506050826138d7565b9050612817565b505050919050565b60606000806129f785612270565b9092509050600019821415612a745760405162461bcd60e51b815260206004820152602260248201527f52656164206f76657272756e20647572696e6720566172496e7420706172736960448201527f6e670000000000000000000000000000000000000000000000000000000000006064820152608401610138565b808410612ac35760405162461bcd60e51b815260206004820152601060248201527f56696e2072656164206f76657272756e000000000000000000000000000000006044820152606401610138565b600080612ad18460016138d7565b905060005b86811015612b5a57612ae888836125cc565b9250600019831415612b3c5760405162461bcd60e51b815260206004820152601760248201527f42616420566172496e7420696e207363726970745369670000000000000000006044820152606401610138565b612b4683836138d7565b915080612b5281613a7b565b915050612ad6565b50612b6587826125cc565b9150600019821415612bb95760405162461bcd60e51b815260206004820152601760248201527f42616420566172496e7420696e207363726970745369670000000000000000006044820152606401610138565b612bc4878284611b81565b979650505050505050565b6020810151600090611c5d565b6000611c5d826020611c4b565b6000806000612bf8858561337f565b905060ff8116612c2a576000858581518110612c1657612c1661399a565b016020015190935060f81c9150612d609050565b83612c368260016139b0565b60ff16612c4391906138d7565b85511015612c5a5760001960009250925050612d60565b60008160ff1660021415612c9f57612c94612c80612c798760016138d7565b8890611c4b565b62ffff0060e882901c1660f89190911c1790565b61ffff169050612d56565b8160ff1660041415612cc957612cbc612241612c798760016138d7565b63ffffffff169050612d56565b8160ff1660081415612d5657612d49612ce6612c798760016138d7565b60c01c64ff000000ff600882811c91821665ff000000ff009390911b92831617601090811b67ffffffffffffffff1666ff00ff00ff00ff9290921667ff00ff00ff00ff009093169290921790911c65ffff0000ffff1617602081811c91901b1790565b67ffffffffffffffff1690505b60ff909116925090505b9250929050565b600080612d738361340b565b60c01c905060006112658264ff000000ff600882811c91821665ff000000ff009390911b92831617601090811b67ffffffffffffffff1666ff00ff00ff00ff9290921667ff00ff00ff00ff009093169290921790911c65ffff0000ffff1617602081811c91901b1790565b60008060008585604051602001612df6929190613bf2565b60408051808303601f1901815291815281516020928301206000818152600e8b01909352912060010154909150600160801b900463ffffffff1615612fb3576000818152600e88016020526040812060018101548154919291612e6d9167ffffffffffffffff90811691600160a01b9004166137ae565b600183015490915067ffffffffffffffff80881691612e9a916801000000000000000090910416836137ae565b67ffffffffffffffff1611158015612ec657508067ffffffffffffffff168667ffffffffffffffff1611155b612f5e5760405162461bcd60e51b815260206004820152604660248201527f4f75747075742076616c7565206973206e6f742077697468696e20746865206160448201527f636365707461626c652072616e6765206f66207468652070656e64696e67207260648201527f6571756573740000000000000000000000000000000000000000000000000000608482015260a401610138565b6001918201546000848152600e8b016020526040902080546001600160e01b0319168155909201805473ffffffffffffffffffffffffffffffffffffffff19169055935067ffffffffffffffff169150613163565b6000818152600f8801602052604090206001810154600160801b900463ffffffff166130465760405162461bcd60e51b8152602060048201526024808201527f4f75747075742069732061206e6f6e2d72657175657374656420726564656d7060448201527f74696f6e000000000000000000000000000000000000000000000000000000006064820152608401610138565b6001810154815460009161306f9167ffffffffffffffff91821691600160a01b909104166137ae565b600183015490915067ffffffffffffffff8088169161309c916801000000000000000090910416836137ae565b67ffffffffffffffff16111580156130c857508067ffffffffffffffff168667ffffffffffffffff1611155b6131605760405162461bcd60e51b815260206004820152604860248201527f4f75747075742076616c7565206973206e6f742077697468696e20746865206160448201527f636365707461626c652072616e6765206f66207468652074696d6564206f757460648201527f2072657175657374000000000000000000000000000000000000000000000000608482015260a401610138565b50505b5094509492505050565b6001600160601b03198116600081815260198401602052604080822060028101805463ffffffff4216600160801b027fffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff9091161774030000000000000000000000000000000000000000179055805491519093927f68cb496f5e64383745876664ef119840f154a729c03ba866b8aecb5c9f53d51691a3505050565b6000806132178360256138d7565b8451101561322c575060001990506000612d60565b60008061323e866126478760246138d7565b9097909650945050505050565b6000611c5a8383613417565b6000611c5a8284613c49565b8151600061327182846138d7565b90508281118015613283575080855110155b6132cf5760405162461bcd60e51b815260206004820152601360248201527f536c696365206f7574206f6620626f756e6473000000000000000000000000006044820152606401610138565b826020860101602085018382015b8083101561218b5782518252602092830192909101906132dd565b60008061330484613445565b9050828114613317576000915050611c5d565b5060019392505050565b600061332d82846138d7565b905082811015611c5d5760405162461bcd60e51b815260206004820152601960248201527f4f766572666c6f7720647572696e67206164646974696f6e2e000000000000006044820152606401610138565b60008282815181106133935761339361399a565b60209101015160f81c60ff14156133ac57506008611c5d565b8282815181106133be576133be61399a565b60209101015160f81c60fe14156133d757506004611c5d565b8282815181106133e9576133e961399a565b60209101015160f81c60fd141561340257506002611c5d565b50600092915050565b6000611c5d8282611c4b565b60008260005281602052602060006040600060025afa50602060006020600060025afa505060005192915050565b6024810151600090611c5d565b80356001600160601b03198116811461346a57600080fd5b919050565b60006060828403121561348157600080fd5b50919050565b60008083601f84011261349957600080fd5b50813567ffffffffffffffff8111156134b157600080fd5b602083019150836020828501011115612d6057600080fd5b803567ffffffffffffffff8116811461346a57600080fd5b60008060008060008060e087890312156134fa57600080fd5b8635955061350a60208801613452565b9450613519886040890161346f565b935060a087013567ffffffffffffffff81111561353557600080fd5b61354189828a01613487565b9094509250613554905060c088016134c9565b90509295509295509295565b600080600080600060e0868803121561357857600080fd5b85359450602086013567ffffffffffffffff8082111561359757600080fd5b908701906080828a0312156135ab57600080fd5b909450604087013590808211156135c157600080fd5b506135ce8882890161346f565b9350506135de876060880161346f565b91506135ec60c08701613452565b90509295509295909350565b6000806000806000806080878903121561361157600080fd5b8635955061362160208801613452565b9450604087013567ffffffffffffffff8082111561363e57600080fd5b818901915089601f83011261365257600080fd5b81358181111561366157600080fd5b8a60208260051b850101111561367657600080fd5b60208301965080955050606089013591508082111561369457600080fd5b506136a189828a01613487565b979a9699509497509295939492505050565b634e487b7160e01b600052602160045260246000fd5b803563ffffffff8116811461346a57600080fd5b6000602082840312156136ef57600080fd5b611c5a826136c9565b60006020828403121561370a57600080fd5b611c5a826134c9565b6001600160c01b031984168152818360088301376000910160080190815292915050565b6001600160601b031984168152818360148301376000910160140190815292915050565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600067ffffffffffffffff808416806137a2576137a261375b565b92169190910492915050565b600067ffffffffffffffff838116908316818110156137cf576137cf613771565b039392505050565b600067ffffffffffffffff8083168185168083038211156137fa576137fa613771565b01949350505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6bffffffffffffffffffffffff198816815260c06020820152600061385560c08301888a613803565b6001600160a01b039690961660408301525067ffffffffffffffff9384166060820152918316608083015290911660a0909101529392505050565b6000808335601e198436030181126138a757600080fd5b83018035915067ffffffffffffffff8211156138c257600080fd5b602001915036819003821315612d6057600080fd5b600082198211156138ea576138ea613771565b500190565b600060a082016bffffffffffffffffffffffff89168352602088818501526001600160a01b038816604085015286606085015260a060808501528185835260c08501905086925060005b868110156139625763ffffffff61394f856136c9565b1682529282019290820190600101613939565b509a9950505050505050505050565b6bffffffffffffffffffffffff1984168152604060208201526000611e1d604083018486613803565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff84168060ff038211156139cd576139cd613771565b019392505050565b600060ff821660ff8416808210156139ef576139ef613771565b90039392505050565b600082821015613a0a57613a0a613771565b500390565b600060208284031215613a2157600080fd5b81356001600160e01b0319811681146116f457600080fd5b60006001600160e01b03198089168352868860048501378683016004810160008152868882375093169390920160048101939093525050600801949350505050565b6000600019821415613a8f57613a8f613771565b5060010190565b600060208284031215613aa857600080fd5b5051919050565b6000816000190483118215151615613ac957613ac9613771565b500290565b600063ffffffff821680613ae457613ae4613771565b6000190192915050565b600082613afd57613afd61375b565b500690565b600181815b80851115613b3d578160001904821115613b2357613b23613771565b80851615613b3057918102915b93841c9390800290613b07565b509250929050565b600082613b5457506001611c5d565b81613b6157506000611c5d565b8160018114613b775760028114613b8157613b9d565b6001915050611c5d565b60ff841115613b9257613b92613771565b50506001821b611c5d565b5060208310610133831016604e8410600b8410161715613bc0575081810a611c5d565b613bca8383613b02565b8060001904821115613bde57613bde613771565b029392505050565b6000611c5a8383613b45565b6bffffffffffffffffffffffff19831681526000825160005b81811015613c285760208186018101516014868401015201613c0b565b81811115613c3a576000601483860101525b50919091016014019392505050565b600082613c5857613c5861375b565b50049056fea26469706673582212204f2929db77c8678a2836b4a45fc3546c879a2c41d0af26d506fc00afcdafe0b064736f6c63430008090033",
88
+ "bytecode": "0x613c9361003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361061004b5760003560e01c80637333b36914610050578063a164de6e14610072578063a76558b314610092575b600080fd5b81801561005c57600080fd5b5061007061006b3660046134e1565b6100b2565b005b81801561007e57600080fd5b5061007061008d366004613560565b610853565b81801561009e57600080fd5b506100706100ad3660046135f8565b610bf2565b6001600160601b031985166000908152601b87016020526040902060016002820154600160a01b900460ff1660058111156100ef576100ef6136b3565b146101415760405162461bcd60e51b815260206004820152601c60248201527f57616c6c6574206d75737420626520696e204c6976652073746174650000000060448201526064015b60405180910390fd5b60018101548061019d5760405162461bcd60e51b815260206004820152602160248201527f4e6f206d61696e205554584f20666f722074686520676976656e2077616c6c656044820152601d60fa1b6064820152608401610138565b8086356101b06040890160208a016136dd565b6101c060608a0160408b016136f8565b6040516020016101fd9392919092835260e09190911b6001600160e01b031916602083015260c01b6001600160c01b0319166024820152602c0190565b60405160208183030381529060405280519060200120146102605760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964206d61696e205554584f2064617461000000000000000000006044820152606401610138565b6000610292600060c01b878760405160200161027e93929190613713565b604051602081830303815290604052611165565b9050600081511161030b5760405162461bcd60e51b815260206004820152602e60248201527f52656465656d6572206f757470757420736372697074206d757374206265206160448201527f207374616e6461726420747970650000000000000000000000000000000000006064820152608401610138565b80805190602001208860405160200161033491906001600160601b031991909116815260140190565b6040516020818303038152906040528051906020012014156103be5760405162461bcd60e51b815260206004820152603760248201527f52656465656d6572206f757470757420736372697074206d757374206e6f742060448201527f706f696e7420746f207468652077616c6c657420504b480000000000000000006064820152608401610138565b600c89015467ffffffffffffffff90811690851610156104205760405162461bcd60e51b815260206004820152601b60248201527f526564656d7074696f6e20616d6f756e7420746f6f20736d616c6c00000000006044820152606401610138565b600088878760405160200161043793929190613737565b60408051808303601f190181529181528151602092830120600081815260108e01909352912060010154909150600160801b900463ffffffff161561050a5760405162461bcd60e51b815260206004820152604a60248201527f546865726520697320612070656e64696e6720726564656d7074696f6e20726560448201527f71756573742066726f6d20746869732077616c6c657420746f2074686520736160648201527f6d65206164647265737300000000000000000000000000000000000000000000608482015260a401610138565b600c8a015460009068010000000000000000900467ffffffffffffffff16610533576000610558565b600c8b01546105589068010000000000000000900467ffffffffffffffff1687613787565b600c8c0154909150600160801b900467ffffffffffffffff1661057b82886137ae565b60028701805460009061059990849067ffffffffffffffff166137d7565b82546101009290920a67ffffffffffffffff81810219909316918316021790915560028801541690506105d260608c0160408d016136f8565b67ffffffffffffffff16101561062a5760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e742077616c6c65742066756e6473000000000000006044820152606401610138565b6040518060a00160405280336001600160a01b031681526020018867ffffffffffffffff1681526020018367ffffffffffffffff1681526020018267ffffffffffffffff1681526020014263ffffffff168152508c601001600085815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160010160106101000a81548163ffffffff021916908363ffffffff1602179055509050507f97a0199072f487232635d50ab75860891afe0b91c976ed2fc76502c4d82d0d958b8a8a338b87876040516107b2979695949392919061382c565b60405180910390a18b546040517f7c6db49c00000000000000000000000000000000000000000000000000000000815233600482015230602482015267ffffffffffffffff891660448201526001600160a01b0390911690637c6db49c90606401600060405180830381600087803b15801561082d57600080fd5b505af1158015610841573d6000803e3d6000fd5b50505050505050505050505050505050565b600061086086868661140b565b90506108b1866108736020880188613890565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508892508791506116fb9050565b6001600160601b031982166000908152601b8701602052604090206002810154600160a01b900460ff1660018160058111156108ef576108ef6136b3565b148061090c5750600281600581111561090a5761090a6136b3565b145b61097e5760405162461bcd60e51b815260206004820152602b60248201527f57616c6c6574206d75737420626520696e204c697665206f72204d6f76696e6760448201527f46756e64732073746174650000000000000000000000000000000000000000006064820152608401610138565b60006109cd8961099160408b018b613890565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9250611955915050565b606081015190915067ffffffffffffffff1615610a4e578381604001518260600151604051602001610a2c9392919092835260e09190911b6001600160e01b031916602083015260c01b6001600160c01b0319166024820152602c0190565b60408051601f1981840301815291905280516020909101206001840155610a56565b600060018401555b8051600284018054600090610a7690849067ffffffffffffffff166137ae565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fa45596c10f758d32ec8cca64a0fbfe776052b08fdb3f026e0a87f52118bf8fbe8585604051610ae29291906001600160601b0319929092168252602082015260400190565b60405180910390a1885481516040517f392aee4300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526001600160a01b039091169063392aee4390602401600060405180830381600087803b158015610b5457600080fd5b505af1158015610b68573d6000803e3d6000fd5b50508a546004808d015460208601516040516356a6d9ef60e01b81526001600160a01b039283169381019390935267ffffffffffffffff16602483015290911692506356a6d9ef91506044015b600060405180830381600087803b158015610bcf57600080fd5b505af1158015610be3573d6000803e3d6000fd5b50505050505050505050505050565b6000858383604051602001610c0993929190613737565b60408051808303601f190181528282528051602091820120600081815260108c01835283902060a08501845280546001600160a01b0381168652600160a01b900467ffffffffffffffff9081169386019390935260010154808316938501939093526801000000000000000083049091166060840152600160801b90910463ffffffff1660808301819052909250610ced5760405162461bcd60e51b815260206004820152602160248201527f526564656d7074696f6e207265717565737420646f6573206e6f7420657869736044820152601d60fa1b6064820152608401610138565b4288600d0154826080015163ffffffff16610d0891906138d7565b10610d7a5760405162461bcd60e51b8152602060048201526024808201527f526564656d7074696f6e207265717565737420686173206e6f742074696d656460448201527f206f7574000000000000000000000000000000000000000000000000000000006064820152608401610138565b6001600160601b031987166000908152601b890160209081526040918290209183015190830151610dab91906137ae565b600282018054600090610dc990849067ffffffffffffffff166137ae565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060016005811115610e0257610e026136b3565b6002820154600160a01b900460ff166005811115610e2257610e226136b3565b1480610e4c5750600280820154600160a01b900460ff166005811115610e4a57610e4a6136b3565b145b80610e76575060056002820154600160a01b900460ff166005811115610e7457610e746136b3565b145b610ee85760405162461bcd60e51b815260206004820152603b60248201527f5468652077616c6c6574206d75737420626520696e204c6976652c204d6f766960448201527f6e6746756e6473206f72205465726d696e6174656420737461746500000000006064820152608401610138565b600083815260118a016020908152604080832085518154878501516001600160a01b039092166001600160e01b031991821617600160a01b67ffffffffffffffff93841602178355878401516001938401805460608b015160808c01519386167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117680100000000000000009190951602939093177fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff16600160801b63ffffffff909216919091021790915560108e019093529220805490911681558101805473ffffffffffffffffffffffffffffffffffffffff191690556002820154600160a01b900460ff166005811115611007576110076136b3565b14806110315750600280820154600160a01b900460ff16600581111561102f5761102f6136b3565b145b156110e2576110408989611a8c565b6002890154600e8a0154600f8b015483546040517fd8dc404d0000000000000000000000000000000000000000000000000000000081526001600160a01b039094169363d8dc404d936110af936bffffffffffffffffffffffff9091169290913391908e908e906004016138ef565b600060405180830381600087803b1580156110c957600080fd5b505af11580156110dd573d6000803e3d6000fd5b505050505b7f013dddc8debc4730cd01232fdcea9ae6013689837732356c187fe5edb9a8a8d588868660405161111593929190613971565b60405180910390a18854825160208401516040516356a6d9ef60e01b81526001600160a01b03928316600482015267ffffffffffffffff90911660248201529116906356a6d9ef90604401610bb5565b606060008260088151811061117c5761117c61399a565b0160200151835160f89190911c91506111968260096139b0565b60ff16146111b4575050604080516020810190915260008152919050565b826009815181106111c7576111c761399a565b016020015160f81c61126d5760028160ff1610156111f5575050604080516020810190915260008152919050565b600083600a8151811061120a5761120a61399a565b016020015160f81c905061121f6002836139d5565b60ff168114158061123d57508060201415801561123d575080601414155b1561125957505060408051602081019091526000815292915050565b61126584600b83611b81565b949350505050565b600061127a846008611c4b565b90507f1976a900000000000000000000000000000000000000000000000000000000007fffffff0000000000000000000000000000000000000000000000000000000000821614156113575783600b815181106112d9576112d961399a565b60209101015160f81c601414158061132e5750611304600285516112fd91906139f8565b8590611c4b565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191661222b60f21b14155b1561134a57505060408051602081019091526000815292915050565b61126584600c6014611b81565b7f17a91400000000000000000000000000000000000000000000000000000000007fffffff0000000000000000000000000000000000000000000000000000000000821614156113f45783600185516113b091906139f8565b815181106113c0576113c061399a565b60209101015160f81c6087146113e757505060408051602081019091526000815292915050565b61126584600b6014611b81565b505050604080516020810190915260008152919050565b600061145761141d6020850185613890565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c6392505050565b6114a35760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420696e70757420766563746f722070726f76696465640000006044820152606401610138565b6114ed6114b36040850185613890565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611d1392505050565b6115395760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964206f757470757420766563746f722070726f766964656400006044820152606401610138565b61159c6115496020850185613a0f565b6115566020860186613890565b6115636040880188613890565b61157360808a0160608b01613a0f565b60405160200161158896959493929190613a39565b604051602081830303815290604052611db6565b90506116376115eb6115b16040850185613890565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ddd92505050565b6115f58480613890565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869493925050506020860135611dea565b6116a95760405162461bcd60e51b815260206004820152603c60248201527f5478206d65726b6c652070726f6f66206973206e6f742076616c696420666f7260448201527f2070726f76696465642068656164657220616e642074782068617368000000006064820152608401610138565b6116f4846116ba6040850185613890565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e2692505050565b9392505050565b6001600160601b031981166000908152601b85016020526040902060010154806117675760405162461bcd60e51b815260206004820152601d60248201527f4e6f206d61696e205554584f20666f7220676976656e2077616c6c65740000006044820152606401610138565b80833561177a60408601602087016136dd565b61178a60608701604088016136f8565b6040516020016117c79392919092835260e09190911b6001600160e01b031916602083015260c01b6001600160c01b0319166024820152602c0190565b604051602081830303815290604052805190602001201461182a5760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964206d61696e205554584f2064617461000000000000000000006044820152606401610138565b60008061183686612195565b9092509050843582148015611865575063ffffffff811661185d60408701602088016136dd565b63ffffffff16145b6118d75760405162461bcd60e51b815260206004820152603f60248201527f4f7574626f756e64207472616e73616374696f6e20696e707574206d7573742060448201527f706f696e7420746f207468652077616c6c65742773206d61696e205554584f006064820152608401610138565b600160178801600087356118f160408a0160208b016136dd565b60405160200161191892919091825260e01b6001600160e01b031916602082015260240190565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff191691151591909117905550505050505050565b6040805160808101825260008082526020820181905291810182905260608101829052908061198385612270565b909250905060006119958360016138d7565b6040517f1976a9140000000000000000000000000000000000000000000000000000000060208201526001600160601b03198716602482015261222b60f21b6038820152909150600090603a0160408051601f198184030181529082905280516020918201207f1600140000000000000000000000000000000000000000000000000000000000918301919091526001600160601b0319881660238301529150600090603701604051602081830303815290604052805190602001209050611a7f898989604051806080016040528088815260200189815260200187815260200186815250612287565b9998505050505050505050565b6001600160601b031981166000908152601b83016020526040902060020154600160a01b900460ff166001816005811115611ac957611ac96136b3565b1480611ae657506002816005811115611ae457611ae46136b3565b145b611b585760405162461bcd60e51b815260206004820152603160248201527f45434453412077616c6c6574206d75737420626520696e204c697665206f722060448201527f4d6f76696e6746756e64732073746174650000000000000000000000000000006064820152608401610138565b6001816005811115611b6c57611b6c6136b3565b1415611b7c57611b7c8383612486565b505050565b606081611b9d57506040805160208101909152600081526116f4565b6000611ba983856138d7565b90508381118015611bbb575080855110155b611c075760405162461bcd60e51b815260206004820152601360248201527f536c696365206f7574206f6620626f756e6473000000000000000000000000006044820152606401610138565b604051915082604083010160405282825283850182038460208701018481015b80821015611c4057815183830152602082019150611c27565b505050509392505050565b6000611c5a8383016020015190565b90505b92915050565b6000806000611c7184612270565b9092509050801580611c84575060001982145b15611c93575060009392505050565b6000611ca08360016138d7565b905060005b82811015611d065785518210611cc15750600095945050505050565b6000611ccd87846125cc565b9050600019811415611ce6575060009695505050505050565b611cf081846138d7565b9250508080611cfe90613a7b565b915050611ca5565b5093519093149392505050565b6000806000611d2184612270565b9092509050801580611d34575060001982145b15611d43575060009392505050565b6000611d508360016138d7565b905060005b82811015611d065785518210611d715750600095945050505050565b6000611d7d8784612617565b9050600019811415611d96575060009695505050505050565b611da081846138d7565b9250508080611dae90613a7b565b915050611d55565b60006020600083516020850160025afa50602060006020600060025afa5050600051919050565b6044810151600090611c5d565b60008385148015611df9575081155b8015611e0457508251155b15611e1157506001611265565b611e1d8584868561267d565b95945050505050565b6001820154604080517f113764be00000000000000000000000000000000000000000000000000000000815290516001600160a01b0390921691600091839163113764be91600480820192602092909190829003018186803b158015611e8b57600080fd5b505afa158015611e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec39190613a96565b90506000826001600160a01b0316632b97be246040518163ffffffff1660e01b815260040160206040518083038186803b158015611f0057600080fd5b505afa158015611f14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f389190613a96565b9050600080611f4e611f4987612725565b6127ba565b905083811415611f6057839150611fde565b82811415611f7057829150611fde565b60405162461bcd60e51b815260206004820152602560248201527f4e6f742061742063757272656e74206f722070726576696f757320646966666960448201527f63756c74790000000000000000000000000000000000000000000000000000006064820152608401610138565b6000611fe9876127e2565b90506000198114156120635760405162461bcd60e51b815260206004820152602360248201527f496e76616c6964206c656e677468206f6620746865206865616465727320636860448201527f61696e00000000000000000000000000000000000000000000000000000000006064820152608401610138565b6001198114156120b55760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206865616465727320636861696e00000000000000000000006044820152606401610138565b6002198114156121075760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420776f726b20696e2061206865616465720000006044820152606401610138565b60038801546121169084613aaf565b81101561218b5760405162461bcd60e51b815260206004820152603360248201527f496e73756666696369656e7420616363756d756c61746564206469666669637560448201527f6c747920696e2068656164657220636861696e000000000000000000000000006064820152608401610138565b5050505050505050565b60008060006121a384612270565b9150508060011461221c5760405162461bcd60e51b815260206004820152602d60248201527f4f7574626f756e64207472616e73616374696f6e206d7573742068617665206160448201527f2073696e676c6520696e707574000000000000000000000000000000000000006064820152608401610138565b600061222885826129e9565b905061223381612bcf565b935061226761224182612bdc565b60d881901c63ff00ff001662ff00ff60e89290921c9190911617601081811b91901c1790565b92505050915091565b60008061227e836000612be9565b91509150915091565b604080516080810182526000808252602082018190529181018290526060810182905290805b83602001518110156124095783516000906122c9908890612617565b85519091506000906122dd90899084611b81565b905060006122ea82612d67565b90506000612308600880855161230091906139f8565b859190611b81565b9050866060015167ffffffffffffffff166000148015612344575060408801518151602083012014806123445750606088015181516020830120145b801561235a575060008267ffffffffffffffff16115b156123805763ffffffff8516604088015267ffffffffffffffff821660608801526123da565b60008061238f8d8c8587612dde565b9150915081896000018181516123a591906137d7565b67ffffffffffffffff169052506020890180518291906123c69083906137d7565b67ffffffffffffffff169052506001975050505b83886000018181516123ec91906138d7565b9052508493506124019250839150613a7b9050565b9150506122ad565b508061247d5760405162461bcd60e51b815260206004820152603b60248201527f526564656d7074696f6e207472616e73616374696f6e206d7573742070726f6360448201527f657373206174206c65617374206f6e6520726564656d7074696f6e00000000006064820152608401610138565b50949350505050565b6001600160601b031981166000908152601b83016020526040902060018101546124b9576124b4838361316d565b61254c565b60028101805463ffffffff42166c01000000000000000000000000027fffffffffffffffffffffff00ffffffff00000000ffffffffffffffffffffffff909116177402000000000000000000000000000000000000000017905580546040516001600160601b0319841691907fbdc9ce990a067e5fd3a5d8dfc68e27e9f221aaa3fe55265e0b7e93c460b3efe290600090a35b601983015460601b6001600160601b031990811690831614156125895760198301805473ffffffffffffffffffffffffffffffffffffffff191690555b601983018054600160a01b900463ffffffff169060146125a883613ace565b91906101000a81548163ffffffff021916908363ffffffff16021790555050505050565b60008060006125db8585613209565b90925090506000198214156125f65760001992505050611c5d565b806126028360256138d7565b61260c91906138d7565b611e1d9060046138d7565b60006126248260096138d7565b835110156126355750600019611c5d565b60008061264c856126478660086138d7565b612be9565b90925090506000198214156126675760001992505050611c5d565b806126738360096138d7565b611e1d91906138d7565b60006020845161268d9190613aee565b1561269a57506000611265565b83516126a857506000611265565b818560005b8651811015612718576126c1600284613aee565b600114156126e6576126df6126d98883016020015190565b8361324b565b91506126ff565b6126fc826126f78984016020015190565b61324b565b91505b60019290921c916127116020826138d7565b90506126ad565b5090931495945050505050565b600080612733836048611c4b565b60e81c9050600083604b8151811061274d5761274d61399a565b016020015160f81c9050600061278183600060108262ffffff16901c8261ff001660108462ffffff16901b17179050919050565b62ffffff16905060006127956003846139d5565b60ff1690506127a681610100613be6565b6127b09083613aaf565b9695505050505050565b6000611c5d7bffff000000000000000000000000000000000000000000000000000083613257565b6000605082516127f29190613aee565b156128005750600019919050565b506040805160808101909152605081526000908190815b84518110156129e15761282b858383613263565b801561284b5761283b82846132f8565b61284b5750600119949350505050565b600061285683612725565b905061286183611db6565b9350806129a58560008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b600882901c7eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff161790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b601082901c7dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff161790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b602082901c7bffffffff00000000ffffffff00000000ffffffff00000000ffffffff1617905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b604082901c77ffffffffffffffff0000000000000000ffffffffffffffff16179050608081901b608082901c179050919050565b11156129b8575060021995945050505050565b6129cb6129c4826127ba565b8690613321565b94506129da90506050826138d7565b9050612817565b505050919050565b60606000806129f785612270565b9092509050600019821415612a745760405162461bcd60e51b815260206004820152602260248201527f52656164206f76657272756e20647572696e6720566172496e7420706172736960448201527f6e670000000000000000000000000000000000000000000000000000000000006064820152608401610138565b808410612ac35760405162461bcd60e51b815260206004820152601060248201527f56696e2072656164206f76657272756e000000000000000000000000000000006044820152606401610138565b600080612ad18460016138d7565b905060005b86811015612b5a57612ae888836125cc565b9250600019831415612b3c5760405162461bcd60e51b815260206004820152601760248201527f42616420566172496e7420696e207363726970745369670000000000000000006044820152606401610138565b612b4683836138d7565b915080612b5281613a7b565b915050612ad6565b50612b6587826125cc565b9150600019821415612bb95760405162461bcd60e51b815260206004820152601760248201527f42616420566172496e7420696e207363726970745369670000000000000000006044820152606401610138565b612bc4878284611b81565b979650505050505050565b6020810151600090611c5d565b6000611c5d826020611c4b565b6000806000612bf8858561337f565b905060ff8116612c2a576000858581518110612c1657612c1661399a565b016020015190935060f81c9150612d609050565b83612c368260016139b0565b60ff16612c4391906138d7565b85511015612c5a5760001960009250925050612d60565b60008160ff1660021415612c9f57612c94612c80612c798760016138d7565b8890611c4b565b62ffff0060e882901c1660f89190911c1790565b61ffff169050612d56565b8160ff1660041415612cc957612cbc612241612c798760016138d7565b63ffffffff169050612d56565b8160ff1660081415612d5657612d49612ce6612c798760016138d7565b60c01c64ff000000ff600882811c91821665ff000000ff009390911b92831617601090811b67ffffffffffffffff1666ff00ff00ff00ff9290921667ff00ff00ff00ff009093169290921790911c65ffff0000ffff1617602081811c91901b1790565b67ffffffffffffffff1690505b60ff909116925090505b9250929050565b600080612d738361340b565b60c01c905060006112658264ff000000ff600882811c91821665ff000000ff009390911b92831617601090811b67ffffffffffffffff1666ff00ff00ff00ff9290921667ff00ff00ff00ff009093169290921790911c65ffff0000ffff1617602081811c91901b1790565b60008060008585604051602001612df6929190613bf2565b60408051808303601f190181529181528151602092830120600081815260108b01909352912060010154909150600160801b900463ffffffff1615612fb3576000818152601088016020526040812060018101548154919291612e6d9167ffffffffffffffff90811691600160a01b9004166137ae565b600183015490915067ffffffffffffffff80881691612e9a916801000000000000000090910416836137ae565b67ffffffffffffffff1611158015612ec657508067ffffffffffffffff168667ffffffffffffffff1611155b612f5e5760405162461bcd60e51b815260206004820152604660248201527f4f75747075742076616c7565206973206e6f742077697468696e20746865206160448201527f636365707461626c652072616e6765206f66207468652070656e64696e67207260648201527f6571756573740000000000000000000000000000000000000000000000000000608482015260a401610138565b600191820154600084815260108b016020526040902080546001600160e01b0319168155909201805473ffffffffffffffffffffffffffffffffffffffff19169055935067ffffffffffffffff169150613163565b600081815260118801602052604090206001810154600160801b900463ffffffff166130465760405162461bcd60e51b8152602060048201526024808201527f4f75747075742069732061206e6f6e2d72657175657374656420726564656d7060448201527f74696f6e000000000000000000000000000000000000000000000000000000006064820152608401610138565b6001810154815460009161306f9167ffffffffffffffff91821691600160a01b909104166137ae565b600183015490915067ffffffffffffffff8088169161309c916801000000000000000090910416836137ae565b67ffffffffffffffff16111580156130c857508067ffffffffffffffff168667ffffffffffffffff1611155b6131605760405162461bcd60e51b815260206004820152604860248201527f4f75747075742076616c7565206973206e6f742077697468696e20746865206160448201527f636365707461626c652072616e6765206f66207468652074696d6564206f757460648201527f2072657175657374000000000000000000000000000000000000000000000000608482015260a401610138565b50505b5094509492505050565b6001600160601b031981166000818152601b8401602052604080822060028101805463ffffffff4216600160801b027fffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff9091161774030000000000000000000000000000000000000000179055805491519093927f68cb496f5e64383745876664ef119840f154a729c03ba866b8aecb5c9f53d51691a3505050565b6000806132178360256138d7565b8451101561322c575060001990506000612d60565b60008061323e866126478760246138d7565b9097909650945050505050565b6000611c5a8383613417565b6000611c5a8284613c49565b8151600061327182846138d7565b90508281118015613283575080855110155b6132cf5760405162461bcd60e51b815260206004820152601360248201527f536c696365206f7574206f6620626f756e6473000000000000000000000000006044820152606401610138565b826020860101602085018382015b8083101561218b5782518252602092830192909101906132dd565b60008061330484613445565b9050828114613317576000915050611c5d565b5060019392505050565b600061332d82846138d7565b905082811015611c5d5760405162461bcd60e51b815260206004820152601960248201527f4f766572666c6f7720647572696e67206164646974696f6e2e000000000000006044820152606401610138565b60008282815181106133935761339361399a565b60209101015160f81c60ff14156133ac57506008611c5d565b8282815181106133be576133be61399a565b60209101015160f81c60fe14156133d757506004611c5d565b8282815181106133e9576133e961399a565b60209101015160f81c60fd141561340257506002611c5d565b50600092915050565b6000611c5d8282611c4b565b60008260005281602052602060006040600060025afa50602060006020600060025afa505060005192915050565b6024810151600090611c5d565b80356001600160601b03198116811461346a57600080fd5b919050565b60006060828403121561348157600080fd5b50919050565b60008083601f84011261349957600080fd5b50813567ffffffffffffffff8111156134b157600080fd5b602083019150836020828501011115612d6057600080fd5b803567ffffffffffffffff8116811461346a57600080fd5b60008060008060008060e087890312156134fa57600080fd5b8635955061350a60208801613452565b9450613519886040890161346f565b935060a087013567ffffffffffffffff81111561353557600080fd5b61354189828a01613487565b9094509250613554905060c088016134c9565b90509295509295509295565b600080600080600060e0868803121561357857600080fd5b85359450602086013567ffffffffffffffff8082111561359757600080fd5b908701906080828a0312156135ab57600080fd5b909450604087013590808211156135c157600080fd5b506135ce8882890161346f565b9350506135de876060880161346f565b91506135ec60c08701613452565b90509295509295909350565b6000806000806000806080878903121561361157600080fd5b8635955061362160208801613452565b9450604087013567ffffffffffffffff8082111561363e57600080fd5b818901915089601f83011261365257600080fd5b81358181111561366157600080fd5b8a60208260051b850101111561367657600080fd5b60208301965080955050606089013591508082111561369457600080fd5b506136a189828a01613487565b979a9699509497509295939492505050565b634e487b7160e01b600052602160045260246000fd5b803563ffffffff8116811461346a57600080fd5b6000602082840312156136ef57600080fd5b611c5a826136c9565b60006020828403121561370a57600080fd5b611c5a826134c9565b6001600160c01b031984168152818360088301376000910160080190815292915050565b6001600160601b031984168152818360148301376000910160140190815292915050565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600067ffffffffffffffff808416806137a2576137a261375b565b92169190910492915050565b600067ffffffffffffffff838116908316818110156137cf576137cf613771565b039392505050565b600067ffffffffffffffff8083168185168083038211156137fa576137fa613771565b01949350505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6bffffffffffffffffffffffff198816815260c06020820152600061385560c08301888a613803565b6001600160a01b039690961660408301525067ffffffffffffffff9384166060820152918316608083015290911660a0909101529392505050565b6000808335601e198436030181126138a757600080fd5b83018035915067ffffffffffffffff8211156138c257600080fd5b602001915036819003821315612d6057600080fd5b600082198211156138ea576138ea613771565b500190565b600060a082016bffffffffffffffffffffffff89168352602088818501526001600160a01b038816604085015286606085015260a060808501528185835260c08501905086925060005b868110156139625763ffffffff61394f856136c9565b1682529282019290820190600101613939565b509a9950505050505050505050565b6bffffffffffffffffffffffff1984168152604060208201526000611e1d604083018486613803565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff84168060ff038211156139cd576139cd613771565b019392505050565b600060ff821660ff8416808210156139ef576139ef613771565b90039392505050565b600082821015613a0a57613a0a613771565b500390565b600060208284031215613a2157600080fd5b81356001600160e01b0319811681146116f457600080fd5b60006001600160e01b03198089168352868860048501378683016004810160008152868882375093169390920160048101939093525050600801949350505050565b6000600019821415613a8f57613a8f613771565b5060010190565b600060208284031215613aa857600080fd5b5051919050565b6000816000190483118215151615613ac957613ac9613771565b500290565b600063ffffffff821680613ae457613ae4613771565b6000190192915050565b600082613afd57613afd61375b565b500690565b600181815b80851115613b3d578160001904821115613b2357613b23613771565b80851615613b3057918102915b93841c9390800290613b07565b509250929050565b600082613b5457506001611c5d565b81613b6157506000611c5d565b8160018114613b775760028114613b8157613b9d565b6001915050611c5d565b60ff841115613b9257613b92613771565b50506001821b611c5d565b5060208310610133831016604e8410600b8410161715613bc0575081810a611c5d565b613bca8383613b02565b8060001904821115613bde57613bde613771565b029392505050565b6000611c5a8383613b45565b6bffffffffffffffffffffffff19831681526000825160005b81811015613c285760208186018101516014868401015201613c0b565b81811115613c3a576000601483860101525b50919091016014019392505050565b600082613c5857613c5861375b565b50049056fea264697066735822122030472ea38b6a36d1fdf3ce8e439fbbf133ff9fa0d5273924eb5630a4f6ff974a64736f6c63430008090033",
89
+ "deployedBytecode": "0x730000000000000000000000000000000000000000301460806040526004361061004b5760003560e01c80637333b36914610050578063a164de6e14610072578063a76558b314610092575b600080fd5b81801561005c57600080fd5b5061007061006b3660046134e1565b6100b2565b005b81801561007e57600080fd5b5061007061008d366004613560565b610853565b81801561009e57600080fd5b506100706100ad3660046135f8565b610bf2565b6001600160601b031985166000908152601b87016020526040902060016002820154600160a01b900460ff1660058111156100ef576100ef6136b3565b146101415760405162461bcd60e51b815260206004820152601c60248201527f57616c6c6574206d75737420626520696e204c6976652073746174650000000060448201526064015b60405180910390fd5b60018101548061019d5760405162461bcd60e51b815260206004820152602160248201527f4e6f206d61696e205554584f20666f722074686520676976656e2077616c6c656044820152601d60fa1b6064820152608401610138565b8086356101b06040890160208a016136dd565b6101c060608a0160408b016136f8565b6040516020016101fd9392919092835260e09190911b6001600160e01b031916602083015260c01b6001600160c01b0319166024820152602c0190565b60405160208183030381529060405280519060200120146102605760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964206d61696e205554584f2064617461000000000000000000006044820152606401610138565b6000610292600060c01b878760405160200161027e93929190613713565b604051602081830303815290604052611165565b9050600081511161030b5760405162461bcd60e51b815260206004820152602e60248201527f52656465656d6572206f757470757420736372697074206d757374206265206160448201527f207374616e6461726420747970650000000000000000000000000000000000006064820152608401610138565b80805190602001208860405160200161033491906001600160601b031991909116815260140190565b6040516020818303038152906040528051906020012014156103be5760405162461bcd60e51b815260206004820152603760248201527f52656465656d6572206f757470757420736372697074206d757374206e6f742060448201527f706f696e7420746f207468652077616c6c657420504b480000000000000000006064820152608401610138565b600c89015467ffffffffffffffff90811690851610156104205760405162461bcd60e51b815260206004820152601b60248201527f526564656d7074696f6e20616d6f756e7420746f6f20736d616c6c00000000006044820152606401610138565b600088878760405160200161043793929190613737565b60408051808303601f190181529181528151602092830120600081815260108e01909352912060010154909150600160801b900463ffffffff161561050a5760405162461bcd60e51b815260206004820152604a60248201527f546865726520697320612070656e64696e6720726564656d7074696f6e20726560448201527f71756573742066726f6d20746869732077616c6c657420746f2074686520736160648201527f6d65206164647265737300000000000000000000000000000000000000000000608482015260a401610138565b600c8a015460009068010000000000000000900467ffffffffffffffff16610533576000610558565b600c8b01546105589068010000000000000000900467ffffffffffffffff1687613787565b600c8c0154909150600160801b900467ffffffffffffffff1661057b82886137ae565b60028701805460009061059990849067ffffffffffffffff166137d7565b82546101009290920a67ffffffffffffffff81810219909316918316021790915560028801541690506105d260608c0160408d016136f8565b67ffffffffffffffff16101561062a5760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e742077616c6c65742066756e6473000000000000006044820152606401610138565b6040518060a00160405280336001600160a01b031681526020018867ffffffffffffffff1681526020018367ffffffffffffffff1681526020018267ffffffffffffffff1681526020014263ffffffff168152508c601001600085815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160010160106101000a81548163ffffffff021916908363ffffffff1602179055509050507f97a0199072f487232635d50ab75860891afe0b91c976ed2fc76502c4d82d0d958b8a8a338b87876040516107b2979695949392919061382c565b60405180910390a18b546040517f7c6db49c00000000000000000000000000000000000000000000000000000000815233600482015230602482015267ffffffffffffffff891660448201526001600160a01b0390911690637c6db49c90606401600060405180830381600087803b15801561082d57600080fd5b505af1158015610841573d6000803e3d6000fd5b50505050505050505050505050505050565b600061086086868661140b565b90506108b1866108736020880188613890565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508892508791506116fb9050565b6001600160601b031982166000908152601b8701602052604090206002810154600160a01b900460ff1660018160058111156108ef576108ef6136b3565b148061090c5750600281600581111561090a5761090a6136b3565b145b61097e5760405162461bcd60e51b815260206004820152602b60248201527f57616c6c6574206d75737420626520696e204c697665206f72204d6f76696e6760448201527f46756e64732073746174650000000000000000000000000000000000000000006064820152608401610138565b60006109cd8961099160408b018b613890565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9250611955915050565b606081015190915067ffffffffffffffff1615610a4e578381604001518260600151604051602001610a2c9392919092835260e09190911b6001600160e01b031916602083015260c01b6001600160c01b0319166024820152602c0190565b60408051601f1981840301815291905280516020909101206001840155610a56565b600060018401555b8051600284018054600090610a7690849067ffffffffffffffff166137ae565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fa45596c10f758d32ec8cca64a0fbfe776052b08fdb3f026e0a87f52118bf8fbe8585604051610ae29291906001600160601b0319929092168252602082015260400190565b60405180910390a1885481516040517f392aee4300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526001600160a01b039091169063392aee4390602401600060405180830381600087803b158015610b5457600080fd5b505af1158015610b68573d6000803e3d6000fd5b50508a546004808d015460208601516040516356a6d9ef60e01b81526001600160a01b039283169381019390935267ffffffffffffffff16602483015290911692506356a6d9ef91506044015b600060405180830381600087803b158015610bcf57600080fd5b505af1158015610be3573d6000803e3d6000fd5b50505050505050505050505050565b6000858383604051602001610c0993929190613737565b60408051808303601f190181528282528051602091820120600081815260108c01835283902060a08501845280546001600160a01b0381168652600160a01b900467ffffffffffffffff9081169386019390935260010154808316938501939093526801000000000000000083049091166060840152600160801b90910463ffffffff1660808301819052909250610ced5760405162461bcd60e51b815260206004820152602160248201527f526564656d7074696f6e207265717565737420646f6573206e6f7420657869736044820152601d60fa1b6064820152608401610138565b4288600d0154826080015163ffffffff16610d0891906138d7565b10610d7a5760405162461bcd60e51b8152602060048201526024808201527f526564656d7074696f6e207265717565737420686173206e6f742074696d656460448201527f206f7574000000000000000000000000000000000000000000000000000000006064820152608401610138565b6001600160601b031987166000908152601b890160209081526040918290209183015190830151610dab91906137ae565b600282018054600090610dc990849067ffffffffffffffff166137ae565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060016005811115610e0257610e026136b3565b6002820154600160a01b900460ff166005811115610e2257610e226136b3565b1480610e4c5750600280820154600160a01b900460ff166005811115610e4a57610e4a6136b3565b145b80610e76575060056002820154600160a01b900460ff166005811115610e7457610e746136b3565b145b610ee85760405162461bcd60e51b815260206004820152603b60248201527f5468652077616c6c6574206d75737420626520696e204c6976652c204d6f766960448201527f6e6746756e6473206f72205465726d696e6174656420737461746500000000006064820152608401610138565b600083815260118a016020908152604080832085518154878501516001600160a01b039092166001600160e01b031991821617600160a01b67ffffffffffffffff93841602178355878401516001938401805460608b015160808c01519386167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117680100000000000000009190951602939093177fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff16600160801b63ffffffff909216919091021790915560108e019093529220805490911681558101805473ffffffffffffffffffffffffffffffffffffffff191690556002820154600160a01b900460ff166005811115611007576110076136b3565b14806110315750600280820154600160a01b900460ff16600581111561102f5761102f6136b3565b145b156110e2576110408989611a8c565b6002890154600e8a0154600f8b015483546040517fd8dc404d0000000000000000000000000000000000000000000000000000000081526001600160a01b039094169363d8dc404d936110af936bffffffffffffffffffffffff9091169290913391908e908e906004016138ef565b600060405180830381600087803b1580156110c957600080fd5b505af11580156110dd573d6000803e3d6000fd5b505050505b7f013dddc8debc4730cd01232fdcea9ae6013689837732356c187fe5edb9a8a8d588868660405161111593929190613971565b60405180910390a18854825160208401516040516356a6d9ef60e01b81526001600160a01b03928316600482015267ffffffffffffffff90911660248201529116906356a6d9ef90604401610bb5565b606060008260088151811061117c5761117c61399a565b0160200151835160f89190911c91506111968260096139b0565b60ff16146111b4575050604080516020810190915260008152919050565b826009815181106111c7576111c761399a565b016020015160f81c61126d5760028160ff1610156111f5575050604080516020810190915260008152919050565b600083600a8151811061120a5761120a61399a565b016020015160f81c905061121f6002836139d5565b60ff168114158061123d57508060201415801561123d575080601414155b1561125957505060408051602081019091526000815292915050565b61126584600b83611b81565b949350505050565b600061127a846008611c4b565b90507f1976a900000000000000000000000000000000000000000000000000000000007fffffff0000000000000000000000000000000000000000000000000000000000821614156113575783600b815181106112d9576112d961399a565b60209101015160f81c601414158061132e5750611304600285516112fd91906139f8565b8590611c4b565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191661222b60f21b14155b1561134a57505060408051602081019091526000815292915050565b61126584600c6014611b81565b7f17a91400000000000000000000000000000000000000000000000000000000007fffffff0000000000000000000000000000000000000000000000000000000000821614156113f45783600185516113b091906139f8565b815181106113c0576113c061399a565b60209101015160f81c6087146113e757505060408051602081019091526000815292915050565b61126584600b6014611b81565b505050604080516020810190915260008152919050565b600061145761141d6020850185613890565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c6392505050565b6114a35760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420696e70757420766563746f722070726f76696465640000006044820152606401610138565b6114ed6114b36040850185613890565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611d1392505050565b6115395760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964206f757470757420766563746f722070726f766964656400006044820152606401610138565b61159c6115496020850185613a0f565b6115566020860186613890565b6115636040880188613890565b61157360808a0160608b01613a0f565b60405160200161158896959493929190613a39565b604051602081830303815290604052611db6565b90506116376115eb6115b16040850185613890565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ddd92505050565b6115f58480613890565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869493925050506020860135611dea565b6116a95760405162461bcd60e51b815260206004820152603c60248201527f5478206d65726b6c652070726f6f66206973206e6f742076616c696420666f7260448201527f2070726f76696465642068656164657220616e642074782068617368000000006064820152608401610138565b6116f4846116ba6040850185613890565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e2692505050565b9392505050565b6001600160601b031981166000908152601b85016020526040902060010154806117675760405162461bcd60e51b815260206004820152601d60248201527f4e6f206d61696e205554584f20666f7220676976656e2077616c6c65740000006044820152606401610138565b80833561177a60408601602087016136dd565b61178a60608701604088016136f8565b6040516020016117c79392919092835260e09190911b6001600160e01b031916602083015260c01b6001600160c01b0319166024820152602c0190565b604051602081830303815290604052805190602001201461182a5760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964206d61696e205554584f2064617461000000000000000000006044820152606401610138565b60008061183686612195565b9092509050843582148015611865575063ffffffff811661185d60408701602088016136dd565b63ffffffff16145b6118d75760405162461bcd60e51b815260206004820152603f60248201527f4f7574626f756e64207472616e73616374696f6e20696e707574206d7573742060448201527f706f696e7420746f207468652077616c6c65742773206d61696e205554584f006064820152608401610138565b600160178801600087356118f160408a0160208b016136dd565b60405160200161191892919091825260e01b6001600160e01b031916602082015260240190565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff191691151591909117905550505050505050565b6040805160808101825260008082526020820181905291810182905260608101829052908061198385612270565b909250905060006119958360016138d7565b6040517f1976a9140000000000000000000000000000000000000000000000000000000060208201526001600160601b03198716602482015261222b60f21b6038820152909150600090603a0160408051601f198184030181529082905280516020918201207f1600140000000000000000000000000000000000000000000000000000000000918301919091526001600160601b0319881660238301529150600090603701604051602081830303815290604052805190602001209050611a7f898989604051806080016040528088815260200189815260200187815260200186815250612287565b9998505050505050505050565b6001600160601b031981166000908152601b83016020526040902060020154600160a01b900460ff166001816005811115611ac957611ac96136b3565b1480611ae657506002816005811115611ae457611ae46136b3565b145b611b585760405162461bcd60e51b815260206004820152603160248201527f45434453412077616c6c6574206d75737420626520696e204c697665206f722060448201527f4d6f76696e6746756e64732073746174650000000000000000000000000000006064820152608401610138565b6001816005811115611b6c57611b6c6136b3565b1415611b7c57611b7c8383612486565b505050565b606081611b9d57506040805160208101909152600081526116f4565b6000611ba983856138d7565b90508381118015611bbb575080855110155b611c075760405162461bcd60e51b815260206004820152601360248201527f536c696365206f7574206f6620626f756e6473000000000000000000000000006044820152606401610138565b604051915082604083010160405282825283850182038460208701018481015b80821015611c4057815183830152602082019150611c27565b505050509392505050565b6000611c5a8383016020015190565b90505b92915050565b6000806000611c7184612270565b9092509050801580611c84575060001982145b15611c93575060009392505050565b6000611ca08360016138d7565b905060005b82811015611d065785518210611cc15750600095945050505050565b6000611ccd87846125cc565b9050600019811415611ce6575060009695505050505050565b611cf081846138d7565b9250508080611cfe90613a7b565b915050611ca5565b5093519093149392505050565b6000806000611d2184612270565b9092509050801580611d34575060001982145b15611d43575060009392505050565b6000611d508360016138d7565b905060005b82811015611d065785518210611d715750600095945050505050565b6000611d7d8784612617565b9050600019811415611d96575060009695505050505050565b611da081846138d7565b9250508080611dae90613a7b565b915050611d55565b60006020600083516020850160025afa50602060006020600060025afa5050600051919050565b6044810151600090611c5d565b60008385148015611df9575081155b8015611e0457508251155b15611e1157506001611265565b611e1d8584868561267d565b95945050505050565b6001820154604080517f113764be00000000000000000000000000000000000000000000000000000000815290516001600160a01b0390921691600091839163113764be91600480820192602092909190829003018186803b158015611e8b57600080fd5b505afa158015611e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec39190613a96565b90506000826001600160a01b0316632b97be246040518163ffffffff1660e01b815260040160206040518083038186803b158015611f0057600080fd5b505afa158015611f14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f389190613a96565b9050600080611f4e611f4987612725565b6127ba565b905083811415611f6057839150611fde565b82811415611f7057829150611fde565b60405162461bcd60e51b815260206004820152602560248201527f4e6f742061742063757272656e74206f722070726576696f757320646966666960448201527f63756c74790000000000000000000000000000000000000000000000000000006064820152608401610138565b6000611fe9876127e2565b90506000198114156120635760405162461bcd60e51b815260206004820152602360248201527f496e76616c6964206c656e677468206f6620746865206865616465727320636860448201527f61696e00000000000000000000000000000000000000000000000000000000006064820152608401610138565b6001198114156120b55760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206865616465727320636861696e00000000000000000000006044820152606401610138565b6002198114156121075760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420776f726b20696e2061206865616465720000006044820152606401610138565b60038801546121169084613aaf565b81101561218b5760405162461bcd60e51b815260206004820152603360248201527f496e73756666696369656e7420616363756d756c61746564206469666669637560448201527f6c747920696e2068656164657220636861696e000000000000000000000000006064820152608401610138565b5050505050505050565b60008060006121a384612270565b9150508060011461221c5760405162461bcd60e51b815260206004820152602d60248201527f4f7574626f756e64207472616e73616374696f6e206d7573742068617665206160448201527f2073696e676c6520696e707574000000000000000000000000000000000000006064820152608401610138565b600061222885826129e9565b905061223381612bcf565b935061226761224182612bdc565b60d881901c63ff00ff001662ff00ff60e89290921c9190911617601081811b91901c1790565b92505050915091565b60008061227e836000612be9565b91509150915091565b604080516080810182526000808252602082018190529181018290526060810182905290805b83602001518110156124095783516000906122c9908890612617565b85519091506000906122dd90899084611b81565b905060006122ea82612d67565b90506000612308600880855161230091906139f8565b859190611b81565b9050866060015167ffffffffffffffff166000148015612344575060408801518151602083012014806123445750606088015181516020830120145b801561235a575060008267ffffffffffffffff16115b156123805763ffffffff8516604088015267ffffffffffffffff821660608801526123da565b60008061238f8d8c8587612dde565b9150915081896000018181516123a591906137d7565b67ffffffffffffffff169052506020890180518291906123c69083906137d7565b67ffffffffffffffff169052506001975050505b83886000018181516123ec91906138d7565b9052508493506124019250839150613a7b9050565b9150506122ad565b508061247d5760405162461bcd60e51b815260206004820152603b60248201527f526564656d7074696f6e207472616e73616374696f6e206d7573742070726f6360448201527f657373206174206c65617374206f6e6520726564656d7074696f6e00000000006064820152608401610138565b50949350505050565b6001600160601b031981166000908152601b83016020526040902060018101546124b9576124b4838361316d565b61254c565b60028101805463ffffffff42166c01000000000000000000000000027fffffffffffffffffffffff00ffffffff00000000ffffffffffffffffffffffff909116177402000000000000000000000000000000000000000017905580546040516001600160601b0319841691907fbdc9ce990a067e5fd3a5d8dfc68e27e9f221aaa3fe55265e0b7e93c460b3efe290600090a35b601983015460601b6001600160601b031990811690831614156125895760198301805473ffffffffffffffffffffffffffffffffffffffff191690555b601983018054600160a01b900463ffffffff169060146125a883613ace565b91906101000a81548163ffffffff021916908363ffffffff16021790555050505050565b60008060006125db8585613209565b90925090506000198214156125f65760001992505050611c5d565b806126028360256138d7565b61260c91906138d7565b611e1d9060046138d7565b60006126248260096138d7565b835110156126355750600019611c5d565b60008061264c856126478660086138d7565b612be9565b90925090506000198214156126675760001992505050611c5d565b806126738360096138d7565b611e1d91906138d7565b60006020845161268d9190613aee565b1561269a57506000611265565b83516126a857506000611265565b818560005b8651811015612718576126c1600284613aee565b600114156126e6576126df6126d98883016020015190565b8361324b565b91506126ff565b6126fc826126f78984016020015190565b61324b565b91505b60019290921c916127116020826138d7565b90506126ad565b5090931495945050505050565b600080612733836048611c4b565b60e81c9050600083604b8151811061274d5761274d61399a565b016020015160f81c9050600061278183600060108262ffffff16901c8261ff001660108462ffffff16901b17179050919050565b62ffffff16905060006127956003846139d5565b60ff1690506127a681610100613be6565b6127b09083613aaf565b9695505050505050565b6000611c5d7bffff000000000000000000000000000000000000000000000000000083613257565b6000605082516127f29190613aee565b156128005750600019919050565b506040805160808101909152605081526000908190815b84518110156129e15761282b858383613263565b801561284b5761283b82846132f8565b61284b5750600119949350505050565b600061285683612725565b905061286183611db6565b9350806129a58560008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b600882901c7eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff161790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b601082901c7dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff161790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b602082901c7bffffffff00000000ffffffff00000000ffffffff00000000ffffffff1617905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b604082901c77ffffffffffffffff0000000000000000ffffffffffffffff16179050608081901b608082901c179050919050565b11156129b8575060021995945050505050565b6129cb6129c4826127ba565b8690613321565b94506129da90506050826138d7565b9050612817565b505050919050565b60606000806129f785612270565b9092509050600019821415612a745760405162461bcd60e51b815260206004820152602260248201527f52656164206f76657272756e20647572696e6720566172496e7420706172736960448201527f6e670000000000000000000000000000000000000000000000000000000000006064820152608401610138565b808410612ac35760405162461bcd60e51b815260206004820152601060248201527f56696e2072656164206f76657272756e000000000000000000000000000000006044820152606401610138565b600080612ad18460016138d7565b905060005b86811015612b5a57612ae888836125cc565b9250600019831415612b3c5760405162461bcd60e51b815260206004820152601760248201527f42616420566172496e7420696e207363726970745369670000000000000000006044820152606401610138565b612b4683836138d7565b915080612b5281613a7b565b915050612ad6565b50612b6587826125cc565b9150600019821415612bb95760405162461bcd60e51b815260206004820152601760248201527f42616420566172496e7420696e207363726970745369670000000000000000006044820152606401610138565b612bc4878284611b81565b979650505050505050565b6020810151600090611c5d565b6000611c5d826020611c4b565b6000806000612bf8858561337f565b905060ff8116612c2a576000858581518110612c1657612c1661399a565b016020015190935060f81c9150612d609050565b83612c368260016139b0565b60ff16612c4391906138d7565b85511015612c5a5760001960009250925050612d60565b60008160ff1660021415612c9f57612c94612c80612c798760016138d7565b8890611c4b565b62ffff0060e882901c1660f89190911c1790565b61ffff169050612d56565b8160ff1660041415612cc957612cbc612241612c798760016138d7565b63ffffffff169050612d56565b8160ff1660081415612d5657612d49612ce6612c798760016138d7565b60c01c64ff000000ff600882811c91821665ff000000ff009390911b92831617601090811b67ffffffffffffffff1666ff00ff00ff00ff9290921667ff00ff00ff00ff009093169290921790911c65ffff0000ffff1617602081811c91901b1790565b67ffffffffffffffff1690505b60ff909116925090505b9250929050565b600080612d738361340b565b60c01c905060006112658264ff000000ff600882811c91821665ff000000ff009390911b92831617601090811b67ffffffffffffffff1666ff00ff00ff00ff9290921667ff00ff00ff00ff009093169290921790911c65ffff0000ffff1617602081811c91901b1790565b60008060008585604051602001612df6929190613bf2565b60408051808303601f190181529181528151602092830120600081815260108b01909352912060010154909150600160801b900463ffffffff1615612fb3576000818152601088016020526040812060018101548154919291612e6d9167ffffffffffffffff90811691600160a01b9004166137ae565b600183015490915067ffffffffffffffff80881691612e9a916801000000000000000090910416836137ae565b67ffffffffffffffff1611158015612ec657508067ffffffffffffffff168667ffffffffffffffff1611155b612f5e5760405162461bcd60e51b815260206004820152604660248201527f4f75747075742076616c7565206973206e6f742077697468696e20746865206160448201527f636365707461626c652072616e6765206f66207468652070656e64696e67207260648201527f6571756573740000000000000000000000000000000000000000000000000000608482015260a401610138565b600191820154600084815260108b016020526040902080546001600160e01b0319168155909201805473ffffffffffffffffffffffffffffffffffffffff19169055935067ffffffffffffffff169150613163565b600081815260118801602052604090206001810154600160801b900463ffffffff166130465760405162461bcd60e51b8152602060048201526024808201527f4f75747075742069732061206e6f6e2d72657175657374656420726564656d7060448201527f74696f6e000000000000000000000000000000000000000000000000000000006064820152608401610138565b6001810154815460009161306f9167ffffffffffffffff91821691600160a01b909104166137ae565b600183015490915067ffffffffffffffff8088169161309c916801000000000000000090910416836137ae565b67ffffffffffffffff16111580156130c857508067ffffffffffffffff168667ffffffffffffffff1611155b6131605760405162461bcd60e51b815260206004820152604860248201527f4f75747075742076616c7565206973206e6f742077697468696e20746865206160448201527f636365707461626c652072616e6765206f66207468652074696d6564206f757460648201527f2072657175657374000000000000000000000000000000000000000000000000608482015260a401610138565b50505b5094509492505050565b6001600160601b031981166000818152601b8401602052604080822060028101805463ffffffff4216600160801b027fffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff9091161774030000000000000000000000000000000000000000179055805491519093927f68cb496f5e64383745876664ef119840f154a729c03ba866b8aecb5c9f53d51691a3505050565b6000806132178360256138d7565b8451101561322c575060001990506000612d60565b60008061323e866126478760246138d7565b9097909650945050505050565b6000611c5a8383613417565b6000611c5a8284613c49565b8151600061327182846138d7565b90508281118015613283575080855110155b6132cf5760405162461bcd60e51b815260206004820152601360248201527f536c696365206f7574206f6620626f756e6473000000000000000000000000006044820152606401610138565b826020860101602085018382015b8083101561218b5782518252602092830192909101906132dd565b60008061330484613445565b9050828114613317576000915050611c5d565b5060019392505050565b600061332d82846138d7565b905082811015611c5d5760405162461bcd60e51b815260206004820152601960248201527f4f766572666c6f7720647572696e67206164646974696f6e2e000000000000006044820152606401610138565b60008282815181106133935761339361399a565b60209101015160f81c60ff14156133ac57506008611c5d565b8282815181106133be576133be61399a565b60209101015160f81c60fe14156133d757506004611c5d565b8282815181106133e9576133e961399a565b60209101015160f81c60fd141561340257506002611c5d565b50600092915050565b6000611c5d8282611c4b565b60008260005281602052602060006040600060025afa50602060006020600060025afa505060005192915050565b6024810151600090611c5d565b80356001600160601b03198116811461346a57600080fd5b919050565b60006060828403121561348157600080fd5b50919050565b60008083601f84011261349957600080fd5b50813567ffffffffffffffff8111156134b157600080fd5b602083019150836020828501011115612d6057600080fd5b803567ffffffffffffffff8116811461346a57600080fd5b60008060008060008060e087890312156134fa57600080fd5b8635955061350a60208801613452565b9450613519886040890161346f565b935060a087013567ffffffffffffffff81111561353557600080fd5b61354189828a01613487565b9094509250613554905060c088016134c9565b90509295509295509295565b600080600080600060e0868803121561357857600080fd5b85359450602086013567ffffffffffffffff8082111561359757600080fd5b908701906080828a0312156135ab57600080fd5b909450604087013590808211156135c157600080fd5b506135ce8882890161346f565b9350506135de876060880161346f565b91506135ec60c08701613452565b90509295509295909350565b6000806000806000806080878903121561361157600080fd5b8635955061362160208801613452565b9450604087013567ffffffffffffffff8082111561363e57600080fd5b818901915089601f83011261365257600080fd5b81358181111561366157600080fd5b8a60208260051b850101111561367657600080fd5b60208301965080955050606089013591508082111561369457600080fd5b506136a189828a01613487565b979a9699509497509295939492505050565b634e487b7160e01b600052602160045260246000fd5b803563ffffffff8116811461346a57600080fd5b6000602082840312156136ef57600080fd5b611c5a826136c9565b60006020828403121561370a57600080fd5b611c5a826134c9565b6001600160c01b031984168152818360088301376000910160080190815292915050565b6001600160601b031984168152818360148301376000910160140190815292915050565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600067ffffffffffffffff808416806137a2576137a261375b565b92169190910492915050565b600067ffffffffffffffff838116908316818110156137cf576137cf613771565b039392505050565b600067ffffffffffffffff8083168185168083038211156137fa576137fa613771565b01949350505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6bffffffffffffffffffffffff198816815260c06020820152600061385560c08301888a613803565b6001600160a01b039690961660408301525067ffffffffffffffff9384166060820152918316608083015290911660a0909101529392505050565b6000808335601e198436030181126138a757600080fd5b83018035915067ffffffffffffffff8211156138c257600080fd5b602001915036819003821315612d6057600080fd5b600082198211156138ea576138ea613771565b500190565b600060a082016bffffffffffffffffffffffff89168352602088818501526001600160a01b038816604085015286606085015260a060808501528185835260c08501905086925060005b868110156139625763ffffffff61394f856136c9565b1682529282019290820190600101613939565b509a9950505050505050505050565b6bffffffffffffffffffffffff1984168152604060208201526000611e1d604083018486613803565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff84168060ff038211156139cd576139cd613771565b019392505050565b600060ff821660ff8416808210156139ef576139ef613771565b90039392505050565b600082821015613a0a57613a0a613771565b500390565b600060208284031215613a2157600080fd5b81356001600160e01b0319811681146116f457600080fd5b60006001600160e01b03198089168352868860048501378683016004810160008152868882375093169390920160048101939093525050600801949350505050565b6000600019821415613a8f57613a8f613771565b5060010190565b600060208284031215613aa857600080fd5b5051919050565b6000816000190483118215151615613ac957613ac9613771565b500290565b600063ffffffff821680613ae457613ae4613771565b6000190192915050565b600082613afd57613afd61375b565b500690565b600181815b80851115613b3d578160001904821115613b2357613b23613771565b80851615613b3057918102915b93841c9390800290613b07565b509250929050565b600082613b5457506001611c5d565b81613b6157506000611c5d565b8160018114613b775760028114613b8157613b9d565b6001915050611c5d565b60ff841115613b9257613b92613771565b50506001821b611c5d565b5060208310610133831016604e8410600b8410161715613bc0575081810a611c5d565b613bca8383613b02565b8060001904821115613bde57613bde613771565b029392505050565b6000611c5a8383613b45565b6bffffffffffffffffffffffff19831681526000825160005b81811015613c285760208186018101516014868401015201613c0b565b81811115613c3a576000601483860101525b50919091016014019392505050565b600082613c5857613c5861375b565b50049056fea264697066735822122030472ea38b6a36d1fdf3ce8e439fbbf133ff9fa0d5273924eb5630a4f6ff974a64736f6c63430008090033",
90
90
  "linkReferences": {},
91
91
  "deployedLinkReferences": {}
92
92
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "_format": "hh-sol-dbg-1",
3
- "buildInfo": "../../../build-info/84acd2201691623304956bd1e3c32f1a.json"
3
+ "buildInfo": "../../../build-info/3453d6d0a875593bd8f0d7f189e987bd.json"
4
4
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "_format": "hh-sol-dbg-1",
3
- "buildInfo": "../../../build-info/84acd2201691623304956bd1e3c32f1a.json"
3
+ "buildInfo": "../../../build-info/3453d6d0a875593bd8f0d7f189e987bd.json"
4
4
  }
@@ -105,8 +105,8 @@
105
105
  "type": "event"
106
106
  }
107
107
  ],
108
- "bytecode": "0x610fc961003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100565760003560e01c80634afbe4c91461005b57806399b0b8471461007d578063c87de7f41461009d578063d079fbb1146100bd575b600080fd5b81801561006757600080fd5b5061007b610076366004610d6d565b6100dd565b005b81801561008957600080fd5b5061007b610098366004610db7565b610303565b8180156100a957600080fd5b5061007b6100b8366004610e08565b61053c565b8180156100c957600080fd5b5061007b6100d8366004610e34565b610662565b60028401546001600160a01b0316331461014e5760405162461bcd60e51b815260206004820152602760248201527f43616c6c6572206973206e6f74207468652045434453412057616c6c657420526044820152666567697374727960c81b60648201526084015b60405180910390fd5b600061016261015d8484610961565b610a0b565b6bffffffffffffffffffffffff198116600090815260198701602052604081209192506002820154600160a01b900460ff1660058111156101a5576101a5610e61565b146102185760405162461bcd60e51b815260206004820152602860248201527f45434453412077616c6c657420686173206265656e20616c726561647920726560448201527f67697374657265640000000000000000000000000000000000000000000000006064820152608401610145565b848155600281018054600160a01b63ffffffff42811668010000000000000000027fffffffffffffffffffffff00ffffffffffffffff00000000ffffffffffffffff909316929092178117909255601788018054606086901c73ffffffffffffffffffffffffffffffffffffffff1990911617808255929092041690601461029f83610e8d565b91906101000a81548163ffffffff021916908363ffffffff16021790555050816bffffffffffffffffffffffff1916857f2dbb47dce81d6b11cca1f1e3b10143d6f7e1e7e92d2dd9aacbb1f875379d308e60405160405180910390a3505050505050565b601783015460601b6bffffffffffffffffffffffff1990811690831614156103935760405162461bcd60e51b815260206004820152602c60248201527f4163746976652077616c6c65742063616e6e6f7420626520636f6e736964657260448201527f656420636c6f736561626c6500000000000000000000000000000000000000006064820152608401610145565b6bffffffffffffffffffffffff1982166000908152601984016020526040902060016002820154600160a01b900460ff1660058111156103d5576103d5610e61565b1461042d5760405162461bcd60e51b815260206004820152602260248201527f45434453412077616c6c6574206d75737420626520696e204c69766520737461604482015261746560f01b6064820152608401610145565b6016840154600282015460009161047a9163ffffffff7c01000000000000000000000000000000000000000000000000000000009092048216916801000000000000000090910416610eb1565b63ffffffff16421015905080806104b957506016850154600160a01b900467ffffffffffffffff166104ad868686610a32565b67ffffffffffffffff16105b61052b5760405162461bcd60e51b815260206004820152603660248201527f57616c6c6574206e6565647320746f206265206f6c6420656e6f756768206f7260448201527f206861766520746f6f20666577207361746f73686973000000000000000000006064820152608401610145565b6105358585610b6a565b5050505050565b60028301546001600160a01b031633146105a85760405162461bcd60e51b815260206004820152602760248201527f43616c6c6572206973206e6f74207468652045434453412057616c6c657420526044820152666567697374727960c81b6064820152608401610145565b60006105b761015d8484610961565b905060016bffffffffffffffffffffffff1982166000908152601986016020526040902060020154600160a01b900460ff1660058111156105fa576105fa610e61565b146106525760405162461bcd60e51b815260206004820152602260248201527f45434453412077616c6c6574206d75737420626520696e204c69766520737461604482015261746560f01b6064820152608401610145565b61065c8482610b6a565b50505050565b6002820154604080517fcc56238800000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163cc562388916004808301926020929190829003018186803b1580156106c257600080fd5b505afa1580156106d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106fa9190610ed9565b600381111561070b5761070b610e61565b1461077e5760405162461bcd60e51b815260206004820152602360248201527f57616c6c6574206372656174696f6e20616c726561647920696e2070726f677260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610145565b601782015460601b6bffffffffffffffffffffffff198116156108c95760006107a8848385610a32565b6bffffffffffffffffffffffff1983166000908152601986016020526040812060020154601687015492935063ffffffff680100000000000000009091048116926107f4911683610eb1565b63ffffffff1642101590508080156108265750601686015467ffffffffffffffff640100000000909104811690841610155b806108535750601686015467ffffffffffffffff6c01000000000000000000000000909104811690841610155b6108c55760405162461bcd60e51b815260206004820152602660248201527f57616c6c6574206372656174696f6e20636f6e646974696f6e7320617265206e60448201527f6f74206d657400000000000000000000000000000000000000000000000000006064820152608401610145565b5050505b6040517f31fecb80caf1e1128496dd5a6f1083ba29fd5fe64c3fe04e2d1b6f9cfc27d5a390600090a18260020160009054906101000a90046001600160a01b03166001600160a01b03166372cc8c6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561094457600080fd5b505af1158015610958573d6000803e3d6000fd5b50505050505050565b60606000610970600284610f01565b61099b57507f02000000000000000000000000000000000000000000000000000000000000006109be565b507f03000000000000000000000000000000000000000000000000000000000000005b6040517fff00000000000000000000000000000000000000000000000000000000000000821660208201526021810185905260410160405160208183030381529060405291505092915050565b60006020600083516020850160025afa50602060006020600060035afa5050600c51919050565b6bffffffffffffffffffffffff19821660009081526019840160205260408120600101548015610b6257808335610a6f6040860160208701610f23565b610a7f6060870160408801610f49565b604051602001610aec9392919092835260e09190911b7fffffffff0000000000000000000000000000000000000000000000000000000016602083015260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166024820152602c0190565b6040516020818303038152906040528051906020012014610b4f5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c69642077616c6c6574206d61696e205554584f20646174610000006044820152606401610145565b610b5f6060840160408501610f49565b91505b509392505050565b6bffffffffffffffffffffffff198116600090815260198301602052604090206001810154610ba257610b9d8383610cbf565b610c3a565b60028101805463ffffffff42166c01000000000000000000000000027fffffffffffffffffffffff00ffffffff00000000ffffffffffffffffffffffff909116177402000000000000000000000000000000000000000017905580546040516bffffffffffffffffffffffff19841691907fbdc9ce990a067e5fd3a5d8dfc68e27e9f221aaa3fe55265e0b7e93c460b3efe290600090a35b601783015460601b6bffffffffffffffffffffffff199081169083161415610c7c5760178301805473ffffffffffffffffffffffffffffffffffffffff191690555b601783018054600160a01b900463ffffffff16906014610c9b83610f73565b91906101000a81548163ffffffff021916908363ffffffff16021790555050505050565b6bffffffffffffffffffffffff198116600081815260198401602052604080822060028101805463ffffffff4216700100000000000000000000000000000000027fffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff9091161774030000000000000000000000000000000000000000179055805491519093927f68cb496f5e64383745876664ef119840f154a729c03ba866b8aecb5c9f53d51691a3505050565b60008060008060808587031215610d8357600080fd5b5050823594602084013594506040840135936060013592509050565b600060608284031215610db157600080fd5b50919050565b600080600060a08486031215610dcc57600080fd5b8335925060208401356bffffffffffffffffffffffff1981168114610df057600080fd5b9150610dff8560408601610d9f565b90509250925092565b600080600060608486031215610e1d57600080fd5b505081359360208301359350604090920135919050565b60008060808385031215610e4757600080fd5b82359150610e588460208501610d9f565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600063ffffffff80831681811415610ea757610ea7610e77565b6001019392505050565b600063ffffffff808316818516808303821115610ed057610ed0610e77565b01949350505050565b600060208284031215610eeb57600080fd5b815160048110610efa57600080fd5b9392505050565b600082610f1e57634e487b7160e01b600052601260045260246000fd5b500690565b600060208284031215610f3557600080fd5b813563ffffffff81168114610efa57600080fd5b600060208284031215610f5b57600080fd5b813567ffffffffffffffff81168114610efa57600080fd5b600063ffffffff821680610f8957610f89610e77565b600019019291505056fea2646970667358221220c680eb195bda3c9271a0375e223a5e104decf9a7ae72c554010aeb05965d708c64736f6c63430008090033",
109
- "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100565760003560e01c80634afbe4c91461005b57806399b0b8471461007d578063c87de7f41461009d578063d079fbb1146100bd575b600080fd5b81801561006757600080fd5b5061007b610076366004610d6d565b6100dd565b005b81801561008957600080fd5b5061007b610098366004610db7565b610303565b8180156100a957600080fd5b5061007b6100b8366004610e08565b61053c565b8180156100c957600080fd5b5061007b6100d8366004610e34565b610662565b60028401546001600160a01b0316331461014e5760405162461bcd60e51b815260206004820152602760248201527f43616c6c6572206973206e6f74207468652045434453412057616c6c657420526044820152666567697374727960c81b60648201526084015b60405180910390fd5b600061016261015d8484610961565b610a0b565b6bffffffffffffffffffffffff198116600090815260198701602052604081209192506002820154600160a01b900460ff1660058111156101a5576101a5610e61565b146102185760405162461bcd60e51b815260206004820152602860248201527f45434453412077616c6c657420686173206265656e20616c726561647920726560448201527f67697374657265640000000000000000000000000000000000000000000000006064820152608401610145565b848155600281018054600160a01b63ffffffff42811668010000000000000000027fffffffffffffffffffffff00ffffffffffffffff00000000ffffffffffffffff909316929092178117909255601788018054606086901c73ffffffffffffffffffffffffffffffffffffffff1990911617808255929092041690601461029f83610e8d565b91906101000a81548163ffffffff021916908363ffffffff16021790555050816bffffffffffffffffffffffff1916857f2dbb47dce81d6b11cca1f1e3b10143d6f7e1e7e92d2dd9aacbb1f875379d308e60405160405180910390a3505050505050565b601783015460601b6bffffffffffffffffffffffff1990811690831614156103935760405162461bcd60e51b815260206004820152602c60248201527f4163746976652077616c6c65742063616e6e6f7420626520636f6e736964657260448201527f656420636c6f736561626c6500000000000000000000000000000000000000006064820152608401610145565b6bffffffffffffffffffffffff1982166000908152601984016020526040902060016002820154600160a01b900460ff1660058111156103d5576103d5610e61565b1461042d5760405162461bcd60e51b815260206004820152602260248201527f45434453412077616c6c6574206d75737420626520696e204c69766520737461604482015261746560f01b6064820152608401610145565b6016840154600282015460009161047a9163ffffffff7c01000000000000000000000000000000000000000000000000000000009092048216916801000000000000000090910416610eb1565b63ffffffff16421015905080806104b957506016850154600160a01b900467ffffffffffffffff166104ad868686610a32565b67ffffffffffffffff16105b61052b5760405162461bcd60e51b815260206004820152603660248201527f57616c6c6574206e6565647320746f206265206f6c6420656e6f756768206f7260448201527f206861766520746f6f20666577207361746f73686973000000000000000000006064820152608401610145565b6105358585610b6a565b5050505050565b60028301546001600160a01b031633146105a85760405162461bcd60e51b815260206004820152602760248201527f43616c6c6572206973206e6f74207468652045434453412057616c6c657420526044820152666567697374727960c81b6064820152608401610145565b60006105b761015d8484610961565b905060016bffffffffffffffffffffffff1982166000908152601986016020526040902060020154600160a01b900460ff1660058111156105fa576105fa610e61565b146106525760405162461bcd60e51b815260206004820152602260248201527f45434453412077616c6c6574206d75737420626520696e204c69766520737461604482015261746560f01b6064820152608401610145565b61065c8482610b6a565b50505050565b6002820154604080517fcc56238800000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163cc562388916004808301926020929190829003018186803b1580156106c257600080fd5b505afa1580156106d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106fa9190610ed9565b600381111561070b5761070b610e61565b1461077e5760405162461bcd60e51b815260206004820152602360248201527f57616c6c6574206372656174696f6e20616c726561647920696e2070726f677260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610145565b601782015460601b6bffffffffffffffffffffffff198116156108c95760006107a8848385610a32565b6bffffffffffffffffffffffff1983166000908152601986016020526040812060020154601687015492935063ffffffff680100000000000000009091048116926107f4911683610eb1565b63ffffffff1642101590508080156108265750601686015467ffffffffffffffff640100000000909104811690841610155b806108535750601686015467ffffffffffffffff6c01000000000000000000000000909104811690841610155b6108c55760405162461bcd60e51b815260206004820152602660248201527f57616c6c6574206372656174696f6e20636f6e646974696f6e7320617265206e60448201527f6f74206d657400000000000000000000000000000000000000000000000000006064820152608401610145565b5050505b6040517f31fecb80caf1e1128496dd5a6f1083ba29fd5fe64c3fe04e2d1b6f9cfc27d5a390600090a18260020160009054906101000a90046001600160a01b03166001600160a01b03166372cc8c6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561094457600080fd5b505af1158015610958573d6000803e3d6000fd5b50505050505050565b60606000610970600284610f01565b61099b57507f02000000000000000000000000000000000000000000000000000000000000006109be565b507f03000000000000000000000000000000000000000000000000000000000000005b6040517fff00000000000000000000000000000000000000000000000000000000000000821660208201526021810185905260410160405160208183030381529060405291505092915050565b60006020600083516020850160025afa50602060006020600060035afa5050600c51919050565b6bffffffffffffffffffffffff19821660009081526019840160205260408120600101548015610b6257808335610a6f6040860160208701610f23565b610a7f6060870160408801610f49565b604051602001610aec9392919092835260e09190911b7fffffffff0000000000000000000000000000000000000000000000000000000016602083015260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166024820152602c0190565b6040516020818303038152906040528051906020012014610b4f5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c69642077616c6c6574206d61696e205554584f20646174610000006044820152606401610145565b610b5f6060840160408501610f49565b91505b509392505050565b6bffffffffffffffffffffffff198116600090815260198301602052604090206001810154610ba257610b9d8383610cbf565b610c3a565b60028101805463ffffffff42166c01000000000000000000000000027fffffffffffffffffffffff00ffffffff00000000ffffffffffffffffffffffff909116177402000000000000000000000000000000000000000017905580546040516bffffffffffffffffffffffff19841691907fbdc9ce990a067e5fd3a5d8dfc68e27e9f221aaa3fe55265e0b7e93c460b3efe290600090a35b601783015460601b6bffffffffffffffffffffffff199081169083161415610c7c5760178301805473ffffffffffffffffffffffffffffffffffffffff191690555b601783018054600160a01b900463ffffffff16906014610c9b83610f73565b91906101000a81548163ffffffff021916908363ffffffff16021790555050505050565b6bffffffffffffffffffffffff198116600081815260198401602052604080822060028101805463ffffffff4216700100000000000000000000000000000000027fffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff9091161774030000000000000000000000000000000000000000179055805491519093927f68cb496f5e64383745876664ef119840f154a729c03ba866b8aecb5c9f53d51691a3505050565b60008060008060808587031215610d8357600080fd5b5050823594602084013594506040840135936060013592509050565b600060608284031215610db157600080fd5b50919050565b600080600060a08486031215610dcc57600080fd5b8335925060208401356bffffffffffffffffffffffff1981168114610df057600080fd5b9150610dff8560408601610d9f565b90509250925092565b600080600060608486031215610e1d57600080fd5b505081359360208301359350604090920135919050565b60008060808385031215610e4757600080fd5b82359150610e588460208501610d9f565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600063ffffffff80831681811415610ea757610ea7610e77565b6001019392505050565b600063ffffffff808316818516808303821115610ed057610ed0610e77565b01949350505050565b600060208284031215610eeb57600080fd5b815160048110610efa57600080fd5b9392505050565b600082610f1e57634e487b7160e01b600052601260045260246000fd5b500690565b600060208284031215610f3557600080fd5b813563ffffffff81168114610efa57600080fd5b600060208284031215610f5b57600080fd5b813567ffffffffffffffff81168114610efa57600080fd5b600063ffffffff821680610f8957610f89610e77565b600019019291505056fea2646970667358221220c680eb195bda3c9271a0375e223a5e104decf9a7ae72c554010aeb05965d708c64736f6c63430008090033",
108
+ "bytecode": "0x610fc961003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100565760003560e01c80634afbe4c91461005b57806399b0b8471461007d578063c87de7f41461009d578063d079fbb1146100bd575b600080fd5b81801561006757600080fd5b5061007b610076366004610d6d565b6100dd565b005b81801561008957600080fd5b5061007b610098366004610db7565b610303565b8180156100a957600080fd5b5061007b6100b8366004610e08565b61053c565b8180156100c957600080fd5b5061007b6100d8366004610e34565b610662565b60028401546001600160a01b0316331461014e5760405162461bcd60e51b815260206004820152602760248201527f43616c6c6572206973206e6f74207468652045434453412057616c6c657420526044820152666567697374727960c81b60648201526084015b60405180910390fd5b600061016261015d8484610961565b610a0b565b6bffffffffffffffffffffffff1981166000908152601b8701602052604081209192506002820154600160a01b900460ff1660058111156101a5576101a5610e61565b146102185760405162461bcd60e51b815260206004820152602860248201527f45434453412077616c6c657420686173206265656e20616c726561647920726560448201527f67697374657265640000000000000000000000000000000000000000000000006064820152608401610145565b848155600281018054600160a01b63ffffffff42811668010000000000000000027fffffffffffffffffffffff00ffffffffffffffff00000000ffffffffffffffff909316929092178117909255601988018054606086901c73ffffffffffffffffffffffffffffffffffffffff1990911617808255929092041690601461029f83610e8d565b91906101000a81548163ffffffff021916908363ffffffff16021790555050816bffffffffffffffffffffffff1916857f2dbb47dce81d6b11cca1f1e3b10143d6f7e1e7e92d2dd9aacbb1f875379d308e60405160405180910390a3505050505050565b601983015460601b6bffffffffffffffffffffffff1990811690831614156103935760405162461bcd60e51b815260206004820152602c60248201527f4163746976652077616c6c65742063616e6e6f7420626520636f6e736964657260448201527f656420636c6f736561626c6500000000000000000000000000000000000000006064820152608401610145565b6bffffffffffffffffffffffff1982166000908152601b84016020526040902060016002820154600160a01b900460ff1660058111156103d5576103d5610e61565b1461042d5760405162461bcd60e51b815260206004820152602260248201527f45434453412077616c6c6574206d75737420626520696e204c69766520737461604482015261746560f01b6064820152608401610145565b6018840154600282015460009161047a9163ffffffff7c01000000000000000000000000000000000000000000000000000000009092048216916801000000000000000090910416610eb1565b63ffffffff16421015905080806104b957506018850154600160a01b900467ffffffffffffffff166104ad868686610a32565b67ffffffffffffffff16105b61052b5760405162461bcd60e51b815260206004820152603660248201527f57616c6c6574206e6565647320746f206265206f6c6420656e6f756768206f7260448201527f206861766520746f6f20666577207361746f73686973000000000000000000006064820152608401610145565b6105358585610b6a565b5050505050565b60028301546001600160a01b031633146105a85760405162461bcd60e51b815260206004820152602760248201527f43616c6c6572206973206e6f74207468652045434453412057616c6c657420526044820152666567697374727960c81b6064820152608401610145565b60006105b761015d8484610961565b905060016bffffffffffffffffffffffff1982166000908152601b86016020526040902060020154600160a01b900460ff1660058111156105fa576105fa610e61565b146106525760405162461bcd60e51b815260206004820152602260248201527f45434453412077616c6c6574206d75737420626520696e204c69766520737461604482015261746560f01b6064820152608401610145565b61065c8482610b6a565b50505050565b6002820154604080517fcc56238800000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163cc562388916004808301926020929190829003018186803b1580156106c257600080fd5b505afa1580156106d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106fa9190610ed9565b600381111561070b5761070b610e61565b1461077e5760405162461bcd60e51b815260206004820152602360248201527f57616c6c6574206372656174696f6e20616c726561647920696e2070726f677260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610145565b601982015460601b6bffffffffffffffffffffffff198116156108c95760006107a8848385610a32565b6bffffffffffffffffffffffff1983166000908152601b86016020526040812060020154601887015492935063ffffffff680100000000000000009091048116926107f4911683610eb1565b63ffffffff1642101590508080156108265750601886015467ffffffffffffffff640100000000909104811690841610155b806108535750601886015467ffffffffffffffff6c01000000000000000000000000909104811690841610155b6108c55760405162461bcd60e51b815260206004820152602660248201527f57616c6c6574206372656174696f6e20636f6e646974696f6e7320617265206e60448201527f6f74206d657400000000000000000000000000000000000000000000000000006064820152608401610145565b5050505b6040517f31fecb80caf1e1128496dd5a6f1083ba29fd5fe64c3fe04e2d1b6f9cfc27d5a390600090a18260020160009054906101000a90046001600160a01b03166001600160a01b03166372cc8c6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561094457600080fd5b505af1158015610958573d6000803e3d6000fd5b50505050505050565b60606000610970600284610f01565b61099b57507f02000000000000000000000000000000000000000000000000000000000000006109be565b507f03000000000000000000000000000000000000000000000000000000000000005b6040517fff00000000000000000000000000000000000000000000000000000000000000821660208201526021810185905260410160405160208183030381529060405291505092915050565b60006020600083516020850160025afa50602060006020600060035afa5050600c51919050565b6bffffffffffffffffffffffff1982166000908152601b840160205260408120600101548015610b6257808335610a6f6040860160208701610f23565b610a7f6060870160408801610f49565b604051602001610aec9392919092835260e09190911b7fffffffff0000000000000000000000000000000000000000000000000000000016602083015260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166024820152602c0190565b6040516020818303038152906040528051906020012014610b4f5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c69642077616c6c6574206d61696e205554584f20646174610000006044820152606401610145565b610b5f6060840160408501610f49565b91505b509392505050565b6bffffffffffffffffffffffff1981166000908152601b8301602052604090206001810154610ba257610b9d8383610cbf565b610c3a565b60028101805463ffffffff42166c01000000000000000000000000027fffffffffffffffffffffff00ffffffff00000000ffffffffffffffffffffffff909116177402000000000000000000000000000000000000000017905580546040516bffffffffffffffffffffffff19841691907fbdc9ce990a067e5fd3a5d8dfc68e27e9f221aaa3fe55265e0b7e93c460b3efe290600090a35b601983015460601b6bffffffffffffffffffffffff199081169083161415610c7c5760198301805473ffffffffffffffffffffffffffffffffffffffff191690555b601983018054600160a01b900463ffffffff16906014610c9b83610f73565b91906101000a81548163ffffffff021916908363ffffffff16021790555050505050565b6bffffffffffffffffffffffff1981166000818152601b8401602052604080822060028101805463ffffffff4216700100000000000000000000000000000000027fffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff9091161774030000000000000000000000000000000000000000179055805491519093927f68cb496f5e64383745876664ef119840f154a729c03ba866b8aecb5c9f53d51691a3505050565b60008060008060808587031215610d8357600080fd5b5050823594602084013594506040840135936060013592509050565b600060608284031215610db157600080fd5b50919050565b600080600060a08486031215610dcc57600080fd5b8335925060208401356bffffffffffffffffffffffff1981168114610df057600080fd5b9150610dff8560408601610d9f565b90509250925092565b600080600060608486031215610e1d57600080fd5b505081359360208301359350604090920135919050565b60008060808385031215610e4757600080fd5b82359150610e588460208501610d9f565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600063ffffffff80831681811415610ea757610ea7610e77565b6001019392505050565b600063ffffffff808316818516808303821115610ed057610ed0610e77565b01949350505050565b600060208284031215610eeb57600080fd5b815160048110610efa57600080fd5b9392505050565b600082610f1e57634e487b7160e01b600052601260045260246000fd5b500690565b600060208284031215610f3557600080fd5b813563ffffffff81168114610efa57600080fd5b600060208284031215610f5b57600080fd5b813567ffffffffffffffff81168114610efa57600080fd5b600063ffffffff821680610f8957610f89610e77565b600019019291505056fea2646970667358221220834110b61115640a23fcb60d39c4818c20ac33fcd70d1c4a72007b160b1b82d464736f6c63430008090033",
109
+ "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100565760003560e01c80634afbe4c91461005b57806399b0b8471461007d578063c87de7f41461009d578063d079fbb1146100bd575b600080fd5b81801561006757600080fd5b5061007b610076366004610d6d565b6100dd565b005b81801561008957600080fd5b5061007b610098366004610db7565b610303565b8180156100a957600080fd5b5061007b6100b8366004610e08565b61053c565b8180156100c957600080fd5b5061007b6100d8366004610e34565b610662565b60028401546001600160a01b0316331461014e5760405162461bcd60e51b815260206004820152602760248201527f43616c6c6572206973206e6f74207468652045434453412057616c6c657420526044820152666567697374727960c81b60648201526084015b60405180910390fd5b600061016261015d8484610961565b610a0b565b6bffffffffffffffffffffffff1981166000908152601b8701602052604081209192506002820154600160a01b900460ff1660058111156101a5576101a5610e61565b146102185760405162461bcd60e51b815260206004820152602860248201527f45434453412077616c6c657420686173206265656e20616c726561647920726560448201527f67697374657265640000000000000000000000000000000000000000000000006064820152608401610145565b848155600281018054600160a01b63ffffffff42811668010000000000000000027fffffffffffffffffffffff00ffffffffffffffff00000000ffffffffffffffff909316929092178117909255601988018054606086901c73ffffffffffffffffffffffffffffffffffffffff1990911617808255929092041690601461029f83610e8d565b91906101000a81548163ffffffff021916908363ffffffff16021790555050816bffffffffffffffffffffffff1916857f2dbb47dce81d6b11cca1f1e3b10143d6f7e1e7e92d2dd9aacbb1f875379d308e60405160405180910390a3505050505050565b601983015460601b6bffffffffffffffffffffffff1990811690831614156103935760405162461bcd60e51b815260206004820152602c60248201527f4163746976652077616c6c65742063616e6e6f7420626520636f6e736964657260448201527f656420636c6f736561626c6500000000000000000000000000000000000000006064820152608401610145565b6bffffffffffffffffffffffff1982166000908152601b84016020526040902060016002820154600160a01b900460ff1660058111156103d5576103d5610e61565b1461042d5760405162461bcd60e51b815260206004820152602260248201527f45434453412077616c6c6574206d75737420626520696e204c69766520737461604482015261746560f01b6064820152608401610145565b6018840154600282015460009161047a9163ffffffff7c01000000000000000000000000000000000000000000000000000000009092048216916801000000000000000090910416610eb1565b63ffffffff16421015905080806104b957506018850154600160a01b900467ffffffffffffffff166104ad868686610a32565b67ffffffffffffffff16105b61052b5760405162461bcd60e51b815260206004820152603660248201527f57616c6c6574206e6565647320746f206265206f6c6420656e6f756768206f7260448201527f206861766520746f6f20666577207361746f73686973000000000000000000006064820152608401610145565b6105358585610b6a565b5050505050565b60028301546001600160a01b031633146105a85760405162461bcd60e51b815260206004820152602760248201527f43616c6c6572206973206e6f74207468652045434453412057616c6c657420526044820152666567697374727960c81b6064820152608401610145565b60006105b761015d8484610961565b905060016bffffffffffffffffffffffff1982166000908152601b86016020526040902060020154600160a01b900460ff1660058111156105fa576105fa610e61565b146106525760405162461bcd60e51b815260206004820152602260248201527f45434453412077616c6c6574206d75737420626520696e204c69766520737461604482015261746560f01b6064820152608401610145565b61065c8482610b6a565b50505050565b6002820154604080517fcc56238800000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163cc562388916004808301926020929190829003018186803b1580156106c257600080fd5b505afa1580156106d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106fa9190610ed9565b600381111561070b5761070b610e61565b1461077e5760405162461bcd60e51b815260206004820152602360248201527f57616c6c6574206372656174696f6e20616c726561647920696e2070726f677260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610145565b601982015460601b6bffffffffffffffffffffffff198116156108c95760006107a8848385610a32565b6bffffffffffffffffffffffff1983166000908152601b86016020526040812060020154601887015492935063ffffffff680100000000000000009091048116926107f4911683610eb1565b63ffffffff1642101590508080156108265750601886015467ffffffffffffffff640100000000909104811690841610155b806108535750601886015467ffffffffffffffff6c01000000000000000000000000909104811690841610155b6108c55760405162461bcd60e51b815260206004820152602660248201527f57616c6c6574206372656174696f6e20636f6e646974696f6e7320617265206e60448201527f6f74206d657400000000000000000000000000000000000000000000000000006064820152608401610145565b5050505b6040517f31fecb80caf1e1128496dd5a6f1083ba29fd5fe64c3fe04e2d1b6f9cfc27d5a390600090a18260020160009054906101000a90046001600160a01b03166001600160a01b03166372cc8c6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561094457600080fd5b505af1158015610958573d6000803e3d6000fd5b50505050505050565b60606000610970600284610f01565b61099b57507f02000000000000000000000000000000000000000000000000000000000000006109be565b507f03000000000000000000000000000000000000000000000000000000000000005b6040517fff00000000000000000000000000000000000000000000000000000000000000821660208201526021810185905260410160405160208183030381529060405291505092915050565b60006020600083516020850160025afa50602060006020600060035afa5050600c51919050565b6bffffffffffffffffffffffff1982166000908152601b840160205260408120600101548015610b6257808335610a6f6040860160208701610f23565b610a7f6060870160408801610f49565b604051602001610aec9392919092835260e09190911b7fffffffff0000000000000000000000000000000000000000000000000000000016602083015260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166024820152602c0190565b6040516020818303038152906040528051906020012014610b4f5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c69642077616c6c6574206d61696e205554584f20646174610000006044820152606401610145565b610b5f6060840160408501610f49565b91505b509392505050565b6bffffffffffffffffffffffff1981166000908152601b8301602052604090206001810154610ba257610b9d8383610cbf565b610c3a565b60028101805463ffffffff42166c01000000000000000000000000027fffffffffffffffffffffff00ffffffff00000000ffffffffffffffffffffffff909116177402000000000000000000000000000000000000000017905580546040516bffffffffffffffffffffffff19841691907fbdc9ce990a067e5fd3a5d8dfc68e27e9f221aaa3fe55265e0b7e93c460b3efe290600090a35b601983015460601b6bffffffffffffffffffffffff199081169083161415610c7c5760198301805473ffffffffffffffffffffffffffffffffffffffff191690555b601983018054600160a01b900463ffffffff16906014610c9b83610f73565b91906101000a81548163ffffffff021916908363ffffffff16021790555050505050565b6bffffffffffffffffffffffff1981166000818152601b8401602052604080822060028101805463ffffffff4216700100000000000000000000000000000000027fffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff9091161774030000000000000000000000000000000000000000179055805491519093927f68cb496f5e64383745876664ef119840f154a729c03ba866b8aecb5c9f53d51691a3505050565b60008060008060808587031215610d8357600080fd5b5050823594602084013594506040840135936060013592509050565b600060608284031215610db157600080fd5b50919050565b600080600060a08486031215610dcc57600080fd5b8335925060208401356bffffffffffffffffffffffff1981168114610df057600080fd5b9150610dff8560408601610d9f565b90509250925092565b600080600060608486031215610e1d57600080fd5b505081359360208301359350604090920135919050565b60008060808385031215610e4757600080fd5b82359150610e588460208501610d9f565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600063ffffffff80831681811415610ea757610ea7610e77565b6001019392505050565b600063ffffffff808316818516808303821115610ed057610ed0610e77565b01949350505050565b600060208284031215610eeb57600080fd5b815160048110610efa57600080fd5b9392505050565b600082610f1e57634e487b7160e01b600052601260045260246000fd5b500690565b600060208284031215610f3557600080fd5b813563ffffffff81168114610efa57600080fd5b600060208284031215610f5b57600080fd5b813567ffffffffffffffff81168114610efa57600080fd5b600063ffffffff821680610f8957610f89610e77565b600019019291505056fea2646970667358221220834110b61115640a23fcb60d39c4818c20ac33fcd70d1c4a72007b160b1b82d464736f6c63430008090033",
110
110
  "linkReferences": {},
111
111
  "deployedLinkReferences": {}
112
112
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "_format": "hh-sol-dbg-1",
3
- "buildInfo": "../../../build-info/84acd2201691623304956bd1e3c32f1a.json"
3
+ "buildInfo": "../../../build-info/3453d6d0a875593bd8f0d7f189e987bd.json"
4
4
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "_format": "hh-sol-dbg-1",
3
- "buildInfo": "../../../build-info/84acd2201691623304956bd1e3c32f1a.json"
3
+ "buildInfo": "../../../build-info/3453d6d0a875593bd8f0d7f189e987bd.json"
4
4
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "_format": "hh-sol-dbg-1",
3
- "buildInfo": "../../../build-info/84acd2201691623304956bd1e3c32f1a.json"
3
+ "buildInfo": "../../../build-info/3453d6d0a875593bd8f0d7f189e987bd.json"
4
4
  }
@@ -16,6 +16,7 @@
16
16
  pragma solidity ^0.8.9;
17
17
 
18
18
  import {BTCUtils} from "@keep-network/bitcoin-spv-sol/contracts/BTCUtils.sol";
19
+ import {BytesLib} from "@keep-network/bitcoin-spv-sol/contracts/BytesLib.sol";
19
20
  import {ValidateSPV} from "@keep-network/bitcoin-spv-sol/contracts/ValidateSPV.sol";
20
21
 
21
22
  import "./BridgeState.sol";
@@ -76,6 +77,7 @@ import "./BridgeState.sol";
76
77
  library BitcoinTx {
77
78
  using BTCUtils for bytes;
78
79
  using BTCUtils for uint256;
80
+ using BytesLib for bytes;
79
81
  using ValidateSPV for bytes;
80
82
  using ValidateSPV for bytes32;
81
83
 
@@ -231,4 +233,71 @@ library BitcoinTx {
231
233
  "Insufficient accumulated difficulty in header chain"
232
234
  );
233
235
  }
236
+
237
+ /// @notice Extracts public key hash from the provided P2PKH or P2WPKH output.
238
+ /// Reverts if the validation fails.
239
+ /// @param output The transaction output
240
+ /// @return pubKeyHash 20-byte public key hash the output locks funds on
241
+ /// @dev Requirements:
242
+ /// - The output must be of P2PKH or P2WPKH type and lock the funds
243
+ /// on a 20-byte public key hash
244
+ function extractPubKeyHash(BridgeState.Storage storage, bytes memory output)
245
+ internal
246
+ view
247
+ returns (bytes20 pubKeyHash)
248
+ {
249
+ bytes memory pubKeyHashBytes = output.extractHash();
250
+
251
+ require(
252
+ pubKeyHashBytes.length == 20,
253
+ "Output's public key hash must have 20 bytes"
254
+ );
255
+
256
+ pubKeyHash = pubKeyHashBytes.slice20(0);
257
+
258
+ // We need to make sure that the 20-byte public key hash
259
+ // is actually used in the right context of a P2PKH or P2WPKH
260
+ // output. To do so, we must extract the full script from the output
261
+ // and compare with the expected P2PKH and P2WPKH scripts
262
+ // referring to that 20-byte public key hash. The output consists
263
+ // of an 8-byte value and a variable length script. To extract the
264
+ // script we slice the output starting from 9th byte until the end.
265
+ bytes32 outputScriptKeccak = keccak256(
266
+ output.slice(8, output.length - 8)
267
+ );
268
+ // Build the expected P2PKH script which has the following byte
269
+ // format: <0x1976a914> <20-byte PKH> <0x88ac>. According to
270
+ // https://en.bitcoin.it/wiki/Script#Opcodes this translates to:
271
+ // - 0x19: Byte length of the entire script
272
+ // - 0x76: OP_DUP
273
+ // - 0xa9: OP_HASH160
274
+ // - 0x14: Byte length of the public key hash
275
+ // - 0x88: OP_EQUALVERIFY
276
+ // - 0xac: OP_CHECKSIG
277
+ // which matches the P2PKH structure as per:
278
+ // https://en.bitcoin.it/wiki/Transaction#Pay-to-PubkeyHash
279
+ bytes32 P2PKHScriptKeccak = keccak256(
280
+ abi.encodePacked(hex"1976a914", pubKeyHash, hex"88ac")
281
+ );
282
+ // Build the expected P2WPKH script which has the following format:
283
+ // <0x160014> <20-byte PKH>. According to
284
+ // https://en.bitcoin.it/wiki/Script#Opcodes this translates to:
285
+ // - 0x16: Byte length of the entire script
286
+ // - 0x00: OP_0
287
+ // - 0x14: Byte length of the public key hash
288
+ // which matches the P2WPKH structure as per:
289
+ // https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki#P2WPKH
290
+ bytes32 P2WPKHScriptKeccak = keccak256(
291
+ abi.encodePacked(hex"160014", pubKeyHash)
292
+ );
293
+ // Make sure the actual output script matches either the P2PKH
294
+ // or P2WPKH format.
295
+ require(
296
+ outputScriptKeccak == P2PKHScriptKeccak ||
297
+ outputScriptKeccak == P2WPKHScriptKeccak,
298
+ "Output must be P2PKH or P2WPKH"
299
+ );
300
+
301
+ return pubKeyHash;
302
+ }
234
303
  }