UNPKG

@settlemint/solidity-diamond-bond

Version:

Smart contract set to build an enterprise bond usecase in SettleMint

1,391 lines 100 kB
{ "_format": "hh-sol-artifact-1", "contractName": "BondFacet", "sourceName": "contracts/facets/BondFacet.sol", "abi": [ { "inputs": [], "name": "BondAlreadyInitialized", "type": "error" }, { "inputs": [], "name": "BondAlreadyIssued", "type": "error" }, { "inputs": [], "name": "BondHasNotBeenIssued", "type": "error" }, { "inputs": [], "name": "CampaignAlreadyPaused", "type": "error" }, { "inputs": [], "name": "CampaignIsClosed", "type": "error" }, { "inputs": [], "name": "CampaignIsPaused", "type": "error" }, { "inputs": [], "name": "CampaignNotPaused", "type": "error" }, { "inputs": [], "name": "CannotReserveAfterCampaignEnd", "type": "error" }, { "inputs": [], "name": "CannotReserveBeforeSignupDate", "type": "error" }, { "inputs": [], "name": "CapitalAmortizationFreePeriodDurationIsNotAMultpleOfThree", "type": "error" }, { "inputs": [], "name": "CapitalAmortizationFreePeriodDurationIsNotAMultpleOfTwelve", "type": "error" }, { "inputs": [], "name": "DivideByZero", "type": "error" }, { "inputs": [], "name": "DurationIsNotAMultpleOfThree", "type": "error" }, { "inputs": [], "name": "DurationIsNotAMultpleOfTwelve", "type": "error" }, { "inputs": [], "name": "ExceedingMaxAmountPerInvestor", "type": "error" }, { "inputs": [], "name": "GracePeriodDurationIsNotAMultpleOfThree", "type": "error" }, { "inputs": [], "name": "GracePeriodDurationIsNotAMultpleOfTwelve", "type": "error" }, { "inputs": [], "name": "NoMoreBondsToBuy", "type": "error" }, { "inputs": [], "name": "OldAccountDoesNotHaveEnoughBonds", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "x", "type": "uint256" }, { "internalType": "uint256", "name": "y", "type": "uint256" } ], "name": "PRBMath_MulDiv18_Overflow", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "x", "type": "uint256" }, { "internalType": "uint256", "name": "y", "type": "uint256" }, { "internalType": "uint256", "name": "denominator", "type": "uint256" } ], "name": "PRBMath_MulDiv_Overflow", "type": "error" }, { "inputs": [ { "internalType": "UD60x18", "name": "x", "type": "uint256" } ], "name": "PRBMath_UD60x18_Exp2_InputTooBig", "type": "error" }, { "inputs": [ { "internalType": "UD60x18", "name": "x", "type": "uint256" } ], "name": "PRBMath_UD60x18_Log_InputTooSmall", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "bondId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "balloonRateNum", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "balloonRateDen", "type": "uint256" } ], "name": "BalloonRateSet", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "bondId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "coupure", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "interestNum", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "interestDen", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "withholdingTaxNum", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "withholdingTaxDen", "type": "uint256" }, { "indexed": false, "internalType": "address", "name": "issuer", "type": "address" } ], "name": "BondInitializedPart1", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "bondId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "periodicInterestRate", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "netReturn", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "periodicity", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "duration", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "methodOfRepayment", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "maxSupply", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "formOfFinancing", "type": "uint256" } ], "name": "BondInitializedPart2", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "bondId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "timestamp", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "issuedAmount", "type": "uint256" } ], "name": "BondIssued", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "bondId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "coupure", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "interestNum", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "interestDen", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "withholdingTaxNum", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "withholdingTaxDen", "type": "uint256" }, { "indexed": false, "internalType": "address", "name": "issuer", "type": "address" } ], "name": "BondParametersEditedPart1", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "bondId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "periodicInterestRate", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "netReturn", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "periodicity", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "duration", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "methodOfRepayment", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "maxSupply", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "formOfFinancing", "type": "uint256" } ], "name": "BondParametersEditedPart2", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "string", "name": "bondTransferId", "type": "string" }, { "indexed": false, "internalType": "uint256", "name": "bondId", "type": "uint256" }, { "indexed": false, "internalType": "address", "name": "oldAccount", "type": "address" }, { "indexed": false, "internalType": "address", "name": "newAccount", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "BondTransferred", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "string", "name": "bondPurchaseId", "type": "string" }, { "indexed": false, "internalType": "uint256", "name": "bondId", "type": "uint256" }, { "indexed": false, "internalType": "address", "name": "holder", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "BondsWithdrawn", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "bondId", "type": "uint256" } ], "name": "CampaignPaused", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "bondId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "startDate", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "endDate", "type": "uint256" } ], "name": "CampaignStartAndEndDateSet", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "bondId", "type": "uint256" } ], "name": "CampaignUnpaused", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "bondId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "capitalAmortizationFreePeriodDuration", "type": "uint256" } ], "name": "CapitalAmortizationFreePeriodSet", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "bondId", "type": "uint256" }, { "indexed": false, "internalType": "string", "name": "capitalClaimId", "type": "string" }, { "indexed": false, "internalType": "uint256", "name": "capitalAmount", "type": "uint256" } ], "name": "CapitalClaimAmountSet", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "bondId", "type": "uint256" }, { "indexed": false, "internalType": "uint256[]", "name": "couponDates", "type": "uint256[]" }, { "indexed": false, "internalType": "uint256[]", "name": "remainingCapital", "type": "uint256[]" }, { "indexed": false, "internalType": "uint256[]", "name": "capitalRepayments", "type": "uint256[]" }, { "indexed": false, "internalType": "uint256[]", "name": "grossCouponRates", "type": "uint256[]" }, { "indexed": false, "internalType": "uint256[]", "name": "netCouponRates", "type": "uint256[]" } ], "name": "CouponsComputed", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "bondId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "gracePeriodDuration", "type": "uint256" } ], "name": "GracePeriodSet", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "bondId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "investorsCount", "type": "uint256" } ], "name": "InvestorsCountChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "bondId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "issueDate", "type": "uint256" } ], "name": "IssueDateSet", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "bondId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "minAmount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "maxAmount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "maxAmountPerInvestor", "type": "uint256" } ], "name": "MinAndMaxAmountSet", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "bondId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "periodicInterest", "type": "uint256" } ], "name": "PeriodicInterestRateSet", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "bondId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "reservedAmount", "type": "uint256" } ], "name": "ReservedAmountChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "bondId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "revocationsCount", "type": "uint256" } ], "name": "RevocationsCountChanged", "type": "event" }, { "inputs": [ { "components": [ { "internalType": "uint256", "name": "__bondId", "type": "uint256" }, { "internalType": "uint256", "name": "__campaignMinAmount", "type": "uint256" }, { "internalType": "uint256", "name": "__campaignMaxAmount", "type": "uint256" }, { "internalType": "uint256", "name": "__campaignStartDate", "type": "uint256" }, { "internalType": "uint256", "name": "__expectedIssueDate", "type": "uint256" }, { "internalType": "uint256", "name": "__coupure", "type": "uint256" }, { "internalType": "uint256", "name": "__interestNum", "type": "uint256" }, { "internalType": "uint256", "name": "__interestDen", "type": "uint256" }, { "internalType": "uint256", "name": "__withholdingTaxNum", "type": "uint256" }, { "internalType": "uint256", "name": "__withholdingTaxDen", "type": "uint256" }, { "internalType": "uint256", "name": "__balloonRateNum", "type": "uint256" }, { "internalType": "uint256", "name": "__balloonRateDen", "type": "uint256" }, { "internalType": "uint256", "name": "__duration", "type": "uint256" }, { "internalType": "uint256", "name": "__capitalAmortizationDuration", "type": "uint256" }, { "internalType": "uint256", "name": "__gracePeriodDuration", "type": "uint256" }, { "internalType": "uint256", "name": "__maxAmountPerInvestor", "type": "uint256" }, { "internalType": "uint256", "name": "__periodicity", "type": "uint256" }, { "internalType": "uint256", "name": "__formOfFinancing", "type": "uint256" }, { "internalType": "uint256", "name": "__methodOfRepayment", "type": "uint256" }, { "internalType": "address", "name": "__issuer", "type": "address" } ], "internalType": "struct BondInitParams.BondInit", "name": "bi", "type": "tuple" } ], "name": "editBondParameters", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "getSelectors", "outputs": [ { "internalType": "bytes4[]", "name": "", "type": "bytes4[]" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [], "name": "getSelectorsOwnership", "outputs": [ { "internalType": "bytes4[]", "name": "", "type": "bytes4[]" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [ { "components": [ { "internalType": "uint256", "name": "__bondId", "type": "uint256" }, { "internalType": "uint256", "name": "__campaignMinAmount", "type": "uint256" }, { "internalType": "uint256", "name": "__campaignMaxAmount", "type": "uint256" }, { "internalType": "uint256", "name": "__campaignStartDate", "type": "uint256" }, { "internalType": "uint256", "name": "__expectedIssueDate", "type": "uint256" }, { "internalType": "uint256", "name": "__coupure", "type": "uint256" }, { "internalType": "uint256", "name": "__interestNum", "type": "uint256" }, { "internalType": "uint256", "name": "__interestDen", "type": "uint256" }, { "internalType": "uint256", "name": "__withholdingTaxNum", "type": "uint256" }, { "internalType": "uint256", "name": "__withholdingTaxDen", "type": "uint256" }, { "internalType": "uint256", "name": "__balloonRateNum", "type": "uint256" }, { "internalType": "uint256", "name": "__balloonRateDen", "type": "uint256" }, { "internalType": "uint256", "name": "__duration", "type": "uint256" }, { "internalType": "uint256", "name": "__capitalAmortizationDuration", "type": "uint256" }, { "internalType": "uint256", "name": "__gracePeriodDuration", "type": "uint256" }, { "internalType": "uint256", "name": "__maxAmountPerInvestor", "type": "uint256" }, { "internalType": "uint256", "name": "__periodicity", "type": "uint256" }, { "internalType": "uint256", "name": "__formOfFinancing", "type": "uint256" }, { "internalType": "uint256", "name": "__methodOfRepayment", "type": "uint256" }, { "internalType": "address", "name": "__issuer", "type": "address" } ], "internalType": "struct BondInitParams.BondInit", "name": "bi", "type": "tuple" } ], "name": "initializeBond", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_newOwner", "type": "address" } ], "name": "initializeOwner", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_bondId", "type": "uint256" }, { "internalType": "uint256", "name": "_issueDate", "type": "uint256" } ], "name": "issueBond", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256[]", "name": "", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "", "type": "uint256[]" }, { "internalType": "bytes", "name": "", "type": "bytes" } ], "name": "onERC1155BatchReceived", "outputs": [ { "internalType": "bytes4", "name": "", "type": "bytes4" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "bytes", "name": "", "type": "bytes" } ], "name": "onERC1155Received", "outputs": [ { "internalType": "bytes4", "name": "", "type": "bytes4" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_bondId", "type": "uint256" } ], "name": "pauseCampaign", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "_bondPurchaseId", "type": "string" }, { "internalType": "uint256", "name": "_bondId", "type": "uint256" }, { "internalType": "address", "name": "_buyer", "type": "address" } ], "name": "rescindReservation", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "_bondPurchaseId", "type": "string" }, { "internalType": "uint256", "name": "_bondId", "type": "uint256" }, { "internalType": "uint256", "name": "_bondAmount", "type": "uint256" }, { "internalType": "address", "name": "_buyer", "type": "address" } ], "name": "reserve", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_bondId", "type": "uint256" }, { "internalType": "uint256", "name": "_balloonRateNum", "type": "uint256" }, { "internalType": "uint256", "name": "_balloonRateDen", "type": "uint256" } ], "name": "setBalloonRate", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_bondId", "type": "uint256" }, { "internalType": "uint256", "name": "_duration", "type": "uint256" } ], "name": "setCapitalAmortizationFreeDuration", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_currencyAddress", "type": "address" } ], "name": "setCurrencyAddress", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_bondId", "type": "uint256" }, { "internalType": "uint256", "name": "_duration", "type": "uint256" } ], "name": "setGracePeriodDuration", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "_bondTransferId", "type": "string" }, { "internalType": "uint256", "name": "_bondId", "type": "uint256" }, { "internalType": "address", "name": "_old", "type": "address" }, { "internalType": "address", "name": "_new", "type": "address" }, { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "name": "transferBond", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_bondId", "type": "uint256" } ], "name": "unpauseCampaign", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "_bondPurchaseId", "type": "string" }, { "internalType": "uint256", "name": "_bondId", "type": "uint256" }, { "internalType": "address", "name": "holder", "type": "address" } ], "name": "withdrawBondsPurchased", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ], "bytecode": "0x60808060405234601557614274908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f905f3560e01c90816301ffc9a7146117b65750806325830db3146115805780632dcb118e1461153457806343a19a65146114895780634b503f0b146112e557806360332e891461116857806368aea41b146110e6578063796b89ec146110a85780638c5f36bb1461100c5780638da5cb5b14610fd85780638dea1f4714610cae578063906b131a14610a455780639226537e14610834578063b4105004146107c0578063bc197c8114610727578063de99347a14610675578063e3adc7ee146103e7578063ee5b280a14610399578063f23a6e611461033e578063f2fde38b146102785763f844a31c14610105575f80fd5b346102755761011336611926565b61013460018060a01b035f51602061421f5f395f51905f5254163314611b61565b61013d82611cac565b9160016018840155601b830160ff815460201c166102665761015f8383612675565b61016882612aeb565b5050815464ff000000001916640100000000179091555060258301805463ff00000019166301000000179055601183015460179093018381558454909385916001600160a01b0316803b156102625760405163731133e960e01b8152306004820152602481018590526044810192909252608060648301525f60848301528290829060a490829084905af180156102575761023e575b50509154604080519384526020840192909252908201527fb5c3204064d2ac62821e92f17e7e2c1e9971c89f07fa01b6dab37145db86dc5590606090a180f35b8161024891611809565b61025357835f6101fe565b8380fd5b6040513d84823e3d90fd5b8280fd5b636f65570160e11b8552600485fd5b80fd5b50346102755760203660031901126102755761029261189f565b5f51602061421f5f395f51905f5254336001600160a01b03821614916102b783611b61565b6001600160a01b03169182156102ed576102d090611b61565b6001600160a01b031916175f51602061421f5f395f51905f525580f35b60405162461bcd60e51b8152602060048201526024808201527f4e6577206f776e65722063616e6e6f7420626520746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b50346102755760a03660031901126102755761035861189f565b506103616118cb565b506084356001600160401b03811161039557610381903690600401611aa2565b505060405163f23a6e6160e01b8152602090f35b5080fd5b5034610275577f8a7a5c9c34210b39b0dd6c746e4824f7af2a84c059d4dcbc168a2036d26df99060406103cb36611926565b80600f6103d784611cac565b015582519182526020820152a180f35b5034610275576103f6366118e1565b919061040181611cac565b60ff601b82015460201c16156106665761041e6024820184611acf565b549061042e600582015483611bbb565b600154604051636eb1769f60e11b81526001600160a01b0388811660048301523060248301529091169190602081604481865afa90811561065b578991610621575b50906104c892610484826020941015611bce565b60268501546040516323b872dd60e01b81526001600160a01b038b8116600483015290911660248201526044810192909252909283919082908b9082906064820190565b03925af18015610616576104e39188916105e7575b50611c43565b855486906001600160a01b0316803b156103955760405163731133e960e01b81526001600160a01b03881660048201526024810186905260448101859052608060648201525f6084820152908290829060a490829084905af18015610257576105c6575b507f99c110e7b335cff55cab2cfe92e319ad78396f17234debbb5860886aa0244cca6105a58686868a60228860018060a01b0383165f520160205260405f20600160ff19825416179055604051948594608086526080860190611c88565b60208501939093526001600160a01b0316604084015260608301520390a180f35b816105d5919695949396611809565b6105e357909192855f610547565b8580fd5b610609915060203d60201161060f575b6106018183611809565b810190611c2b565b5f6104dd565b503d6105f7565b6040513d89823e3d90fd5b9190506020823d602011610653575b8161063d60209383611809565b8101031261064f5790516104c8610470565b5f80fd5b3d9150610630565b6040513d8b823e3d90fd5b630189aad160e71b8552600485fd5b50346102755760203660031901126102755760043561069381611cac565b601b81019081549060ff8260181c16610718576002810154421190811591610708575b506106f95763ff000000191663010000001790556040519081527fab1902ee37c92d1a78dda53814d64b815e7e3ee287d60843a3dbd6954e3206b490602090a180f35b63ebd7e12960e01b8452600484fd5b905060034291015411155f6106b6565b632e75fea560e11b8552600485fd5b50346102755760a03660031901126102755761074161189f565b5061074a6118cb565b506044356001600160401b0381116103955761076a903690600401611a72565b50506064356001600160401b0381116103955761078b903690600401611a72565b50506084356001600160401b038111610395576107ac903690600401611aa2565b505060405163bc197c8160e01b8152602090f35b50346102755780600319360112610275576108306040516107e2608082611809565b600381526060366020830137638da5cb5b60e01b6107ff82611b16565b5263f2fde38b60e01b61081182611b23565b52638c5f36bb60e01b61082382611b33565b526040519182918261193c565b0390f35b5034610275576108433661197f565b61084d8151611cac565b60ff601b82015460201c16610a3657907f182cb671939e46d1345c30b51134e41ef7782a2113747a93b4dc3c31b91ea81e610a309261088b83611e5d565b825160028201546003830154604080519384526020840192909252908201527f05b741eb5649daedcc851ef6f057b1bf89b49d12357d31c478c425b6eb1ce9c590606090a182518154600183015460128401546040805194855260208501939093529183015260608201527f1ada3075f8dc673c9de9ba7c0b8e81065d996d1faa99feb6d0a648c8b7a1516d90608090a1825160a08085015160c08087015160e0808901516101008a01516101208b01516102608c0151604080519a8b5260208b01989098529689019490945260608801919091526080870152938501526001600160a01b03909116908301527fc64d8be5e3585a2141489e772ad1096418b37137a76298a309a5f1095f95f1ca91a18251610a176008830154926007810154906102008701516101808801516102408901519160ff6025601086015495015460081c16946109d986611b43565b6040519889988994919260e0969399989794919961010087019a8752602087015260408601526060850152608084015260a083015260c08201520152565b0390a1610a2a8151608083015190612675565b51612aeb565b50505080f35b636f65570160e11b8352600483fd5b5034610275576080366003190112610275576004356001600160401b03811161039557610a76903690600401611859565b9060243560443592610a866118b5565b9260ff601b610a9485611cac565b015460181c16610c9f57610aa783611cac565b906010820154946011830196875496878082115f14610c9657610ac991611afc565b905b81811115610c8e5750955b60028401544210610c7f5760038401544211610c71578615610c6257602384019260018060a01b0383165f5283602052610b148860405f2054611b09565b601286015410610c53576001600160a01b0383165f9081526020859052604090205415610bb1575b5060409460247f83518b027c8ada9071fa7643b5352e180e42cf5a021d61294e5880408643c97f979560209a958a95610b7887610b9d97611b09565b885560018060a01b03165f528b52875f20610b94868254611b09565b90550190611acf565b5554825191825285820152a1604051908152f35b6014850180549160018301809311610c3f5750879560209a958a95610b7887610b9d977ff865af89149aa92dd957b447226842542090f013d1c80f4f66f6eb3ea79f8e9160407f83518b027c8ada9071fa7643b5352e180e42cf5a021d61294e5880408643c97f9f819f9a8060249b5582519182526020820152a1975050509550959a509597505094610b3c565b634e487b7160e01b81526011600452602490fd5b6315a1589160e11b8152600490fd5b6303f7614f60e51b8352600483fd5b62c32ed760e41b8352600483fd5b633cad284b60e21b8352600483fd5b905095610ad6565b50508290610acb565b63a6a992df60e01b8152600490fd5b503461064f5760a036600319011261064f576004356001600160401b03811161064f57610cdf903690600401611859565b6024356044356001600160a01b03811680820361064f57610cfe6118b5565b9060843592610d2460018060a01b035f51602061421f5f395f51905f5254163314611b61565b610d2d85611cac565b60ff601b82015460201c1615610fc9575f54604051627eeac760e11b8152600481018590526024810188905290602090829060449082906001600160a01b03165afa8015610f405786915f91610f94575b5010610f85576005610d9291015485611bbb565b600154604051636eb1769f60e11b81526001600160a01b03868116600483015230602483015290911690602081604481855afa908115610f40575f91610f4b575b5090610e2793610de884602095941015611bce565b6040516323b872dd60e01b81526001600160a01b03808916600483015290911660248201526044810192909252909283919082905f9082906064820190565b03925af18015610f4057610e41915f916105e75750611c43565b5f546001600160a01b031691823b1561064f575f809160c460405180948193637921219560e11b835287600484015260018060a01b0316978860248401528a604484015289606484015260a060848401528160a48401525af18015610f4057610efe575b5091610ee393917f38db1382a58023a1d5d8aaab1581199c9b7d9ed33223c18beeaab57924aff20f959360405195869560a0875260a0870190611c88565b9360208601526040850152606084015260808301520390a180f35b7f38db1382a58023a1d5d8aaab1581199c9b7d9ed33223c18beeaab57924aff20f959391965091610f335f610ee39694611809565b5f96919395509193610ea5565b6040513d5f823e3d90fd5b929190506020833d602011610f7d575b81610f6860209383611809565b8101031261064f579151909190610e27610dd3565b3d9150610f5b565b6348efb0c560e11b5f5260045ffd5b9150506020813d602011610fc1575b81610fb060209383611809565b8101031261064f578590515f610d7e565b3d9150610fa3565b630189aad160e71b5f5260045ffd5b3461064f575f36600319011261064f575f51602061421f5f395f51905f52546040516001600160a01b039091168152602090f35b3461064f57602036600319011261064f5761102561189f565b5f51602061421f5f395f51905f52546001600160a01b031661106f575f51602061421f5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055005b60405162461bcd60e51b815260206004820152601160248201527013dddb995c88185b1c9958591e481cd95d607a1b6044820152606490fd5b3461064f57602036600319011261064f576001600160a01b036110c961189f565b166bffffffffffffffffffffffff60a01b60015416176001555f80f35b3461064f57606036600319011261064f577f9cc9725ee02d8f0a4d8b30054405939f4d872cc6a5c2d677e02f5bd87e5dea2a60243560043561116360443561112d83611cac565b600a670de0b6b3a764000061114284886136df565b04910155604051938493846040919493926060820195825260208201520152565b0390a1005b3461064f576111763661197f565b306bffffffffffffffffffffffff60a01b5f5416175f556111978151611cac565b90601b820160ff815460101c166112d6576112d4927fb42ebd0ad22561f77328ee457d5ba2a08a7c2847ff88c663cca9dcc8c53dc086916111d784611e5d565b805462ff0000191662010000179055600154602582018054640100000000600160c01b031916602092831b640100000000600160c01b03161790819055845160a08087015160c08089015160e0808b01516101008c01516101208d01516102608e0151604080519a8b529b8a01979097529988019390935260608701526080860191909152928401959095526001600160a01b0316938201939093529092917ff5d1b3af18a6e549e23801b7a43bec54699badce37e0f7e96e0a4ebb65143d7491a1610a178451916008810154936007820154916102008801516101808901519060ff60106102408c01519401549460081c16946109d986611b43565b005b6371001f5d60e11b5f5260045ffd5b3461064f575f36600319011261064f576040516102006113058183611809565b600f8252601f19013660208301376360332e8960e01b61132482611b16565b52631e5ae27b60e21b61133682611b23565b5263491329bf60e11b61134882611b33565b52805160031015611475576368aea41b60e01b6080820152805160041015611475576316e588c760e11b60a08201528051600510156114755763772d940560e11b60c082015280516006101561147557634835898d60e11b60e082015280516007101561147557636f4c9a3d60e11b610100820152805160081015611475576343a19a6560e01b610120820152805160091015611475576325830db360e01b6101408201528051600a101561147557638dea1f4760e01b6101608201528051600b1015611475576371d6e3f760e11b6101808201528051600c101561147557633e1128c760e21b6101a08201528051600d10156114755763f23a6e6160e01b6101c08201528051600e10156114755763bc197c8160e01b6101e0820152604051908190610830908261193c565b634e487b7160e01b5f52603260045260245ffd5b3461064f57602036600319011261064f576004356114a681611cac565b601b81019182549160ff8360181c1615611525576002810154421190811591611515575b50611506577f11aa0bd3fb4d9c5622c703f91610a74140a4f88a7ebc7b4faaeaf52e3cb7aa949260209263ff00000019169055604051908152a1005b63ebd7e12960e01b5f5260045ffd5b90506003429101541115846114ca565b636428884d60e11b5f5260045ffd5b3461064f577f091a72ed52432e53c748925ef46b36a19f93cb874539b387d4f3b1f92aa33e11604061156536611926565b80600e61157184611cac565b015582519182526020820152a1005b3461064f5761158e366118e1565b919061159981611cac565b6011810190815460248201956115af8787611acf565b54821061177157602383019160018060a01b0382165f528260205260405f20546115d98989611acf565b541161171e576115f4906115ed8989611acf565b5490611afc565b84556116008787611acf565b5460018060a01b0382165f528260205261161f60405f20918254611afc565b905560018060a01b03165f5260205260405f2054156116d0575b60150193845490600182018092116116bc57855f6116a06040979388947f499925bc28b60b5b11b1841f8f51318fa4484237122fb618e76c3195b37d9eb8967f83518b027c8ada9071fa7643b5352e180e42cf5a021d61294e5880408643c97f9b55611acf565b55548151908582526020820152a15482519182526020820152a1005b634e487b7160e01b5f52601160045260245ffd5b601481019081545f1981019081116116bc576040817ff865af89149aa92dd957b447226842542090f013d1c80f4f66f6eb3ea79f8e9192601595558151908782526020820152a19050611639565b60405162461bcd60e51b815260206004820152602560248201527f556e646572666c6f773a20726573657276656420616d6f756e74206279206164604482015264647265737360d81b6064820152608490fd5b60405162461bcd60e51b815260206004820152601a60248201527f556e646572666c6f773a20726573657276656420616d6f756e740000000000006044820152606490fd5b3461064f57602036600319011261064f576004359063ffffffff60e01b821680920361064f57602091630271189760e51b81149081156117f8575b5015158152f35b6301ffc9a760e01b149050836117f1565b90601f801991011681019081106001600160401b0382111761182a57604052565b634e487b7160e01b5f52604160045260245ffd5b6001600160401b03811161182a57601f01601f191660200190565b81601f8201121561064f578035906118708261183e565b9261187e6040519485611809565b8284526020838301011161064f57815f926020809301838601378301015290565b600435906001600160a01b038216820361064f57565b606435906001600160a01b038216820361064f57565b602435906001600160a01b038216820361064f57565b606060031982011261064f57600435906001600160401b03821161064f5761190b91600401611859565b90602435906044356001600160a01b038116810361064f5790565b604090600319011261064f576004359060243590565b60206040818301928281528451809452019201905f5b81811061195f5750505090565b82516001600160e01b031916845260209384019390920191600101611952565b61028090600319011261064f5760405161028081018181106001600160401b0382111761182a57604090815260043582526024356020830152604435908201526064356060820152608435608082015260a43560a082015260c43560c082015260e43560e082015261010435610100820152610124356101208201526101443561014082015261016435610160820152610184356101808201526101a4356101a08201526101c4356101c08201526101e4356101e0820152610204356102008201526102243561022082015261024435610240820152610264356001600160a01b038116810361064f5761026082015290565b9181601f8401121561064f578235916001600160401b03831161064f576020808501948460051b01011161064f57565b9181601f8401121561064f578235916001600160401b03831161064f576020838186019501011161064f57565b6040518151909260209284929081908501845e82019081520301902090565b5f198101919082116116bc57565b919082039182116116bc57565b919082018092116116bc57565b8051156114755760200190565b8051600110156114755760400190565b8051600210156114755760600190565b60021115611b4d57565b634e487b7160e01b5f52602160045260245ffd5b15611b6857565b60405162461bcd60e51b815260206004820152602560248201527f4f6e6c7920746865206f776e65722063616e2063616c6c20746869732066756e60448201526431ba34b7b760d91b6064820152608490fd5b818102929181159184041417156116bc57565b15611bd557565b60405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608490fd5b9081602091031261064f5751801515810361064f5790565b15611c4a57565b60405162461bcd60e51b8152602060048201526016602482015275115490cc8c0e881d1c985b9cd9995c8819985a5b195960521b6044820152606490fd5b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b5f818072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b811015611e37575b50806d04ee2d6d415b85acef8100000000600a921015611e1c575b662386f26fc10000811015611e08575b6305f5e100811015611df7575b612710811015611de8575b6064811015611dda575b1015611dd2575b6001810191600a6021611d4d611d378661183e565b95611d456040519788611809565b80875261183e565b602086019490601f19013686378501015b5f1901916f181899199a1a9b1b9c1cb0b131b232b360811b8282061a8353048015611d8c57600a9091611d5e565b5050611dcc602c604051809360208201956b1cdd1bdc9859d94b989bdb9960a21b87525180918484015e81015f838201520301601f198101835282611809565b51902090565b600101611d22565b606460029104920191611d1b565b61271060049104920191611d11565b6305f5e10060089104920191611d06565b662386f26fc1000060109104920191611cf9565b6d04ee2d6d415b85acef810000000060209104920191611ce9565b6040925072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b90049050600a611cce565b905f611e698351611cac565b6102608401516026820180546001600160a01b0319166001600160a01b039290921691909117905560a084018051600583015560e08501805190939290156125b757610200860192868451155f1461258957610180600c9101510661257a5786905b6101c08201908151612463575b6101a08301918251612390575b60c0840197611ef789518251906136df565b9060068701918255610100860191825191611f196101208901938451906136df565b60098a0155670de0b6b3a7640000611f4660408a0151809c60018d019d8e5560208c01518d5551906136df565b0460108a015560606101e08901519860128b01998a55610180810151600d8c015501519b8c9b624f1a008d60028d019e8f55019d8e81116116bc578e10612325578a90600382019e8f558051155f146122775750602501805460ff191690555050805460088901555b6102408d01805160010361223c57508551156122055760258801805462ff00001916620300001790555b8551600e8901558351600f8901556101408d01948d86519081151590816121f6575b50612183575b505061217e98957f9cc9725ee02d8f0a4d8b30054405939f4d872cc6a5c2d677e02f5bd87e5dea2a89967f05b741eb5649daedcc851ef6f057b1bf89b49d12357d31c478c425b6eb1ce9c59e9f9a6040612159986120ea7f1ada3075f8dc673c9de9ba7c0b8e81065d996d1faa99feb6d0a648c8b7a1516d9d996120e46120de7f091a72ed52432e53c748925ef46b36a19f93cb874539b387d4f3b1f92aa33e119b869b601b7f8a7a5c9c34210b39b0dd6c746e4824f7af2a84c059d4dcbc168a2036d26df990990161ff001981541690555493519051906136df565b82614143565b90611afc565b60078c01558d51905182519182526020820152a18a5190516101608c0151855192835260208301919091526040820152606090a18851905182519182526020820152a1855192549354905490604051948594859094939260609260808301968352602083015260408201520152565b0390a15191549254604051938493846040919493926060820195825260208201520152565b0390a1565b8e6121956101608201928351906136df565b600a8c015551908751905191303b15610253576040516368aea41b60e01b8152600481019190915260248101919091526044810191909152818160648183305af180156102575715612001576121ec828092611809565b6102755780612001565b6101609150015115158f611ffb565b8351156122245760258801805462ff0000191662040000179055611fd9565b60258801805462ff0000191662010000179055611fd9565b8051612256575060258801805462ff000019169055611fd9565b5160011901611fd95760258801805462ff0000191662020000179055611fd9565b80516001036122cf5750602501805460ff19166001179055815190516122c5926122c0926122b0926122a891611b09565b9051906136df565b6703782dace9d900005b9061349f565b611aee565b6008890155611faf565b519091906002146122e3575b505050611faf565b612318926122a861230a9260256122c09501600260ff198254161790558251905190611b09565b6701280f39a34855556122ba565b60088901555