craft-nft

A standalone NFT implementation for real-world arts and crafts assets
Log | Files | Refs | README

commit 861c733e81c4baa9f59829d89418a9649d0b6638
parent 5290ab9b54942bf3fe7951dc8b49533d20d1b84a
Author: lash <dev@holbrook.no>
Date:   Sun, 26 Feb 2023 07:43:44 +0000

Implement multihash for uri, event msg

Diffstat:
Mjs/contract/CraftNFT.bin | 4++--
Mjs/contract/CraftNFT.json | 2+-
Mpython/craft_nft/data/CraftNFT.bin | 4++--
Mpython/craft_nft/data/CraftNFT.json | 2+-
Mpython/craft_nft/nft.py | 9+++++----
Mpython/craft_nft/runnable/publish.py | 2+-
Msolidity/CraftNFT.sol | 204+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------
7 files changed, 180 insertions(+), 47 deletions(-)

diff --git a/js/contract/CraftNFT.bin b/js/contract/CraftNFT.bin @@ -1 +1 @@ -60806040523480156200001157600080fd5b506040516200437a3803806200437a833981810160405281019062000037919062000279565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060098190555082600690816200008f919062000564565b508160079081620000a1919062000564565b505050506200064b565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200011482620000c9565b810181811067ffffffffffffffff82111715620001365762000135620000da565b5b80604052505050565b60006200014b620000ab565b905062000159828262000109565b919050565b600067ffffffffffffffff8211156200017c576200017b620000da565b5b6200018782620000c9565b9050602081019050919050565b60005b83811015620001b457808201518184015260208101905062000197565b60008484015250505050565b6000620001d7620001d1846200015e565b6200013f565b905082815260208101848484011115620001f657620001f5620000c4565b5b6200020384828562000194565b509392505050565b600082601f830112620002235762000222620000bf565b5b815162000235848260208601620001c0565b91505092915050565b6000819050919050565b62000253816200023e565b81146200025f57600080fd5b50565b600081519050620002738162000248565b92915050565b600080600060608486031215620002955762000294620000b5565b5b600084015167ffffffffffffffff811115620002b657620002b5620000ba565b5b620002c4868287016200020b565b935050602084015167ffffffffffffffff811115620002e857620002e7620000ba565b5b620002f6868287016200020b565b9250506040620003098682870162000262565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036657607f821691505b6020821081036200037c576200037b6200031e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620003e97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003a7565b620003f58683620003a7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004426200043c62000436846200040d565b62000417565b6200040d565b9050919050565b6000819050919050565b6200045e8362000421565b620004766200046d8262000449565b848454620003b7565b825550505050565b600090565b6200048d6200047e565b6200049a81848462000453565b505050565b5b81811015620004c257620004b660008262000483565b600181019050620004a0565b5050565b601f8211156200051157620004db8162000382565b620004e68462000397565b81016020851015620004f6578190505b6200050e620005058562000397565b8301826200049f565b50505b505050565b60008160020a8304905092915050565b6000620005396000198460080262000516565b1980831691505092915050565b600062000554838362000526565b9150826002028217905092915050565b6200056f8262000313565b67ffffffffffffffff8111156200058b576200058a620000da565b5b6200059782546200034d565b620005a4828285620004c6565b600060209050601f831160018114620005dc5760008415620005c7578287015190505b620005d3858262000546565b86555062000643565b601f198416620005ec8662000382565b60005b828110156200061657848901518255600182019150602085019450602081019050620005ef565b8683101562000636578489015162000632601f89168262000526565b8355505b6001600288020188555050505b505050505050565b613d1f806200065b6000396000f3fe6080604052600436106101df576000357c01000000000000000000000000000000000000000000000000000000009004806369e85c7111610114578063b242e534116100b2578063d824ee4f11610081578063d824ee4f146106e4578063e985e9c514610721578063f117e1731461075e578063f9613ab21461079b576101df565b8063b242e53414610611578063b88d4fde1461064e578063c87b56dd1461066a578063c9796c39146106a7576101df565b806395d89b41116100ee57806395d89b4114610555578063a22cb46514610580578063adf288df146105a9578063b1a6afd3146105e6576101df565b806369e85c71146104b057806370a08231146104ed5780638da5cb5b1461052a576101df565b806340c84b0e116101815780634d03546a1161015b5780634d03546a146103ba5780634f64b2be146103f7578063559f5dc9146104345780636352211e14610473576101df565b806340c84b0e1461034a57806342842e0e1461037557806349f2553a14610391576101df565b806318160ddd116101bd57806318160ddd1461028957806323b872dd146102b457806324e0febc146102d05780633fd2f5931461030d576101df565b806301ffc9a7146101e457806306fdde0314610221578063081812fc1461024c575b600080fd5b3480156101f057600080fd5b5061020b60048036038101906102069190612e79565b6107d8565b6040516102189190612ec1565b60405180910390f35b34801561022d57600080fd5b5061023661092c565b6040516102439190612f6c565b60405180910390f35b34801561025857600080fd5b50610273600480360381019061026e9190612fc4565b6109ba565b6040516102809190613032565b60405180910390f35b34801561029557600080fd5b5061029e6109f7565b6040516102ab919061305c565b60405180910390f35b6102ce60048036038101906102c991906130a3565b610a01565b005b3480156102dc57600080fd5b506102f760048036038101906102f2919061312c565b610a6c565b6040516103049190613168565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f919061312c565b610a84565b60405161034191906131d8565b60405180910390f35b34801561035657600080fd5b5061035f610de3565b60405161036c91906131d8565b60405180910390f35b61038f600480360381019061038a91906130a3565b610e71565b005b34801561039d57600080fd5b506103b860048036038101906103b3919061332f565b610edc565b005b3480156103c657600080fd5b506103e160048036038101906103dc91906133b6565b6111f4565b6040516103ee9190612ec1565b60405180910390f35b34801561040357600080fd5b5061041e60048036038101906104199190612fc4565b61147e565b60405161042b9190613168565b60405180910390f35b34801561044057600080fd5b5061045b600480360381019061045691906133f6565b6114a2565b60405161046a93929190613445565b60405180910390f35b34801561047f57600080fd5b5061049a60048036038101906104959190612fc4565b611516565b6040516104a79190613032565b60405180910390f35b3480156104bc57600080fd5b506104d760048036038101906104d2919061312c565b611552565b6040516104e49190612f6c565b60405180910390f35b3480156104f957600080fd5b50610514600480360381019061050f919061347c565b61176b565b604051610521919061305c565b60405180910390f35b34801561053657600080fd5b5061053f6117b4565b60405161054c9190613032565b60405180910390f35b34801561056157600080fd5b5061056a6117d8565b6040516105779190612f6c565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a291906134d5565b611866565b005b3480156105b557600080fd5b506105d060048036038101906105cb9190613515565b611b08565b6040516105dd9190613168565b60405180910390f35b3480156105f257600080fd5b506105fb611d26565b6040516106089190613168565b60405180910390f35b34801561061d57600080fd5b50610638600480360381019061063391906134d5565b611d2c565b6040516106459190612ec1565b60405180910390f35b610668600480360381019061066391906135f6565b611e0d565b005b34801561067657600080fd5b50610691600480360381019061068c9190612fc4565b611ee8565b60405161069e9190612f6c565b60405180910390f35b3480156106b357600080fd5b506106ce60048036038101906106c9919061312c565b611f5a565b6040516106db9190612f6c565b60405180910390f35b3480156106f057600080fd5b5061070b600480360381019061070691906136b3565b612354565b6040516107189190613168565b60405180910390f35b34801561072d57600080fd5b5061074860048036038101906107439190613706565b612507565b6040516107559190612ec1565b60405180910390f35b34801561076a57600080fd5b5061078560048036038101906107809190613746565b61259f565b6040516107929190613168565b60405180910390f35b3480156107a757600080fd5b506107c260048036038101906107bd919061312c565b6126a4565b6040516107cf9190613168565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361082c5760019050610927565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361087e5760019050610927565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036108d05760019050610927565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109225760019050610927565b600090505b919050565b60068054610939906137dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610965906137dc565b80156109b25780601f10610987576101008083540402835291602001916109b2565b820191906000526020600020905b81548152906001019060200180831161099557829003601f168201915b505050505081565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600854905090565b610a0c838383612750565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60036020528060005260406000206000915090505481565b606080600080604067ffffffffffffffff811115610aa557610aa4613204565b5b6040519080825280601f01601f191660200182016040528015610ad75781602001600182028036833780820191505090505b5092506000905060005b6020811015610dd757600460f0878360208110610b0157610b0061380d565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015610bd957603083610b709190613878565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610ba557610ba461380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610c4b565b605783610be69190613878565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610c1b57610c1a61380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868260208110610c6057610c5f61380d565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015610d3757603083610cc29190613878565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610cf291906138ad565b81518110610d0357610d0261380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610db5565b605783610d449190613878565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610d7491906138ad565b81518110610d8557610d8461380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282610dc291906138ad565b91508080610dcf906138e1565b915050610ae1565b50829350505050919050565b600a8054610df0906137dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1c906137dc565b8015610e695780601f10610e3e57610100808354040283529160200191610e69565b820191906000526020600020905b815481529060010190602001808311610e4c57829003601f168201915b505050505081565b610e7c838383612750565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f3957600080fd5b82915081519050602f7f01000000000000000000000000000000000000000000000000000000000000000282600183610f729190613929565b81518110610f8357610f8261380d565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611003578080610fff906138e1565b9150505b8067ffffffffffffffff81111561101d5761101c613204565b5b6040519080825280601f01601f19166020018201604052801561104f5781602001600182028036833780820191505090505b50600a908161105e9190613b0f565b5060005b825181101561114f5782818151811061107e5761107d61380d565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600a8281546110d6906137dc565b81106110e5576110e461380d565b5b8154600116156111045790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055508080611147906138e1565b915050611062565b50815181146111ef577f2f00000000000000000000000000000000000000000000000000000000000000600a83518154611188906137dc565b81106111975761119661380d565b5b8154600116156111b65790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461124f57600080fd5b611257612dda565b6002600086815260200190815260200160002080549050915060008211156112d4576000600260008781526020019081526020016000206000815481106112a1576112a061380d565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff16116112d357600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060026000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff0219169083151502179055505050600185908060018154018082558091505060019003906000526020600020016000909190919091505560008465ffffffffffff16036113f9576001600860008282546113ed91906138ad565b9250508190555061141b565b8365ffffffffffff166008600082825461141391906138ad565b925050819055505b8365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c3428760405161146a9190613168565b60405180910390a360019250505092915050565b6001818154811061148e57600080fd5b906000526020600020016000915090505481565b600260205281600052604060002081815481106114be57600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b600080600360008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061156285610a84565b9150600a8054611571906137dc565b9050905080825161158291906138ad565b67ffffffffffffffff81111561159b5761159a613204565b5b6040519080825280601f01601f1916602001820160405280156115cd5781602001600182028036833780820191505090505b50925060005b8181101561169257600a8181546115e9906137dc565b81106115f8576115f761380d565b5b8154600116156116175790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000028482815181106116505761164f61380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061168a906138e1565b9150506115d3565b5060005b825181101561175f578281815181106116b2576116b161380d565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000284838151811061170f5761170e61380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180611749906138e1565b9250508080611757906138e1565b915050611696565b50829350505050919050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600780546117e5906137dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611811906137dc565b801561185e5780601f106118335761010080835404028352916020019161185e565b820191906000526020600020905b81548152906001019060200180831161184157829003601f168201915b505050505081565b801561198757600073ffffffffffffffffffffffffffffffffffffffff16600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461190457600080fd5b81600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611a9f565b600073ffffffffffffffffffffffffffffffffffffffff16600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611a1f57600080fd5b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611afc9190612ec1565b60405180910390a35050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b6357600080fd5b6001600260008581526020019081526020016000208054905014611b8657600080fd5b600060026000858152602001908152602001600020600081548110611bae57611bad61380d565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff1614611be057600080fd5b6000600102600360008581526020019081526020016000205414611c0357600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1690507fc000000000000000000000000000000000000000000000000000000000000000811790508060010260036000858152602001908152602001600020819055506001600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cac91906138ad565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560019004604051611d14919061305c565b60405180910390a38291505092915050565b60095481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d8757600080fd5b600060149054906101000a900460ff1615611da157600080fd5b8115611dc3576001600060146101000a81548160ff0219169083151502179055505b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905092915050565b611e18848484612750565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e84611ecd90613c06565b604051611eda9190613168565b60405180910390a450505050565b606060008260010290506000600260008381526020019081526020016000208054905003611f2357611f19816126a4565b9050806001900492505b6000600260008381526020019081526020016000208054905011611f4657600080fd5b611f5283600102611552565b915050919050565b60608060606000611f6a85610a84565b9150604767ffffffffffffffff811115611f8757611f86613204565b5b6040519080825280601f01601f191660200182016040528015611fb95781602001600182028036833780820191505090505b5092507f730000000000000000000000000000000000000000000000000000000000000083600081518110611ff157611ff061380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f6800000000000000000000000000000000000000000000000000000000000000836001815181106120555761205461380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f6100000000000000000000000000000000000000000000000000000000000000836002815181106120b9576120b861380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f32000000000000000000000000000000000000000000000000000000000000008360038151811061211d5761211c61380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3500000000000000000000000000000000000000000000000000000000000000836004815181106121815761218061380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3600000000000000000000000000000000000000000000000000000000000000836005815181106121e5576121e461380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3a00000000000000000000000000000000000000000000000000000000000000836006815181106122495761224861380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506007905060005b60408110156123485782818151811061229b5761229a61380d565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028483815181106122f8576122f761380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180612332906138e1565b9250508080612340906138e1565b91505061227f565b50829350505050919050565b600080600260008581526020019081526020016000208361ffff16815481106123805761237f61380d565b5b90600052602060002001905080600001600c9054906101000a900460ff16156123a857600080fd5b60008361ffff161480156123da575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b156124395760018160000160068282829054906101000a900465ffffffffffff166124059190613c6d565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055506124318585611b08565b915050612500565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461249157600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff16106124d957600080fd5b6124fc8585858460000160069054906101000a900465ffffffffffff1685612a67565b9150505b9392505050565b60008173ffffffffffffffffffffffffffffffffffffffff16600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600260008681526020019081526020016000208461ffff16815481106125cb576125ca61380d565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461262f57600080fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff161161265a57600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff161061268c57600080fd5b6126998686868685612a67565b915050949350505050565b600080600360008481526020019081526020016000205490506126c681612ce5565b6126cf57600080fd5b6126d881612d17565b156126e6578291505061274b565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016127a7919061305c565b602060405180830381865afa1580156127c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e89190613cbc565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461282257600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612956573373ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061294c57503373ffffffffffffffffffffffffffffffffffffffff16600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61295557600080fd5b5b60006004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506129b38284612d49565b6001600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a039190613929565b925050819055506001600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a5a91906138ad565b9250508190555050505050565b6000806000807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008860019004169250603067ffffffffffffffff8861ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16831792508565ffffffffffff16831792508260010290506000600102600360008381526020019081526020016000205414612afa57600080fd5b84600001600c9054906101000a900460ff16612b5c578460000160069054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff1614612b5b57600185600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff886001900416915060b8829060020a0291507f8000000000000000000000000000000000000000000000000000000000000000821791508873ffffffffffffffffffffffffffffffffffffffff168217915060018560000160068282829054906101000a900465ffffffffffff16612bdd9190613c6d565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055508160010260036000838152602001908152602001600020819055506001600b60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c6a91906138ad565b925050819055508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051612cce919061305c565b60405180910390a380935050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b600080836001029050600360008281526020019081526020016000205460019004915060008203612d7957600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600360008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e5681612e21565b8114612e6157600080fd5b50565b600081359050612e7381612e4d565b92915050565b600060208284031215612e8f57612e8e612e17565b5b6000612e9d84828501612e64565b91505092915050565b60008115159050919050565b612ebb81612ea6565b82525050565b6000602082019050612ed66000830184612eb2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f16578082015181840152602081019050612efb565b60008484015250505050565b6000601f19601f8301169050919050565b6000612f3e82612edc565b612f488185612ee7565b9350612f58818560208601612ef8565b612f6181612f22565b840191505092915050565b60006020820190508181036000830152612f868184612f33565b905092915050565b6000819050919050565b612fa181612f8e565b8114612fac57600080fd5b50565b600081359050612fbe81612f98565b92915050565b600060208284031215612fda57612fd9612e17565b5b6000612fe884828501612faf565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061301c82612ff1565b9050919050565b61302c81613011565b82525050565b60006020820190506130476000830184613023565b92915050565b61305681612f8e565b82525050565b6000602082019050613071600083018461304d565b92915050565b61308081613011565b811461308b57600080fd5b50565b60008135905061309d81613077565b92915050565b6000806000606084860312156130bc576130bb612e17565b5b60006130ca8682870161308e565b93505060206130db8682870161308e565b92505060406130ec86828701612faf565b9150509250925092565b6000819050919050565b613109816130f6565b811461311457600080fd5b50565b60008135905061312681613100565b92915050565b60006020828403121561314257613141612e17565b5b600061315084828501613117565b91505092915050565b613162816130f6565b82525050565b600060208201905061317d6000830184613159565b92915050565b600081519050919050565b600082825260208201905092915050565b60006131aa82613183565b6131b4818561318e565b93506131c4818560208601612ef8565b6131cd81612f22565b840191505092915050565b600060208201905081810360008301526131f2818461319f565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61323c82612f22565b810181811067ffffffffffffffff8211171561325b5761325a613204565b5b80604052505050565b600061326e612e0d565b905061327a8282613233565b919050565b600067ffffffffffffffff82111561329a57613299613204565b5b6132a382612f22565b9050602081019050919050565b82818337600083830152505050565b60006132d26132cd8461327f565b613264565b9050828152602081018484840111156132ee576132ed6131ff565b5b6132f98482856132b0565b509392505050565b600082601f830112613316576133156131fa565b5b81356133268482602086016132bf565b91505092915050565b60006020828403121561334557613344612e17565b5b600082013567ffffffffffffffff81111561336357613362612e1c565b5b61336f84828501613301565b91505092915050565b600065ffffffffffff82169050919050565b61339381613378565b811461339e57600080fd5b50565b6000813590506133b08161338a565b92915050565b600080604083850312156133cd576133cc612e17565b5b60006133db85828601613117565b92505060206133ec858286016133a1565b9150509250929050565b6000806040838503121561340d5761340c612e17565b5b600061341b85828601613117565b925050602061342c85828601612faf565b9150509250929050565b61343f81613378565b82525050565b600060608201905061345a6000830186613436565b6134676020830185613436565b6134746040830184612eb2565b949350505050565b60006020828403121561349257613491612e17565b5b60006134a08482850161308e565b91505092915050565b6134b281612ea6565b81146134bd57600080fd5b50565b6000813590506134cf816134a9565b92915050565b600080604083850312156134ec576134eb612e17565b5b60006134fa8582860161308e565b925050602061350b858286016134c0565b9150509250929050565b6000806040838503121561352c5761352b612e17565b5b600061353a8582860161308e565b925050602061354b85828601613117565b9150509250929050565b600067ffffffffffffffff8211156135705761356f613204565b5b61357982612f22565b9050602081019050919050565b600061359961359484613555565b613264565b9050828152602081018484840111156135b5576135b46131ff565b5b6135c08482856132b0565b509392505050565b600082601f8301126135dd576135dc6131fa565b5b81356135ed848260208601613586565b91505092915050565b600080600080608085870312156136105761360f612e17565b5b600061361e8782880161308e565b945050602061362f8782880161308e565b935050604061364087828801612faf565b925050606085013567ffffffffffffffff81111561366157613660612e1c565b5b61366d878288016135c8565b91505092959194509250565b600061ffff82169050919050565b61369081613679565b811461369b57600080fd5b50565b6000813590506136ad81613687565b92915050565b6000806000606084860312156136cc576136cb612e17565b5b60006136da8682870161308e565b93505060206136eb86828701613117565b92505060406136fc8682870161369e565b9150509250925092565b6000806040838503121561371d5761371c612e17565b5b600061372b8582860161308e565b925050602061373c8582860161308e565b9150509250929050565b600080600080608085870312156137605761375f612e17565b5b600061376e8782880161308e565b945050602061377f87828801613117565b93505060406137908782880161369e565b92505060606137a1878288016133a1565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806137f457607f821691505b602082108103613807576138066137ad565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138838261383c565b915061388e8361383c565b9250828201905060ff8111156138a7576138a6613849565b5b92915050565b60006138b882612f8e565b91506138c383612f8e565b92508282019050808211156138db576138da613849565b5b92915050565b60006138ec82612f8e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361391e5761391d613849565b5b600182019050919050565b600061393482612f8e565b915061393f83612f8e565b925082820390508181111561395757613956613849565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b6000600883026139c27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613982565b6139cc8683613982565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613a09613a046139ff84612f8e565b6139e4565b612f8e565b9050919050565b6000819050919050565b613a23836139ee565b613a37613a2f82613a10565b848454613992565b825550505050565b600090565b613a4c613a3f565b613a57818484613a1a565b505050565b5b81811015613a7b57613a70600082613a44565b600181019050613a5d565b5050565b601f821115613ac057613a918161395d565b613a9a84613972565b81016020851015613aa9578190505b613abd613ab585613972565b830182613a5c565b50505b505050565b60008160020a8304905092915050565b6000613ae660001984600802613ac5565b1980831691505092915050565b6000613aff8383613ad5565b9150826002028217905092915050565b613b1882613183565b67ffffffffffffffff811115613b3157613b30613204565b5b613b3b82546137dc565b613b46828285613a7f565b600060209050601f831160018114613b795760008415613b67578287015190505b613b718582613af3565b865550613bd9565b601f198416613b878661395d565b60005b82811015613baf57848901518255600182019150602085019450602081019050613b8a565b86831015613bcc5784890151613bc8601f891682613ad5565b8355505b6001600288020188555050505b505050505050565b6000819050602082019050919050565b6000613bfd82516130f6565b80915050919050565b6000613c1182613183565b82613c1b84613be1565b9050613c2681613bf1565b92506020821015613c6657613c617fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802613982565b831692505b5050919050565b6000613c7882613378565b9150613c8383613378565b9250828201905065ffffffffffff811115613ca157613ca0613849565b5b92915050565b600081519050613cb681613077565b92915050565b600060208284031215613cd257613cd1612e17565b5b6000613ce084828501613ca7565b9150509291505056fea2646970667358221220a61ab7da49ebc6608666d52010ac708bffa9f8c1c0c76f149381a0a6304083bd64736f6c63430008110033 -\ No newline at end of file +60806040523480156200001157600080fd5b50604051620062fb380380620062fb833981810160405281019062000037919062000b3f565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060098190555082600690816200008f919062000e2a565b508160079081620000a1919062000e2a565b50620000f5602060126040518060400160405280600681526020017f73686132353600000000000000000000000000000000000000000000000000008152506200017c640100000000026401000000009004565b62000110601262000453640100000000026401000000009004565b602067ffffffffffffffff8111156200012e576200012d620009a0565b5b6040519080825280601f01601f191660200182016040528015620001615781602001600182028036833780820191505090505b50600e908162000172919062000f81565b5050505062001403565b6060819050601081511115620001c9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001c090620010c9565b60405180910390fd5b620001d36200090b565b6000600790505b60008160ff161062000237576000600882620001f7919062001127565b60ff1660ff9060020a029050600086821667ffffffffffffffff16111562000220575062000237565b81806200022d906200116d565b92505050620001da565b6001816200024691906200119b565b826020019060ff16908160ff16815250506008816007620002689190620011d7565b62000274919062001127565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082620003029062001266565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600c60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b6000600c6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff16116200048c57600080fd5b81600d819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115620004c457620004c3620009a0565b5b6040519080825280601f01601f191660200182016040528015620004f75781602001600182028036833780820191505090505b50600e908162000508919062000f81565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c620005436200055e640100000000026401000000009004565b60405162000552919062001328565b60405180910390a15050565b60606200060c600e8054620005739062000c13565b80601f0160208091040260200160405190810160405280929190818152602001828054620005a19062000c13565b8015620005f25780601f10620005c657610100808354040283529160200191620005f2565b820191906000526020600020905b815481529060010190602001808311620005d457829003601f168201915b505050505062000611640100000000026401000000009004565b905090565b606060006060600c6000600d54815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff1685516200066691906200134c565b6200067291906200134c565b67ffffffffffffffff8111156200068e576200068d620009a0565b5b6040519080825280601f01601f191660200182016040528015620006c15781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff16811015620007a1578260000160139054906101000a9004780100000000000000000000000000000000000000000000000002816008811062000723576200072262001387565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000028282815181106200075c576200075b62001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806200079890620013b6565b915050620006c7565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110620007eb57620007ea62001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806200082790620013b6565b91505060005b8551811015620008ff578581815181106200084d576200084c62001387565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838284620008a691906200134c565b81518110620008ba57620008b962001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620008f690620013b6565b9150506200082d565b50819350505050919050565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620009da826200098f565b810181811067ffffffffffffffff82111715620009fc57620009fb620009a0565b5b80604052505050565b600062000a1162000971565b905062000a1f8282620009cf565b919050565b600067ffffffffffffffff82111562000a425762000a41620009a0565b5b62000a4d826200098f565b9050602081019050919050565b60005b8381101562000a7a57808201518184015260208101905062000a5d565b60008484015250505050565b600062000a9d62000a978462000a24565b62000a05565b90508281526020810184848401111562000abc5762000abb6200098a565b5b62000ac984828562000a5a565b509392505050565b600082601f83011262000ae95762000ae862000985565b5b815162000afb84826020860162000a86565b91505092915050565b6000819050919050565b62000b198162000b04565b811462000b2557600080fd5b50565b60008151905062000b398162000b0e565b92915050565b60008060006060848603121562000b5b5762000b5a6200097b565b5b600084015167ffffffffffffffff81111562000b7c5762000b7b62000980565b5b62000b8a8682870162000ad1565b935050602084015167ffffffffffffffff81111562000bae5762000bad62000980565b5b62000bbc8682870162000ad1565b925050604062000bcf8682870162000b28565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000c2c57607f821691505b60208210810362000c425762000c4162000be4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000caf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c6d565b62000cbb868362000c6d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000d0862000d0262000cfc8462000cd3565b62000cdd565b62000cd3565b9050919050565b6000819050919050565b62000d248362000ce7565b62000d3c62000d338262000d0f565b84845462000c7d565b825550505050565b600090565b62000d5362000d44565b62000d6081848462000d19565b505050565b5b8181101562000d885762000d7c60008262000d49565b60018101905062000d66565b5050565b601f82111562000dd75762000da18162000c48565b62000dac8462000c5d565b8101602085101562000dbc578190505b62000dd462000dcb8562000c5d565b83018262000d65565b50505b505050565b60008160020a8304905092915050565b600062000dff6000198460080262000ddc565b1980831691505092915050565b600062000e1a838362000dec565b9150826002028217905092915050565b62000e358262000bd9565b67ffffffffffffffff81111562000e515762000e50620009a0565b5b62000e5d825462000c13565b62000e6a82828562000d8c565b600060209050601f83116001811462000ea2576000841562000e8d578287015190505b62000e99858262000e0c565b86555062000f09565b601f19841662000eb28662000c48565b60005b8281101562000edc5784890151825560018201915060208501945060208101905062000eb5565b8683101562000efc578489015162000ef8601f89168262000dec565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b60008190508160005260206000209050919050565b601f82111562000f7c5762000f468162000f1c565b62000f518462000c5d565b8101602085101562000f61578190505b62000f7962000f708562000c5d565b83018262000d65565b50505b505050565b62000f8c8262000f11565b67ffffffffffffffff81111562000fa85762000fa7620009a0565b5b62000fb4825462000c13565b62000fc182828562000f31565b600060209050601f83116001811462000ff9576000841562000fe4578287015190505b62000ff0858262000e0c565b86555062001060565b601f198416620010098662000f1c565b60005b8281101562001033578489015182556001820191506020850194506020810190506200100c565b868310156200105357848901516200104f601f89168262000dec565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b6000620010b160138362001068565b9150620010be8262001079565b602082019050919050565b60006020820190508181036000830152620010e481620010a2565b9050919050565b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200113482620010eb565b91506200114183620010eb565b92508282026200115181620010eb565b9150808214620011665762001165620010f8565b5b5092915050565b60006200117a82620010eb565b91506000820362001190576200118f620010f8565b5b600182039050919050565b6000620011a882620010eb565b9150620011b583620010eb565b9250828201905060ff811115620011d157620011d0620010f8565b5b92915050565b6000620011e482620010eb565b9150620011f183620010eb565b9250828203905060ff8111156200120d576200120c620010f8565b5b92915050565b6000819050602082019050919050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b60006200125d825162001223565b80915050919050565b6000620012738262000f11565b826200127f8462001213565b90506200128c816200124f565b92506010821015620012cf57620012ca7fffffffffffffffffffffffffffffffff000000000000000000000000000000008360100360080262000c6d565b831692505b5050919050565b600082825260208201905092915050565b6000620012f48262000f11565b620013008185620012d6565b93506200131281856020860162000a5a565b6200131d816200098f565b840191505092915050565b60006020820190508181036000830152620013448184620012e7565b905092915050565b6000620013598262000cd3565b9150620013668362000cd3565b9250828201905080821115620013815762001380620010f8565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000620013c38262000cd3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620013f857620013f7620010f8565b5b600182019050919050565b614ee880620014136000396000f3fe60806040526004361061022c576000357c01000000000000000000000000000000000000000000000000000000009004806395d89b4111610135578063b88d4fde116100bd578063d824ee4f1161008c578063d824ee4f14610855578063e8a7f4c514610892578063e985e9c5146108cf578063f117e1731461090c578063f9613ab2146109495761022c565b8063b88d4fde14610796578063c5bec6fc146107b2578063c87b56dd146107ef578063ccc094c21461082c5761022c565b8063adf288df11610104578063adf288df14610685578063b1a6afd3146106c2578063b238d603146106ed578063b242e5341461072e578063b5fdeb231461076b5761022c565b806395d89b41146105cb5780639a7c5e9f146105f6578063a22cb4651461061f578063ad0dec2f146106485761022c565b80634d03546a116101b85780636352211e116101875780636352211e146104ac5780636b9cb86a146104e957806370a082311461052657806386e90b59146105635780638da5cb5b146105a05761022c565b80634d03546a146103ca5780634f64b2be146104075780635344299a14610444578063559f5dc91461046d5761022c565b806323b872dd116101ff57806323b872dd1461030157806324e0febc1461031d57806340c84b0e1461035a57806342842e0e1461038557806349f2553a146103a15761022c565b806301ffc9a71461023157806306fdde031461026e578063081812fc1461029957806318160ddd146102d6575b600080fd5b34801561023d57600080fd5b5061025860048036038101906102539190613c81565b610986565b6040516102659190613cc9565b60405180910390f35b34801561027a57600080fd5b50610283610ada565b6040516102909190613d74565b60405180910390f35b3480156102a557600080fd5b506102c060048036038101906102bb9190613dcc565b610b68565b6040516102cd9190613e3a565b60405180910390f35b3480156102e257600080fd5b506102eb610ba5565b6040516102f89190613e64565b60405180910390f35b61031b60048036038101906103169190613eab565b610baf565b005b34801561032957600080fd5b50610344600480360381019061033f9190613f34565b610c1a565b6040516103519190613f70565b60405180910390f35b34801561036657600080fd5b5061036f610c32565b60405161037c9190613fe0565b60405180910390f35b61039f600480360381019061039a9190613eab565b610cc0565b005b3480156103ad57600080fd5b506103c860048036038101906103c39190614137565b610d2b565b005b3480156103d657600080fd5b506103f160048036038101906103ec91906141be565b611043565b6040516103fe9190613cc9565b60405180910390f35b34801561041357600080fd5b5061042e60048036038101906104299190613dcc565b6112cd565b60405161043b9190613f70565b60405180910390f35b34801561045057600080fd5b5061046b6004803603810190610466919061429f565b6112f1565b005b34801561047957600080fd5b50610494600480360381019061048f91906142e8565b61137d565b6040516104a393929190614337565b60405180910390f35b3480156104b857600080fd5b506104d360048036038101906104ce9190613dcc565b6113f1565b6040516104e09190613e3a565b60405180910390f35b3480156104f557600080fd5b50610510600480360381019061050b919061429f565b61142d565b60405161051d9190613d74565b60405180910390f35b34801561053257600080fd5b5061054d6004803603810190610548919061436e565b611646565b60405161055a9190613e64565b60405180910390f35b34801561056f57600080fd5b5061058a6004803603810190610585919061429f565b61168f565b6040516105979190613d74565b60405180910390f35b3480156105ac57600080fd5b506105b561193a565b6040516105c29190613e3a565b60405180910390f35b3480156105d757600080fd5b506105e061195e565b6040516105ed9190613d74565b60405180910390f35b34801561060257600080fd5b5061061d60048036038101906106189190613dcc565b6119ec565b005b34801561062b57600080fd5b50610646600480360381019061064191906143c7565b611add565b005b34801561065457600080fd5b5061066f600480360381019061066a919061429f565b611d7f565b60405161067c9190613fe0565b60405180910390f35b34801561069157600080fd5b506106ac60048036038101906106a79190614407565b612056565b6040516106b99190613f70565b60405180910390f35b3480156106ce57600080fd5b506106d7612274565b6040516106e49190613f70565b60405180910390f35b3480156106f957600080fd5b50610714600480360381019061070f9190613dcc565b61227a565b6040516107259594939291906144d9565b60405180910390f35b34801561073a57600080fd5b50610755600480360381019061075091906143c7565b612319565b6040516107629190613cc9565b60405180910390f35b34801561077757600080fd5b506107806123fa565b60405161078d9190613fe0565b60405180910390f35b6107b060048036038101906107ab919061452c565b612494565b005b3480156107be57600080fd5b506107d960048036038101906107d4919061429f565b61256f565b6040516107e69190613fe0565b60405180910390f35b3480156107fb57600080fd5b5061081660048036038101906108119190613dcc565b612928565b6040516108239190613d74565b60405180910390f35b34801561083857600080fd5b50610853600480360381019061084e919061461b565b612a7b565b005b34801561086157600080fd5b5061087c600480360381019061087791906146c4565b612d3d565b6040516108899190613f70565b60405180910390f35b34801561089e57600080fd5b506108b960048036038101906108b4919061429f565b612ef0565b6040516108c69190613fe0565b60405180910390f35b3480156108db57600080fd5b506108f660048036038101906108f19190614717565b6132a9565b6040516109039190613cc9565b60405180910390f35b34801561091857600080fd5b50610933600480360381019061092e9190614757565b613341565b6040516109409190613f70565b60405180910390f35b34801561095557600080fd5b50610970600480360381019061096b9190613f34565b613446565b60405161097d9190613f70565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109da5760019050610ad5565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a2c5760019050610ad5565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a7e5760019050610ad5565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ad05760019050610ad5565b600090505b919050565b60068054610ae7906147ed565b80601f0160208091040260200160405190810160405280929190818152602001828054610b13906147ed565b8015610b605780601f10610b3557610100808354040283529160200191610b60565b820191906000526020600020905b815481529060010190602001808311610b4357829003601f168201915b505050505081565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600854905090565b610bba8383836134f2565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60036020528060005260406000206000915090505481565b600a8054610c3f906147ed565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6b906147ed565b8015610cb85780601f10610c8d57610100808354040283529160200191610cb8565b820191906000526020600020905b815481529060010190602001808311610c9b57829003601f168201915b505050505081565b610ccb8383836134f2565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d8857600080fd5b82915081519050602f7f01000000000000000000000000000000000000000000000000000000000000000282600183610dc1919061484d565b81518110610dd257610dd1614881565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610e52578080610e4e906148b0565b9150505b8067ffffffffffffffff811115610e6c57610e6b61400c565b5b6040519080825280601f01601f191660200182016040528015610e9e5781602001600182028036833780820191505090505b50600a9081610ead9190614aaa565b5060005b8251811015610f9e57828181518110610ecd57610ecc614881565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600a828154610f25906147ed565b8110610f3457610f33614881565b5b815460011615610f535790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055508080610f96906148b0565b915050610eb1565b508151811461103e577f2f00000000000000000000000000000000000000000000000000000000000000600a83518154610fd7906147ed565b8110610fe657610fe5614881565b5b8154600116156110055790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461109e57600080fd5b6110a6613b7c565b600260008681526020019081526020016000208054905091506000821115611123576000600260008781526020019081526020016000206000815481106110f0576110ef614881565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161161112257600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060026000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff0219169083151502179055505050600185908060018154018082558091505060019003906000526020600020016000909190919091505560008465ffffffffffff16036112485760016008600082825461123c9190614b7c565b9250508190555061126a565b8365ffffffffffff16600860008282546112629190614b7c565b925050819055505b8365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c342876040516112b99190613f70565b60405180910390a360019250505092915050565b600181815481106112dd57600080fd5b906000526020600020016000915090505481565b6000600c6000600d54815260200190815260200160002090508060000160009054906101000a900460ff1660ff1682511461132b57600080fd5b81600e908161133a9190614aaa565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c6113646123fa565b6040516113719190613fe0565b60405180910390a15050565b6002602052816000526040600020818154811061139957600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b600080600360008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061143d85612ef0565b9150600a805461144c906147ed565b9050905080825161145d9190614b7c565b67ffffffffffffffff8111156114765761147561400c565b5b6040519080825280601f01601f1916602001820160405280156114a85781602001600182028036833780820191505090505b50925060005b8181101561156d57600a8181546114c4906147ed565b81106114d3576114d2614881565b5b8154600116156114f25790600052602060002090602091828204019190065b9054901a7f01000000000000000000000000000000000000000000000000000000000000000284828151811061152b5761152a614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611565906148b0565b9150506114ae565b5060005b825181101561163a5782818151811061158d5761158c614881565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028483815181106115ea576115e9614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180611624906148b0565b9250508080611632906148b0565b915050611571565b50829350505050919050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600060608060006116a18661256f565b9150600c6000600d54815260200190815260200160002093508360000160029054906101000a900460ff1660ff16905060018251826116e09190614b7c565b6116ea9190614b7c565b67ffffffffffffffff8111156117035761170261400c565b5b6040519080825280601f01601f1916602001820160405280156117355781602001600182028036833780820191505090505b50925060005b818110156117ef578460000160039054906101000a900470010000000000000000000000000000000002816010811061177757611776614881565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000028482815181106117ad576117ac614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806117e7906148b0565b91505061173b565b50603a7f01000000000000000000000000000000000000000000000000000000000000000283828151811061182757611826614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611861906148b0565b91505060005b825181101561192d5782818151811061188357611882614881565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028482846118da9190614b7c565b815181106118eb576118ea614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611925906148b0565b915050611867565b5082945050505050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6007805461196b906147ed565b80601f0160208091040260200160405190810160405280929190818152602001828054611997906147ed565b80156119e45780601f106119b9576101008083540402835291602001916119e4565b820191906000526020600020905b8154815290600101906020018083116119c757829003601f168201915b505050505081565b6000600c6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff1611611a2457600080fd5b81600d819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115611a5957611a5861400c565b5b6040519080825280601f01601f191660200182016040528015611a8b5781602001600182028036833780820191505090505b50600e9081611a9a9190614aaa565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c611ac46123fa565b604051611ad19190613fe0565b60405180910390a15050565b8015611bfe57600073ffffffffffffffffffffffffffffffffffffffff16600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b7b57600080fd5b81600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611d16565b600073ffffffffffffffffffffffffffffffffffffffff16600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611c9657600080fd5b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d739190613cc9565b60405180910390a35050565b606060006060600c6000600d54815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff168551611dd29190614b7c565b611ddc9190614b7c565b67ffffffffffffffff811115611df557611df461400c565b5b6040519080825280601f01601f191660200182016040528015611e275781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff16811015611efd578260000160139054906101000a90047801000000000000000000000000000000000000000000000000028160088110611e8557611e84614881565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110611ebb57611eba614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611ef5906148b0565b915050611e2d565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110611f4457611f43614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611f7e906148b0565b91505060005b855181101561204a57858181518110611fa057611f9f614881565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838284611ff79190614b7c565b8151811061200857612007614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080612042906148b0565b915050611f84565b50819350505050919050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120b157600080fd5b60016002600085815260200190815260200160002080549050146120d457600080fd5b6000600260008581526020019081526020016000206000815481106120fc576120fb614881565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161461212e57600080fd5b600060010260036000858152602001908152602001600020541461215157600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1690507fc000000000000000000000000000000000000000000000000000000000000000811790508060010260036000858152602001908152602001600020819055506001600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121fa9190614b7c565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885600190046040516122629190613e64565b60405180910390a38291505092915050565b60095481565b600c6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060000160039054906101000a900470010000000000000000000000000000000002908060000160139054906101000a9004780100000000000000000000000000000000000000000000000002905085565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461237457600080fd5b600060149054906101000a900460ff161561238e57600080fd5b81156123b0576001600060146101000a81548160ff0219169083151502179055505b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905092915050565b606061248f600e805461240c906147ed565b80601f0160208091040260200160405190810160405280929190818152602001828054612438906147ed565b80156124855780601f1061245a57610100808354040283529160200191612485565b820191906000526020600020905b81548152906001019060200180831161246857829003601f168201915b5050505050611d7f565b905090565b61249f8484846134f2565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e8461255490614bd5565b6040516125619190613f70565b60405180910390a450505050565b606080600080600285516125839190614c3c565b67ffffffffffffffff81111561259c5761259b61400c565b5b6040519080825280601f01601f1916602001820160405280156125ce5781602001600182028036833780820191505090505b5092506000905060005b602081101561291c57600460f08783815181106125f8576125f7614881565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff1610156126f75760308361268e9190614c7e565b7f0100000000000000000000000000000000000000000000000000000000000000028483815181106126c3576126c2614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612769565b6057836127049190614c7e565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061273957612738614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f86828151811061277e5761277d614881565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff16101561287c576030836128079190614c7e565b7f010000000000000000000000000000000000000000000000000000000000000002846001846128379190614b7c565b8151811061284857612847614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506128fa565b6057836128899190614c7e565b7f010000000000000000000000000000000000000000000000000000000000000002846001846128b99190614b7c565b815181106128ca576128c9614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b6002826129079190614b7c565b91508080612914906148b0565b9150506125d8565b50829350505050919050565b606060006060836001029150600060026000848152602001908152602001600020805490500361295e5761295b82613446565b91505b600060026000848152602001908152602001600020805490501161298157600080fd5b602067ffffffffffffffff81111561299c5761299b61400c565b5b6040519080825280601f01601f1916602001820160405280156129ce5781602001600182028036833780820191505090505b50905060005b6020811015612a68578281602081106129f0576129ef614881565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110612a2657612a25614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080612a60906148b0565b9150506129d4565b50612a728161142d565b92505050919050565b6060819050601081511115612ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abc90614cff565b60405180910390fd5b612acd613baf565b6000600790505b60008160ff1610612b29576000600882612aee9190614d1f565b60ff1660ff9060020a029050600086821667ffffffffffffffff161115612b155750612b29565b8180612b2090614d5c565b92505050612ad4565b600181612b369190614c7e565b826020019060ff16908160ff16815250506008816007612b569190614d85565b612b609190614d1f565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082612bec90614dcf565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600c60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b600080600260008581526020019081526020016000208361ffff1681548110612d6957612d68614881565b5b90600052602060002001905080600001600c9054906101000a900460ff1615612d9157600080fd5b60008361ffff16148015612dc3575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b15612e225760018160000160068282829054906101000a900465ffffffffffff16612dee9190614e36565b92506101000a81548165ffffffffffff021916908365ffffffffffff160217905550612e1a8585612056565b915050612ee9565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e7a57600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff1610612ec257600080fd5b612ee58585858460000160069054906101000a900465ffffffffffff1685613809565b9150505b9392505050565b60608060008060028551612f049190614c3c565b67ffffffffffffffff811115612f1d57612f1c61400c565b5b6040519080825280601f01601f191660200182016040528015612f4f5781602001600182028036833780820191505090505b5092506000905060005b602081101561329d57600460f0878381518110612f7957612f78614881565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff1610156130785760308361300f9190614c7e565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061304457613043614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506130ea565b6057836130859190614c7e565b7f0100000000000000000000000000000000000000000000000000000000000000028483815181106130ba576130b9614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f8682815181106130ff576130fe614881565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff1610156131fd576030836131889190614c7e565b7f010000000000000000000000000000000000000000000000000000000000000002846001846131b89190614b7c565b815181106131c9576131c8614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061327b565b60578361320a9190614c7e565b7f0100000000000000000000000000000000000000000000000000000000000000028460018461323a9190614b7c565b8151811061324b5761324a614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b6002826132889190614b7c565b91508080613295906148b0565b915050612f59565b50829350505050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600260008681526020019081526020016000208461ffff168154811061336d5761336c614881565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146133d157600080fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff16116133fc57600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff161061342e57600080fd5b61343b8686868685613809565b915050949350505050565b6000806003600084815260200190815260200160002054905061346881613a87565b61347157600080fd5b61347a81613ab9565b1561348857829150506134ed565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016135499190613e64565b602060405180830381865afa158015613566573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358a9190614e85565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146135c457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146136f8573373ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806136ee57503373ffffffffffffffffffffffffffffffffffffffff16600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6136f757600080fd5b5b60006004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506137558284613aeb565b6001600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137a5919061484d565b925050819055506001600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137fc9190614b7c565b9250508190555050505050565b6000806000807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008860019004169250603067ffffffffffffffff8861ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16831792508565ffffffffffff1683179250826001029050600060010260036000838152602001908152602001600020541461389c57600080fd5b84600001600c9054906101000a900460ff166138fe578460000160069054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff16146138fd57600185600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff886001900416915060b8829060020a0291507f8000000000000000000000000000000000000000000000000000000000000000821791508873ffffffffffffffffffffffffffffffffffffffff168217915060018560000160068282829054906101000a900465ffffffffffff1661397f9190614e36565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055508160010260036000838152602001908152602001600020819055506001600b60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a0c9190614b7c565b925050819055508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051613a709190613e64565b60405180910390a380935050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b600080836001029050600360008281526020019081526020016000205460019004915060008203613b1b57600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600360008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613c5e81613c29565b8114613c6957600080fd5b50565b600081359050613c7b81613c55565b92915050565b600060208284031215613c9757613c96613c1f565b5b6000613ca584828501613c6c565b91505092915050565b60008115159050919050565b613cc381613cae565b82525050565b6000602082019050613cde6000830184613cba565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d1e578082015181840152602081019050613d03565b60008484015250505050565b6000601f19601f8301169050919050565b6000613d4682613ce4565b613d508185613cef565b9350613d60818560208601613d00565b613d6981613d2a565b840191505092915050565b60006020820190508181036000830152613d8e8184613d3b565b905092915050565b6000819050919050565b613da981613d96565b8114613db457600080fd5b50565b600081359050613dc681613da0565b92915050565b600060208284031215613de257613de1613c1f565b5b6000613df084828501613db7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e2482613df9565b9050919050565b613e3481613e19565b82525050565b6000602082019050613e4f6000830184613e2b565b92915050565b613e5e81613d96565b82525050565b6000602082019050613e796000830184613e55565b92915050565b613e8881613e19565b8114613e9357600080fd5b50565b600081359050613ea581613e7f565b92915050565b600080600060608486031215613ec457613ec3613c1f565b5b6000613ed286828701613e96565b9350506020613ee386828701613e96565b9250506040613ef486828701613db7565b9150509250925092565b6000819050919050565b613f1181613efe565b8114613f1c57600080fd5b50565b600081359050613f2e81613f08565b92915050565b600060208284031215613f4a57613f49613c1f565b5b6000613f5884828501613f1f565b91505092915050565b613f6a81613efe565b82525050565b6000602082019050613f856000830184613f61565b92915050565b600081519050919050565b600082825260208201905092915050565b6000613fb282613f8b565b613fbc8185613f96565b9350613fcc818560208601613d00565b613fd581613d2a565b840191505092915050565b60006020820190508181036000830152613ffa8184613fa7565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61404482613d2a565b810181811067ffffffffffffffff821117156140635761406261400c565b5b80604052505050565b6000614076613c15565b9050614082828261403b565b919050565b600067ffffffffffffffff8211156140a2576140a161400c565b5b6140ab82613d2a565b9050602081019050919050565b82818337600083830152505050565b60006140da6140d584614087565b61406c565b9050828152602081018484840111156140f6576140f5614007565b5b6141018482856140b8565b509392505050565b600082601f83011261411e5761411d614002565b5b813561412e8482602086016140c7565b91505092915050565b60006020828403121561414d5761414c613c1f565b5b600082013567ffffffffffffffff81111561416b5761416a613c24565b5b61417784828501614109565b91505092915050565b600065ffffffffffff82169050919050565b61419b81614180565b81146141a657600080fd5b50565b6000813590506141b881614192565b92915050565b600080604083850312156141d5576141d4613c1f565b5b60006141e385828601613f1f565b92505060206141f4858286016141a9565b9150509250929050565b600067ffffffffffffffff8211156142195761421861400c565b5b61422282613d2a565b9050602081019050919050565b600061424261423d846141fe565b61406c565b90508281526020810184848401111561425e5761425d614007565b5b6142698482856140b8565b509392505050565b600082601f83011261428657614285614002565b5b813561429684826020860161422f565b91505092915050565b6000602082840312156142b5576142b4613c1f565b5b600082013567ffffffffffffffff8111156142d3576142d2613c24565b5b6142df84828501614271565b91505092915050565b600080604083850312156142ff576142fe613c1f565b5b600061430d85828601613f1f565b925050602061431e85828601613db7565b9150509250929050565b61433181614180565b82525050565b600060608201905061434c6000830186614328565b6143596020830185614328565b6143666040830184613cba565b949350505050565b60006020828403121561438457614383613c1f565b5b600061439284828501613e96565b91505092915050565b6143a481613cae565b81146143af57600080fd5b50565b6000813590506143c18161439b565b92915050565b600080604083850312156143de576143dd613c1f565b5b60006143ec85828601613e96565b92505060206143fd858286016143b2565b9150509250929050565b6000806040838503121561441e5761441d613c1f565b5b600061442c85828601613e96565b925050602061443d85828601613f1f565b9150509250929050565b600060ff82169050919050565b61445d81614447565b82525050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b61449881614463565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b6144d38161449e565b82525050565b600060a0820190506144ee6000830188614454565b6144fb6020830187614454565b6145086040830186614454565b614515606083018561448f565b61452260808301846144ca565b9695505050505050565b6000806000806080858703121561454657614545613c1f565b5b600061455487828801613e96565b945050602061456587828801613e96565b935050604061457687828801613db7565b925050606085013567ffffffffffffffff81111561459757614596613c24565b5b6145a387828801614271565b91505092959194509250565b6145b881614447565b81146145c357600080fd5b50565b6000813590506145d5816145af565b92915050565b600067ffffffffffffffff82169050919050565b6145f8816145db565b811461460357600080fd5b50565b600081359050614615816145ef565b92915050565b60008060006060848603121561463457614633613c1f565b5b6000614642868287016145c6565b935050602061465386828701614606565b925050604084013567ffffffffffffffff81111561467457614673613c24565b5b61468086828701614109565b9150509250925092565b600061ffff82169050919050565b6146a18161468a565b81146146ac57600080fd5b50565b6000813590506146be81614698565b92915050565b6000806000606084860312156146dd576146dc613c1f565b5b60006146eb86828701613e96565b93505060206146fc86828701613f1f565b925050604061470d868287016146af565b9150509250925092565b6000806040838503121561472e5761472d613c1f565b5b600061473c85828601613e96565b925050602061474d85828601613e96565b9150509250929050565b6000806000806080858703121561477157614770613c1f565b5b600061477f87828801613e96565b945050602061479087828801613f1f565b93505060406147a1878288016146af565b92505060606147b2878288016141a9565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061480557607f821691505b602082108103614818576148176147be565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061485882613d96565b915061486383613d96565b925082820390508181111561487b5761487a61481e565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006148bb82613d96565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148ed576148ec61481e565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830261495d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261491d565b614967868361491d565b95508019841693508086168417925050509392505050565b6000819050919050565b60006149a461499f61499a84613d96565b61497f565b613d96565b9050919050565b6000819050919050565b6149be83614989565b6149d26149ca826149ab565b84845461492d565b825550505050565b600090565b6149e76149da565b6149f28184846149b5565b505050565b5b81811015614a1657614a0b6000826149df565b6001810190506149f8565b5050565b601f821115614a5b57614a2c816148f8565b614a358461490d565b81016020851015614a44578190505b614a58614a508561490d565b8301826149f7565b50505b505050565b60008160020a8304905092915050565b6000614a8160001984600802614a60565b1980831691505092915050565b6000614a9a8383614a70565b9150826002028217905092915050565b614ab382613f8b565b67ffffffffffffffff811115614acc57614acb61400c565b5b614ad682546147ed565b614ae1828285614a1a565b600060209050601f831160018114614b145760008415614b02578287015190505b614b0c8582614a8e565b865550614b74565b601f198416614b22866148f8565b60005b82811015614b4a57848901518255600182019150602085019450602081019050614b25565b86831015614b675784890151614b63601f891682614a70565b8355505b6001600288020188555050505b505050505050565b6000614b8782613d96565b9150614b9283613d96565b9250828201905080821115614baa57614ba961481e565b5b92915050565b6000819050602082019050919050565b6000614bcc8251613efe565b80915050919050565b6000614be082613f8b565b82614bea84614bb0565b9050614bf581614bc0565b92506020821015614c3557614c307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8360200360080261491d565b831692505b5050919050565b6000614c4782613d96565b9150614c5283613d96565b9250828202614c6081613d96565b91508282048414831517614c7757614c7661481e565b5b5092915050565b6000614c8982614447565b9150614c9483614447565b9250828201905060ff811115614cad57614cac61481e565b5b92915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b6000614ce9601383613cef565b9150614cf482614cb3565b602082019050919050565b60006020820190508181036000830152614d1881614cdc565b9050919050565b6000614d2a82614447565b9150614d3583614447565b9250828202614d4381614447565b9150808214614d5557614d5461481e565b5b5092915050565b6000614d6782614447565b915060008203614d7a57614d7961481e565b5b600182039050919050565b6000614d9082614447565b9150614d9b83614447565b9250828203905060ff811115614db457614db361481e565b5b92915050565b6000614dc68251614463565b80915050919050565b6000614dda82613f8b565b82614de484614bb0565b9050614def81614dba565b92506010821015614e2f57614e2a7fffffffffffffffffffffffffffffffff000000000000000000000000000000008360100360080261491d565b831692505b5050919050565b6000614e4182614180565b9150614e4c83614180565b9250828201905065ffffffffffff811115614e6a57614e6961481e565b5b92915050565b600081519050614e7f81613e7f565b92915050565b600060208284031215614e9b57614e9a613c1f565b5b6000614ea984828501614e70565b9150509291505056fea264697066735822122005c4972e97f7f5b8236ab2edbb05c611d096a13cc0b55ae355e46b3019fadddd64736f6c63430008120033 +\ No newline at end of file diff --git a/js/contract/CraftNFT.json b/js/contract/CraftNFT.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bool","name":"_final","type":"bool"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"_multiHash","type":"bytes"}],"name":"Msg","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"uint8","name":"_length","type":"uint8"},{"internalType":"uint64","name":"_codecId","type":"uint64"},{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"addCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getMsg","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"multiCodecs","outputs":[{"internalType":"uint8","name":"l","type":"uint8"},{"internalType":"uint8","name":"codecRLength","type":"uint8"},{"internalType":"uint8","name":"prefixRLength","type":"uint8"},{"internalType":"bytes16","name":"prefix","type":"bytes16"},{"internalType":"bytes8","name":"codec","type":"bytes8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"setMsg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_codec","type":"uint256"}],"name":"setMsgCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toHash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bool","name":"_final","type":"bool"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/craft_nft/data/CraftNFT.bin b/python/craft_nft/data/CraftNFT.bin @@ -1 +1 @@ -60806040523480156200001157600080fd5b506040516200437a3803806200437a833981810160405281019062000037919062000279565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060098190555082600690816200008f919062000564565b508160079081620000a1919062000564565b505050506200064b565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200011482620000c9565b810181811067ffffffffffffffff82111715620001365762000135620000da565b5b80604052505050565b60006200014b620000ab565b905062000159828262000109565b919050565b600067ffffffffffffffff8211156200017c576200017b620000da565b5b6200018782620000c9565b9050602081019050919050565b60005b83811015620001b457808201518184015260208101905062000197565b60008484015250505050565b6000620001d7620001d1846200015e565b6200013f565b905082815260208101848484011115620001f657620001f5620000c4565b5b6200020384828562000194565b509392505050565b600082601f830112620002235762000222620000bf565b5b815162000235848260208601620001c0565b91505092915050565b6000819050919050565b62000253816200023e565b81146200025f57600080fd5b50565b600081519050620002738162000248565b92915050565b600080600060608486031215620002955762000294620000b5565b5b600084015167ffffffffffffffff811115620002b657620002b5620000ba565b5b620002c4868287016200020b565b935050602084015167ffffffffffffffff811115620002e857620002e7620000ba565b5b620002f6868287016200020b565b9250506040620003098682870162000262565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036657607f821691505b6020821081036200037c576200037b6200031e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620003e97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003a7565b620003f58683620003a7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004426200043c62000436846200040d565b62000417565b6200040d565b9050919050565b6000819050919050565b6200045e8362000421565b620004766200046d8262000449565b848454620003b7565b825550505050565b600090565b6200048d6200047e565b6200049a81848462000453565b505050565b5b81811015620004c257620004b660008262000483565b600181019050620004a0565b5050565b601f8211156200051157620004db8162000382565b620004e68462000397565b81016020851015620004f6578190505b6200050e620005058562000397565b8301826200049f565b50505b505050565b60008160020a8304905092915050565b6000620005396000198460080262000516565b1980831691505092915050565b600062000554838362000526565b9150826002028217905092915050565b6200056f8262000313565b67ffffffffffffffff8111156200058b576200058a620000da565b5b6200059782546200034d565b620005a4828285620004c6565b600060209050601f831160018114620005dc5760008415620005c7578287015190505b620005d3858262000546565b86555062000643565b601f198416620005ec8662000382565b60005b828110156200061657848901518255600182019150602085019450602081019050620005ef565b8683101562000636578489015162000632601f89168262000526565b8355505b6001600288020188555050505b505050505050565b613d1f806200065b6000396000f3fe6080604052600436106101df576000357c01000000000000000000000000000000000000000000000000000000009004806369e85c7111610114578063b242e534116100b2578063d824ee4f11610081578063d824ee4f146106e4578063e985e9c514610721578063f117e1731461075e578063f9613ab21461079b576101df565b8063b242e53414610611578063b88d4fde1461064e578063c87b56dd1461066a578063c9796c39146106a7576101df565b806395d89b41116100ee57806395d89b4114610555578063a22cb46514610580578063adf288df146105a9578063b1a6afd3146105e6576101df565b806369e85c71146104b057806370a08231146104ed5780638da5cb5b1461052a576101df565b806340c84b0e116101815780634d03546a1161015b5780634d03546a146103ba5780634f64b2be146103f7578063559f5dc9146104345780636352211e14610473576101df565b806340c84b0e1461034a57806342842e0e1461037557806349f2553a14610391576101df565b806318160ddd116101bd57806318160ddd1461028957806323b872dd146102b457806324e0febc146102d05780633fd2f5931461030d576101df565b806301ffc9a7146101e457806306fdde0314610221578063081812fc1461024c575b600080fd5b3480156101f057600080fd5b5061020b60048036038101906102069190612e79565b6107d8565b6040516102189190612ec1565b60405180910390f35b34801561022d57600080fd5b5061023661092c565b6040516102439190612f6c565b60405180910390f35b34801561025857600080fd5b50610273600480360381019061026e9190612fc4565b6109ba565b6040516102809190613032565b60405180910390f35b34801561029557600080fd5b5061029e6109f7565b6040516102ab919061305c565b60405180910390f35b6102ce60048036038101906102c991906130a3565b610a01565b005b3480156102dc57600080fd5b506102f760048036038101906102f2919061312c565b610a6c565b6040516103049190613168565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f919061312c565b610a84565b60405161034191906131d8565b60405180910390f35b34801561035657600080fd5b5061035f610de3565b60405161036c91906131d8565b60405180910390f35b61038f600480360381019061038a91906130a3565b610e71565b005b34801561039d57600080fd5b506103b860048036038101906103b3919061332f565b610edc565b005b3480156103c657600080fd5b506103e160048036038101906103dc91906133b6565b6111f4565b6040516103ee9190612ec1565b60405180910390f35b34801561040357600080fd5b5061041e60048036038101906104199190612fc4565b61147e565b60405161042b9190613168565b60405180910390f35b34801561044057600080fd5b5061045b600480360381019061045691906133f6565b6114a2565b60405161046a93929190613445565b60405180910390f35b34801561047f57600080fd5b5061049a60048036038101906104959190612fc4565b611516565b6040516104a79190613032565b60405180910390f35b3480156104bc57600080fd5b506104d760048036038101906104d2919061312c565b611552565b6040516104e49190612f6c565b60405180910390f35b3480156104f957600080fd5b50610514600480360381019061050f919061347c565b61176b565b604051610521919061305c565b60405180910390f35b34801561053657600080fd5b5061053f6117b4565b60405161054c9190613032565b60405180910390f35b34801561056157600080fd5b5061056a6117d8565b6040516105779190612f6c565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a291906134d5565b611866565b005b3480156105b557600080fd5b506105d060048036038101906105cb9190613515565b611b08565b6040516105dd9190613168565b60405180910390f35b3480156105f257600080fd5b506105fb611d26565b6040516106089190613168565b60405180910390f35b34801561061d57600080fd5b50610638600480360381019061063391906134d5565b611d2c565b6040516106459190612ec1565b60405180910390f35b610668600480360381019061066391906135f6565b611e0d565b005b34801561067657600080fd5b50610691600480360381019061068c9190612fc4565b611ee8565b60405161069e9190612f6c565b60405180910390f35b3480156106b357600080fd5b506106ce60048036038101906106c9919061312c565b611f5a565b6040516106db9190612f6c565b60405180910390f35b3480156106f057600080fd5b5061070b600480360381019061070691906136b3565b612354565b6040516107189190613168565b60405180910390f35b34801561072d57600080fd5b5061074860048036038101906107439190613706565b612507565b6040516107559190612ec1565b60405180910390f35b34801561076a57600080fd5b5061078560048036038101906107809190613746565b61259f565b6040516107929190613168565b60405180910390f35b3480156107a757600080fd5b506107c260048036038101906107bd919061312c565b6126a4565b6040516107cf9190613168565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361082c5760019050610927565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361087e5760019050610927565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036108d05760019050610927565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109225760019050610927565b600090505b919050565b60068054610939906137dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610965906137dc565b80156109b25780601f10610987576101008083540402835291602001916109b2565b820191906000526020600020905b81548152906001019060200180831161099557829003601f168201915b505050505081565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600854905090565b610a0c838383612750565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60036020528060005260406000206000915090505481565b606080600080604067ffffffffffffffff811115610aa557610aa4613204565b5b6040519080825280601f01601f191660200182016040528015610ad75781602001600182028036833780820191505090505b5092506000905060005b6020811015610dd757600460f0878360208110610b0157610b0061380d565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015610bd957603083610b709190613878565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610ba557610ba461380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610c4b565b605783610be69190613878565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110610c1b57610c1a61380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868260208110610c6057610c5f61380d565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015610d3757603083610cc29190613878565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610cf291906138ad565b81518110610d0357610d0261380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610db5565b605783610d449190613878565b7f01000000000000000000000000000000000000000000000000000000000000000284600184610d7491906138ad565b81518110610d8557610d8461380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282610dc291906138ad565b91508080610dcf906138e1565b915050610ae1565b50829350505050919050565b600a8054610df0906137dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1c906137dc565b8015610e695780601f10610e3e57610100808354040283529160200191610e69565b820191906000526020600020905b815481529060010190602001808311610e4c57829003601f168201915b505050505081565b610e7c838383612750565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f3957600080fd5b82915081519050602f7f01000000000000000000000000000000000000000000000000000000000000000282600183610f729190613929565b81518110610f8357610f8261380d565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611003578080610fff906138e1565b9150505b8067ffffffffffffffff81111561101d5761101c613204565b5b6040519080825280601f01601f19166020018201604052801561104f5781602001600182028036833780820191505090505b50600a908161105e9190613b0f565b5060005b825181101561114f5782818151811061107e5761107d61380d565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600a8281546110d6906137dc565b81106110e5576110e461380d565b5b8154600116156111045790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055508080611147906138e1565b915050611062565b50815181146111ef577f2f00000000000000000000000000000000000000000000000000000000000000600a83518154611188906137dc565b81106111975761119661380d565b5b8154600116156111b65790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461124f57600080fd5b611257612dda565b6002600086815260200190815260200160002080549050915060008211156112d4576000600260008781526020019081526020016000206000815481106112a1576112a061380d565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff16116112d357600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060026000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff0219169083151502179055505050600185908060018154018082558091505060019003906000526020600020016000909190919091505560008465ffffffffffff16036113f9576001600860008282546113ed91906138ad565b9250508190555061141b565b8365ffffffffffff166008600082825461141391906138ad565b925050819055505b8365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c3428760405161146a9190613168565b60405180910390a360019250505092915050565b6001818154811061148e57600080fd5b906000526020600020016000915090505481565b600260205281600052604060002081815481106114be57600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b600080600360008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061156285610a84565b9150600a8054611571906137dc565b9050905080825161158291906138ad565b67ffffffffffffffff81111561159b5761159a613204565b5b6040519080825280601f01601f1916602001820160405280156115cd5781602001600182028036833780820191505090505b50925060005b8181101561169257600a8181546115e9906137dc565b81106115f8576115f761380d565b5b8154600116156116175790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000028482815181106116505761164f61380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061168a906138e1565b9150506115d3565b5060005b825181101561175f578281815181106116b2576116b161380d565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000284838151811061170f5761170e61380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180611749906138e1565b9250508080611757906138e1565b915050611696565b50829350505050919050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600780546117e5906137dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611811906137dc565b801561185e5780601f106118335761010080835404028352916020019161185e565b820191906000526020600020905b81548152906001019060200180831161184157829003601f168201915b505050505081565b801561198757600073ffffffffffffffffffffffffffffffffffffffff16600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461190457600080fd5b81600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611a9f565b600073ffffffffffffffffffffffffffffffffffffffff16600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611a1f57600080fd5b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611afc9190612ec1565b60405180910390a35050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b6357600080fd5b6001600260008581526020019081526020016000208054905014611b8657600080fd5b600060026000858152602001908152602001600020600081548110611bae57611bad61380d565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff1614611be057600080fd5b6000600102600360008581526020019081526020016000205414611c0357600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1690507fc000000000000000000000000000000000000000000000000000000000000000811790508060010260036000858152602001908152602001600020819055506001600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cac91906138ad565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560019004604051611d14919061305c565b60405180910390a38291505092915050565b60095481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d8757600080fd5b600060149054906101000a900460ff1615611da157600080fd5b8115611dc3576001600060146101000a81548160ff0219169083151502179055505b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905092915050565b611e18848484612750565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e84611ecd90613c06565b604051611eda9190613168565b60405180910390a450505050565b606060008260010290506000600260008381526020019081526020016000208054905003611f2357611f19816126a4565b9050806001900492505b6000600260008381526020019081526020016000208054905011611f4657600080fd5b611f5283600102611552565b915050919050565b60608060606000611f6a85610a84565b9150604767ffffffffffffffff811115611f8757611f86613204565b5b6040519080825280601f01601f191660200182016040528015611fb95781602001600182028036833780820191505090505b5092507f730000000000000000000000000000000000000000000000000000000000000083600081518110611ff157611ff061380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f6800000000000000000000000000000000000000000000000000000000000000836001815181106120555761205461380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f6100000000000000000000000000000000000000000000000000000000000000836002815181106120b9576120b861380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f32000000000000000000000000000000000000000000000000000000000000008360038151811061211d5761211c61380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3500000000000000000000000000000000000000000000000000000000000000836004815181106121815761218061380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3600000000000000000000000000000000000000000000000000000000000000836005815181106121e5576121e461380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f3a00000000000000000000000000000000000000000000000000000000000000836006815181106122495761224861380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506007905060005b60408110156123485782818151811061229b5761229a61380d565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028483815181106122f8576122f761380d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180612332906138e1565b9250508080612340906138e1565b91505061227f565b50829350505050919050565b600080600260008581526020019081526020016000208361ffff16815481106123805761237f61380d565b5b90600052602060002001905080600001600c9054906101000a900460ff16156123a857600080fd5b60008361ffff161480156123da575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b156124395760018160000160068282829054906101000a900465ffffffffffff166124059190613c6d565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055506124318585611b08565b915050612500565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461249157600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff16106124d957600080fd5b6124fc8585858460000160069054906101000a900465ffffffffffff1685612a67565b9150505b9392505050565b60008173ffffffffffffffffffffffffffffffffffffffff16600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600260008681526020019081526020016000208461ffff16815481106125cb576125ca61380d565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461262f57600080fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff161161265a57600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff161061268c57600080fd5b6126998686868685612a67565b915050949350505050565b600080600360008481526020019081526020016000205490506126c681612ce5565b6126cf57600080fd5b6126d881612d17565b156126e6578291505061274b565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016127a7919061305c565b602060405180830381865afa1580156127c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e89190613cbc565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461282257600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612956573373ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061294c57503373ffffffffffffffffffffffffffffffffffffffff16600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61295557600080fd5b5b60006004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506129b38284612d49565b6001600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a039190613929565b925050819055506001600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a5a91906138ad565b9250508190555050505050565b6000806000807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008860019004169250603067ffffffffffffffff8861ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16831792508565ffffffffffff16831792508260010290506000600102600360008381526020019081526020016000205414612afa57600080fd5b84600001600c9054906101000a900460ff16612b5c578460000160069054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff1614612b5b57600185600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff886001900416915060b8829060020a0291507f8000000000000000000000000000000000000000000000000000000000000000821791508873ffffffffffffffffffffffffffffffffffffffff168217915060018560000160068282829054906101000a900465ffffffffffff16612bdd9190613c6d565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055508160010260036000838152602001908152602001600020819055506001600b60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c6a91906138ad565b925050819055508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051612cce919061305c565b60405180910390a380935050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b600080836001029050600360008281526020019081526020016000205460019004915060008203612d7957600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600360008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e5681612e21565b8114612e6157600080fd5b50565b600081359050612e7381612e4d565b92915050565b600060208284031215612e8f57612e8e612e17565b5b6000612e9d84828501612e64565b91505092915050565b60008115159050919050565b612ebb81612ea6565b82525050565b6000602082019050612ed66000830184612eb2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f16578082015181840152602081019050612efb565b60008484015250505050565b6000601f19601f8301169050919050565b6000612f3e82612edc565b612f488185612ee7565b9350612f58818560208601612ef8565b612f6181612f22565b840191505092915050565b60006020820190508181036000830152612f868184612f33565b905092915050565b6000819050919050565b612fa181612f8e565b8114612fac57600080fd5b50565b600081359050612fbe81612f98565b92915050565b600060208284031215612fda57612fd9612e17565b5b6000612fe884828501612faf565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061301c82612ff1565b9050919050565b61302c81613011565b82525050565b60006020820190506130476000830184613023565b92915050565b61305681612f8e565b82525050565b6000602082019050613071600083018461304d565b92915050565b61308081613011565b811461308b57600080fd5b50565b60008135905061309d81613077565b92915050565b6000806000606084860312156130bc576130bb612e17565b5b60006130ca8682870161308e565b93505060206130db8682870161308e565b92505060406130ec86828701612faf565b9150509250925092565b6000819050919050565b613109816130f6565b811461311457600080fd5b50565b60008135905061312681613100565b92915050565b60006020828403121561314257613141612e17565b5b600061315084828501613117565b91505092915050565b613162816130f6565b82525050565b600060208201905061317d6000830184613159565b92915050565b600081519050919050565b600082825260208201905092915050565b60006131aa82613183565b6131b4818561318e565b93506131c4818560208601612ef8565b6131cd81612f22565b840191505092915050565b600060208201905081810360008301526131f2818461319f565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61323c82612f22565b810181811067ffffffffffffffff8211171561325b5761325a613204565b5b80604052505050565b600061326e612e0d565b905061327a8282613233565b919050565b600067ffffffffffffffff82111561329a57613299613204565b5b6132a382612f22565b9050602081019050919050565b82818337600083830152505050565b60006132d26132cd8461327f565b613264565b9050828152602081018484840111156132ee576132ed6131ff565b5b6132f98482856132b0565b509392505050565b600082601f830112613316576133156131fa565b5b81356133268482602086016132bf565b91505092915050565b60006020828403121561334557613344612e17565b5b600082013567ffffffffffffffff81111561336357613362612e1c565b5b61336f84828501613301565b91505092915050565b600065ffffffffffff82169050919050565b61339381613378565b811461339e57600080fd5b50565b6000813590506133b08161338a565b92915050565b600080604083850312156133cd576133cc612e17565b5b60006133db85828601613117565b92505060206133ec858286016133a1565b9150509250929050565b6000806040838503121561340d5761340c612e17565b5b600061341b85828601613117565b925050602061342c85828601612faf565b9150509250929050565b61343f81613378565b82525050565b600060608201905061345a6000830186613436565b6134676020830185613436565b6134746040830184612eb2565b949350505050565b60006020828403121561349257613491612e17565b5b60006134a08482850161308e565b91505092915050565b6134b281612ea6565b81146134bd57600080fd5b50565b6000813590506134cf816134a9565b92915050565b600080604083850312156134ec576134eb612e17565b5b60006134fa8582860161308e565b925050602061350b858286016134c0565b9150509250929050565b6000806040838503121561352c5761352b612e17565b5b600061353a8582860161308e565b925050602061354b85828601613117565b9150509250929050565b600067ffffffffffffffff8211156135705761356f613204565b5b61357982612f22565b9050602081019050919050565b600061359961359484613555565b613264565b9050828152602081018484840111156135b5576135b46131ff565b5b6135c08482856132b0565b509392505050565b600082601f8301126135dd576135dc6131fa565b5b81356135ed848260208601613586565b91505092915050565b600080600080608085870312156136105761360f612e17565b5b600061361e8782880161308e565b945050602061362f8782880161308e565b935050604061364087828801612faf565b925050606085013567ffffffffffffffff81111561366157613660612e1c565b5b61366d878288016135c8565b91505092959194509250565b600061ffff82169050919050565b61369081613679565b811461369b57600080fd5b50565b6000813590506136ad81613687565b92915050565b6000806000606084860312156136cc576136cb612e17565b5b60006136da8682870161308e565b93505060206136eb86828701613117565b92505060406136fc8682870161369e565b9150509250925092565b6000806040838503121561371d5761371c612e17565b5b600061372b8582860161308e565b925050602061373c8582860161308e565b9150509250929050565b600080600080608085870312156137605761375f612e17565b5b600061376e8782880161308e565b945050602061377f87828801613117565b93505060406137908782880161369e565b92505060606137a1878288016133a1565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806137f457607f821691505b602082108103613807576138066137ad565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138838261383c565b915061388e8361383c565b9250828201905060ff8111156138a7576138a6613849565b5b92915050565b60006138b882612f8e565b91506138c383612f8e565b92508282019050808211156138db576138da613849565b5b92915050565b60006138ec82612f8e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361391e5761391d613849565b5b600182019050919050565b600061393482612f8e565b915061393f83612f8e565b925082820390508181111561395757613956613849565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b6000600883026139c27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613982565b6139cc8683613982565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613a09613a046139ff84612f8e565b6139e4565b612f8e565b9050919050565b6000819050919050565b613a23836139ee565b613a37613a2f82613a10565b848454613992565b825550505050565b600090565b613a4c613a3f565b613a57818484613a1a565b505050565b5b81811015613a7b57613a70600082613a44565b600181019050613a5d565b5050565b601f821115613ac057613a918161395d565b613a9a84613972565b81016020851015613aa9578190505b613abd613ab585613972565b830182613a5c565b50505b505050565b60008160020a8304905092915050565b6000613ae660001984600802613ac5565b1980831691505092915050565b6000613aff8383613ad5565b9150826002028217905092915050565b613b1882613183565b67ffffffffffffffff811115613b3157613b30613204565b5b613b3b82546137dc565b613b46828285613a7f565b600060209050601f831160018114613b795760008415613b67578287015190505b613b718582613af3565b865550613bd9565b601f198416613b878661395d565b60005b82811015613baf57848901518255600182019150602085019450602081019050613b8a565b86831015613bcc5784890151613bc8601f891682613ad5565b8355505b6001600288020188555050505b505050505050565b6000819050602082019050919050565b6000613bfd82516130f6565b80915050919050565b6000613c1182613183565b82613c1b84613be1565b9050613c2681613bf1565b92506020821015613c6657613c617fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802613982565b831692505b5050919050565b6000613c7882613378565b9150613c8383613378565b9250828201905065ffffffffffff811115613ca157613ca0613849565b5b92915050565b600081519050613cb681613077565b92915050565b600060208284031215613cd257613cd1612e17565b5b6000613ce084828501613ca7565b9150509291505056fea2646970667358221220a61ab7da49ebc6608666d52010ac708bffa9f8c1c0c76f149381a0a6304083bd64736f6c63430008110033 -\ No newline at end of file +60806040523480156200001157600080fd5b50604051620062fb380380620062fb833981810160405281019062000037919062000b3f565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060098190555082600690816200008f919062000e2a565b508160079081620000a1919062000e2a565b50620000f5602060126040518060400160405280600681526020017f73686132353600000000000000000000000000000000000000000000000000008152506200017c640100000000026401000000009004565b62000110601262000453640100000000026401000000009004565b602067ffffffffffffffff8111156200012e576200012d620009a0565b5b6040519080825280601f01601f191660200182016040528015620001615781602001600182028036833780820191505090505b50600e908162000172919062000f81565b5050505062001403565b6060819050601081511115620001c9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001c090620010c9565b60405180910390fd5b620001d36200090b565b6000600790505b60008160ff161062000237576000600882620001f7919062001127565b60ff1660ff9060020a029050600086821667ffffffffffffffff16111562000220575062000237565b81806200022d906200116d565b92505050620001da565b6001816200024691906200119b565b826020019060ff16908160ff16815250506008816007620002689190620011d7565b62000274919062001127565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082620003029062001266565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600c60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b6000600c6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff16116200048c57600080fd5b81600d819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115620004c457620004c3620009a0565b5b6040519080825280601f01601f191660200182016040528015620004f75781602001600182028036833780820191505090505b50600e908162000508919062000f81565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c620005436200055e640100000000026401000000009004565b60405162000552919062001328565b60405180910390a15050565b60606200060c600e8054620005739062000c13565b80601f0160208091040260200160405190810160405280929190818152602001828054620005a19062000c13565b8015620005f25780601f10620005c657610100808354040283529160200191620005f2565b820191906000526020600020905b815481529060010190602001808311620005d457829003601f168201915b505050505062000611640100000000026401000000009004565b905090565b606060006060600c6000600d54815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff1685516200066691906200134c565b6200067291906200134c565b67ffffffffffffffff8111156200068e576200068d620009a0565b5b6040519080825280601f01601f191660200182016040528015620006c15781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff16811015620007a1578260000160139054906101000a9004780100000000000000000000000000000000000000000000000002816008811062000723576200072262001387565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000028282815181106200075c576200075b62001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806200079890620013b6565b915050620006c7565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110620007eb57620007ea62001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806200082790620013b6565b91505060005b8551811015620008ff578581815181106200084d576200084c62001387565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838284620008a691906200134c565b81518110620008ba57620008b962001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620008f690620013b6565b9150506200082d565b50819350505050919050565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620009da826200098f565b810181811067ffffffffffffffff82111715620009fc57620009fb620009a0565b5b80604052505050565b600062000a1162000971565b905062000a1f8282620009cf565b919050565b600067ffffffffffffffff82111562000a425762000a41620009a0565b5b62000a4d826200098f565b9050602081019050919050565b60005b8381101562000a7a57808201518184015260208101905062000a5d565b60008484015250505050565b600062000a9d62000a978462000a24565b62000a05565b90508281526020810184848401111562000abc5762000abb6200098a565b5b62000ac984828562000a5a565b509392505050565b600082601f83011262000ae95762000ae862000985565b5b815162000afb84826020860162000a86565b91505092915050565b6000819050919050565b62000b198162000b04565b811462000b2557600080fd5b50565b60008151905062000b398162000b0e565b92915050565b60008060006060848603121562000b5b5762000b5a6200097b565b5b600084015167ffffffffffffffff81111562000b7c5762000b7b62000980565b5b62000b8a8682870162000ad1565b935050602084015167ffffffffffffffff81111562000bae5762000bad62000980565b5b62000bbc8682870162000ad1565b925050604062000bcf8682870162000b28565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000c2c57607f821691505b60208210810362000c425762000c4162000be4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000caf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c6d565b62000cbb868362000c6d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000d0862000d0262000cfc8462000cd3565b62000cdd565b62000cd3565b9050919050565b6000819050919050565b62000d248362000ce7565b62000d3c62000d338262000d0f565b84845462000c7d565b825550505050565b600090565b62000d5362000d44565b62000d6081848462000d19565b505050565b5b8181101562000d885762000d7c60008262000d49565b60018101905062000d66565b5050565b601f82111562000dd75762000da18162000c48565b62000dac8462000c5d565b8101602085101562000dbc578190505b62000dd462000dcb8562000c5d565b83018262000d65565b50505b505050565b60008160020a8304905092915050565b600062000dff6000198460080262000ddc565b1980831691505092915050565b600062000e1a838362000dec565b9150826002028217905092915050565b62000e358262000bd9565b67ffffffffffffffff81111562000e515762000e50620009a0565b5b62000e5d825462000c13565b62000e6a82828562000d8c565b600060209050601f83116001811462000ea2576000841562000e8d578287015190505b62000e99858262000e0c565b86555062000f09565b601f19841662000eb28662000c48565b60005b8281101562000edc5784890151825560018201915060208501945060208101905062000eb5565b8683101562000efc578489015162000ef8601f89168262000dec565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b60008190508160005260206000209050919050565b601f82111562000f7c5762000f468162000f1c565b62000f518462000c5d565b8101602085101562000f61578190505b62000f7962000f708562000c5d565b83018262000d65565b50505b505050565b62000f8c8262000f11565b67ffffffffffffffff81111562000fa85762000fa7620009a0565b5b62000fb4825462000c13565b62000fc182828562000f31565b600060209050601f83116001811462000ff9576000841562000fe4578287015190505b62000ff0858262000e0c565b86555062001060565b601f198416620010098662000f1c565b60005b8281101562001033578489015182556001820191506020850194506020810190506200100c565b868310156200105357848901516200104f601f89168262000dec565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b6000620010b160138362001068565b9150620010be8262001079565b602082019050919050565b60006020820190508181036000830152620010e481620010a2565b9050919050565b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200113482620010eb565b91506200114183620010eb565b92508282026200115181620010eb565b9150808214620011665762001165620010f8565b5b5092915050565b60006200117a82620010eb565b91506000820362001190576200118f620010f8565b5b600182039050919050565b6000620011a882620010eb565b9150620011b583620010eb565b9250828201905060ff811115620011d157620011d0620010f8565b5b92915050565b6000620011e482620010eb565b9150620011f183620010eb565b9250828203905060ff8111156200120d576200120c620010f8565b5b92915050565b6000819050602082019050919050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b60006200125d825162001223565b80915050919050565b6000620012738262000f11565b826200127f8462001213565b90506200128c816200124f565b92506010821015620012cf57620012ca7fffffffffffffffffffffffffffffffff000000000000000000000000000000008360100360080262000c6d565b831692505b5050919050565b600082825260208201905092915050565b6000620012f48262000f11565b620013008185620012d6565b93506200131281856020860162000a5a565b6200131d816200098f565b840191505092915050565b60006020820190508181036000830152620013448184620012e7565b905092915050565b6000620013598262000cd3565b9150620013668362000cd3565b9250828201905080821115620013815762001380620010f8565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000620013c38262000cd3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620013f857620013f7620010f8565b5b600182019050919050565b614ee880620014136000396000f3fe60806040526004361061022c576000357c01000000000000000000000000000000000000000000000000000000009004806395d89b4111610135578063b88d4fde116100bd578063d824ee4f1161008c578063d824ee4f14610855578063e8a7f4c514610892578063e985e9c5146108cf578063f117e1731461090c578063f9613ab2146109495761022c565b8063b88d4fde14610796578063c5bec6fc146107b2578063c87b56dd146107ef578063ccc094c21461082c5761022c565b8063adf288df11610104578063adf288df14610685578063b1a6afd3146106c2578063b238d603146106ed578063b242e5341461072e578063b5fdeb231461076b5761022c565b806395d89b41146105cb5780639a7c5e9f146105f6578063a22cb4651461061f578063ad0dec2f146106485761022c565b80634d03546a116101b85780636352211e116101875780636352211e146104ac5780636b9cb86a146104e957806370a082311461052657806386e90b59146105635780638da5cb5b146105a05761022c565b80634d03546a146103ca5780634f64b2be146104075780635344299a14610444578063559f5dc91461046d5761022c565b806323b872dd116101ff57806323b872dd1461030157806324e0febc1461031d57806340c84b0e1461035a57806342842e0e1461038557806349f2553a146103a15761022c565b806301ffc9a71461023157806306fdde031461026e578063081812fc1461029957806318160ddd146102d6575b600080fd5b34801561023d57600080fd5b5061025860048036038101906102539190613c81565b610986565b6040516102659190613cc9565b60405180910390f35b34801561027a57600080fd5b50610283610ada565b6040516102909190613d74565b60405180910390f35b3480156102a557600080fd5b506102c060048036038101906102bb9190613dcc565b610b68565b6040516102cd9190613e3a565b60405180910390f35b3480156102e257600080fd5b506102eb610ba5565b6040516102f89190613e64565b60405180910390f35b61031b60048036038101906103169190613eab565b610baf565b005b34801561032957600080fd5b50610344600480360381019061033f9190613f34565b610c1a565b6040516103519190613f70565b60405180910390f35b34801561036657600080fd5b5061036f610c32565b60405161037c9190613fe0565b60405180910390f35b61039f600480360381019061039a9190613eab565b610cc0565b005b3480156103ad57600080fd5b506103c860048036038101906103c39190614137565b610d2b565b005b3480156103d657600080fd5b506103f160048036038101906103ec91906141be565b611043565b6040516103fe9190613cc9565b60405180910390f35b34801561041357600080fd5b5061042e60048036038101906104299190613dcc565b6112cd565b60405161043b9190613f70565b60405180910390f35b34801561045057600080fd5b5061046b6004803603810190610466919061429f565b6112f1565b005b34801561047957600080fd5b50610494600480360381019061048f91906142e8565b61137d565b6040516104a393929190614337565b60405180910390f35b3480156104b857600080fd5b506104d360048036038101906104ce9190613dcc565b6113f1565b6040516104e09190613e3a565b60405180910390f35b3480156104f557600080fd5b50610510600480360381019061050b919061429f565b61142d565b60405161051d9190613d74565b60405180910390f35b34801561053257600080fd5b5061054d6004803603810190610548919061436e565b611646565b60405161055a9190613e64565b60405180910390f35b34801561056f57600080fd5b5061058a6004803603810190610585919061429f565b61168f565b6040516105979190613d74565b60405180910390f35b3480156105ac57600080fd5b506105b561193a565b6040516105c29190613e3a565b60405180910390f35b3480156105d757600080fd5b506105e061195e565b6040516105ed9190613d74565b60405180910390f35b34801561060257600080fd5b5061061d60048036038101906106189190613dcc565b6119ec565b005b34801561062b57600080fd5b50610646600480360381019061064191906143c7565b611add565b005b34801561065457600080fd5b5061066f600480360381019061066a919061429f565b611d7f565b60405161067c9190613fe0565b60405180910390f35b34801561069157600080fd5b506106ac60048036038101906106a79190614407565b612056565b6040516106b99190613f70565b60405180910390f35b3480156106ce57600080fd5b506106d7612274565b6040516106e49190613f70565b60405180910390f35b3480156106f957600080fd5b50610714600480360381019061070f9190613dcc565b61227a565b6040516107259594939291906144d9565b60405180910390f35b34801561073a57600080fd5b50610755600480360381019061075091906143c7565b612319565b6040516107629190613cc9565b60405180910390f35b34801561077757600080fd5b506107806123fa565b60405161078d9190613fe0565b60405180910390f35b6107b060048036038101906107ab919061452c565b612494565b005b3480156107be57600080fd5b506107d960048036038101906107d4919061429f565b61256f565b6040516107e69190613fe0565b60405180910390f35b3480156107fb57600080fd5b5061081660048036038101906108119190613dcc565b612928565b6040516108239190613d74565b60405180910390f35b34801561083857600080fd5b50610853600480360381019061084e919061461b565b612a7b565b005b34801561086157600080fd5b5061087c600480360381019061087791906146c4565b612d3d565b6040516108899190613f70565b60405180910390f35b34801561089e57600080fd5b506108b960048036038101906108b4919061429f565b612ef0565b6040516108c69190613fe0565b60405180910390f35b3480156108db57600080fd5b506108f660048036038101906108f19190614717565b6132a9565b6040516109039190613cc9565b60405180910390f35b34801561091857600080fd5b50610933600480360381019061092e9190614757565b613341565b6040516109409190613f70565b60405180910390f35b34801561095557600080fd5b50610970600480360381019061096b9190613f34565b613446565b60405161097d9190613f70565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109da5760019050610ad5565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a2c5760019050610ad5565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a7e5760019050610ad5565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ad05760019050610ad5565b600090505b919050565b60068054610ae7906147ed565b80601f0160208091040260200160405190810160405280929190818152602001828054610b13906147ed565b8015610b605780601f10610b3557610100808354040283529160200191610b60565b820191906000526020600020905b815481529060010190602001808311610b4357829003601f168201915b505050505081565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600854905090565b610bba8383836134f2565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60036020528060005260406000206000915090505481565b600a8054610c3f906147ed565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6b906147ed565b8015610cb85780601f10610c8d57610100808354040283529160200191610cb8565b820191906000526020600020905b815481529060010190602001808311610c9b57829003601f168201915b505050505081565b610ccb8383836134f2565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d8857600080fd5b82915081519050602f7f01000000000000000000000000000000000000000000000000000000000000000282600183610dc1919061484d565b81518110610dd257610dd1614881565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610e52578080610e4e906148b0565b9150505b8067ffffffffffffffff811115610e6c57610e6b61400c565b5b6040519080825280601f01601f191660200182016040528015610e9e5781602001600182028036833780820191505090505b50600a9081610ead9190614aaa565b5060005b8251811015610f9e57828181518110610ecd57610ecc614881565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600a828154610f25906147ed565b8110610f3457610f33614881565b5b815460011615610f535790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055508080610f96906148b0565b915050610eb1565b508151811461103e577f2f00000000000000000000000000000000000000000000000000000000000000600a83518154610fd7906147ed565b8110610fe657610fe5614881565b5b8154600116156110055790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461109e57600080fd5b6110a6613b7c565b600260008681526020019081526020016000208054905091506000821115611123576000600260008781526020019081526020016000206000815481106110f0576110ef614881565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161161112257600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060026000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff0219169083151502179055505050600185908060018154018082558091505060019003906000526020600020016000909190919091505560008465ffffffffffff16036112485760016008600082825461123c9190614b7c565b9250508190555061126a565b8365ffffffffffff16600860008282546112629190614b7c565b925050819055505b8365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c342876040516112b99190613f70565b60405180910390a360019250505092915050565b600181815481106112dd57600080fd5b906000526020600020016000915090505481565b6000600c6000600d54815260200190815260200160002090508060000160009054906101000a900460ff1660ff1682511461132b57600080fd5b81600e908161133a9190614aaa565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c6113646123fa565b6040516113719190613fe0565b60405180910390a15050565b6002602052816000526040600020818154811061139957600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b600080600360008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061143d85612ef0565b9150600a805461144c906147ed565b9050905080825161145d9190614b7c565b67ffffffffffffffff8111156114765761147561400c565b5b6040519080825280601f01601f1916602001820160405280156114a85781602001600182028036833780820191505090505b50925060005b8181101561156d57600a8181546114c4906147ed565b81106114d3576114d2614881565b5b8154600116156114f25790600052602060002090602091828204019190065b9054901a7f01000000000000000000000000000000000000000000000000000000000000000284828151811061152b5761152a614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611565906148b0565b9150506114ae565b5060005b825181101561163a5782818151811061158d5761158c614881565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028483815181106115ea576115e9614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180611624906148b0565b9250508080611632906148b0565b915050611571565b50829350505050919050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600060608060006116a18661256f565b9150600c6000600d54815260200190815260200160002093508360000160029054906101000a900460ff1660ff16905060018251826116e09190614b7c565b6116ea9190614b7c565b67ffffffffffffffff8111156117035761170261400c565b5b6040519080825280601f01601f1916602001820160405280156117355781602001600182028036833780820191505090505b50925060005b818110156117ef578460000160039054906101000a900470010000000000000000000000000000000002816010811061177757611776614881565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000028482815181106117ad576117ac614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806117e7906148b0565b91505061173b565b50603a7f01000000000000000000000000000000000000000000000000000000000000000283828151811061182757611826614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611861906148b0565b91505060005b825181101561192d5782818151811061188357611882614881565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028482846118da9190614b7c565b815181106118eb576118ea614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611925906148b0565b915050611867565b5082945050505050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6007805461196b906147ed565b80601f0160208091040260200160405190810160405280929190818152602001828054611997906147ed565b80156119e45780601f106119b9576101008083540402835291602001916119e4565b820191906000526020600020905b8154815290600101906020018083116119c757829003601f168201915b505050505081565b6000600c6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff1611611a2457600080fd5b81600d819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115611a5957611a5861400c565b5b6040519080825280601f01601f191660200182016040528015611a8b5781602001600182028036833780820191505090505b50600e9081611a9a9190614aaa565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c611ac46123fa565b604051611ad19190613fe0565b60405180910390a15050565b8015611bfe57600073ffffffffffffffffffffffffffffffffffffffff16600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b7b57600080fd5b81600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611d16565b600073ffffffffffffffffffffffffffffffffffffffff16600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611c9657600080fd5b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d739190613cc9565b60405180910390a35050565b606060006060600c6000600d54815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff168551611dd29190614b7c565b611ddc9190614b7c565b67ffffffffffffffff811115611df557611df461400c565b5b6040519080825280601f01601f191660200182016040528015611e275781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff16811015611efd578260000160139054906101000a90047801000000000000000000000000000000000000000000000000028160088110611e8557611e84614881565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110611ebb57611eba614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611ef5906148b0565b915050611e2d565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110611f4457611f43614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611f7e906148b0565b91505060005b855181101561204a57858181518110611fa057611f9f614881565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838284611ff79190614b7c565b8151811061200857612007614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080612042906148b0565b915050611f84565b50819350505050919050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120b157600080fd5b60016002600085815260200190815260200160002080549050146120d457600080fd5b6000600260008581526020019081526020016000206000815481106120fc576120fb614881565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161461212e57600080fd5b600060010260036000858152602001908152602001600020541461215157600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1690507fc000000000000000000000000000000000000000000000000000000000000000811790508060010260036000858152602001908152602001600020819055506001600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121fa9190614b7c565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885600190046040516122629190613e64565b60405180910390a38291505092915050565b60095481565b600c6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060000160039054906101000a900470010000000000000000000000000000000002908060000160139054906101000a9004780100000000000000000000000000000000000000000000000002905085565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461237457600080fd5b600060149054906101000a900460ff161561238e57600080fd5b81156123b0576001600060146101000a81548160ff0219169083151502179055505b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905092915050565b606061248f600e805461240c906147ed565b80601f0160208091040260200160405190810160405280929190818152602001828054612438906147ed565b80156124855780601f1061245a57610100808354040283529160200191612485565b820191906000526020600020905b81548152906001019060200180831161246857829003601f168201915b5050505050611d7f565b905090565b61249f8484846134f2565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e8461255490614bd5565b6040516125619190613f70565b60405180910390a450505050565b606080600080600285516125839190614c3c565b67ffffffffffffffff81111561259c5761259b61400c565b5b6040519080825280601f01601f1916602001820160405280156125ce5781602001600182028036833780820191505090505b5092506000905060005b602081101561291c57600460f08783815181106125f8576125f7614881565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff1610156126f75760308361268e9190614c7e565b7f0100000000000000000000000000000000000000000000000000000000000000028483815181106126c3576126c2614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612769565b6057836127049190614c7e565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061273957612738614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f86828151811061277e5761277d614881565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff16101561287c576030836128079190614c7e565b7f010000000000000000000000000000000000000000000000000000000000000002846001846128379190614b7c565b8151811061284857612847614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506128fa565b6057836128899190614c7e565b7f010000000000000000000000000000000000000000000000000000000000000002846001846128b99190614b7c565b815181106128ca576128c9614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b6002826129079190614b7c565b91508080612914906148b0565b9150506125d8565b50829350505050919050565b606060006060836001029150600060026000848152602001908152602001600020805490500361295e5761295b82613446565b91505b600060026000848152602001908152602001600020805490501161298157600080fd5b602067ffffffffffffffff81111561299c5761299b61400c565b5b6040519080825280601f01601f1916602001820160405280156129ce5781602001600182028036833780820191505090505b50905060005b6020811015612a68578281602081106129f0576129ef614881565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110612a2657612a25614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080612a60906148b0565b9150506129d4565b50612a728161142d565b92505050919050565b6060819050601081511115612ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abc90614cff565b60405180910390fd5b612acd613baf565b6000600790505b60008160ff1610612b29576000600882612aee9190614d1f565b60ff1660ff9060020a029050600086821667ffffffffffffffff161115612b155750612b29565b8180612b2090614d5c565b92505050612ad4565b600181612b369190614c7e565b826020019060ff16908160ff16815250506008816007612b569190614d85565b612b609190614d1f565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082612bec90614dcf565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600c60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b600080600260008581526020019081526020016000208361ffff1681548110612d6957612d68614881565b5b90600052602060002001905080600001600c9054906101000a900460ff1615612d9157600080fd5b60008361ffff16148015612dc3575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b15612e225760018160000160068282829054906101000a900465ffffffffffff16612dee9190614e36565b92506101000a81548165ffffffffffff021916908365ffffffffffff160217905550612e1a8585612056565b915050612ee9565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e7a57600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff1610612ec257600080fd5b612ee58585858460000160069054906101000a900465ffffffffffff1685613809565b9150505b9392505050565b60608060008060028551612f049190614c3c565b67ffffffffffffffff811115612f1d57612f1c61400c565b5b6040519080825280601f01601f191660200182016040528015612f4f5781602001600182028036833780820191505090505b5092506000905060005b602081101561329d57600460f0878381518110612f7957612f78614881565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff1610156130785760308361300f9190614c7e565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061304457613043614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506130ea565b6057836130859190614c7e565b7f0100000000000000000000000000000000000000000000000000000000000000028483815181106130ba576130b9614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f8682815181106130ff576130fe614881565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff1610156131fd576030836131889190614c7e565b7f010000000000000000000000000000000000000000000000000000000000000002846001846131b89190614b7c565b815181106131c9576131c8614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061327b565b60578361320a9190614c7e565b7f0100000000000000000000000000000000000000000000000000000000000000028460018461323a9190614b7c565b8151811061324b5761324a614881565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b6002826132889190614b7c565b91508080613295906148b0565b915050612f59565b50829350505050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600260008681526020019081526020016000208461ffff168154811061336d5761336c614881565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146133d157600080fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff16116133fc57600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff161061342e57600080fd5b61343b8686868685613809565b915050949350505050565b6000806003600084815260200190815260200160002054905061346881613a87565b61347157600080fd5b61347a81613ab9565b1561348857829150506134ed565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016135499190613e64565b602060405180830381865afa158015613566573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358a9190614e85565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146135c457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146136f8573373ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806136ee57503373ffffffffffffffffffffffffffffffffffffffff16600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6136f757600080fd5b5b60006004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506137558284613aeb565b6001600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137a5919061484d565b925050819055506001600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137fc9190614b7c565b9250508190555050505050565b6000806000807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008860019004169250603067ffffffffffffffff8861ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16831792508565ffffffffffff1683179250826001029050600060010260036000838152602001908152602001600020541461389c57600080fd5b84600001600c9054906101000a900460ff166138fe578460000160069054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff16146138fd57600185600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff886001900416915060b8829060020a0291507f8000000000000000000000000000000000000000000000000000000000000000821791508873ffffffffffffffffffffffffffffffffffffffff168217915060018560000160068282829054906101000a900465ffffffffffff1661397f9190614e36565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055508160010260036000838152602001908152602001600020819055506001600b60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a0c9190614b7c565b925050819055508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051613a709190613e64565b60405180910390a380935050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b600080836001029050600360008281526020019081526020016000205460019004915060008203613b1b57600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600360008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613c5e81613c29565b8114613c6957600080fd5b50565b600081359050613c7b81613c55565b92915050565b600060208284031215613c9757613c96613c1f565b5b6000613ca584828501613c6c565b91505092915050565b60008115159050919050565b613cc381613cae565b82525050565b6000602082019050613cde6000830184613cba565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d1e578082015181840152602081019050613d03565b60008484015250505050565b6000601f19601f8301169050919050565b6000613d4682613ce4565b613d508185613cef565b9350613d60818560208601613d00565b613d6981613d2a565b840191505092915050565b60006020820190508181036000830152613d8e8184613d3b565b905092915050565b6000819050919050565b613da981613d96565b8114613db457600080fd5b50565b600081359050613dc681613da0565b92915050565b600060208284031215613de257613de1613c1f565b5b6000613df084828501613db7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e2482613df9565b9050919050565b613e3481613e19565b82525050565b6000602082019050613e4f6000830184613e2b565b92915050565b613e5e81613d96565b82525050565b6000602082019050613e796000830184613e55565b92915050565b613e8881613e19565b8114613e9357600080fd5b50565b600081359050613ea581613e7f565b92915050565b600080600060608486031215613ec457613ec3613c1f565b5b6000613ed286828701613e96565b9350506020613ee386828701613e96565b9250506040613ef486828701613db7565b9150509250925092565b6000819050919050565b613f1181613efe565b8114613f1c57600080fd5b50565b600081359050613f2e81613f08565b92915050565b600060208284031215613f4a57613f49613c1f565b5b6000613f5884828501613f1f565b91505092915050565b613f6a81613efe565b82525050565b6000602082019050613f856000830184613f61565b92915050565b600081519050919050565b600082825260208201905092915050565b6000613fb282613f8b565b613fbc8185613f96565b9350613fcc818560208601613d00565b613fd581613d2a565b840191505092915050565b60006020820190508181036000830152613ffa8184613fa7565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61404482613d2a565b810181811067ffffffffffffffff821117156140635761406261400c565b5b80604052505050565b6000614076613c15565b9050614082828261403b565b919050565b600067ffffffffffffffff8211156140a2576140a161400c565b5b6140ab82613d2a565b9050602081019050919050565b82818337600083830152505050565b60006140da6140d584614087565b61406c565b9050828152602081018484840111156140f6576140f5614007565b5b6141018482856140b8565b509392505050565b600082601f83011261411e5761411d614002565b5b813561412e8482602086016140c7565b91505092915050565b60006020828403121561414d5761414c613c1f565b5b600082013567ffffffffffffffff81111561416b5761416a613c24565b5b61417784828501614109565b91505092915050565b600065ffffffffffff82169050919050565b61419b81614180565b81146141a657600080fd5b50565b6000813590506141b881614192565b92915050565b600080604083850312156141d5576141d4613c1f565b5b60006141e385828601613f1f565b92505060206141f4858286016141a9565b9150509250929050565b600067ffffffffffffffff8211156142195761421861400c565b5b61422282613d2a565b9050602081019050919050565b600061424261423d846141fe565b61406c565b90508281526020810184848401111561425e5761425d614007565b5b6142698482856140b8565b509392505050565b600082601f83011261428657614285614002565b5b813561429684826020860161422f565b91505092915050565b6000602082840312156142b5576142b4613c1f565b5b600082013567ffffffffffffffff8111156142d3576142d2613c24565b5b6142df84828501614271565b91505092915050565b600080604083850312156142ff576142fe613c1f565b5b600061430d85828601613f1f565b925050602061431e85828601613db7565b9150509250929050565b61433181614180565b82525050565b600060608201905061434c6000830186614328565b6143596020830185614328565b6143666040830184613cba565b949350505050565b60006020828403121561438457614383613c1f565b5b600061439284828501613e96565b91505092915050565b6143a481613cae565b81146143af57600080fd5b50565b6000813590506143c18161439b565b92915050565b600080604083850312156143de576143dd613c1f565b5b60006143ec85828601613e96565b92505060206143fd858286016143b2565b9150509250929050565b6000806040838503121561441e5761441d613c1f565b5b600061442c85828601613e96565b925050602061443d85828601613f1f565b9150509250929050565b600060ff82169050919050565b61445d81614447565b82525050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b61449881614463565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b6144d38161449e565b82525050565b600060a0820190506144ee6000830188614454565b6144fb6020830187614454565b6145086040830186614454565b614515606083018561448f565b61452260808301846144ca565b9695505050505050565b6000806000806080858703121561454657614545613c1f565b5b600061455487828801613e96565b945050602061456587828801613e96565b935050604061457687828801613db7565b925050606085013567ffffffffffffffff81111561459757614596613c24565b5b6145a387828801614271565b91505092959194509250565b6145b881614447565b81146145c357600080fd5b50565b6000813590506145d5816145af565b92915050565b600067ffffffffffffffff82169050919050565b6145f8816145db565b811461460357600080fd5b50565b600081359050614615816145ef565b92915050565b60008060006060848603121561463457614633613c1f565b5b6000614642868287016145c6565b935050602061465386828701614606565b925050604084013567ffffffffffffffff81111561467457614673613c24565b5b61468086828701614109565b9150509250925092565b600061ffff82169050919050565b6146a18161468a565b81146146ac57600080fd5b50565b6000813590506146be81614698565b92915050565b6000806000606084860312156146dd576146dc613c1f565b5b60006146eb86828701613e96565b93505060206146fc86828701613f1f565b925050604061470d868287016146af565b9150509250925092565b6000806040838503121561472e5761472d613c1f565b5b600061473c85828601613e96565b925050602061474d85828601613e96565b9150509250929050565b6000806000806080858703121561477157614770613c1f565b5b600061477f87828801613e96565b945050602061479087828801613f1f565b93505060406147a1878288016146af565b92505060606147b2878288016141a9565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061480557607f821691505b602082108103614818576148176147be565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061485882613d96565b915061486383613d96565b925082820390508181111561487b5761487a61481e565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006148bb82613d96565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148ed576148ec61481e565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830261495d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261491d565b614967868361491d565b95508019841693508086168417925050509392505050565b6000819050919050565b60006149a461499f61499a84613d96565b61497f565b613d96565b9050919050565b6000819050919050565b6149be83614989565b6149d26149ca826149ab565b84845461492d565b825550505050565b600090565b6149e76149da565b6149f28184846149b5565b505050565b5b81811015614a1657614a0b6000826149df565b6001810190506149f8565b5050565b601f821115614a5b57614a2c816148f8565b614a358461490d565b81016020851015614a44578190505b614a58614a508561490d565b8301826149f7565b50505b505050565b60008160020a8304905092915050565b6000614a8160001984600802614a60565b1980831691505092915050565b6000614a9a8383614a70565b9150826002028217905092915050565b614ab382613f8b565b67ffffffffffffffff811115614acc57614acb61400c565b5b614ad682546147ed565b614ae1828285614a1a565b600060209050601f831160018114614b145760008415614b02578287015190505b614b0c8582614a8e565b865550614b74565b601f198416614b22866148f8565b60005b82811015614b4a57848901518255600182019150602085019450602081019050614b25565b86831015614b675784890151614b63601f891682614a70565b8355505b6001600288020188555050505b505050505050565b6000614b8782613d96565b9150614b9283613d96565b9250828201905080821115614baa57614ba961481e565b5b92915050565b6000819050602082019050919050565b6000614bcc8251613efe565b80915050919050565b6000614be082613f8b565b82614bea84614bb0565b9050614bf581614bc0565b92506020821015614c3557614c307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8360200360080261491d565b831692505b5050919050565b6000614c4782613d96565b9150614c5283613d96565b9250828202614c6081613d96565b91508282048414831517614c7757614c7661481e565b5b5092915050565b6000614c8982614447565b9150614c9483614447565b9250828201905060ff811115614cad57614cac61481e565b5b92915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b6000614ce9601383613cef565b9150614cf482614cb3565b602082019050919050565b60006020820190508181036000830152614d1881614cdc565b9050919050565b6000614d2a82614447565b9150614d3583614447565b9250828202614d4381614447565b9150808214614d5557614d5461481e565b5b5092915050565b6000614d6782614447565b915060008203614d7a57614d7961481e565b5b600182039050919050565b6000614d9082614447565b9150614d9b83614447565b9250828203905060ff811115614db457614db361481e565b5b92915050565b6000614dc68251614463565b80915050919050565b6000614dda82613f8b565b82614de484614bb0565b9050614def81614dba565b92506010821015614e2f57614e2a7fffffffffffffffffffffffffffffffff000000000000000000000000000000008360100360080261491d565b831692505b5050919050565b6000614e4182614180565b9150614e4c83614180565b9250828201905065ffffffffffff811115614e6a57614e6961481e565b5b92915050565b600081519050614e7f81613e7f565b92915050565b600060208284031215614e9b57614e9a613c1f565b5b6000614ea984828501614e70565b9150509291505056fea264697066735822122005c4972e97f7f5b8236ab2edbb05c611d096a13cc0b55ae355e46b3019fadddd64736f6c63430008120033 +\ No newline at end of file diff --git a/python/craft_nft/data/CraftNFT.json b/python/craft_nft/data/CraftNFT.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bool","name":"_final","type":"bool"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"_multiHash","type":"bytes"}],"name":"Msg","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"uint8","name":"_length","type":"uint8"},{"internalType":"uint64","name":"_codecId","type":"uint64"},{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"addCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getMsg","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"multiCodecs","outputs":[{"internalType":"uint8","name":"l","type":"uint8"},{"internalType":"uint8","name":"codecRLength","type":"uint8"},{"internalType":"uint8","name":"prefixRLength","type":"uint8"},{"internalType":"bytes16","name":"prefix","type":"bytes16"},{"internalType":"bytes8","name":"codec","type":"bytes8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"setMsg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_codec","type":"uint256"}],"name":"setMsgCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toHash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bool","name":"_final","type":"bool"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/craft_nft/nft.py b/python/craft_nft/nft.py @@ -246,8 +246,9 @@ class CraftNFT(ERC721): o['method'] = 'eth_call' enc = ABIContractEncoder() enc.method('toURI') - enc.typ(ABIContractType.BYTES32) - enc.bytes32(token_id) + #enc.typ(ABIContractType.BYTES32) + enc.typ(ABIContractType.BYTES) + enc.bytes(token_id) data = add_0x(enc.get()) tx = self.template(sender_address, contract_address) tx = self.set_code(tx, data) @@ -263,8 +264,8 @@ class CraftNFT(ERC721): o['method'] = 'eth_call' enc = ABIContractEncoder() enc.method('toURL') - enc.typ(ABIContractType.BYTES32) - enc.bytes32(token_id) + enc.typ(ABIContractType.BYTES) + enc.bytes(token_id) data = add_0x(enc.get()) tx = self.template(sender_address, contract_address) tx = self.set_code(tx, data) diff --git a/python/craft_nft/runnable/publish.py b/python/craft_nft/runnable/publish.py @@ -61,7 +61,7 @@ def process_config_local(config, arg, args, flags): arg_flags = ArgFlag() arg = Arg(arg_flags) -flags = arg_flags.STD_WRITE | arg_flags.WALLET | arg_flags.CREATE | arg_flags.VALUE | arg_flags.TAB +flags = arg_flags.STD_WRITE | arg_flags.WALLET | arg_flags.VALUE | arg_flags.TAB argparser = chainlib.eth.cli.ArgumentParser() argparser.add_argument('--name', type=str, required=True, help='Token name') diff --git a/solidity/CraftNFT.sol b/solidity/CraftNFT.sol @@ -71,13 +71,34 @@ contract CraftNFT { // Minter event Mint(address indexed _minter, address indexed _beneficiary, uint256 _value); + // Batcher event Allocate(address indexed _minter, uint48 indexed _count, bytes32 _tokenId); + // Content hashes + // Represents a multicodec item + struct MultiHash { + uint8 l; + uint8 codecRLength; + uint8 prefixRLength; + bytes16 prefix; + bytes8 codec; + } + // All registered multicodecs + mapping (uint256 => MultiHash) public multiCodecs; + uint256 msgCodec; + bytes currentMsg; + + + event Msg(bytes _multiHash); + constructor(string memory _name, string memory _symbol, bytes32 _declaration) { owner = msg.sender; declaration =_declaration; name = _name; symbol = _symbol; + addCodec(32, 0x12, "sha256"); + setMsgCodec(0x12); + currentMsg = new bytes(32); } // Transfer ownership of token contract to new owner. @@ -356,33 +377,7 @@ contract CraftNFT { } } - // create sha256 scheme URI from tokenId - function toURI(bytes32 _data) public pure returns(string memory) { - bytes memory out; - bytes memory _hexDigest; - uint256 c; - - _hexDigest = getDigestHex(_data); - - out = new bytes(64 + 7); - out[0] = "s"; - out[1] = "h"; - out[2] = "a"; - out[3] = "2"; - out[4] = "5"; - out[5] = "6"; - out[6] = ":"; - - c = 7; - for (uint256 i = 0; i < 64; i++) { - out[c] = _hexDigest[i]; - c++; - } - - return string(out); - } - - function toURL(bytes32 _data) public view returns(string memory) { + function toURL(bytes memory _data) public view returns(string memory) { bytes memory out; bytes memory _hexDigest; uint256 c; @@ -402,12 +397,12 @@ contract CraftNFT { return string(out); } - function getDigestHex(bytes32 _data) public pure returns(bytes memory) { + function getDigestHex(bytes memory _data) public pure returns(bytes memory) { bytes memory out; uint8 t; uint256 c; - out = new bytes(64); + out = new bytes(_data.length * 2); c = 0; for (uint256 i = 0; i < 32; i++) { t = (uint8(_data[i]) & 0xf0) >> 4; @@ -429,16 +424,24 @@ contract CraftNFT { // ERC-721 (Metadata - optional) function tokenURI(uint256 _tokenId) public view returns (string memory) { - bytes32 _tokenIdBytes; + bytes32 _tokenIdBytesFixed; + bytes memory _tokenIdBytes; - _tokenIdBytes = bytes32(_tokenId); + _tokenIdBytesFixed = bytes32(_tokenId); + + // If not direct match, check if it is a batch. + // Fail if still not found (length 0). + if (token[_tokenIdBytesFixed].length == 0) { + _tokenIdBytesFixed = getDigest(_tokenIdBytesFixed); + } + require(token[_tokenIdBytesFixed].length > 0); - if (token[_tokenIdBytes].length == 0) { - _tokenIdBytes = getDigest(_tokenIdBytes); - _tokenId = uint256(_tokenIdBytes); + _tokenIdBytes = new bytes(32); + for (uint256 i = 0; i < 32; i++) { + _tokenIdBytes[i] = _tokenIdBytesFixed[i]; } - require(token[_tokenIdBytes].length > 0); - return toURL(bytes32(_tokenId)); + + return toURL(_tokenIdBytes); } // EIP-165 @@ -465,4 +468,133 @@ contract CraftNFT { function totalSupply() public view returns(uint256) { return supply; } + + // Add a multicodec that can later be set as current codec + function addCodec(uint8 _length, uint64 _codecId, string memory _uriPrefix) public { + bytes memory prefixBytes; + + prefixBytes = bytes(_uriPrefix); + require(prefixBytes.length <= 16, 'ERR_PREFIX_TOO_LONG'); + MultiHash memory _hsh; + uint8 c; + + c = 7; + while (c >= 0) { + uint64 mask = uint64(0xff << (c * 8)); + if ((mask & _codecId) > 0) { + break; + } + c--; + } + _hsh.codecRLength = c + 1; + _hsh.codec = bytes8(_codecId << ((7 - c) * 8)); + _hsh.prefixRLength = uint8(prefixBytes.length); + _hsh.prefix = bytes16(prefixBytes); + _hsh.l = _length; + + multiCodecs[uint256(_codecId)] = _hsh; + } + + // Generate a multihash from the given digest and current selected multicodec + function toHash(bytes memory _digest) public view returns(bytes memory) { + MultiHash storage m; + bytes memory r; + + m = multiCodecs[msgCodec]; + r = new bytes(_digest.length + m.l + m.codecRLength); + + uint256 i = 0; + for (i; i < m.codecRLength; i++) { + r[i] = m.codec[i]; + } + r[i] = bytes1(m.l); + i++; + for (uint256 j = 0; j < _digest.length; j++) { + r[i+j] = _digest[j]; + } + + return r; + } + + // Generate a URI representing the digest and the string prefix representation + // of the currently selected multicodec + function toURI(bytes memory _digest) public view returns(string memory) { + MultiHash storage m; + + bytes memory codecString; + bytes memory digestHex; + uint256 l; + + digestHex = toHex(_digest); + m = multiCodecs[msgCodec]; + l = m.prefixRLength; + codecString = new bytes(l + digestHex.length + 1); + for (uint256 i = 0; i < l; i++) { + codecString[i] = m.prefix[i]; + } + codecString[l] = 0x3a; + l++; + + for (uint256 i = 0; i < digestHex.length; i++) { + codecString[l+i] = digestHex[i]; + } + return string(codecString); + + } + + // TODO: move to internal library method + // bytes to hex conversion + function toHex(bytes memory _data) public pure returns(bytes memory) { + bytes memory out; + uint8 t; + uint256 c; + + out = new bytes(_data.length * 2); + c = 0; + for (uint256 i = 0; i < 32; i++) { + t = (uint8(_data[i]) & 0xf0) >> 4; + if (t < 10) { + out[c] = bytes1(t + 0x30); + } else { + out[c] = bytes1(t + 0x57); + } + t = uint8(_data[i]) & 0x0f; + if (t < 10) { + out[c+1] = bytes1(t + 0x30); + } else { + out[c+1] = bytes1(t + 0x57); + } + c += 2; + } + return out; + } + + // Set the current multicodec to use for multihash generation + function setMsgCodec(uint256 _codec) public { + MultiHash storage _hsh; + + _hsh = multiCodecs[_codec]; + require(_hsh.l > 0); + + msgCodec = _codec; + currentMsg = new bytes(_hsh.l); + + emit Msg(getMsg()); + } + + // Set the latest pesistent message on contract + function setMsg(bytes memory _digest) public { + MultiHash storage _hsh; + + _hsh = multiCodecs[msgCodec]; + require(_digest.length == _hsh.l); + + currentMsg = _digest; + emit Msg(getMsg()); + } + + // Return a multihash of the latest persistent message + function getMsg() public view returns(bytes memory) { + return toHash(currentMsg); + } }