diff --git a/Makefile b/Makefile index 554ae443..0621cca0 100644 --- a/Makefile +++ b/Makefile @@ -111,7 +111,7 @@ deploy-token-bridge-l1: RPC_URL=http:\\localhost:8445/ \ REMOTE_CHAIN_ID=1337 \ TOKEN_BRIDGE_L1=true \ - TOKEN_BRIDGE_SECURITY_COUNCIL=0x90F79bf6EB2c4f870365E785982E1f101E93b906 \ + L1_TOKEN_BRIDGE_SECURITY_COUNCIL=0x90F79bf6EB2c4f870365E785982E1f101E93b906 \ L2MESSAGESERVICE_ADDRESS=0xe537D669CA013d86EBeF1D64e40fC74CADC91987 \ LINEA_ROLLUP_ADDRESS=0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9 \ npx ts-node local-deployments-artifacts/deployBridgedTokenAndTokenBridge.ts @@ -124,7 +124,7 @@ deploy-token-bridge-l2: RPC_URL=http:\\localhost:8545/ \ REMOTE_CHAIN_ID=31648428 \ TOKEN_BRIDGE_L1=false \ - TOKEN_BRIDGE_SECURITY_COUNCIL=0xf17f52151EbEF6C7334FAD080c5704D77216b732 \ + L2_TOKEN_BRIDGE_SECURITY_COUNCIL=0xf17f52151EbEF6C7334FAD080c5704D77216b732 \ L2MESSAGESERVICE_ADDRESS=0xe537D669CA013d86EBeF1D64e40fC74CADC91987 \ LINEA_ROLLUP_ADDRESS=0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9 \ npx ts-node local-deployments-artifacts/deployBridgedTokenAndTokenBridge.ts diff --git a/contracts/abi/LineaRollupV6.0.abi b/contracts/abi/LineaRollupV6.0.abi index 481271af..5bf3bb4e 100644 --- a/contracts/abi/LineaRollupV6.0.abi +++ b/contracts/abi/LineaRollupV6.0.abi @@ -983,19 +983,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "GENESIS_SHNARF", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "INBOX_STATUS_RECEIVED", diff --git a/contracts/contracts/LineaRollup.sol b/contracts/contracts/LineaRollup.sol index bdc28b86..597071f2 100644 --- a/contracts/contracts/LineaRollup.sol +++ b/contracts/contracts/LineaRollup.sol @@ -33,18 +33,6 @@ contract LineaRollup is /// @notice The role required to set/remove proof verifiers by type. bytes32 public constant VERIFIER_UNSETTER_ROLE = keccak256("VERIFIER_UNSETTER_ROLE"); - /// @notice The default genesis shnarf using empty/default hashes and a default state. - bytes32 public constant GENESIS_SHNARF = - keccak256( - abi.encode( - EMPTY_HASH, - EMPTY_HASH, - 0x072ead6777750dc20232d1cee8dc9a395c2d350df4bbaa5096c6f59b214dcecd, - EMPTY_HASH, - EMPTY_HASH - ) - ); - /// @dev Value indicating a shnarf exists. uint256 internal constant SHNARF_EXISTS_DEFAULT_VALUE = 1; @@ -138,9 +126,16 @@ contract LineaRollup is currentL2BlockNumber = _initializationData.initialL2BlockNumber; stateRootHashes[_initializationData.initialL2BlockNumber] = _initializationData.initialStateRootHash; - blobShnarfExists[GENESIS_SHNARF] = SHNARF_EXISTS_DEFAULT_VALUE; + bytes32 genesisShnarf = _computeShnarf( + EMPTY_HASH, + EMPTY_HASH, + _initializationData.initialStateRootHash, + EMPTY_HASH, + EMPTY_HASH + ); - currentFinalizedShnarf = GENESIS_SHNARF; + blobShnarfExists[genesisShnarf] = SHNARF_EXISTS_DEFAULT_VALUE; + currentFinalizedShnarf = genesisShnarf; currentFinalizedState = _computeLastFinalizedState(0, EMPTY_HASH, _initializationData.genesisTimestamp); } diff --git a/contracts/local-deployments-artifacts/deployBridgedTokenAndTokenBridge.ts b/contracts/local-deployments-artifacts/deployBridgedTokenAndTokenBridge.ts index 0e4570e5..1f4a9e8e 100644 --- a/contracts/local-deployments-artifacts/deployBridgedTokenAndTokenBridge.ts +++ b/contracts/local-deployments-artifacts/deployBridgedTokenAndTokenBridge.ts @@ -37,15 +37,22 @@ async function main() { const ORDERED_NONCE_POST_L2MESSAGESERVICE = 3; const ORDERED_NONCE_POST_LINEAROLLUP = 4; + let securityCouncilAddress; + + if (process.env.TOKEN_BRIDGE_L1 === "true") { + securityCouncilAddress = getRequiredEnvVar("L1_TOKEN_BRIDGE_SECURITY_COUNCIL"); + } else { + securityCouncilAddress = getRequiredEnvVar("L2_TOKEN_BRIDGE_SECURITY_COUNCIL"); + } + const l2MessageServiceAddress = process.env.L2MESSAGESERVICE_ADDRESS; const lineaRollupAddress = process.env.LINEA_ROLLUP_ADDRESS; const remoteChainId = getRequiredEnvVar("REMOTE_CHAIN_ID"); - const tokenBridgeSecurityCouncil = getRequiredEnvVar("TOKEN_BRIDGE_SECURITY_COUNCIL"); const pauseTypeRoles = getEnvVarOrDefault("TOKEN_BRIDGE_PAUSE_TYPES_ROLES", TOKEN_BRIDGE_PAUSE_TYPES_ROLES); const unpauseTypeRoles = getEnvVarOrDefault("TOKEN_BRIDGE_UNPAUSE_TYPES_ROLES", TOKEN_BRIDGE_UNPAUSE_TYPES_ROLES); - const defaultRoleAddresses = generateRoleAssignments(TOKEN_BRIDGE_ROLES, tokenBridgeSecurityCouncil, []); + const defaultRoleAddresses = generateRoleAssignments(TOKEN_BRIDGE_ROLES, securityCouncilAddress, []); const roleAddresses = getEnvVarOrDefault("TOKEN_BRIDGE_ROLE_ADDRESSES", defaultRoleAddresses); const provider = new ethers.JsonRpcProvider(process.env.RPC_URL); const wallet = new ethers.Wallet(process.env.PRIVATE_KEY!, provider); @@ -53,13 +60,13 @@ async function main() { let walletNonce; if (process.env.TOKEN_BRIDGE_L1 === "true") { - if (process.env.L1_NONCE === undefined) { + if (!process.env.L1_NONCE) { walletNonce = await wallet.getNonce(); } else { walletNonce = parseInt(process.env.L1_NONCE) + ORDERED_NONCE_POST_LINEAROLLUP; } } else { - if (process.env.L2_NONCE === undefined) { + if (!process.env.L2_NONCE) { walletNonce = await wallet.getNonce(); } else { walletNonce = parseInt(process.env.L2_NONCE) + ORDERED_NONCE_POST_L2MESSAGESERVICE; @@ -119,7 +126,7 @@ async function main() { const initializer = getInitializerData(TokenBridgeAbi, "initialize", [ { - defaultAdmin: tokenBridgeSecurityCouncil, + defaultAdmin: securityCouncilAddress, messageService: deployingChainMessageService, tokenBeacon: beaconProxyAddress, sourceChainId: chainId, diff --git a/contracts/local-deployments-artifacts/dynamic-artifacts/LineaRollupV6.json b/contracts/local-deployments-artifacts/dynamic-artifacts/LineaRollupV6.json index cd78b1e2..a938a4f4 100644 --- a/contracts/local-deployments-artifacts/dynamic-artifacts/LineaRollupV6.json +++ b/contracts/local-deployments-artifacts/dynamic-artifacts/LineaRollupV6.json @@ -987,19 +987,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "GENESIS_SHNARF", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "INBOX_STATUS_RECEIVED", @@ -2447,8 +2434,8 @@ "type": "function" } ], - "bytecode": "0x6080604052348015600e575f80fd5b5060156019565b60d3565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161460d1575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b615462806100e05f395ff3fe60806040526004361061049d575f3560e01c806373bd07b71161026b578063b837dbe911610156578063cc5782f6116100d1578063d5d4b83511610087578063e196fb5d1161006d578063e196fb5d14610ea0578063e97a1e9e14610ebf578063f5b541a614610f31575f80fd5b8063d5d4b83514610e57578063d722bbfc14610e6d575f80fd5b8063cd9b9e9a116100b7578063cd9b9e9a14610e02578063cf5b276414610e18578063d547741f14610e38575f80fd5b8063cc5782f614610da1578063cc6f725114610dcf575f80fd5b8063bf3e750511610126578063c0c4e5841161010c578063c0c4e58414610d4e578063c1dc0f0714610d6d578063c211697414610d82575f80fd5b8063bf3e750514610d06578063c0729ab114610d39575f80fd5b8063b837dbe914610c80578063b9174ba314610c95578063bc61e73314610cc8578063bcc3003d14610ce7575f80fd5b80639ac25d08116101e6578063a98e773d116101b6578063ad422ff01161019c578063ad422ff014610c24578063aea4f74514610c39578063b59faa6014610c4d575f80fd5b8063a98e773d14610bd0578063ac1eff6814610bef575f80fd5b80639ac25d0814610b585780639ee8b21114610b8b5780639f3ce55a14610baa578063a217fddf14610bbd575f80fd5b8063914e57eb1161023b578063921b278e11610221578063921b278e14610b23578063986fcddd14610a4157806399467a3514610b39575f80fd5b8063914e57eb14610ab357806391d1485414610adf575f80fd5b806373bd07b714610a2d5780637d1e8c5514610a415780638be745d114610a545780638de4948714610a80575f80fd5b80634cdd389b1161038b57806360e83cf31161030657806367e404ce116102d6578063695378f5116102bc578063695378f5146109b15780636a906b80146109c75780636e673843146109fa575f80fd5b806367e404ce146109665780636854f6bc14610992575f80fd5b806360e83cf3146108bc57806363213155146108e85780636463fb2a1461091b57806366f96e981461093a575f80fd5b8063587944561161035b5780635c721a0c116103415780635c721a0c146108395780635ed73ceb146108645780636078bfd814610890575f80fd5b806358794456146108245780635b7eb4bd14610742575f80fd5b80634cdd389b146107875780635230eef2146107b3578063557eac73146107e65780635603c65f14610805575f80fd5b8063289581741161041b57806338b90333116103eb5780633fc08b65116103d15780633fc08b651461071757806348922ab714610742578063491e093614610768575f80fd5b806338b903331461068f5780633b12eccb146106e4575f80fd5b8063289581741461061c5780632c70645c1461063b5780632f2ff15d1461065157806336568abe14610670575f80fd5b806312d3fa9a116104705780631f443da0116104565780631f443da0146105965780632130d812146105c2578063248a9ca3146105ee575f80fd5b806312d3fa9a1461054d5780631e2ff94f14610580575f80fd5b806301ffc9a7146104a157806303134d1d146104d557806305861180146105165780631065a3991461052c575b5f80fd5b3480156104ac575f80fd5b506104c06104bb3660046147a5565b610f64565b60405190151581526020015b60405180910390f35b3480156104e0575f80fd5b506105087f1ab87f7458c0e3d07e9881c14ee67f0141703614fd48ea5b15ed987e5f4b030e81565b6040519081526020016104cc565b348015610521575f80fd5b506105086101bb5481565b348015610537575f80fd5b5061054b6105463660046147e4565b610ffc565b005b348015610558575f80fd5b506105087f67c2dca7476ee0fe1dd3cba13428c6760bfe2599a6dfe26a9ad7ef27317c6e7781565b34801561058b575f80fd5b506105086101185481565b3480156105a1575f80fd5b506105086105b0366004614802565b6101b96020525f908152604090205481565b3480156105cd575f80fd5b506105086105dc366004614802565b6101be6020525f908152604090205481565b3480156105f9575f80fd5b50610508610608366004614802565b5f9081526065602052604090206001015490565b348015610627575f80fd5b5061054b610636366004614802565b6110f8565b348015610646575f80fd5b506105086101835481565b34801561065c575f80fd5b5061054b61066b36600461482d565b6111ab565b34801561067b575f80fd5b5061054b61068a36600461482d565b6111d4565b34801561069a575f80fd5b506106d76040518060400160405280600381526020017f362e30000000000000000000000000000000000000000000000000000000000081525081565b6040516104cc919061485b565b3480156106ef575f80fd5b506105087fb6cc65f42901ed602aec1619cc1ead29d487cd489094a37615153eaeb991d77081565b348015610722575f80fd5b50610508610731366004614802565b60a56020525f908152604090205481565b34801561074d575f80fd5b50610756600181565b60405160ff90911681526020016104cc565b348015610773575f80fd5b5061054b6107823660046148d5565b61122b565b348015610792575f80fd5b506105086107a1366004614802565b6101b76020525f908152604090205481565b3480156107be575f80fd5b506105087f0cf0d2deb70d7bdac2fa48c4ac99bc558170be0ce5fcb994caefa4bf7b96edf981565b3480156107f1575f80fd5b5061054b610800366004614802565b6114e1565b348015610810575f80fd5b5061054b61081f366004614965565b6115a7565b34801561082f575f80fd5b5061050860995481565b348015610844575f80fd5b50610508610853366004614802565b60a66020525f908152604090205481565b34801561086f575f80fd5b5061050861087e366004614802565b6101ba6020525f908152604090205481565b34801561089b575f80fd5b506105086108aa366004614802565b6101b66020525f908152604090205481565b3480156108c7575f80fd5b506105086108d6366004614802565b6101506020525f908152604090205481565b3480156108f3575f80fd5b506105087fe37c272ea30e2bb381ad7cf89ae754b49153250609f36d0cbdad8b64c184bb5c81565b348015610926575f80fd5b5061054b6109353660046149dd565b61169f565b348015610945575f80fd5b50610508610954366004614802565b6101b86020525f908152604090205481565b348015610971575f80fd5b5061097a611af8565b6040516001600160a01b0390911681526020016104cc565b34801561099d575f80fd5b5061054b6109ac366004614a15565b611b30565b3480156109bc575f80fd5b506105086101195481565b3480156109d2575f80fd5b506105087fd8b4c34c2ec1f3194471108c64ad2beda340c0337ee4ca35592f9ef270f4228b81565b348015610a05575f80fd5b506105087f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c81565b348015610a38575f80fd5b50610756600281565b348015610a4c575f80fd5b506107565f81565b348015610a5f575f80fd5b50610508610a6e366004614802565b61011a6020525f908152604090205481565b348015610a8b575f80fd5b506105087fe1fce82838dd7a42cfe783f60dc6233c8aa2c4fc66e77817805e767ec5e349b681565b348015610abe575f80fd5b50610508610acd366004614802565b61014e6020525f908152604090205481565b348015610aea575f80fd5b506104c0610af936600461482d565b5f9182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b348015610b2e575f80fd5b506105086101bf5481565b348015610b44575f80fd5b5061054b610b53366004614a63565b611d70565b348015610b63575f80fd5b506105087f56bdc3c9ec86cb7db110a7699b2ade72f0b8819727d9f7d906b012641505fa7781565b348015610b96575f80fd5b506104c0610ba5366004614802565b612054565b61054b610bb8366004614ae0565b612077565b348015610bc8575f80fd5b506105085f81565b348015610bdb575f80fd5b5061054b610bea366004614b38565b612199565b348015610bfa575f80fd5b5061097a610c09366004614802565b61011b6020525f90815260409020546001600160a01b031681565b348015610c2f575f80fd5b5061050860985481565b348015610c44575f80fd5b5061054b6125cb565b348015610c58575f80fd5b506105087fe4831f9e4316ac2c65117d1f602fbf56d38128a9973d5e3fdbc5b77265c18d4081565b348015610c8b575f80fd5b5061050860e45481565b348015610ca0575f80fd5b506105087f430a7f0cb00b5ebbe63cecc96e82cf959a883e7c13a95110854f1fa6b3fbf59881565b348015610cd3575f80fd5b506104c0610ce23660046147e4565b612626565b348015610cf2575f80fd5b5061054b610d01366004614b70565b61264a565b348015610d11575f80fd5b506105087f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d8281565b348015610d44575f80fd5b50610508609a5481565b348015610d59575f80fd5b5061054b610d68366004614bda565b61277a565b348015610d78575f80fd5b5061050860975481565b348015610d8d575f80fd5b5061054b610d9c366004614c8c565b6129e0565b348015610dac575f80fd5b506104c0610dbb366004614802565b60d96020525f908152604090205460ff1681565b348015610dda575f80fd5b506105087fe8cb6172fcf5cbaae022b7c910224a4f0c20d53227e630056efff182155a5abc81565b348015610e0d575f80fd5b506105086101bd5481565b348015610e23575f80fd5b506101c05461097a906001600160a01b031681565b348015610e43575f80fd5b5061054b610e5236600461482d565b612ae6565b348015610e62575f80fd5b506105086101bc5481565b348015610e78575f80fd5b506105087f6b5661ddfbd1fbd525c902a513e0f47d9c74f1c1ee8a2d4f1937ad305fb8f41a81565b348015610eab575f80fd5b5061054b610eba3660046147e4565b612b0a565b348015610eca575f80fd5b50610508604080515f602082018190529181018290527f072ead6777750dc20232d1cee8dc9a395c2d350df4bbaa5096c6f59b214dcecd60608201526080810182905260a081019190915260c0016040516020818303038152906040528051906020012081565b348015610f3c575f80fd5b506105087f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480610ff657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60dc5f82600881111561101157611011614cb6565b600881111561102257611022614cb6565b81526020019081526020015f205461103981612be2565b61104282612626565b61108357816040517f1865965400000000000000000000000000000000000000000000000000000000815260040161107a9190614ce3565b60405180910390fd5b81600881111561109557611095614cb6565b60da8054600190921b1990911690558160088111156110b6576110b6614cb6565b7fd071d2b85dec4489435b541d2f0e2570db09b09db9efd8703948d44a433df65a335b6040516001600160a01b03909116815260200160405180910390a25050565b7f6b5661ddfbd1fbd525c902a513e0f47d9c74f1c1ee8a2d4f1937ad305fb8f41a61112281612be2565b5f82815261011b602090815260408083205490516001600160a01b0390911681523392859290917f4a29db3fc6b42bda201e4b4d69ce8d575eeeba5f153509c0d0a342af0f1bd021910160405180910390a4505f90815261011b6020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b5f828152606560205260409020600101546111c581612be2565b6111cf8383612bec565b505050565b6101c0546001600160a01b039081169082160361121d576040517f7f7497e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112278282612caa565b5050565b611233612d4c565b85878484875f5a90506112466003612de9565b61127a61127460017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614d4f565b8f612e7b565b5f61128a8f8f8f8f8c8f8f612e82565b905061129581612edb565b6112a76112a28d8f614d62565b612f35565b5f808f6001600160a01b03168e8d8d6040516112c4929190614d75565b5f6040518083038185875af1925050503d805f81146112fe576040519150601f19603f3d011682016040523d82523d5f602084013e611303565b606091505b5091509150816113605780511561131d5780518082602001fd5b8f6040517f5461344300000000000000000000000000000000000000000000000000000000815260040161107a91906001600160a01b0391909116815260200190565b61139461138e60017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614d4f565b5f612e7b565b60405183907fa4c827e719e911e8f19393ccdb85b5102f08f0910604d340ba38390b7ff2ab0e905f90a25050861590506114c957855f84900361143f57853b15801561143d573a5a6113e861bc7c86614d62565b6113f29190614d4f565b6113fc9190614d84565b915081881115611439576001600160a01b0387166108fc61141d848b614d4f565b6040518115909202915f818181858888f193505050505061143d565b8791505b505b5f6001600160a01b038416156114555783611457565b335b90505f816001600160a01b03166108fc8490811502906040515f60405180830381858888f193505050509050806114c5576040517fa57c4df40000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161107a565b5050505b5050505050506114d7612fab565b5050505050505050565b7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d8261150b81612be2565b5f805f426099541015611530576097546115259042614d62565b609955506001611542565b609a5485101561154257849250600191505b609885905580806115505750815b1561155b57609a8390555b60408051868152831515602082015282151581830152905133917fbc3dc0cb5c15c51c81316450d44048838bb478b9809447d01c766a06f3e9f2c8919081900360600190a25050505050565b60066115b281612de9565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296115dc81612be2565b5f859003611616576040517f7907d79b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610119545f81815261011a6020526040902054843514611662576040517fead4c30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101bd545f6116718684612fd9565b90505f611685878484878b602001356132c6565b905061169381898c8c61334e565b50505050505050505050565b6116a7612d4c565b60a081018035906116bb9060808401614d9b565b6116c9610120840184614db6565b6116da610100860160e08701614d9b565b5f5a90506116e86003612de9565b6101008701355f908152610150602052604081205490819003611737576040517f4e68667500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117418880614e17565b9050811461179057806117548980614e17565b6040517f5e3fd6ad000000000000000000000000000000000000000000000000000000008152600481019390935260248301525060440161107a565b61179d88602001356135b2565b6117b26112a260c08a013560a08b0135614d62565b5f6117fb6117c660808b0160608c01614d9b565b6117d660a08c0160808d01614d9b565b8b60a001358c60c001358d602001358e8061012001906117f69190614db6565b612e82565b90506118268161180b8b80614e17565b61181b60608e0160408f01614e7b565b8d610100013561362a565b61185c576040517fb05e92fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61189f61188a60017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614d4f565b61189a60808c0160608d01614d9b565b612e7b565b5f806118b160a08c0160808d01614d9b565b6001600160a01b031660c08c01356118cd6101208e018e614db6565b6040516118db929190614d75565b5f6040518083038185875af1925050503d805f8114611915576040519150601f19603f3d011682016040523d82523d5f602084013e61191a565b606091505b509150915081611982578051156119345780518082602001fd5b61194460a08c0160808d01614d9b565b6040517f546134430000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161107a565b6119b061138e60017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614d4f565b60405183907fa4c827e719e911e8f19393ccdb85b5102f08f0910604d340ba38390b7ff2ab0e905f90a2505050505f861115611ae757855f849003611a5d57853b158015611a5b573a5a611a0661bc7c86614d62565b611a109190614d4f565b611a1a9190614d84565b915081881115611a57576001600160a01b0387166108fc611a3b848b614d4f565b6040518115909202915f818181858888f1935050505050611a5b565b8791505b505b5f6001600160a01b03841615611a735783611a75565b335b90505f816001600160a01b03166108fc8490811502906040515f60405180830381858888f19350505050905080611ae3576040517fa57c4df40000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161107a565b5050505b505050505050611af5612fab565b50565b5f611b2b611b2760017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614d4f565b5c90565b905090565b6005611b3b81612de9565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929611b6581612be2565b611b726040860186614db6565b90505f03611bac576040517fc01eab5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8381526101be602052604090205415611bf5576040517f0f06cd150000000000000000000000000000000000000000000000000000000081526004810184905260240161107a565b5f8481526101be60205260408120549003611c3f576040517f6e5424c20000000000000000000000000000000000000000000000000000000081526004810185905260240161107a565b5f611c4d6040870187614db6565b604051611c5b929190614d75565b604051809103902090505f611c7d8760200135835f9182526020526040902090565b90505f611cc98760208a01358a3585611ca2611c9c60408f018f614db6565b89613737565b604080519586526020860194909452928401919091526060830152608082015260a0902090565b9050808614611d0e576040517fd3664fb3000000000000000000000000000000000000000000000000000000008152600481018790526024810182905260440161107a565b5f8181526101be602052604090819020600190555181907f55f4c645c36aa5cd3f443d6be44d7a7a5df9d2100d7139dfc69d4289ee07231990611d5e908a908c3590918252602082015260400190565b60405180910390a25050505050505050565b6004611d7b81612de9565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929611da581612be2565b5f859003611ddf576040517fb1504a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b844915611e1b576040517f8019aff70000000000000000000000000000000000000000000000000000000081526004810186905260240161107a565b5f8481526101be60205260408120549003611e65576040517f6e5424c20000000000000000000000000000000000000000000000000000000081526004810185905260240161107a565b5f8381526101be602052604090205415611eae576040517f0f06cd150000000000000000000000000000000000000000000000000000000081526004810184905260240161107a565b6040805160a0810182525f808252606060208301819052928201839052918101829052608081018290528190865f5b89811015611fb3578a8a82818110611ef757611ef7614e9e565b9050602002810190611f099190614ecb565b611f1290614fe8565b81499450925083611f52576040517fc0e41e1d0000000000000000000000000000000000000000000000000000000081526004810182905260240161107a565b60808301515f8181526020869052604090209550611f8085875f1c865f015187602001518860400151613838565b6060848101518551604080519687526020870194909452928501528301869052608083015260a090912090600101611edd565b50808714611ff7576040517fd3664fb3000000000000000000000000000000000000000000000000000000008152600481018890526024810182905260440161107a565b5f8181526101be602090815260409182902060019055606084015182518b81529182015282917f55f4c645c36aa5cd3f443d6be44d7a7a5df9d2100d7139dfc69d4289ee072319910160405180910390a250505050505050505050565b600881901c5f90815261014f6020526040812054600160ff84161b161515610ff6565b600261208281612de9565b6001600160a01b0385166120c2576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b348411156120fc576040517fb03b693200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60e480545f918261210c83615075565b9091555090505f61211d8634614d4f565b90505f61212f33898985878b8b612e82565b905061213b83826139da565b80886001600160a01b0316336001600160a01b03167fe856c2b8bd4eb0027ce32eeaf595c21b0b6b4644b326e5b7bd80a1cf8db72e6c8a86888c8c6040516121879594939291906150d5565b60405180910390a45050505050505050565b5f54610100900460ff16158080156121b757505f54600160ff909116105b806121d05750303b1580156121d057505f5460ff166001145b61225c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161107a565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156122b8575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f6122c96080840160608501614d9b565b6001600160a01b031603612309576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61232c61231960e0840184615105565b612327610100860186615105565b613a56565b61233e82608001358360a00135613d04565b6123595f61235461016085016101408601614d9b565b612bec565b61236e61236960c0840184615105565b613dc5565b61237e6080830160608401614d9b565b5f805261011b6020527f033d11f27e62ab919708ec716731da80d261a6e4253259b7acde9bf89d28ec1880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790556123f061014083016101208401614d9b565b6101c080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905561243b61014083016101208401614d9b565b6001600160a01b0316336001600160a01b03167f1f82add12d98b5eaed4d6a6d5f74cfc7a85e5c90c335ab5562f77f220ed45d5f60405160405180910390a36020828101356101198190555f90815261011a825260408082208535905580518084018390528082018390527f072ead6777750dc20232d1cee8dc9a395c2d350df4bbaa5096c6f59b214dcecd60608083018290526080830185905260a08084018690528451808503909101815260c08401855280519087012085526101be86528385206001905560e0830185905261010083018590526101208301919091526101408201849052610160808301859052835180840390910181526101808301808552815191909601206101bd558385526101a0820193909352908501356101c09091015290206101bf558015611227575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b7f0cf0d2deb70d7bdac2fa48c4ac99bc558170be0ce5fcb994caefa4bf7b96edf96125f581612be2565b5f609a81905560405133917fba88c025b0cbb77022c0c487beef24f759f1e4be2f51a205bc427cee19c2eaa691a250565b5f81600881111561263957612639614cb6565b60da54600190911b16151592915050565b61265762f099c082614d62565b421015612690576040517f4306cbb100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805184815260208101849052908101829052606090206101bf5414612708576101bf546040805185815260208101859052908101839052606090206040517fbc5aad110000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161107a565b6101c0546001600160a01b031661273f7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92982612bec565b6040516001600160a01b0382169033907f9fc8868f8577b31b805ee65bb52325782b5e2708dbdb7f04c7467c6785fccb30905f90a350505050565b5f54600690610100900460ff1615801561279a57505f5460ff8083169116105b612826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161107a565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556128608888613dc5565b61286c86868686613a56565b6001600160a01b0382166128ac576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101c080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03841690811790915560405133907f1f82add12d98b5eaed4d6a6d5f74cfc7a85e5c90c335ab5562f77f220ed45d5f905f90a36040517f362e300000000000000000000000000000000000000000000000000000000000907f352e300000000000000000000000000000000000000000000000000000000000907f2f8492a7a430cf917798dfb60bc5af634f68e6c40287947df0ea6f7ec0669bd8905f90a35f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050565b7f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c612a0a81612be2565b6001600160a01b038316612a4a576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82815261011b60209081526040918290205491516001600160a01b03928316815233928592908716917f4a29db3fc6b42bda201e4b4d69ce8d575eeeba5f153509c0d0a342af0f1bd021910160405180910390a4505f90815261011b6020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f82815260656020526040902060010154612b0081612be2565b6111cf8383613f73565b60db5f826008811115612b1f57612b1f614cb6565b6008811115612b3057612b30614cb6565b81526020019081526020015f2054612b4781612be2565b612b5082612626565b15612b8957816040517fc0a71b5800000000000000000000000000000000000000000000000000000000815260040161107a9190614ce3565b816008811115612b9b57612b9b614cb6565b60da8054600190921b9091179055816008811115612bbb57612bbb614cb6565b7f534f879afd40abb4e39f8e1b77a316be4c8e3521d9cf5a3a3db8959d574d4559336110d9565b611af58133614012565b5f8281526065602090815260408083206001600160a01b038516845290915290205460ff16611227575f8281526065602090815260408083206001600160a01b0385168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055612c663390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6001600160a01b0381163314612d42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c660000000000000000000000000000000000606482015260840161107a565b6112278282613f73565b5f612d7b611b2760017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614d4f565b14612db2576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612de7612de060017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614d4f565b6001612e7b565b565b60da54816008811115612dfe57612dfe614cb6565b6001901b811615612e3d57816040517fc0a71b5800000000000000000000000000000000000000000000000000000000815260040161107a9190614ce3565b60028116156112275760016040517fc0a71b5800000000000000000000000000000000000000000000000000000000815260040161107a9190614ce3565b80825d5050565b5f60405188815287602082015286604082015285606082015284608082015260c060a08201528260c0820152602083065f8115612ec0578160200390505b848660e085013790930160e001902098975050505050505050565b5f81815260a66020526040902054600114612f25576040517f992d87c30000000000000000000000000000000000000000000000000000000081526004810182905260240161107a565b5f90815260a66020526040812055565b8015611af557426099541015612f5a57609754612f529042614d62565b609955612f6a565b609a54612f679082614d62565b90505b609854811115612fa6576040517fa74c1c5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609a55565b612de761138e60017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614d4f565b5f81836020013511613024576040517f70614405000000000000000000000000000000000000000000000000000000008152602084013560048201526024810183905260440161107a565b6130388361018001358461014001356140a0565b6101bf54604080516101608601358152610120860135602082015260e08601359181019190915260609020146130ce57604080516101608501358152610120850135602082015260e085013591810191909152606090206101bf546040517fbc5aad110000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161107a565b4283610100013510613119576040517fbf81c6e0000000000000000000000000000000000000000000000000000000008152610100840135600482015242602482015260440161107a565b6080830135613154576040517f2898482a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61319760408401356060850135608086013560a087013560c0880135604080519586526020860194909452928401919091526060830152608082015260a0902090565b5f8181526101be6020526040812054919250036131e3576040517fedeae83c0000000000000000000000000000000000000000000000000000000081526004810182905260240161107a565b6131ff6131f46101c0850185614e17565b856101a0013561416d565b6132166132106101e0850185614db6565b84614279565b6020808401355f81815261011a909252604090912060808501359055610119556101bd81905561326b610180840135610140850135610100860135604080519384526020840192909252908201526060902090565b6101bf5580602084013561327e84615075565b60408051873581526080880135602082015291955085917fa0262dc79e4ccb71ceac8574ae906311ae338aa4a2044fd4ec4b99fad5ab60cb910160405180910390a492915050565b5f604051858152846020820152604060e0880160408301378360808201528260a082015260a0610120880160c083013761018081016101c088013588018035602081026020830184376020029091206101608301525061018090207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190069695505050505050565b6040805160018082528183019092525f916020808301908036833701905050905084815f8151811061338257613382614e9e565b6020908102919091018101919091525f85815261011b90915260409020546001600160a01b0316806133e0576040517f69ed70ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80826001600160a01b0316637e4f7a8a60e01b87878760405160240161340993929190615169565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161347491906151da565b5f604051808303815f865af19150503d805f81146134ad576040519150601f19603f3d011682016040523d82523d5f602084013e6134b2565b606091505b509150915081613559578051156134f757602081017bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81511663ca389c4460e01b178152815181fd5b6040517fca389c4400000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f556e6b6e6f776e00000000000000000000000000000000000000000000000000604482015260640161107a565b5f8180602001905181019061356e91906151e5565b9050806135a7576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050565b600881901c5f90815261014f6020526040902054600160ff83161b1615613608576040517f335a4a900000000000000000000000000000000000000000000000000000000081526004810182905260240161107a565b600881901c5f90815261014f602052604090208054600160ff84161b17905550565b5f8061364b600161363c876002615325565b6136469190614d4f565b614306565b90508063ffffffff168463ffffffff1611156136a3576040517ff7ec909700000000000000000000000000000000000000000000000000000000815263ffffffff80861660048301528216602482015260440161107a565b865f5b8681101561372957600163ffffffff8716821c811690036136f3576136ec8888838181106136d6576136d6614e9e565b90506020020135835f9182526020526040902090565b9150613721565b61371e8289898481811061370957613709614e9e565b905060200201355f9182526020526040902090565b91505b6001016136a6565b509092149695505050505050565b5f613743602084615330565b1561377a576040517f6426c6c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f729eebce00000000000000000000000000000000000000000000000000000000835b801561382f57602081039050808601357fff000000000000000000000000000000000000000000000000000000000000008116156137e057604051838152600481fd5b7f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001817f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff000000018787090893505061379d565b50509392505050565b7f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001840693505f80600a6001600160a01b03168787878787604051602001613883959493929190615368565b60408051601f198184030181529082905261389d916151da565b5f60405180830381855afa9150503d805f81146138d5576040519150601f19603f3d011682016040523d82523d5f602084013e6138da565b606091505b509150915081613916576040517fa71194af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604081511461395e578051604080517ff75db38100000000000000000000000000000000000000000000000000000000815261107a9290600401918252602082015260400190565b602081015160408201516110008214158061399957507f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff000000018114155b156135a7576040517f68dcad5f000000000000000000000000000000000000000000000000000000008152600481018390526024810182905260440161107a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015f90815261014e60208181526040808420548452848252808420868552929091528083208290555190918391839186917fea3b023b4c8680d4b4824f0143132c95476359a2bb70a81d6c5a36f6918f63399190a4505050565b5f54610100900460ff16613aec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161107a565b5f5b83811015613bf457848482818110613b0857613b08614e9e565b9050604002016020013560db5f878785818110613b2757613b27614e9e565b613b3d92602060409092020190810191506147e4565b6008811115613b4e57613b4e614cb6565b6008811115613b5f57613b5f614cb6565b815260208101919091526040015f2055848482818110613b8157613b81614e9e565b90506040020160200135858583818110613b9d57613b9d614e9e565b613bb392602060409092020190810191506147e4565b6008811115613bc457613bc4614cb6565b6040517f33aa8fd1ce49e1761bc8d27fd53414bfefc45d690feed0ce55019d7d3aec6091905f90a3600101613aee565b505f5b81811015613cfd57828282818110613c1157613c11614e9e565b9050604002016020013560dc5f858585818110613c3057613c30614e9e565b613c4692602060409092020190810191506147e4565b6008811115613c5757613c57614cb6565b6008811115613c6857613c68614cb6565b815260208101919091526040015f2055828282818110613c8a57613c8a614e9e565b90506040020160200135838383818110613ca657613ca6614e9e565b613cbc92602060409092020190810191506147e4565b6008811115613ccd57613ccd614cb6565b6040517fe7bf4b8dc0c17a52dc9e52323a3ab61cb2079db35f969125b1f8a3d984c6f6c2905f90a3600101613bf7565b5050505050565b5f54610100900460ff16613d9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161107a565b613da2614353565b613daa614353565b613db2614353565b613dbc82826143e9565b5050600160e455565b5f54610100900460ff16613e5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161107a565b5f5b818110156111cf575f838383818110613e7857613e78614e9e565b613e8e9260206040909202019081019150614d9b565b6001600160a01b031603613ece576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828282818110613ee057613ee0614e9e565b905060400201602001355f801b03613f24576040517f0742d05300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613f6b838383818110613f3957613f39614e9e565b90506040020160200135848484818110613f5557613f55614e9e565b6123549260206040909202019081019150614d9b565b600101613e5d565b5f8281526065602090815260408083206001600160a01b038516845290915290205460ff1615611227575f8281526065602090815260408083206001600160a01b038516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b5f8281526065602090815260408083206001600160a01b038516845290915290205460ff16611227576140448161454f565b61404f836020614561565b60405160200161406092919061538e565b60408051601f19818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261107a9160040161485b565b815f036140e2578015611227576040517f0c2565920000000000000000000000000000000000000000000000000000000081526004810182905260240161107a565b8061411c576040517f5228f4c80000000000000000000000000000000000000000000000000000000081526004810183905260240161107a565b5f82815261014e60205260409020548114611227576040517f36459fa0000000000000000000000000000000000000000000000000000000008152600481018390526024810182905260440161107a565b5f5b82811015614273576101505f85858481811061418d5761418d614e9e565b9050602002013581526020019081526020015f20545f146141f6578383828181106141ba576141ba614e9e565b905060200201356040517fe5d1442500000000000000000000000000000000000000000000000000000000815260040161107a91815260200190565b816101505f86868581811061420d5761420d614e9e565b9050602002013581526020019081526020015f20819055508184848381811061423857614238614e9e565b905060200201357f300e6f978eee6a4b0bba78dd8400dc64fd5652dbfc868a2258e16d0977be222b60405160405180910390a360010161416f565b50505050565b614284600283615330565b156142be576040517f0c91d7760000000000000000000000000000000000000000000000000000000081526004810183905260240161107a565b5f805b83811015613cfd576040518582013560f01c9250838301907f3c116827db9db3a30c1a25db8b0ee4bab9d2b223560209cfd839601b621c726d905f90a26002016142c1565b5f63ffffffff82111561434f576040517f6dfcc650000000000000000000000000000000000000000000000000000000008152602060048201526024810183905260440161107a565b5090565b5f54610100900460ff16612de7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161107a565b5f54610100900460ff1661447f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161107a565b815f036144b8576040517fb5ed5a3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f036144f1576040517fd10d72bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609782905560988190556145058242614d62565b60998190556097546098546040805192835260208301919091528101919091527f8f805c372b66240792580418b7328c0c554ae235f0932475c51b026887fe26a9906060016125bf565b6060610ff66001600160a01b03831660145b60605f61456f836002614d84565b61457a906002614d62565b67ffffffffffffffff81111561459257614592614f07565b6040519080825280601f01601f1916602001820160405280156145bc576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106145f2576145f2614e9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061465457614654614e9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f61468e846002614d84565b614699906001614d62565b90505b6001811115614735577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106146da576146da614e9e565b1a60f81b8282815181106146f0576146f0614e9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c9361472e816153f8565b905061469c565b50831561479e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161107a565b9392505050565b5f602082840312156147b5575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461479e575f80fd5b5f602082840312156147f4575f80fd5b81356009811061479e575f80fd5b5f60208284031215614812575f80fd5b5035919050565b6001600160a01b0381168114611af5575f80fd5b5f806040838503121561483e575f80fd5b82359150602083013561485081614819565b809150509250929050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f8083601f8401126148a0575f80fd5b50813567ffffffffffffffff8111156148b7575f80fd5b6020830191508360208285010111156148ce575f80fd5b9250929050565b5f805f805f805f8060e0898b0312156148ec575f80fd5b88356148f781614819565b9750602089013561490781614819565b96506040890135955060608901359450608089013561492581614819565b935060a089013567ffffffffffffffff811115614940575f80fd5b61494c8b828c01614890565b999c989b50969995989497949560c00135949350505050565b5f805f8060608587031215614978575f80fd5b843567ffffffffffffffff81111561498e575f80fd5b61499a87828801614890565b90955093505060208501359150604085013567ffffffffffffffff8111156149c0575f80fd5b850161020081880312156149d2575f80fd5b939692955090935050565b5f602082840312156149ed575f80fd5b813567ffffffffffffffff811115614a03575f80fd5b8201610140818503121561479e575f80fd5b5f805f60608486031215614a27575f80fd5b833567ffffffffffffffff811115614a3d575f80fd5b840160608187031215614a4e575f80fd5b95602085013595506040909401359392505050565b5f805f8060608587031215614a76575f80fd5b843567ffffffffffffffff811115614a8c575f80fd5b8501601f81018713614a9c575f80fd5b803567ffffffffffffffff811115614ab2575f80fd5b8760208260051b8401011115614ac6575f80fd5b602091820198909750908601359560400135945092505050565b5f805f8060608587031215614af3575f80fd5b8435614afe81614819565b935060208501359250604085013567ffffffffffffffff811115614b20575f80fd5b614b2c87828801614890565b95989497509550505050565b5f60208284031215614b48575f80fd5b813567ffffffffffffffff811115614b5e575f80fd5b8201610160818503121561479e575f80fd5b5f805f60608486031215614b82575f80fd5b505081359360208301359350604090920135919050565b5f8083601f840112614ba9575f80fd5b50813567ffffffffffffffff811115614bc0575f80fd5b6020830191508360208260061b85010111156148ce575f80fd5b5f805f805f805f6080888a031215614bf0575f80fd5b873567ffffffffffffffff811115614c06575f80fd5b614c128a828b01614b99565b909850965050602088013567ffffffffffffffff811115614c31575f80fd5b614c3d8a828b01614b99565b909650945050604088013567ffffffffffffffff811115614c5c575f80fd5b614c688a828b01614b99565b9094509250506060880135614c7c81614819565b8091505092959891949750929550565b5f8060408385031215614c9d575f80fd5b8235614ca881614819565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6020810160098310614d1c577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b91905290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610ff657610ff6614d22565b80820180821115610ff657610ff6614d22565b818382375f9101908152919050565b8082028115828204841417610ff657610ff6614d22565b5f60208284031215614dab575f80fd5b813561479e81614819565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614de9575f80fd5b83018035915067ffffffffffffffff821115614e03575f80fd5b6020019150368190038213156148ce575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614e4a575f80fd5b83018035915067ffffffffffffffff821115614e64575f80fd5b6020019150600581901b36038213156148ce575f80fd5b5f60208284031215614e8b575f80fd5b813563ffffffff8116811461479e575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61833603018112614efd575f80fd5b9190910192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405160a0810167ffffffffffffffff81118282101715614f5757614f57614f07565b60405290565b5f82601f830112614f6c575f80fd5b813567ffffffffffffffff811115614f8657614f86614f07565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715614fb557614fb5614f07565b604052818152838201602001851015614fcc575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60a08236031215614ff8575f80fd5b615000614f34565b82358152602083013567ffffffffffffffff81111561501d575f80fd5b61502936828601614f5d565b602083015250604083013567ffffffffffffffff811115615048575f80fd5b61505436828601614f5d565b60408301525060608381013590820152608092830135928101929092525090565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036150a5576150a5614d22565b5060010190565b81835281816020850137505f602082840101525f6020601f19601f840116840101905092915050565b858152846020820152836040820152608060608201525f6150fa6080830184866150ac565b979650505050505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615138575f80fd5b83018035915067ffffffffffffffff821115615152575f80fd5b6020019150600681901b36038213156148ce575f80fd5b604081525f61517c6040830185876150ac565b82810360208401528084518083526020830191506020860192505f5b818110156151b6578351835260209384019390920191600101615198565b5090979650505050505050565b5f81518060208401855e5f93019283525090919050565b5f61479e82846151c3565b5f602082840312156151f5575f80fd5b8151801515811461479e575f80fd5b6001815b600184111561523f5780850481111561522357615223614d22565b600184161561523157908102905b60019390931c928002615208565b935093915050565b5f8261525557506001610ff6565b8161526157505f610ff6565b816001811461527757600281146152815761529d565b6001915050610ff6565b60ff84111561529257615292614d22565b50506001821b610ff6565b5060208310610133831016604e8410600b84101617156152c0575081810a610ff6565b6152eb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484615204565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561531d5761531d614d22565b029392505050565b5f61479e8383615247565b5f82615363577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500690565b8581528460208201528360408201525f6150fa61538860608401866151c3565b846151c3565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f6153bf60178301856151c3565b7f206973206d697373696e6720726f6c652000000000000000000000000000000081526153ef60118201856151c3565b95945050505050565b5f8161540657615406614d22565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea264697066735822122017fa9362d0392993ac5f756a12c21940cf721259b8b8bc02053fb03e1c986a6364736f6c634300081a0033", - "deployedBytecode": "0x60806040526004361061049d575f3560e01c806373bd07b71161026b578063b837dbe911610156578063cc5782f6116100d1578063d5d4b83511610087578063e196fb5d1161006d578063e196fb5d14610ea0578063e97a1e9e14610ebf578063f5b541a614610f31575f80fd5b8063d5d4b83514610e57578063d722bbfc14610e6d575f80fd5b8063cd9b9e9a116100b7578063cd9b9e9a14610e02578063cf5b276414610e18578063d547741f14610e38575f80fd5b8063cc5782f614610da1578063cc6f725114610dcf575f80fd5b8063bf3e750511610126578063c0c4e5841161010c578063c0c4e58414610d4e578063c1dc0f0714610d6d578063c211697414610d82575f80fd5b8063bf3e750514610d06578063c0729ab114610d39575f80fd5b8063b837dbe914610c80578063b9174ba314610c95578063bc61e73314610cc8578063bcc3003d14610ce7575f80fd5b80639ac25d08116101e6578063a98e773d116101b6578063ad422ff01161019c578063ad422ff014610c24578063aea4f74514610c39578063b59faa6014610c4d575f80fd5b8063a98e773d14610bd0578063ac1eff6814610bef575f80fd5b80639ac25d0814610b585780639ee8b21114610b8b5780639f3ce55a14610baa578063a217fddf14610bbd575f80fd5b8063914e57eb1161023b578063921b278e11610221578063921b278e14610b23578063986fcddd14610a4157806399467a3514610b39575f80fd5b8063914e57eb14610ab357806391d1485414610adf575f80fd5b806373bd07b714610a2d5780637d1e8c5514610a415780638be745d114610a545780638de4948714610a80575f80fd5b80634cdd389b1161038b57806360e83cf31161030657806367e404ce116102d6578063695378f5116102bc578063695378f5146109b15780636a906b80146109c75780636e673843146109fa575f80fd5b806367e404ce146109665780636854f6bc14610992575f80fd5b806360e83cf3146108bc57806363213155146108e85780636463fb2a1461091b57806366f96e981461093a575f80fd5b8063587944561161035b5780635c721a0c116103415780635c721a0c146108395780635ed73ceb146108645780636078bfd814610890575f80fd5b806358794456146108245780635b7eb4bd14610742575f80fd5b80634cdd389b146107875780635230eef2146107b3578063557eac73146107e65780635603c65f14610805575f80fd5b8063289581741161041b57806338b90333116103eb5780633fc08b65116103d15780633fc08b651461071757806348922ab714610742578063491e093614610768575f80fd5b806338b903331461068f5780633b12eccb146106e4575f80fd5b8063289581741461061c5780632c70645c1461063b5780632f2ff15d1461065157806336568abe14610670575f80fd5b806312d3fa9a116104705780631f443da0116104565780631f443da0146105965780632130d812146105c2578063248a9ca3146105ee575f80fd5b806312d3fa9a1461054d5780631e2ff94f14610580575f80fd5b806301ffc9a7146104a157806303134d1d146104d557806305861180146105165780631065a3991461052c575b5f80fd5b3480156104ac575f80fd5b506104c06104bb3660046147a5565b610f64565b60405190151581526020015b60405180910390f35b3480156104e0575f80fd5b506105087f1ab87f7458c0e3d07e9881c14ee67f0141703614fd48ea5b15ed987e5f4b030e81565b6040519081526020016104cc565b348015610521575f80fd5b506105086101bb5481565b348015610537575f80fd5b5061054b6105463660046147e4565b610ffc565b005b348015610558575f80fd5b506105087f67c2dca7476ee0fe1dd3cba13428c6760bfe2599a6dfe26a9ad7ef27317c6e7781565b34801561058b575f80fd5b506105086101185481565b3480156105a1575f80fd5b506105086105b0366004614802565b6101b96020525f908152604090205481565b3480156105cd575f80fd5b506105086105dc366004614802565b6101be6020525f908152604090205481565b3480156105f9575f80fd5b50610508610608366004614802565b5f9081526065602052604090206001015490565b348015610627575f80fd5b5061054b610636366004614802565b6110f8565b348015610646575f80fd5b506105086101835481565b34801561065c575f80fd5b5061054b61066b36600461482d565b6111ab565b34801561067b575f80fd5b5061054b61068a36600461482d565b6111d4565b34801561069a575f80fd5b506106d76040518060400160405280600381526020017f362e30000000000000000000000000000000000000000000000000000000000081525081565b6040516104cc919061485b565b3480156106ef575f80fd5b506105087fb6cc65f42901ed602aec1619cc1ead29d487cd489094a37615153eaeb991d77081565b348015610722575f80fd5b50610508610731366004614802565b60a56020525f908152604090205481565b34801561074d575f80fd5b50610756600181565b60405160ff90911681526020016104cc565b348015610773575f80fd5b5061054b6107823660046148d5565b61122b565b348015610792575f80fd5b506105086107a1366004614802565b6101b76020525f908152604090205481565b3480156107be575f80fd5b506105087f0cf0d2deb70d7bdac2fa48c4ac99bc558170be0ce5fcb994caefa4bf7b96edf981565b3480156107f1575f80fd5b5061054b610800366004614802565b6114e1565b348015610810575f80fd5b5061054b61081f366004614965565b6115a7565b34801561082f575f80fd5b5061050860995481565b348015610844575f80fd5b50610508610853366004614802565b60a66020525f908152604090205481565b34801561086f575f80fd5b5061050861087e366004614802565b6101ba6020525f908152604090205481565b34801561089b575f80fd5b506105086108aa366004614802565b6101b66020525f908152604090205481565b3480156108c7575f80fd5b506105086108d6366004614802565b6101506020525f908152604090205481565b3480156108f3575f80fd5b506105087fe37c272ea30e2bb381ad7cf89ae754b49153250609f36d0cbdad8b64c184bb5c81565b348015610926575f80fd5b5061054b6109353660046149dd565b61169f565b348015610945575f80fd5b50610508610954366004614802565b6101b86020525f908152604090205481565b348015610971575f80fd5b5061097a611af8565b6040516001600160a01b0390911681526020016104cc565b34801561099d575f80fd5b5061054b6109ac366004614a15565b611b30565b3480156109bc575f80fd5b506105086101195481565b3480156109d2575f80fd5b506105087fd8b4c34c2ec1f3194471108c64ad2beda340c0337ee4ca35592f9ef270f4228b81565b348015610a05575f80fd5b506105087f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c81565b348015610a38575f80fd5b50610756600281565b348015610a4c575f80fd5b506107565f81565b348015610a5f575f80fd5b50610508610a6e366004614802565b61011a6020525f908152604090205481565b348015610a8b575f80fd5b506105087fe1fce82838dd7a42cfe783f60dc6233c8aa2c4fc66e77817805e767ec5e349b681565b348015610abe575f80fd5b50610508610acd366004614802565b61014e6020525f908152604090205481565b348015610aea575f80fd5b506104c0610af936600461482d565b5f9182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b348015610b2e575f80fd5b506105086101bf5481565b348015610b44575f80fd5b5061054b610b53366004614a63565b611d70565b348015610b63575f80fd5b506105087f56bdc3c9ec86cb7db110a7699b2ade72f0b8819727d9f7d906b012641505fa7781565b348015610b96575f80fd5b506104c0610ba5366004614802565b612054565b61054b610bb8366004614ae0565b612077565b348015610bc8575f80fd5b506105085f81565b348015610bdb575f80fd5b5061054b610bea366004614b38565b612199565b348015610bfa575f80fd5b5061097a610c09366004614802565b61011b6020525f90815260409020546001600160a01b031681565b348015610c2f575f80fd5b5061050860985481565b348015610c44575f80fd5b5061054b6125cb565b348015610c58575f80fd5b506105087fe4831f9e4316ac2c65117d1f602fbf56d38128a9973d5e3fdbc5b77265c18d4081565b348015610c8b575f80fd5b5061050860e45481565b348015610ca0575f80fd5b506105087f430a7f0cb00b5ebbe63cecc96e82cf959a883e7c13a95110854f1fa6b3fbf59881565b348015610cd3575f80fd5b506104c0610ce23660046147e4565b612626565b348015610cf2575f80fd5b5061054b610d01366004614b70565b61264a565b348015610d11575f80fd5b506105087f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d8281565b348015610d44575f80fd5b50610508609a5481565b348015610d59575f80fd5b5061054b610d68366004614bda565b61277a565b348015610d78575f80fd5b5061050860975481565b348015610d8d575f80fd5b5061054b610d9c366004614c8c565b6129e0565b348015610dac575f80fd5b506104c0610dbb366004614802565b60d96020525f908152604090205460ff1681565b348015610dda575f80fd5b506105087fe8cb6172fcf5cbaae022b7c910224a4f0c20d53227e630056efff182155a5abc81565b348015610e0d575f80fd5b506105086101bd5481565b348015610e23575f80fd5b506101c05461097a906001600160a01b031681565b348015610e43575f80fd5b5061054b610e5236600461482d565b612ae6565b348015610e62575f80fd5b506105086101bc5481565b348015610e78575f80fd5b506105087f6b5661ddfbd1fbd525c902a513e0f47d9c74f1c1ee8a2d4f1937ad305fb8f41a81565b348015610eab575f80fd5b5061054b610eba3660046147e4565b612b0a565b348015610eca575f80fd5b50610508604080515f602082018190529181018290527f072ead6777750dc20232d1cee8dc9a395c2d350df4bbaa5096c6f59b214dcecd60608201526080810182905260a081019190915260c0016040516020818303038152906040528051906020012081565b348015610f3c575f80fd5b506105087f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480610ff657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60dc5f82600881111561101157611011614cb6565b600881111561102257611022614cb6565b81526020019081526020015f205461103981612be2565b61104282612626565b61108357816040517f1865965400000000000000000000000000000000000000000000000000000000815260040161107a9190614ce3565b60405180910390fd5b81600881111561109557611095614cb6565b60da8054600190921b1990911690558160088111156110b6576110b6614cb6565b7fd071d2b85dec4489435b541d2f0e2570db09b09db9efd8703948d44a433df65a335b6040516001600160a01b03909116815260200160405180910390a25050565b7f6b5661ddfbd1fbd525c902a513e0f47d9c74f1c1ee8a2d4f1937ad305fb8f41a61112281612be2565b5f82815261011b602090815260408083205490516001600160a01b0390911681523392859290917f4a29db3fc6b42bda201e4b4d69ce8d575eeeba5f153509c0d0a342af0f1bd021910160405180910390a4505f90815261011b6020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b5f828152606560205260409020600101546111c581612be2565b6111cf8383612bec565b505050565b6101c0546001600160a01b039081169082160361121d576040517f7f7497e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112278282612caa565b5050565b611233612d4c565b85878484875f5a90506112466003612de9565b61127a61127460017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614d4f565b8f612e7b565b5f61128a8f8f8f8f8c8f8f612e82565b905061129581612edb565b6112a76112a28d8f614d62565b612f35565b5f808f6001600160a01b03168e8d8d6040516112c4929190614d75565b5f6040518083038185875af1925050503d805f81146112fe576040519150601f19603f3d011682016040523d82523d5f602084013e611303565b606091505b5091509150816113605780511561131d5780518082602001fd5b8f6040517f5461344300000000000000000000000000000000000000000000000000000000815260040161107a91906001600160a01b0391909116815260200190565b61139461138e60017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614d4f565b5f612e7b565b60405183907fa4c827e719e911e8f19393ccdb85b5102f08f0910604d340ba38390b7ff2ab0e905f90a25050861590506114c957855f84900361143f57853b15801561143d573a5a6113e861bc7c86614d62565b6113f29190614d4f565b6113fc9190614d84565b915081881115611439576001600160a01b0387166108fc61141d848b614d4f565b6040518115909202915f818181858888f193505050505061143d565b8791505b505b5f6001600160a01b038416156114555783611457565b335b90505f816001600160a01b03166108fc8490811502906040515f60405180830381858888f193505050509050806114c5576040517fa57c4df40000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161107a565b5050505b5050505050506114d7612fab565b5050505050505050565b7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d8261150b81612be2565b5f805f426099541015611530576097546115259042614d62565b609955506001611542565b609a5485101561154257849250600191505b609885905580806115505750815b1561155b57609a8390555b60408051868152831515602082015282151581830152905133917fbc3dc0cb5c15c51c81316450d44048838bb478b9809447d01c766a06f3e9f2c8919081900360600190a25050505050565b60066115b281612de9565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296115dc81612be2565b5f859003611616576040517f7907d79b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610119545f81815261011a6020526040902054843514611662576040517fead4c30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101bd545f6116718684612fd9565b90505f611685878484878b602001356132c6565b905061169381898c8c61334e565b50505050505050505050565b6116a7612d4c565b60a081018035906116bb9060808401614d9b565b6116c9610120840184614db6565b6116da610100860160e08701614d9b565b5f5a90506116e86003612de9565b6101008701355f908152610150602052604081205490819003611737576040517f4e68667500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117418880614e17565b9050811461179057806117548980614e17565b6040517f5e3fd6ad000000000000000000000000000000000000000000000000000000008152600481019390935260248301525060440161107a565b61179d88602001356135b2565b6117b26112a260c08a013560a08b0135614d62565b5f6117fb6117c660808b0160608c01614d9b565b6117d660a08c0160808d01614d9b565b8b60a001358c60c001358d602001358e8061012001906117f69190614db6565b612e82565b90506118268161180b8b80614e17565b61181b60608e0160408f01614e7b565b8d610100013561362a565b61185c576040517fb05e92fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61189f61188a60017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614d4f565b61189a60808c0160608d01614d9b565b612e7b565b5f806118b160a08c0160808d01614d9b565b6001600160a01b031660c08c01356118cd6101208e018e614db6565b6040516118db929190614d75565b5f6040518083038185875af1925050503d805f8114611915576040519150601f19603f3d011682016040523d82523d5f602084013e61191a565b606091505b509150915081611982578051156119345780518082602001fd5b61194460a08c0160808d01614d9b565b6040517f546134430000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161107a565b6119b061138e60017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614d4f565b60405183907fa4c827e719e911e8f19393ccdb85b5102f08f0910604d340ba38390b7ff2ab0e905f90a2505050505f861115611ae757855f849003611a5d57853b158015611a5b573a5a611a0661bc7c86614d62565b611a109190614d4f565b611a1a9190614d84565b915081881115611a57576001600160a01b0387166108fc611a3b848b614d4f565b6040518115909202915f818181858888f1935050505050611a5b565b8791505b505b5f6001600160a01b03841615611a735783611a75565b335b90505f816001600160a01b03166108fc8490811502906040515f60405180830381858888f19350505050905080611ae3576040517fa57c4df40000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161107a565b5050505b505050505050611af5612fab565b50565b5f611b2b611b2760017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614d4f565b5c90565b905090565b6005611b3b81612de9565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929611b6581612be2565b611b726040860186614db6565b90505f03611bac576040517fc01eab5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8381526101be602052604090205415611bf5576040517f0f06cd150000000000000000000000000000000000000000000000000000000081526004810184905260240161107a565b5f8481526101be60205260408120549003611c3f576040517f6e5424c20000000000000000000000000000000000000000000000000000000081526004810185905260240161107a565b5f611c4d6040870187614db6565b604051611c5b929190614d75565b604051809103902090505f611c7d8760200135835f9182526020526040902090565b90505f611cc98760208a01358a3585611ca2611c9c60408f018f614db6565b89613737565b604080519586526020860194909452928401919091526060830152608082015260a0902090565b9050808614611d0e576040517fd3664fb3000000000000000000000000000000000000000000000000000000008152600481018790526024810182905260440161107a565b5f8181526101be602052604090819020600190555181907f55f4c645c36aa5cd3f443d6be44d7a7a5df9d2100d7139dfc69d4289ee07231990611d5e908a908c3590918252602082015260400190565b60405180910390a25050505050505050565b6004611d7b81612de9565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929611da581612be2565b5f859003611ddf576040517fb1504a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b844915611e1b576040517f8019aff70000000000000000000000000000000000000000000000000000000081526004810186905260240161107a565b5f8481526101be60205260408120549003611e65576040517f6e5424c20000000000000000000000000000000000000000000000000000000081526004810185905260240161107a565b5f8381526101be602052604090205415611eae576040517f0f06cd150000000000000000000000000000000000000000000000000000000081526004810184905260240161107a565b6040805160a0810182525f808252606060208301819052928201839052918101829052608081018290528190865f5b89811015611fb3578a8a82818110611ef757611ef7614e9e565b9050602002810190611f099190614ecb565b611f1290614fe8565b81499450925083611f52576040517fc0e41e1d0000000000000000000000000000000000000000000000000000000081526004810182905260240161107a565b60808301515f8181526020869052604090209550611f8085875f1c865f015187602001518860400151613838565b6060848101518551604080519687526020870194909452928501528301869052608083015260a090912090600101611edd565b50808714611ff7576040517fd3664fb3000000000000000000000000000000000000000000000000000000008152600481018890526024810182905260440161107a565b5f8181526101be602090815260409182902060019055606084015182518b81529182015282917f55f4c645c36aa5cd3f443d6be44d7a7a5df9d2100d7139dfc69d4289ee072319910160405180910390a250505050505050505050565b600881901c5f90815261014f6020526040812054600160ff84161b161515610ff6565b600261208281612de9565b6001600160a01b0385166120c2576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b348411156120fc576040517fb03b693200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60e480545f918261210c83615075565b9091555090505f61211d8634614d4f565b90505f61212f33898985878b8b612e82565b905061213b83826139da565b80886001600160a01b0316336001600160a01b03167fe856c2b8bd4eb0027ce32eeaf595c21b0b6b4644b326e5b7bd80a1cf8db72e6c8a86888c8c6040516121879594939291906150d5565b60405180910390a45050505050505050565b5f54610100900460ff16158080156121b757505f54600160ff909116105b806121d05750303b1580156121d057505f5460ff166001145b61225c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161107a565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156122b8575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f6122c96080840160608501614d9b565b6001600160a01b031603612309576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61232c61231960e0840184615105565b612327610100860186615105565b613a56565b61233e82608001358360a00135613d04565b6123595f61235461016085016101408601614d9b565b612bec565b61236e61236960c0840184615105565b613dc5565b61237e6080830160608401614d9b565b5f805261011b6020527f033d11f27e62ab919708ec716731da80d261a6e4253259b7acde9bf89d28ec1880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790556123f061014083016101208401614d9b565b6101c080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905561243b61014083016101208401614d9b565b6001600160a01b0316336001600160a01b03167f1f82add12d98b5eaed4d6a6d5f74cfc7a85e5c90c335ab5562f77f220ed45d5f60405160405180910390a36020828101356101198190555f90815261011a825260408082208535905580518084018390528082018390527f072ead6777750dc20232d1cee8dc9a395c2d350df4bbaa5096c6f59b214dcecd60608083018290526080830185905260a08084018690528451808503909101815260c08401855280519087012085526101be86528385206001905560e0830185905261010083018590526101208301919091526101408201849052610160808301859052835180840390910181526101808301808552815191909601206101bd558385526101a0820193909352908501356101c09091015290206101bf558015611227575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b7f0cf0d2deb70d7bdac2fa48c4ac99bc558170be0ce5fcb994caefa4bf7b96edf96125f581612be2565b5f609a81905560405133917fba88c025b0cbb77022c0c487beef24f759f1e4be2f51a205bc427cee19c2eaa691a250565b5f81600881111561263957612639614cb6565b60da54600190911b16151592915050565b61265762f099c082614d62565b421015612690576040517f4306cbb100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805184815260208101849052908101829052606090206101bf5414612708576101bf546040805185815260208101859052908101839052606090206040517fbc5aad110000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161107a565b6101c0546001600160a01b031661273f7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92982612bec565b6040516001600160a01b0382169033907f9fc8868f8577b31b805ee65bb52325782b5e2708dbdb7f04c7467c6785fccb30905f90a350505050565b5f54600690610100900460ff1615801561279a57505f5460ff8083169116105b612826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161107a565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556128608888613dc5565b61286c86868686613a56565b6001600160a01b0382166128ac576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101c080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03841690811790915560405133907f1f82add12d98b5eaed4d6a6d5f74cfc7a85e5c90c335ab5562f77f220ed45d5f905f90a36040517f362e300000000000000000000000000000000000000000000000000000000000907f352e300000000000000000000000000000000000000000000000000000000000907f2f8492a7a430cf917798dfb60bc5af634f68e6c40287947df0ea6f7ec0669bd8905f90a35f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050565b7f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c612a0a81612be2565b6001600160a01b038316612a4a576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82815261011b60209081526040918290205491516001600160a01b03928316815233928592908716917f4a29db3fc6b42bda201e4b4d69ce8d575eeeba5f153509c0d0a342af0f1bd021910160405180910390a4505f90815261011b6020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f82815260656020526040902060010154612b0081612be2565b6111cf8383613f73565b60db5f826008811115612b1f57612b1f614cb6565b6008811115612b3057612b30614cb6565b81526020019081526020015f2054612b4781612be2565b612b5082612626565b15612b8957816040517fc0a71b5800000000000000000000000000000000000000000000000000000000815260040161107a9190614ce3565b816008811115612b9b57612b9b614cb6565b60da8054600190921b9091179055816008811115612bbb57612bbb614cb6565b7f534f879afd40abb4e39f8e1b77a316be4c8e3521d9cf5a3a3db8959d574d4559336110d9565b611af58133614012565b5f8281526065602090815260408083206001600160a01b038516845290915290205460ff16611227575f8281526065602090815260408083206001600160a01b0385168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055612c663390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6001600160a01b0381163314612d42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c660000000000000000000000000000000000606482015260840161107a565b6112278282613f73565b5f612d7b611b2760017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614d4f565b14612db2576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612de7612de060017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614d4f565b6001612e7b565b565b60da54816008811115612dfe57612dfe614cb6565b6001901b811615612e3d57816040517fc0a71b5800000000000000000000000000000000000000000000000000000000815260040161107a9190614ce3565b60028116156112275760016040517fc0a71b5800000000000000000000000000000000000000000000000000000000815260040161107a9190614ce3565b80825d5050565b5f60405188815287602082015286604082015285606082015284608082015260c060a08201528260c0820152602083065f8115612ec0578160200390505b848660e085013790930160e001902098975050505050505050565b5f81815260a66020526040902054600114612f25576040517f992d87c30000000000000000000000000000000000000000000000000000000081526004810182905260240161107a565b5f90815260a66020526040812055565b8015611af557426099541015612f5a57609754612f529042614d62565b609955612f6a565b609a54612f679082614d62565b90505b609854811115612fa6576040517fa74c1c5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609a55565b612de761138e60017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614d4f565b5f81836020013511613024576040517f70614405000000000000000000000000000000000000000000000000000000008152602084013560048201526024810183905260440161107a565b6130388361018001358461014001356140a0565b6101bf54604080516101608601358152610120860135602082015260e08601359181019190915260609020146130ce57604080516101608501358152610120850135602082015260e085013591810191909152606090206101bf546040517fbc5aad110000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161107a565b4283610100013510613119576040517fbf81c6e0000000000000000000000000000000000000000000000000000000008152610100840135600482015242602482015260440161107a565b6080830135613154576040517f2898482a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61319760408401356060850135608086013560a087013560c0880135604080519586526020860194909452928401919091526060830152608082015260a0902090565b5f8181526101be6020526040812054919250036131e3576040517fedeae83c0000000000000000000000000000000000000000000000000000000081526004810182905260240161107a565b6131ff6131f46101c0850185614e17565b856101a0013561416d565b6132166132106101e0850185614db6565b84614279565b6020808401355f81815261011a909252604090912060808501359055610119556101bd81905561326b610180840135610140850135610100860135604080519384526020840192909252908201526060902090565b6101bf5580602084013561327e84615075565b60408051873581526080880135602082015291955085917fa0262dc79e4ccb71ceac8574ae906311ae338aa4a2044fd4ec4b99fad5ab60cb910160405180910390a492915050565b5f604051858152846020820152604060e0880160408301378360808201528260a082015260a0610120880160c083013761018081016101c088013588018035602081026020830184376020029091206101608301525061018090207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190069695505050505050565b6040805160018082528183019092525f916020808301908036833701905050905084815f8151811061338257613382614e9e565b6020908102919091018101919091525f85815261011b90915260409020546001600160a01b0316806133e0576040517f69ed70ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80826001600160a01b0316637e4f7a8a60e01b87878760405160240161340993929190615169565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161347491906151da565b5f604051808303815f865af19150503d805f81146134ad576040519150601f19603f3d011682016040523d82523d5f602084013e6134b2565b606091505b509150915081613559578051156134f757602081017bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81511663ca389c4460e01b178152815181fd5b6040517fca389c4400000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f556e6b6e6f776e00000000000000000000000000000000000000000000000000604482015260640161107a565b5f8180602001905181019061356e91906151e5565b9050806135a7576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050565b600881901c5f90815261014f6020526040902054600160ff83161b1615613608576040517f335a4a900000000000000000000000000000000000000000000000000000000081526004810182905260240161107a565b600881901c5f90815261014f602052604090208054600160ff84161b17905550565b5f8061364b600161363c876002615325565b6136469190614d4f565b614306565b90508063ffffffff168463ffffffff1611156136a3576040517ff7ec909700000000000000000000000000000000000000000000000000000000815263ffffffff80861660048301528216602482015260440161107a565b865f5b8681101561372957600163ffffffff8716821c811690036136f3576136ec8888838181106136d6576136d6614e9e565b90506020020135835f9182526020526040902090565b9150613721565b61371e8289898481811061370957613709614e9e565b905060200201355f9182526020526040902090565b91505b6001016136a6565b509092149695505050505050565b5f613743602084615330565b1561377a576040517f6426c6c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f729eebce00000000000000000000000000000000000000000000000000000000835b801561382f57602081039050808601357fff000000000000000000000000000000000000000000000000000000000000008116156137e057604051838152600481fd5b7f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001817f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff000000018787090893505061379d565b50509392505050565b7f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001840693505f80600a6001600160a01b03168787878787604051602001613883959493929190615368565b60408051601f198184030181529082905261389d916151da565b5f60405180830381855afa9150503d805f81146138d5576040519150601f19603f3d011682016040523d82523d5f602084013e6138da565b606091505b509150915081613916576040517fa71194af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604081511461395e578051604080517ff75db38100000000000000000000000000000000000000000000000000000000815261107a9290600401918252602082015260400190565b602081015160408201516110008214158061399957507f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff000000018114155b156135a7576040517f68dcad5f000000000000000000000000000000000000000000000000000000008152600481018390526024810182905260440161107a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015f90815261014e60208181526040808420548452848252808420868552929091528083208290555190918391839186917fea3b023b4c8680d4b4824f0143132c95476359a2bb70a81d6c5a36f6918f63399190a4505050565b5f54610100900460ff16613aec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161107a565b5f5b83811015613bf457848482818110613b0857613b08614e9e565b9050604002016020013560db5f878785818110613b2757613b27614e9e565b613b3d92602060409092020190810191506147e4565b6008811115613b4e57613b4e614cb6565b6008811115613b5f57613b5f614cb6565b815260208101919091526040015f2055848482818110613b8157613b81614e9e565b90506040020160200135858583818110613b9d57613b9d614e9e565b613bb392602060409092020190810191506147e4565b6008811115613bc457613bc4614cb6565b6040517f33aa8fd1ce49e1761bc8d27fd53414bfefc45d690feed0ce55019d7d3aec6091905f90a3600101613aee565b505f5b81811015613cfd57828282818110613c1157613c11614e9e565b9050604002016020013560dc5f858585818110613c3057613c30614e9e565b613c4692602060409092020190810191506147e4565b6008811115613c5757613c57614cb6565b6008811115613c6857613c68614cb6565b815260208101919091526040015f2055828282818110613c8a57613c8a614e9e565b90506040020160200135838383818110613ca657613ca6614e9e565b613cbc92602060409092020190810191506147e4565b6008811115613ccd57613ccd614cb6565b6040517fe7bf4b8dc0c17a52dc9e52323a3ab61cb2079db35f969125b1f8a3d984c6f6c2905f90a3600101613bf7565b5050505050565b5f54610100900460ff16613d9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161107a565b613da2614353565b613daa614353565b613db2614353565b613dbc82826143e9565b5050600160e455565b5f54610100900460ff16613e5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161107a565b5f5b818110156111cf575f838383818110613e7857613e78614e9e565b613e8e9260206040909202019081019150614d9b565b6001600160a01b031603613ece576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828282818110613ee057613ee0614e9e565b905060400201602001355f801b03613f24576040517f0742d05300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613f6b838383818110613f3957613f39614e9e565b90506040020160200135848484818110613f5557613f55614e9e565b6123549260206040909202019081019150614d9b565b600101613e5d565b5f8281526065602090815260408083206001600160a01b038516845290915290205460ff1615611227575f8281526065602090815260408083206001600160a01b038516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b5f8281526065602090815260408083206001600160a01b038516845290915290205460ff16611227576140448161454f565b61404f836020614561565b60405160200161406092919061538e565b60408051601f19818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261107a9160040161485b565b815f036140e2578015611227576040517f0c2565920000000000000000000000000000000000000000000000000000000081526004810182905260240161107a565b8061411c576040517f5228f4c80000000000000000000000000000000000000000000000000000000081526004810183905260240161107a565b5f82815261014e60205260409020548114611227576040517f36459fa0000000000000000000000000000000000000000000000000000000008152600481018390526024810182905260440161107a565b5f5b82811015614273576101505f85858481811061418d5761418d614e9e565b9050602002013581526020019081526020015f20545f146141f6578383828181106141ba576141ba614e9e565b905060200201356040517fe5d1442500000000000000000000000000000000000000000000000000000000815260040161107a91815260200190565b816101505f86868581811061420d5761420d614e9e565b9050602002013581526020019081526020015f20819055508184848381811061423857614238614e9e565b905060200201357f300e6f978eee6a4b0bba78dd8400dc64fd5652dbfc868a2258e16d0977be222b60405160405180910390a360010161416f565b50505050565b614284600283615330565b156142be576040517f0c91d7760000000000000000000000000000000000000000000000000000000081526004810183905260240161107a565b5f805b83811015613cfd576040518582013560f01c9250838301907f3c116827db9db3a30c1a25db8b0ee4bab9d2b223560209cfd839601b621c726d905f90a26002016142c1565b5f63ffffffff82111561434f576040517f6dfcc650000000000000000000000000000000000000000000000000000000008152602060048201526024810183905260440161107a565b5090565b5f54610100900460ff16612de7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161107a565b5f54610100900460ff1661447f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161107a565b815f036144b8576040517fb5ed5a3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f036144f1576040517fd10d72bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609782905560988190556145058242614d62565b60998190556097546098546040805192835260208301919091528101919091527f8f805c372b66240792580418b7328c0c554ae235f0932475c51b026887fe26a9906060016125bf565b6060610ff66001600160a01b03831660145b60605f61456f836002614d84565b61457a906002614d62565b67ffffffffffffffff81111561459257614592614f07565b6040519080825280601f01601f1916602001820160405280156145bc576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106145f2576145f2614e9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061465457614654614e9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f61468e846002614d84565b614699906001614d62565b90505b6001811115614735577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106146da576146da614e9e565b1a60f81b8282815181106146f0576146f0614e9e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c9361472e816153f8565b905061469c565b50831561479e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161107a565b9392505050565b5f602082840312156147b5575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461479e575f80fd5b5f602082840312156147f4575f80fd5b81356009811061479e575f80fd5b5f60208284031215614812575f80fd5b5035919050565b6001600160a01b0381168114611af5575f80fd5b5f806040838503121561483e575f80fd5b82359150602083013561485081614819565b809150509250929050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f8083601f8401126148a0575f80fd5b50813567ffffffffffffffff8111156148b7575f80fd5b6020830191508360208285010111156148ce575f80fd5b9250929050565b5f805f805f805f8060e0898b0312156148ec575f80fd5b88356148f781614819565b9750602089013561490781614819565b96506040890135955060608901359450608089013561492581614819565b935060a089013567ffffffffffffffff811115614940575f80fd5b61494c8b828c01614890565b999c989b50969995989497949560c00135949350505050565b5f805f8060608587031215614978575f80fd5b843567ffffffffffffffff81111561498e575f80fd5b61499a87828801614890565b90955093505060208501359150604085013567ffffffffffffffff8111156149c0575f80fd5b850161020081880312156149d2575f80fd5b939692955090935050565b5f602082840312156149ed575f80fd5b813567ffffffffffffffff811115614a03575f80fd5b8201610140818503121561479e575f80fd5b5f805f60608486031215614a27575f80fd5b833567ffffffffffffffff811115614a3d575f80fd5b840160608187031215614a4e575f80fd5b95602085013595506040909401359392505050565b5f805f8060608587031215614a76575f80fd5b843567ffffffffffffffff811115614a8c575f80fd5b8501601f81018713614a9c575f80fd5b803567ffffffffffffffff811115614ab2575f80fd5b8760208260051b8401011115614ac6575f80fd5b602091820198909750908601359560400135945092505050565b5f805f8060608587031215614af3575f80fd5b8435614afe81614819565b935060208501359250604085013567ffffffffffffffff811115614b20575f80fd5b614b2c87828801614890565b95989497509550505050565b5f60208284031215614b48575f80fd5b813567ffffffffffffffff811115614b5e575f80fd5b8201610160818503121561479e575f80fd5b5f805f60608486031215614b82575f80fd5b505081359360208301359350604090920135919050565b5f8083601f840112614ba9575f80fd5b50813567ffffffffffffffff811115614bc0575f80fd5b6020830191508360208260061b85010111156148ce575f80fd5b5f805f805f805f6080888a031215614bf0575f80fd5b873567ffffffffffffffff811115614c06575f80fd5b614c128a828b01614b99565b909850965050602088013567ffffffffffffffff811115614c31575f80fd5b614c3d8a828b01614b99565b909650945050604088013567ffffffffffffffff811115614c5c575f80fd5b614c688a828b01614b99565b9094509250506060880135614c7c81614819565b8091505092959891949750929550565b5f8060408385031215614c9d575f80fd5b8235614ca881614819565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6020810160098310614d1c577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b91905290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610ff657610ff6614d22565b80820180821115610ff657610ff6614d22565b818382375f9101908152919050565b8082028115828204841417610ff657610ff6614d22565b5f60208284031215614dab575f80fd5b813561479e81614819565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614de9575f80fd5b83018035915067ffffffffffffffff821115614e03575f80fd5b6020019150368190038213156148ce575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614e4a575f80fd5b83018035915067ffffffffffffffff821115614e64575f80fd5b6020019150600581901b36038213156148ce575f80fd5b5f60208284031215614e8b575f80fd5b813563ffffffff8116811461479e575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61833603018112614efd575f80fd5b9190910192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405160a0810167ffffffffffffffff81118282101715614f5757614f57614f07565b60405290565b5f82601f830112614f6c575f80fd5b813567ffffffffffffffff811115614f8657614f86614f07565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715614fb557614fb5614f07565b604052818152838201602001851015614fcc575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60a08236031215614ff8575f80fd5b615000614f34565b82358152602083013567ffffffffffffffff81111561501d575f80fd5b61502936828601614f5d565b602083015250604083013567ffffffffffffffff811115615048575f80fd5b61505436828601614f5d565b60408301525060608381013590820152608092830135928101929092525090565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036150a5576150a5614d22565b5060010190565b81835281816020850137505f602082840101525f6020601f19601f840116840101905092915050565b858152846020820152836040820152608060608201525f6150fa6080830184866150ac565b979650505050505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615138575f80fd5b83018035915067ffffffffffffffff821115615152575f80fd5b6020019150600681901b36038213156148ce575f80fd5b604081525f61517c6040830185876150ac565b82810360208401528084518083526020830191506020860192505f5b818110156151b6578351835260209384019390920191600101615198565b5090979650505050505050565b5f81518060208401855e5f93019283525090919050565b5f61479e82846151c3565b5f602082840312156151f5575f80fd5b8151801515811461479e575f80fd5b6001815b600184111561523f5780850481111561522357615223614d22565b600184161561523157908102905b60019390931c928002615208565b935093915050565b5f8261525557506001610ff6565b8161526157505f610ff6565b816001811461527757600281146152815761529d565b6001915050610ff6565b60ff84111561529257615292614d22565b50506001821b610ff6565b5060208310610133831016604e8410600b84101617156152c0575081810a610ff6565b6152eb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484615204565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561531d5761531d614d22565b029392505050565b5f61479e8383615247565b5f82615363577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500690565b8581528460208201528360408201525f6150fa61538860608401866151c3565b846151c3565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f6153bf60178301856151c3565b7f206973206d697373696e6720726f6c652000000000000000000000000000000081526153ef60118201856151c3565b95945050505050565b5f8161540657615406614d22565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea264697066735822122017fa9362d0392993ac5f756a12c21940cf721259b8b8bc02053fb03e1c986a6364736f6c634300081a0033", + "bytecode": "0x6080604052348015600e575f80fd5b5060156019565b60d3565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161460d1575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b61535e806100e05f395ff3fe608060405260043610610483575f3560e01c806373bd07b711610251578063b837dbe91161013c578063cc5782f6116100b7578063d547741f11610087578063d722bbfc1161006d578063d722bbfc14610e53578063e196fb5d14610e86578063f5b541a614610ea5575f80fd5b8063d547741f14610e1e578063d5d4b83514610e3d575f80fd5b8063cc5782f614610d87578063cc6f725114610db5578063cd9b9e9a14610de8578063cf5b276414610dfe575f80fd5b8063bf3e75051161010c578063c0c4e584116100f2578063c0c4e58414610d34578063c1dc0f0714610d53578063c211697414610d68575f80fd5b8063bf3e750514610cec578063c0729ab114610d1f575f80fd5b8063b837dbe914610c66578063b9174ba314610c7b578063bc61e73314610cae578063bcc3003d14610ccd575f80fd5b80639ac25d08116101cc578063a98e773d1161019c578063ad422ff011610182578063ad422ff014610c0a578063aea4f74514610c1f578063b59faa6014610c33575f80fd5b8063a98e773d14610bb6578063ac1eff6814610bd5575f80fd5b80639ac25d0814610b3e5780639ee8b21114610b715780639f3ce55a14610b90578063a217fddf14610ba3575f80fd5b8063914e57eb11610221578063921b278e11610207578063921b278e14610b09578063986fcddd14610a2757806399467a3514610b1f575f80fd5b8063914e57eb14610a9957806391d1485414610ac5575f80fd5b806373bd07b714610a135780637d1e8c5514610a275780638be745d114610a3a5780638de4948714610a66575f80fd5b80634cdd389b1161037157806360e83cf3116102ec57806367e404ce116102bc578063695378f5116102a2578063695378f5146109975780636a906b80146109ad5780636e673843146109e0575f80fd5b806367e404ce1461094c5780636854f6bc14610978575f80fd5b806360e83cf3146108a257806363213155146108ce5780636463fb2a1461090157806366f96e9814610920575f80fd5b806358794456116103415780635c721a0c116103275780635c721a0c1461081f5780635ed73ceb1461084a5780636078bfd814610876575f80fd5b8063587944561461080a5780635b7eb4bd14610728575f80fd5b80634cdd389b1461076d5780635230eef214610799578063557eac73146107cc5780635603c65f146107eb575f80fd5b8063289581741161040157806338b90333116103d15780633fc08b65116103b75780633fc08b65146106fd57806348922ab714610728578063491e09361461074e575f80fd5b806338b90333146106755780633b12eccb146106ca575f80fd5b806328958174146106025780632c70645c146106215780632f2ff15d1461063757806336568abe14610656575f80fd5b806312d3fa9a116104565780631f443da01161043c5780631f443da01461057c5780632130d812146105a8578063248a9ca3146105d4575f80fd5b806312d3fa9a146105335780631e2ff94f14610566575f80fd5b806301ffc9a71461048757806303134d1d146104bb57806305861180146104fc5780631065a39914610512575b5f80fd5b348015610492575f80fd5b506104a66104a13660046146a1565b610ed8565b60405190151581526020015b60405180910390f35b3480156104c6575f80fd5b506104ee7f1ab87f7458c0e3d07e9881c14ee67f0141703614fd48ea5b15ed987e5f4b030e81565b6040519081526020016104b2565b348015610507575f80fd5b506104ee6101bb5481565b34801561051d575f80fd5b5061053161052c3660046146e0565b610f70565b005b34801561053e575f80fd5b506104ee7f67c2dca7476ee0fe1dd3cba13428c6760bfe2599a6dfe26a9ad7ef27317c6e7781565b348015610571575f80fd5b506104ee6101185481565b348015610587575f80fd5b506104ee6105963660046146fe565b6101b96020525f908152604090205481565b3480156105b3575f80fd5b506104ee6105c23660046146fe565b6101be6020525f908152604090205481565b3480156105df575f80fd5b506104ee6105ee3660046146fe565b5f9081526065602052604090206001015490565b34801561060d575f80fd5b5061053161061c3660046146fe565b61106c565b34801561062c575f80fd5b506104ee6101835481565b348015610642575f80fd5b50610531610651366004614729565b61111f565b348015610661575f80fd5b50610531610670366004614729565b611148565b348015610680575f80fd5b506106bd6040518060400160405280600381526020017f362e30000000000000000000000000000000000000000000000000000000000081525081565b6040516104b29190614757565b3480156106d5575f80fd5b506104ee7fb6cc65f42901ed602aec1619cc1ead29d487cd489094a37615153eaeb991d77081565b348015610708575f80fd5b506104ee6107173660046146fe565b60a56020525f908152604090205481565b348015610733575f80fd5b5061073c600181565b60405160ff90911681526020016104b2565b348015610759575f80fd5b506105316107683660046147d1565b61119f565b348015610778575f80fd5b506104ee6107873660046146fe565b6101b76020525f908152604090205481565b3480156107a4575f80fd5b506104ee7f0cf0d2deb70d7bdac2fa48c4ac99bc558170be0ce5fcb994caefa4bf7b96edf981565b3480156107d7575f80fd5b506105316107e63660046146fe565b611455565b3480156107f6575f80fd5b50610531610805366004614861565b61151b565b348015610815575f80fd5b506104ee60995481565b34801561082a575f80fd5b506104ee6108393660046146fe565b60a66020525f908152604090205481565b348015610855575f80fd5b506104ee6108643660046146fe565b6101ba6020525f908152604090205481565b348015610881575f80fd5b506104ee6108903660046146fe565b6101b66020525f908152604090205481565b3480156108ad575f80fd5b506104ee6108bc3660046146fe565b6101506020525f908152604090205481565b3480156108d9575f80fd5b506104ee7fe37c272ea30e2bb381ad7cf89ae754b49153250609f36d0cbdad8b64c184bb5c81565b34801561090c575f80fd5b5061053161091b3660046148d9565b611613565b34801561092b575f80fd5b506104ee61093a3660046146fe565b6101b86020525f908152604090205481565b348015610957575f80fd5b50610960611a6c565b6040516001600160a01b0390911681526020016104b2565b348015610983575f80fd5b50610531610992366004614911565b611aa4565b3480156109a2575f80fd5b506104ee6101195481565b3480156109b8575f80fd5b506104ee7fd8b4c34c2ec1f3194471108c64ad2beda340c0337ee4ca35592f9ef270f4228b81565b3480156109eb575f80fd5b506104ee7f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c81565b348015610a1e575f80fd5b5061073c600281565b348015610a32575f80fd5b5061073c5f81565b348015610a45575f80fd5b506104ee610a543660046146fe565b61011a6020525f908152604090205481565b348015610a71575f80fd5b506104ee7fe1fce82838dd7a42cfe783f60dc6233c8aa2c4fc66e77817805e767ec5e349b681565b348015610aa4575f80fd5b506104ee610ab33660046146fe565b61014e6020525f908152604090205481565b348015610ad0575f80fd5b506104a6610adf366004614729565b5f9182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b348015610b14575f80fd5b506104ee6101bf5481565b348015610b2a575f80fd5b50610531610b3936600461495f565b611ce4565b348015610b49575f80fd5b506104ee7f56bdc3c9ec86cb7db110a7699b2ade72f0b8819727d9f7d906b012641505fa7781565b348015610b7c575f80fd5b506104a6610b8b3660046146fe565b611fc8565b610531610b9e3660046149dc565b611feb565b348015610bae575f80fd5b506104ee5f81565b348015610bc1575f80fd5b50610531610bd0366004614a34565b61210d565b348015610be0575f80fd5b50610960610bef3660046146fe565b61011b6020525f90815260409020546001600160a01b031681565b348015610c15575f80fd5b506104ee60985481565b348015610c2a575f80fd5b506105316124c7565b348015610c3e575f80fd5b506104ee7fe4831f9e4316ac2c65117d1f602fbf56d38128a9973d5e3fdbc5b77265c18d4081565b348015610c71575f80fd5b506104ee60e45481565b348015610c86575f80fd5b506104ee7f430a7f0cb00b5ebbe63cecc96e82cf959a883e7c13a95110854f1fa6b3fbf59881565b348015610cb9575f80fd5b506104a6610cc83660046146e0565b612522565b348015610cd8575f80fd5b50610531610ce7366004614a6c565b612546565b348015610cf7575f80fd5b506104ee7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d8281565b348015610d2a575f80fd5b506104ee609a5481565b348015610d3f575f80fd5b50610531610d4e366004614ad6565b612676565b348015610d5e575f80fd5b506104ee60975481565b348015610d73575f80fd5b50610531610d82366004614b88565b6128dc565b348015610d92575f80fd5b506104a6610da13660046146fe565b60d96020525f908152604090205460ff1681565b348015610dc0575f80fd5b506104ee7fe8cb6172fcf5cbaae022b7c910224a4f0c20d53227e630056efff182155a5abc81565b348015610df3575f80fd5b506104ee6101bd5481565b348015610e09575f80fd5b506101c054610960906001600160a01b031681565b348015610e29575f80fd5b50610531610e38366004614729565b6129e2565b348015610e48575f80fd5b506104ee6101bc5481565b348015610e5e575f80fd5b506104ee7f6b5661ddfbd1fbd525c902a513e0f47d9c74f1c1ee8a2d4f1937ad305fb8f41a81565b348015610e91575f80fd5b50610531610ea03660046146e0565b612a06565b348015610eb0575f80fd5b506104ee7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480610f6a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60dc5f826008811115610f8557610f85614bb2565b6008811115610f9657610f96614bb2565b81526020019081526020015f2054610fad81612ade565b610fb682612522565b610ff757816040517f18659654000000000000000000000000000000000000000000000000000000008152600401610fee9190614bdf565b60405180910390fd5b81600881111561100957611009614bb2565b60da8054600190921b19909116905581600881111561102a5761102a614bb2565b7fd071d2b85dec4489435b541d2f0e2570db09b09db9efd8703948d44a433df65a335b6040516001600160a01b03909116815260200160405180910390a25050565b7f6b5661ddfbd1fbd525c902a513e0f47d9c74f1c1ee8a2d4f1937ad305fb8f41a61109681612ade565b5f82815261011b602090815260408083205490516001600160a01b0390911681523392859290917f4a29db3fc6b42bda201e4b4d69ce8d575eeeba5f153509c0d0a342af0f1bd021910160405180910390a4505f90815261011b6020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b5f8281526065602052604090206001015461113981612ade565b6111438383612ae8565b505050565b6101c0546001600160a01b0390811690821603611191576040517f7f7497e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61119b8282612ba6565b5050565b6111a7612c48565b85878484875f5a90506111ba6003612ce5565b6111ee6111e860017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614c4b565b8f612d77565b5f6111fe8f8f8f8f8c8f8f612d7e565b905061120981612dd7565b61121b6112168d8f614c5e565b612e31565b5f808f6001600160a01b03168e8d8d604051611238929190614c71565b5f6040518083038185875af1925050503d805f8114611272576040519150601f19603f3d011682016040523d82523d5f602084013e611277565b606091505b5091509150816112d4578051156112915780518082602001fd5b8f6040517f54613443000000000000000000000000000000000000000000000000000000008152600401610fee91906001600160a01b0391909116815260200190565b61130861130260017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614c4b565b5f612d77565b60405183907fa4c827e719e911e8f19393ccdb85b5102f08f0910604d340ba38390b7ff2ab0e905f90a250508615905061143d57855f8490036113b357853b1580156113b1573a5a61135c61bc7c86614c5e565b6113669190614c4b565b6113709190614c80565b9150818811156113ad576001600160a01b0387166108fc611391848b614c4b565b6040518115909202915f818181858888f19350505050506113b1565b8791505b505b5f6001600160a01b038416156113c957836113cb565b335b90505f816001600160a01b03166108fc8490811502906040515f60405180830381858888f19350505050905080611439576040517fa57c4df40000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610fee565b5050505b50505050505061144b612ea7565b5050505050505050565b7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d8261147f81612ade565b5f805f4260995410156114a4576097546114999042614c5e565b6099555060016114b6565b609a548510156114b657849250600191505b609885905580806114c45750815b156114cf57609a8390555b60408051868152831515602082015282151581830152905133917fbc3dc0cb5c15c51c81316450d44048838bb478b9809447d01c766a06f3e9f2c8919081900360600190a25050505050565b600661152681612ce5565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92961155081612ade565b5f85900361158a576040517f7907d79b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610119545f81815261011a60205260409020548435146115d6576040517fead4c30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101bd545f6115e58684612ed5565b90505f6115f9878484878b602001356131c2565b905061160781898c8c61324a565b50505050505050505050565b61161b612c48565b60a0810180359061162f9060808401614c97565b61163d610120840184614cb2565b61164e610100860160e08701614c97565b5f5a905061165c6003612ce5565b6101008701355f9081526101506020526040812054908190036116ab576040517f4e68667500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116b58880614d13565b9050811461170457806116c88980614d13565b6040517f5e3fd6ad0000000000000000000000000000000000000000000000000000000081526004810193909352602483015250604401610fee565b61171188602001356134ae565b61172661121660c08a013560a08b0135614c5e565b5f61176f61173a60808b0160608c01614c97565b61174a60a08c0160808d01614c97565b8b60a001358c60c001358d602001358e80610120019061176a9190614cb2565b612d7e565b905061179a8161177f8b80614d13565b61178f60608e0160408f01614d77565b8d6101000135613526565b6117d0576040517fb05e92fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118136117fe60017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614c4b565b61180e60808c0160608d01614c97565b612d77565b5f8061182560a08c0160808d01614c97565b6001600160a01b031660c08c01356118416101208e018e614cb2565b60405161184f929190614c71565b5f6040518083038185875af1925050503d805f8114611889576040519150601f19603f3d011682016040523d82523d5f602084013e61188e565b606091505b5091509150816118f6578051156118a85780518082602001fd5b6118b860a08c0160808d01614c97565b6040517f546134430000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610fee565b61192461130260017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614c4b565b60405183907fa4c827e719e911e8f19393ccdb85b5102f08f0910604d340ba38390b7ff2ab0e905f90a2505050505f861115611a5b57855f8490036119d157853b1580156119cf573a5a61197a61bc7c86614c5e565b6119849190614c4b565b61198e9190614c80565b9150818811156119cb576001600160a01b0387166108fc6119af848b614c4b565b6040518115909202915f818181858888f19350505050506119cf565b8791505b505b5f6001600160a01b038416156119e757836119e9565b335b90505f816001600160a01b03166108fc8490811502906040515f60405180830381858888f19350505050905080611a57576040517fa57c4df40000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610fee565b5050505b505050505050611a69612ea7565b50565b5f611a9f611a9b60017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614c4b565b5c90565b905090565b6005611aaf81612ce5565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929611ad981612ade565b611ae66040860186614cb2565b90505f03611b20576040517fc01eab5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8381526101be602052604090205415611b69576040517f0f06cd1500000000000000000000000000000000000000000000000000000000815260048101849052602401610fee565b5f8481526101be60205260408120549003611bb3576040517f6e5424c200000000000000000000000000000000000000000000000000000000815260048101859052602401610fee565b5f611bc16040870187614cb2565b604051611bcf929190614c71565b604051809103902090505f611bf18760200135835f9182526020526040902090565b90505f611c3d8760208a01358a3585611c16611c1060408f018f614cb2565b89613633565b604080519586526020860194909452928401919091526060830152608082015260a0902090565b9050808614611c82576040517fd3664fb30000000000000000000000000000000000000000000000000000000081526004810187905260248101829052604401610fee565b5f8181526101be602052604090819020600190555181907f55f4c645c36aa5cd3f443d6be44d7a7a5df9d2100d7139dfc69d4289ee07231990611cd2908a908c3590918252602082015260400190565b60405180910390a25050505050505050565b6004611cef81612ce5565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929611d1981612ade565b5f859003611d53576040517fb1504a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b844915611d8f576040517f8019aff700000000000000000000000000000000000000000000000000000000815260048101869052602401610fee565b5f8481526101be60205260408120549003611dd9576040517f6e5424c200000000000000000000000000000000000000000000000000000000815260048101859052602401610fee565b5f8381526101be602052604090205415611e22576040517f0f06cd1500000000000000000000000000000000000000000000000000000000815260048101849052602401610fee565b6040805160a0810182525f808252606060208301819052928201839052918101829052608081018290528190865f5b89811015611f27578a8a82818110611e6b57611e6b614d9a565b9050602002810190611e7d9190614dc7565b611e8690614ee4565b81499450925083611ec6576040517fc0e41e1d00000000000000000000000000000000000000000000000000000000815260048101829052602401610fee565b60808301515f8181526020869052604090209550611ef485875f1c865f015187602001518860400151613734565b6060848101518551604080519687526020870194909452928501528301869052608083015260a090912090600101611e51565b50808714611f6b576040517fd3664fb30000000000000000000000000000000000000000000000000000000081526004810188905260248101829052604401610fee565b5f8181526101be602090815260409182902060019055606084015182518b81529182015282917f55f4c645c36aa5cd3f443d6be44d7a7a5df9d2100d7139dfc69d4289ee072319910160405180910390a250505050505050505050565b600881901c5f90815261014f6020526040812054600160ff84161b161515610f6a565b6002611ff681612ce5565b6001600160a01b038516612036576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b34841115612070576040517fb03b693200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60e480545f918261208083614f71565b9091555090505f6120918634614c4b565b90505f6120a333898985878b8b612d7e565b90506120af83826138d6565b80886001600160a01b0316336001600160a01b03167fe856c2b8bd4eb0027ce32eeaf595c21b0b6b4644b326e5b7bd80a1cf8db72e6c8a86888c8c6040516120fb959493929190614fd1565b60405180910390a45050505050505050565b5f54610100900460ff161580801561212b57505f54600160ff909116105b806121445750303b15801561214457505f5460ff166001145b6121d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610fee565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561222c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f61223d6080840160608501614c97565b6001600160a01b03160361227d576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122a061228d60e0840184615001565b61229b610100860186615001565b613952565b6122b282608001358360a00135613c00565b6122cd5f6122c861016085016101408601614c97565b612ae8565b6122e26122dd60c0840184615001565b613cc1565b6122f26080830160608401614c97565b5f805261011b6020527f033d11f27e62ab919708ec716731da80d261a6e4253259b7acde9bf89d28ec1880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905561236461014083016101208401614c97565b6101c080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790556123af61014083016101208401614c97565b6001600160a01b0316336001600160a01b03167f1f82add12d98b5eaed4d6a6d5f74cfc7a85e5c90c335ab5562f77f220ed45d5f60405160405180910390a36020828101356101198190555f90815261011a8252604080822085359081905581518381528085018490528083019190915260608082018490526080820184905260a09091208084526101be8552828420600190556101bd55815183815293840192909252808501359083015290206101bf55801561119b575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b7f0cf0d2deb70d7bdac2fa48c4ac99bc558170be0ce5fcb994caefa4bf7b96edf96124f181612ade565b5f609a81905560405133917fba88c025b0cbb77022c0c487beef24f759f1e4be2f51a205bc427cee19c2eaa691a250565b5f81600881111561253557612535614bb2565b60da54600190911b16151592915050565b61255362f099c082614c5e565b42101561258c576040517f4306cbb100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805184815260208101849052908101829052606090206101bf5414612604576101bf546040805185815260208101859052908101839052606090206040517fbc5aad1100000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610fee565b6101c0546001600160a01b031661263b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92982612ae8565b6040516001600160a01b0382169033907f9fc8868f8577b31b805ee65bb52325782b5e2708dbdb7f04c7467c6785fccb30905f90a350505050565b5f54600690610100900460ff1615801561269657505f5460ff8083169116105b612722576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610fee565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff83161761010017905561275c8888613cc1565b61276886868686613952565b6001600160a01b0382166127a8576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101c080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03841690811790915560405133907f1f82add12d98b5eaed4d6a6d5f74cfc7a85e5c90c335ab5562f77f220ed45d5f905f90a36040517f362e300000000000000000000000000000000000000000000000000000000000907f352e300000000000000000000000000000000000000000000000000000000000907f2f8492a7a430cf917798dfb60bc5af634f68e6c40287947df0ea6f7ec0669bd8905f90a35f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050565b7f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c61290681612ade565b6001600160a01b038316612946576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82815261011b60209081526040918290205491516001600160a01b03928316815233928592908716917f4a29db3fc6b42bda201e4b4d69ce8d575eeeba5f153509c0d0a342af0f1bd021910160405180910390a4505f90815261011b6020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f828152606560205260409020600101546129fc81612ade565b6111438383613e6f565b60db5f826008811115612a1b57612a1b614bb2565b6008811115612a2c57612a2c614bb2565b81526020019081526020015f2054612a4381612ade565b612a4c82612522565b15612a8557816040517fc0a71b58000000000000000000000000000000000000000000000000000000008152600401610fee9190614bdf565b816008811115612a9757612a97614bb2565b60da8054600190921b9091179055816008811115612ab757612ab7614bb2565b7f534f879afd40abb4e39f8e1b77a316be4c8e3521d9cf5a3a3db8959d574d45593361104d565b611a698133613f0e565b5f8281526065602090815260408083206001600160a01b038516845290915290205460ff1661119b575f8281526065602090815260408083206001600160a01b0385168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055612b623390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6001600160a01b0381163314612c3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610fee565b61119b8282613e6f565b5f612c77611a9b60017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614c4b565b14612cae576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ce3612cdc60017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614c4b565b6001612d77565b565b60da54816008811115612cfa57612cfa614bb2565b6001901b811615612d3957816040517fc0a71b58000000000000000000000000000000000000000000000000000000008152600401610fee9190614bdf565b600281161561119b5760016040517fc0a71b58000000000000000000000000000000000000000000000000000000008152600401610fee9190614bdf565b80825d5050565b5f60405188815287602082015286604082015285606082015284608082015260c060a08201528260c0820152602083065f8115612dbc578160200390505b848660e085013790930160e001902098975050505050505050565b5f81815260a66020526040902054600114612e21576040517f992d87c300000000000000000000000000000000000000000000000000000000815260048101829052602401610fee565b5f90815260a66020526040812055565b8015611a6957426099541015612e5657609754612e4e9042614c5e565b609955612e66565b609a54612e639082614c5e565b90505b609854811115612ea2576040517fa74c1c5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609a55565b612ce361130260017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614c4b565b5f81836020013511612f20576040517f706144050000000000000000000000000000000000000000000000000000000081526020840135600482015260248101839052604401610fee565b612f34836101800135846101400135613f9c565b6101bf54604080516101608601358152610120860135602082015260e0860135918101919091526060902014612fca57604080516101608501358152610120850135602082015260e085013591810191909152606090206101bf546040517fbc5aad1100000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610fee565b4283610100013510613015576040517fbf81c6e00000000000000000000000000000000000000000000000000000000081526101008401356004820152426024820152604401610fee565b6080830135613050576040517f2898482a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61309360408401356060850135608086013560a087013560c0880135604080519586526020860194909452928401919091526060830152608082015260a0902090565b5f8181526101be6020526040812054919250036130df576040517fedeae83c00000000000000000000000000000000000000000000000000000000815260048101829052602401610fee565b6130fb6130f06101c0850185614d13565b856101a00135614069565b61311261310c6101e0850185614cb2565b84614175565b6020808401355f81815261011a909252604090912060808501359055610119556101bd819055613167610180840135610140850135610100860135604080519384526020840192909252908201526060902090565b6101bf5580602084013561317a84614f71565b60408051873581526080880135602082015291955085917fa0262dc79e4ccb71ceac8574ae906311ae338aa4a2044fd4ec4b99fad5ab60cb910160405180910390a492915050565b5f604051858152846020820152604060e0880160408301378360808201528260a082015260a0610120880160c083013761018081016101c088013588018035602081026020830184376020029091206101608301525061018090207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190069695505050505050565b6040805160018082528183019092525f916020808301908036833701905050905084815f8151811061327e5761327e614d9a565b6020908102919091018101919091525f85815261011b90915260409020546001600160a01b0316806132dc576040517f69ed70ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80826001600160a01b0316637e4f7a8a60e01b87878760405160240161330593929190615065565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161337091906150d6565b5f604051808303815f865af19150503d805f81146133a9576040519150601f19603f3d011682016040523d82523d5f602084013e6133ae565b606091505b509150915081613455578051156133f357602081017bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81511663ca389c4460e01b178152815181fd5b6040517fca389c4400000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f556e6b6e6f776e000000000000000000000000000000000000000000000000006044820152606401610fee565b5f8180602001905181019061346a91906150e1565b9050806134a3576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050565b600881901c5f90815261014f6020526040902054600160ff83161b1615613504576040517f335a4a9000000000000000000000000000000000000000000000000000000000815260048101829052602401610fee565b600881901c5f90815261014f602052604090208054600160ff84161b17905550565b5f806135476001613538876002615221565b6135429190614c4b565b614202565b90508063ffffffff168463ffffffff16111561359f576040517ff7ec909700000000000000000000000000000000000000000000000000000000815263ffffffff808616600483015282166024820152604401610fee565b865f5b8681101561362557600163ffffffff8716821c811690036135ef576135e88888838181106135d2576135d2614d9a565b90506020020135835f9182526020526040902090565b915061361d565b61361a8289898481811061360557613605614d9a565b905060200201355f9182526020526040902090565b91505b6001016135a2565b509092149695505050505050565b5f61363f60208461522c565b15613676576040517f6426c6c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f729eebce00000000000000000000000000000000000000000000000000000000835b801561372b57602081039050808601357fff000000000000000000000000000000000000000000000000000000000000008116156136dc57604051838152600481fd5b7f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001817f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff0000000187870908935050613699565b50509392505050565b7f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001840693505f80600a6001600160a01b0316878787878760405160200161377f959493929190615264565b60408051601f1981840301815290829052613799916150d6565b5f60405180830381855afa9150503d805f81146137d1576040519150601f19603f3d011682016040523d82523d5f602084013e6137d6565b606091505b509150915081613812576040517fa71194af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604081511461385a578051604080517ff75db381000000000000000000000000000000000000000000000000000000008152610fee9290600401918252602082015260400190565b602081015160408201516110008214158061389557507f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff000000018114155b156134a3576040517f68dcad5f0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610fee565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015f90815261014e60208181526040808420548452848252808420868552929091528083208290555190918391839186917fea3b023b4c8680d4b4824f0143132c95476359a2bb70a81d6c5a36f6918f63399190a4505050565b5f54610100900460ff166139e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610fee565b5f5b83811015613af057848482818110613a0457613a04614d9a565b9050604002016020013560db5f878785818110613a2357613a23614d9a565b613a3992602060409092020190810191506146e0565b6008811115613a4a57613a4a614bb2565b6008811115613a5b57613a5b614bb2565b815260208101919091526040015f2055848482818110613a7d57613a7d614d9a565b90506040020160200135858583818110613a9957613a99614d9a565b613aaf92602060409092020190810191506146e0565b6008811115613ac057613ac0614bb2565b6040517f33aa8fd1ce49e1761bc8d27fd53414bfefc45d690feed0ce55019d7d3aec6091905f90a36001016139ea565b505f5b81811015613bf957828282818110613b0d57613b0d614d9a565b9050604002016020013560dc5f858585818110613b2c57613b2c614d9a565b613b4292602060409092020190810191506146e0565b6008811115613b5357613b53614bb2565b6008811115613b6457613b64614bb2565b815260208101919091526040015f2055828282818110613b8657613b86614d9a565b90506040020160200135838383818110613ba257613ba2614d9a565b613bb892602060409092020190810191506146e0565b6008811115613bc957613bc9614bb2565b6040517fe7bf4b8dc0c17a52dc9e52323a3ab61cb2079db35f969125b1f8a3d984c6f6c2905f90a3600101613af3565b5050505050565b5f54610100900460ff16613c96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610fee565b613c9e61424f565b613ca661424f565b613cae61424f565b613cb882826142e5565b5050600160e455565b5f54610100900460ff16613d57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610fee565b5f5b81811015611143575f838383818110613d7457613d74614d9a565b613d8a9260206040909202019081019150614c97565b6001600160a01b031603613dca576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828282818110613ddc57613ddc614d9a565b905060400201602001355f801b03613e20576040517f0742d05300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613e67838383818110613e3557613e35614d9a565b90506040020160200135848484818110613e5157613e51614d9a565b6122c89260206040909202019081019150614c97565b600101613d59565b5f8281526065602090815260408083206001600160a01b038516845290915290205460ff161561119b575f8281526065602090815260408083206001600160a01b038516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b5f8281526065602090815260408083206001600160a01b038516845290915290205460ff1661119b57613f408161444b565b613f4b83602061445d565b604051602001613f5c92919061528a565b60408051601f19818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252610fee91600401614757565b815f03613fde57801561119b576040517f0c25659200000000000000000000000000000000000000000000000000000000815260048101829052602401610fee565b80614018576040517f5228f4c800000000000000000000000000000000000000000000000000000000815260048101839052602401610fee565b5f82815261014e6020526040902054811461119b576040517f36459fa00000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610fee565b5f5b8281101561416f576101505f85858481811061408957614089614d9a565b9050602002013581526020019081526020015f20545f146140f2578383828181106140b6576140b6614d9a565b905060200201356040517fe5d14425000000000000000000000000000000000000000000000000000000008152600401610fee91815260200190565b816101505f86868581811061410957614109614d9a565b9050602002013581526020019081526020015f20819055508184848381811061413457614134614d9a565b905060200201357f300e6f978eee6a4b0bba78dd8400dc64fd5652dbfc868a2258e16d0977be222b60405160405180910390a360010161406b565b50505050565b61418060028361522c565b156141ba576040517f0c91d77600000000000000000000000000000000000000000000000000000000815260048101839052602401610fee565b5f805b83811015613bf9576040518582013560f01c9250838301907f3c116827db9db3a30c1a25db8b0ee4bab9d2b223560209cfd839601b621c726d905f90a26002016141bd565b5f63ffffffff82111561424b576040517f6dfcc6500000000000000000000000000000000000000000000000000000000081526020600482015260248101839052604401610fee565b5090565b5f54610100900460ff16612ce3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610fee565b5f54610100900460ff1661437b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610fee565b815f036143b4576040517fb5ed5a3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f036143ed576040517fd10d72bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609782905560988190556144018242614c5e565b60998190556097546098546040805192835260208301919091528101919091527f8f805c372b66240792580418b7328c0c554ae235f0932475c51b026887fe26a9906060016124bb565b6060610f6a6001600160a01b03831660145b60605f61446b836002614c80565b614476906002614c5e565b67ffffffffffffffff81111561448e5761448e614e03565b6040519080825280601f01601f1916602001820160405280156144b8576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106144ee576144ee614d9a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061455057614550614d9a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f61458a846002614c80565b614595906001614c5e565b90505b6001811115614631577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106145d6576145d6614d9a565b1a60f81b8282815181106145ec576145ec614d9a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c9361462a816152f4565b9050614598565b50831561469a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610fee565b9392505050565b5f602082840312156146b1575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461469a575f80fd5b5f602082840312156146f0575f80fd5b81356009811061469a575f80fd5b5f6020828403121561470e575f80fd5b5035919050565b6001600160a01b0381168114611a69575f80fd5b5f806040838503121561473a575f80fd5b82359150602083013561474c81614715565b809150509250929050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f8083601f84011261479c575f80fd5b50813567ffffffffffffffff8111156147b3575f80fd5b6020830191508360208285010111156147ca575f80fd5b9250929050565b5f805f805f805f8060e0898b0312156147e8575f80fd5b88356147f381614715565b9750602089013561480381614715565b96506040890135955060608901359450608089013561482181614715565b935060a089013567ffffffffffffffff81111561483c575f80fd5b6148488b828c0161478c565b999c989b50969995989497949560c00135949350505050565b5f805f8060608587031215614874575f80fd5b843567ffffffffffffffff81111561488a575f80fd5b6148968782880161478c565b90955093505060208501359150604085013567ffffffffffffffff8111156148bc575f80fd5b850161020081880312156148ce575f80fd5b939692955090935050565b5f602082840312156148e9575f80fd5b813567ffffffffffffffff8111156148ff575f80fd5b8201610140818503121561469a575f80fd5b5f805f60608486031215614923575f80fd5b833567ffffffffffffffff811115614939575f80fd5b84016060818703121561494a575f80fd5b95602085013595506040909401359392505050565b5f805f8060608587031215614972575f80fd5b843567ffffffffffffffff811115614988575f80fd5b8501601f81018713614998575f80fd5b803567ffffffffffffffff8111156149ae575f80fd5b8760208260051b84010111156149c2575f80fd5b602091820198909750908601359560400135945092505050565b5f805f80606085870312156149ef575f80fd5b84356149fa81614715565b935060208501359250604085013567ffffffffffffffff811115614a1c575f80fd5b614a288782880161478c565b95989497509550505050565b5f60208284031215614a44575f80fd5b813567ffffffffffffffff811115614a5a575f80fd5b8201610160818503121561469a575f80fd5b5f805f60608486031215614a7e575f80fd5b505081359360208301359350604090920135919050565b5f8083601f840112614aa5575f80fd5b50813567ffffffffffffffff811115614abc575f80fd5b6020830191508360208260061b85010111156147ca575f80fd5b5f805f805f805f6080888a031215614aec575f80fd5b873567ffffffffffffffff811115614b02575f80fd5b614b0e8a828b01614a95565b909850965050602088013567ffffffffffffffff811115614b2d575f80fd5b614b398a828b01614a95565b909650945050604088013567ffffffffffffffff811115614b58575f80fd5b614b648a828b01614a95565b9094509250506060880135614b7881614715565b8091505092959891949750929550565b5f8060408385031215614b99575f80fd5b8235614ba481614715565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6020810160098310614c18577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b91905290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610f6a57610f6a614c1e565b80820180821115610f6a57610f6a614c1e565b818382375f9101908152919050565b8082028115828204841417610f6a57610f6a614c1e565b5f60208284031215614ca7575f80fd5b813561469a81614715565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614ce5575f80fd5b83018035915067ffffffffffffffff821115614cff575f80fd5b6020019150368190038213156147ca575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614d46575f80fd5b83018035915067ffffffffffffffff821115614d60575f80fd5b6020019150600581901b36038213156147ca575f80fd5b5f60208284031215614d87575f80fd5b813563ffffffff8116811461469a575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61833603018112614df9575f80fd5b9190910192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405160a0810167ffffffffffffffff81118282101715614e5357614e53614e03565b60405290565b5f82601f830112614e68575f80fd5b813567ffffffffffffffff811115614e8257614e82614e03565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715614eb157614eb1614e03565b604052818152838201602001851015614ec8575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60a08236031215614ef4575f80fd5b614efc614e30565b82358152602083013567ffffffffffffffff811115614f19575f80fd5b614f2536828601614e59565b602083015250604083013567ffffffffffffffff811115614f44575f80fd5b614f5036828601614e59565b60408301525060608381013590820152608092830135928101929092525090565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614fa157614fa1614c1e565b5060010190565b81835281816020850137505f602082840101525f6020601f19601f840116840101905092915050565b858152846020820152836040820152608060608201525f614ff6608083018486614fa8565b979650505050505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615034575f80fd5b83018035915067ffffffffffffffff82111561504e575f80fd5b6020019150600681901b36038213156147ca575f80fd5b604081525f615078604083018587614fa8565b82810360208401528084518083526020830191506020860192505f5b818110156150b2578351835260209384019390920191600101615094565b5090979650505050505050565b5f81518060208401855e5f93019283525090919050565b5f61469a82846150bf565b5f602082840312156150f1575f80fd5b8151801515811461469a575f80fd5b6001815b600184111561513b5780850481111561511f5761511f614c1e565b600184161561512d57908102905b60019390931c928002615104565b935093915050565b5f8261515157506001610f6a565b8161515d57505f610f6a565b8160018114615173576002811461517d57615199565b6001915050610f6a565b60ff84111561518e5761518e614c1e565b50506001821b610f6a565b5060208310610133831016604e8410600b84101617156151bc575081810a610f6a565b6151e77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484615100565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561521957615219614c1e565b029392505050565b5f61469a8383615143565b5f8261525f577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500690565b8581528460208201528360408201525f614ff661528460608401866150bf565b846150bf565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f6152bb60178301856150bf565b7f206973206d697373696e6720726f6c652000000000000000000000000000000081526152eb60118201856150bf565b95945050505050565b5f8161530257615302614c1e565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220f37ab9d49b246192cc1f4c0273d18fcd431dc83c67e6b7fb35993ccad3328d4e64736f6c634300081a0033", + "deployedBytecode": "0x608060405260043610610483575f3560e01c806373bd07b711610251578063b837dbe91161013c578063cc5782f6116100b7578063d547741f11610087578063d722bbfc1161006d578063d722bbfc14610e53578063e196fb5d14610e86578063f5b541a614610ea5575f80fd5b8063d547741f14610e1e578063d5d4b83514610e3d575f80fd5b8063cc5782f614610d87578063cc6f725114610db5578063cd9b9e9a14610de8578063cf5b276414610dfe575f80fd5b8063bf3e75051161010c578063c0c4e584116100f2578063c0c4e58414610d34578063c1dc0f0714610d53578063c211697414610d68575f80fd5b8063bf3e750514610cec578063c0729ab114610d1f575f80fd5b8063b837dbe914610c66578063b9174ba314610c7b578063bc61e73314610cae578063bcc3003d14610ccd575f80fd5b80639ac25d08116101cc578063a98e773d1161019c578063ad422ff011610182578063ad422ff014610c0a578063aea4f74514610c1f578063b59faa6014610c33575f80fd5b8063a98e773d14610bb6578063ac1eff6814610bd5575f80fd5b80639ac25d0814610b3e5780639ee8b21114610b715780639f3ce55a14610b90578063a217fddf14610ba3575f80fd5b8063914e57eb11610221578063921b278e11610207578063921b278e14610b09578063986fcddd14610a2757806399467a3514610b1f575f80fd5b8063914e57eb14610a9957806391d1485414610ac5575f80fd5b806373bd07b714610a135780637d1e8c5514610a275780638be745d114610a3a5780638de4948714610a66575f80fd5b80634cdd389b1161037157806360e83cf3116102ec57806367e404ce116102bc578063695378f5116102a2578063695378f5146109975780636a906b80146109ad5780636e673843146109e0575f80fd5b806367e404ce1461094c5780636854f6bc14610978575f80fd5b806360e83cf3146108a257806363213155146108ce5780636463fb2a1461090157806366f96e9814610920575f80fd5b806358794456116103415780635c721a0c116103275780635c721a0c1461081f5780635ed73ceb1461084a5780636078bfd814610876575f80fd5b8063587944561461080a5780635b7eb4bd14610728575f80fd5b80634cdd389b1461076d5780635230eef214610799578063557eac73146107cc5780635603c65f146107eb575f80fd5b8063289581741161040157806338b90333116103d15780633fc08b65116103b75780633fc08b65146106fd57806348922ab714610728578063491e09361461074e575f80fd5b806338b90333146106755780633b12eccb146106ca575f80fd5b806328958174146106025780632c70645c146106215780632f2ff15d1461063757806336568abe14610656575f80fd5b806312d3fa9a116104565780631f443da01161043c5780631f443da01461057c5780632130d812146105a8578063248a9ca3146105d4575f80fd5b806312d3fa9a146105335780631e2ff94f14610566575f80fd5b806301ffc9a71461048757806303134d1d146104bb57806305861180146104fc5780631065a39914610512575b5f80fd5b348015610492575f80fd5b506104a66104a13660046146a1565b610ed8565b60405190151581526020015b60405180910390f35b3480156104c6575f80fd5b506104ee7f1ab87f7458c0e3d07e9881c14ee67f0141703614fd48ea5b15ed987e5f4b030e81565b6040519081526020016104b2565b348015610507575f80fd5b506104ee6101bb5481565b34801561051d575f80fd5b5061053161052c3660046146e0565b610f70565b005b34801561053e575f80fd5b506104ee7f67c2dca7476ee0fe1dd3cba13428c6760bfe2599a6dfe26a9ad7ef27317c6e7781565b348015610571575f80fd5b506104ee6101185481565b348015610587575f80fd5b506104ee6105963660046146fe565b6101b96020525f908152604090205481565b3480156105b3575f80fd5b506104ee6105c23660046146fe565b6101be6020525f908152604090205481565b3480156105df575f80fd5b506104ee6105ee3660046146fe565b5f9081526065602052604090206001015490565b34801561060d575f80fd5b5061053161061c3660046146fe565b61106c565b34801561062c575f80fd5b506104ee6101835481565b348015610642575f80fd5b50610531610651366004614729565b61111f565b348015610661575f80fd5b50610531610670366004614729565b611148565b348015610680575f80fd5b506106bd6040518060400160405280600381526020017f362e30000000000000000000000000000000000000000000000000000000000081525081565b6040516104b29190614757565b3480156106d5575f80fd5b506104ee7fb6cc65f42901ed602aec1619cc1ead29d487cd489094a37615153eaeb991d77081565b348015610708575f80fd5b506104ee6107173660046146fe565b60a56020525f908152604090205481565b348015610733575f80fd5b5061073c600181565b60405160ff90911681526020016104b2565b348015610759575f80fd5b506105316107683660046147d1565b61119f565b348015610778575f80fd5b506104ee6107873660046146fe565b6101b76020525f908152604090205481565b3480156107a4575f80fd5b506104ee7f0cf0d2deb70d7bdac2fa48c4ac99bc558170be0ce5fcb994caefa4bf7b96edf981565b3480156107d7575f80fd5b506105316107e63660046146fe565b611455565b3480156107f6575f80fd5b50610531610805366004614861565b61151b565b348015610815575f80fd5b506104ee60995481565b34801561082a575f80fd5b506104ee6108393660046146fe565b60a66020525f908152604090205481565b348015610855575f80fd5b506104ee6108643660046146fe565b6101ba6020525f908152604090205481565b348015610881575f80fd5b506104ee6108903660046146fe565b6101b66020525f908152604090205481565b3480156108ad575f80fd5b506104ee6108bc3660046146fe565b6101506020525f908152604090205481565b3480156108d9575f80fd5b506104ee7fe37c272ea30e2bb381ad7cf89ae754b49153250609f36d0cbdad8b64c184bb5c81565b34801561090c575f80fd5b5061053161091b3660046148d9565b611613565b34801561092b575f80fd5b506104ee61093a3660046146fe565b6101b86020525f908152604090205481565b348015610957575f80fd5b50610960611a6c565b6040516001600160a01b0390911681526020016104b2565b348015610983575f80fd5b50610531610992366004614911565b611aa4565b3480156109a2575f80fd5b506104ee6101195481565b3480156109b8575f80fd5b506104ee7fd8b4c34c2ec1f3194471108c64ad2beda340c0337ee4ca35592f9ef270f4228b81565b3480156109eb575f80fd5b506104ee7f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c81565b348015610a1e575f80fd5b5061073c600281565b348015610a32575f80fd5b5061073c5f81565b348015610a45575f80fd5b506104ee610a543660046146fe565b61011a6020525f908152604090205481565b348015610a71575f80fd5b506104ee7fe1fce82838dd7a42cfe783f60dc6233c8aa2c4fc66e77817805e767ec5e349b681565b348015610aa4575f80fd5b506104ee610ab33660046146fe565b61014e6020525f908152604090205481565b348015610ad0575f80fd5b506104a6610adf366004614729565b5f9182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b348015610b14575f80fd5b506104ee6101bf5481565b348015610b2a575f80fd5b50610531610b3936600461495f565b611ce4565b348015610b49575f80fd5b506104ee7f56bdc3c9ec86cb7db110a7699b2ade72f0b8819727d9f7d906b012641505fa7781565b348015610b7c575f80fd5b506104a6610b8b3660046146fe565b611fc8565b610531610b9e3660046149dc565b611feb565b348015610bae575f80fd5b506104ee5f81565b348015610bc1575f80fd5b50610531610bd0366004614a34565b61210d565b348015610be0575f80fd5b50610960610bef3660046146fe565b61011b6020525f90815260409020546001600160a01b031681565b348015610c15575f80fd5b506104ee60985481565b348015610c2a575f80fd5b506105316124c7565b348015610c3e575f80fd5b506104ee7fe4831f9e4316ac2c65117d1f602fbf56d38128a9973d5e3fdbc5b77265c18d4081565b348015610c71575f80fd5b506104ee60e45481565b348015610c86575f80fd5b506104ee7f430a7f0cb00b5ebbe63cecc96e82cf959a883e7c13a95110854f1fa6b3fbf59881565b348015610cb9575f80fd5b506104a6610cc83660046146e0565b612522565b348015610cd8575f80fd5b50610531610ce7366004614a6c565b612546565b348015610cf7575f80fd5b506104ee7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d8281565b348015610d2a575f80fd5b506104ee609a5481565b348015610d3f575f80fd5b50610531610d4e366004614ad6565b612676565b348015610d5e575f80fd5b506104ee60975481565b348015610d73575f80fd5b50610531610d82366004614b88565b6128dc565b348015610d92575f80fd5b506104a6610da13660046146fe565b60d96020525f908152604090205460ff1681565b348015610dc0575f80fd5b506104ee7fe8cb6172fcf5cbaae022b7c910224a4f0c20d53227e630056efff182155a5abc81565b348015610df3575f80fd5b506104ee6101bd5481565b348015610e09575f80fd5b506101c054610960906001600160a01b031681565b348015610e29575f80fd5b50610531610e38366004614729565b6129e2565b348015610e48575f80fd5b506104ee6101bc5481565b348015610e5e575f80fd5b506104ee7f6b5661ddfbd1fbd525c902a513e0f47d9c74f1c1ee8a2d4f1937ad305fb8f41a81565b348015610e91575f80fd5b50610531610ea03660046146e0565b612a06565b348015610eb0575f80fd5b506104ee7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480610f6a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60dc5f826008811115610f8557610f85614bb2565b6008811115610f9657610f96614bb2565b81526020019081526020015f2054610fad81612ade565b610fb682612522565b610ff757816040517f18659654000000000000000000000000000000000000000000000000000000008152600401610fee9190614bdf565b60405180910390fd5b81600881111561100957611009614bb2565b60da8054600190921b19909116905581600881111561102a5761102a614bb2565b7fd071d2b85dec4489435b541d2f0e2570db09b09db9efd8703948d44a433df65a335b6040516001600160a01b03909116815260200160405180910390a25050565b7f6b5661ddfbd1fbd525c902a513e0f47d9c74f1c1ee8a2d4f1937ad305fb8f41a61109681612ade565b5f82815261011b602090815260408083205490516001600160a01b0390911681523392859290917f4a29db3fc6b42bda201e4b4d69ce8d575eeeba5f153509c0d0a342af0f1bd021910160405180910390a4505f90815261011b6020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b5f8281526065602052604090206001015461113981612ade565b6111438383612ae8565b505050565b6101c0546001600160a01b0390811690821603611191576040517f7f7497e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61119b8282612ba6565b5050565b6111a7612c48565b85878484875f5a90506111ba6003612ce5565b6111ee6111e860017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614c4b565b8f612d77565b5f6111fe8f8f8f8f8c8f8f612d7e565b905061120981612dd7565b61121b6112168d8f614c5e565b612e31565b5f808f6001600160a01b03168e8d8d604051611238929190614c71565b5f6040518083038185875af1925050503d805f8114611272576040519150601f19603f3d011682016040523d82523d5f602084013e611277565b606091505b5091509150816112d4578051156112915780518082602001fd5b8f6040517f54613443000000000000000000000000000000000000000000000000000000008152600401610fee91906001600160a01b0391909116815260200190565b61130861130260017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614c4b565b5f612d77565b60405183907fa4c827e719e911e8f19393ccdb85b5102f08f0910604d340ba38390b7ff2ab0e905f90a250508615905061143d57855f8490036113b357853b1580156113b1573a5a61135c61bc7c86614c5e565b6113669190614c4b565b6113709190614c80565b9150818811156113ad576001600160a01b0387166108fc611391848b614c4b565b6040518115909202915f818181858888f19350505050506113b1565b8791505b505b5f6001600160a01b038416156113c957836113cb565b335b90505f816001600160a01b03166108fc8490811502906040515f60405180830381858888f19350505050905080611439576040517fa57c4df40000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610fee565b5050505b50505050505061144b612ea7565b5050505050505050565b7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d8261147f81612ade565b5f805f4260995410156114a4576097546114999042614c5e565b6099555060016114b6565b609a548510156114b657849250600191505b609885905580806114c45750815b156114cf57609a8390555b60408051868152831515602082015282151581830152905133917fbc3dc0cb5c15c51c81316450d44048838bb478b9809447d01c766a06f3e9f2c8919081900360600190a25050505050565b600661152681612ce5565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92961155081612ade565b5f85900361158a576040517f7907d79b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610119545f81815261011a60205260409020548435146115d6576040517fead4c30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101bd545f6115e58684612ed5565b90505f6115f9878484878b602001356131c2565b905061160781898c8c61324a565b50505050505050505050565b61161b612c48565b60a0810180359061162f9060808401614c97565b61163d610120840184614cb2565b61164e610100860160e08701614c97565b5f5a905061165c6003612ce5565b6101008701355f9081526101506020526040812054908190036116ab576040517f4e68667500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116b58880614d13565b9050811461170457806116c88980614d13565b6040517f5e3fd6ad0000000000000000000000000000000000000000000000000000000081526004810193909352602483015250604401610fee565b61171188602001356134ae565b61172661121660c08a013560a08b0135614c5e565b5f61176f61173a60808b0160608c01614c97565b61174a60a08c0160808d01614c97565b8b60a001358c60c001358d602001358e80610120019061176a9190614cb2565b612d7e565b905061179a8161177f8b80614d13565b61178f60608e0160408f01614d77565b8d6101000135613526565b6117d0576040517fb05e92fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118136117fe60017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614c4b565b61180e60808c0160608d01614c97565b612d77565b5f8061182560a08c0160808d01614c97565b6001600160a01b031660c08c01356118416101208e018e614cb2565b60405161184f929190614c71565b5f6040518083038185875af1925050503d805f8114611889576040519150601f19603f3d011682016040523d82523d5f602084013e61188e565b606091505b5091509150816118f6578051156118a85780518082602001fd5b6118b860a08c0160808d01614c97565b6040517f546134430000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610fee565b61192461130260017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614c4b565b60405183907fa4c827e719e911e8f19393ccdb85b5102f08f0910604d340ba38390b7ff2ab0e905f90a2505050505f861115611a5b57855f8490036119d157853b1580156119cf573a5a61197a61bc7c86614c5e565b6119849190614c4b565b61198e9190614c80565b9150818811156119cb576001600160a01b0387166108fc6119af848b614c4b565b6040518115909202915f818181858888f19350505050506119cf565b8791505b505b5f6001600160a01b038416156119e757836119e9565b335b90505f816001600160a01b03166108fc8490811502906040515f60405180830381858888f19350505050905080611a57576040517fa57c4df40000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610fee565b5050505b505050505050611a69612ea7565b50565b5f611a9f611a9b60017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614c4b565b5c90565b905090565b6005611aaf81612ce5565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929611ad981612ade565b611ae66040860186614cb2565b90505f03611b20576040517fc01eab5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8381526101be602052604090205415611b69576040517f0f06cd1500000000000000000000000000000000000000000000000000000000815260048101849052602401610fee565b5f8481526101be60205260408120549003611bb3576040517f6e5424c200000000000000000000000000000000000000000000000000000000815260048101859052602401610fee565b5f611bc16040870187614cb2565b604051611bcf929190614c71565b604051809103902090505f611bf18760200135835f9182526020526040902090565b90505f611c3d8760208a01358a3585611c16611c1060408f018f614cb2565b89613633565b604080519586526020860194909452928401919091526060830152608082015260a0902090565b9050808614611c82576040517fd3664fb30000000000000000000000000000000000000000000000000000000081526004810187905260248101829052604401610fee565b5f8181526101be602052604090819020600190555181907f55f4c645c36aa5cd3f443d6be44d7a7a5df9d2100d7139dfc69d4289ee07231990611cd2908a908c3590918252602082015260400190565b60405180910390a25050505050505050565b6004611cef81612ce5565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929611d1981612ade565b5f859003611d53576040517fb1504a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b844915611d8f576040517f8019aff700000000000000000000000000000000000000000000000000000000815260048101869052602401610fee565b5f8481526101be60205260408120549003611dd9576040517f6e5424c200000000000000000000000000000000000000000000000000000000815260048101859052602401610fee565b5f8381526101be602052604090205415611e22576040517f0f06cd1500000000000000000000000000000000000000000000000000000000815260048101849052602401610fee565b6040805160a0810182525f808252606060208301819052928201839052918101829052608081018290528190865f5b89811015611f27578a8a82818110611e6b57611e6b614d9a565b9050602002810190611e7d9190614dc7565b611e8690614ee4565b81499450925083611ec6576040517fc0e41e1d00000000000000000000000000000000000000000000000000000000815260048101829052602401610fee565b60808301515f8181526020869052604090209550611ef485875f1c865f015187602001518860400151613734565b6060848101518551604080519687526020870194909452928501528301869052608083015260a090912090600101611e51565b50808714611f6b576040517fd3664fb30000000000000000000000000000000000000000000000000000000081526004810188905260248101829052604401610fee565b5f8181526101be602090815260409182902060019055606084015182518b81529182015282917f55f4c645c36aa5cd3f443d6be44d7a7a5df9d2100d7139dfc69d4289ee072319910160405180910390a250505050505050505050565b600881901c5f90815261014f6020526040812054600160ff84161b161515610f6a565b6002611ff681612ce5565b6001600160a01b038516612036576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b34841115612070576040517fb03b693200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60e480545f918261208083614f71565b9091555090505f6120918634614c4b565b90505f6120a333898985878b8b612d7e565b90506120af83826138d6565b80886001600160a01b0316336001600160a01b03167fe856c2b8bd4eb0027ce32eeaf595c21b0b6b4644b326e5b7bd80a1cf8db72e6c8a86888c8c6040516120fb959493929190614fd1565b60405180910390a45050505050505050565b5f54610100900460ff161580801561212b57505f54600160ff909116105b806121445750303b15801561214457505f5460ff166001145b6121d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610fee565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561222c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f61223d6080840160608501614c97565b6001600160a01b03160361227d576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122a061228d60e0840184615001565b61229b610100860186615001565b613952565b6122b282608001358360a00135613c00565b6122cd5f6122c861016085016101408601614c97565b612ae8565b6122e26122dd60c0840184615001565b613cc1565b6122f26080830160608401614c97565b5f805261011b6020527f033d11f27e62ab919708ec716731da80d261a6e4253259b7acde9bf89d28ec1880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905561236461014083016101208401614c97565b6101c080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790556123af61014083016101208401614c97565b6001600160a01b0316336001600160a01b03167f1f82add12d98b5eaed4d6a6d5f74cfc7a85e5c90c335ab5562f77f220ed45d5f60405160405180910390a36020828101356101198190555f90815261011a8252604080822085359081905581518381528085018490528083019190915260608082018490526080820184905260a09091208084526101be8552828420600190556101bd55815183815293840192909252808501359083015290206101bf55801561119b575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b7f0cf0d2deb70d7bdac2fa48c4ac99bc558170be0ce5fcb994caefa4bf7b96edf96124f181612ade565b5f609a81905560405133917fba88c025b0cbb77022c0c487beef24f759f1e4be2f51a205bc427cee19c2eaa691a250565b5f81600881111561253557612535614bb2565b60da54600190911b16151592915050565b61255362f099c082614c5e565b42101561258c576040517f4306cbb100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805184815260208101849052908101829052606090206101bf5414612604576101bf546040805185815260208101859052908101839052606090206040517fbc5aad1100000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610fee565b6101c0546001600160a01b031661263b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92982612ae8565b6040516001600160a01b0382169033907f9fc8868f8577b31b805ee65bb52325782b5e2708dbdb7f04c7467c6785fccb30905f90a350505050565b5f54600690610100900460ff1615801561269657505f5460ff8083169116105b612722576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610fee565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff83161761010017905561275c8888613cc1565b61276886868686613952565b6001600160a01b0382166127a8576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101c080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03841690811790915560405133907f1f82add12d98b5eaed4d6a6d5f74cfc7a85e5c90c335ab5562f77f220ed45d5f905f90a36040517f362e300000000000000000000000000000000000000000000000000000000000907f352e300000000000000000000000000000000000000000000000000000000000907f2f8492a7a430cf917798dfb60bc5af634f68e6c40287947df0ea6f7ec0669bd8905f90a35f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050565b7f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c61290681612ade565b6001600160a01b038316612946576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82815261011b60209081526040918290205491516001600160a01b03928316815233928592908716917f4a29db3fc6b42bda201e4b4d69ce8d575eeeba5f153509c0d0a342af0f1bd021910160405180910390a4505f90815261011b6020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f828152606560205260409020600101546129fc81612ade565b6111438383613e6f565b60db5f826008811115612a1b57612a1b614bb2565b6008811115612a2c57612a2c614bb2565b81526020019081526020015f2054612a4381612ade565b612a4c82612522565b15612a8557816040517fc0a71b58000000000000000000000000000000000000000000000000000000008152600401610fee9190614bdf565b816008811115612a9757612a97614bb2565b60da8054600190921b9091179055816008811115612ab757612ab7614bb2565b7f534f879afd40abb4e39f8e1b77a316be4c8e3521d9cf5a3a3db8959d574d45593361104d565b611a698133613f0e565b5f8281526065602090815260408083206001600160a01b038516845290915290205460ff1661119b575f8281526065602090815260408083206001600160a01b0385168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055612b623390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6001600160a01b0381163314612c3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610fee565b61119b8282613e6f565b5f612c77611a9b60017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614c4b565b14612cae576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ce3612cdc60017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614c4b565b6001612d77565b565b60da54816008811115612cfa57612cfa614bb2565b6001901b811615612d3957816040517fc0a71b58000000000000000000000000000000000000000000000000000000008152600401610fee9190614bdf565b600281161561119b5760016040517fc0a71b58000000000000000000000000000000000000000000000000000000008152600401610fee9190614bdf565b80825d5050565b5f60405188815287602082015286604082015285606082015284608082015260c060a08201528260c0820152602083065f8115612dbc578160200390505b848660e085013790930160e001902098975050505050505050565b5f81815260a66020526040902054600114612e21576040517f992d87c300000000000000000000000000000000000000000000000000000000815260048101829052602401610fee565b5f90815260a66020526040812055565b8015611a6957426099541015612e5657609754612e4e9042614c5e565b609955612e66565b609a54612e639082614c5e565b90505b609854811115612ea2576040517fa74c1c5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609a55565b612ce361130260017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614c4b565b5f81836020013511612f20576040517f706144050000000000000000000000000000000000000000000000000000000081526020840135600482015260248101839052604401610fee565b612f34836101800135846101400135613f9c565b6101bf54604080516101608601358152610120860135602082015260e0860135918101919091526060902014612fca57604080516101608501358152610120850135602082015260e085013591810191909152606090206101bf546040517fbc5aad1100000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610fee565b4283610100013510613015576040517fbf81c6e00000000000000000000000000000000000000000000000000000000081526101008401356004820152426024820152604401610fee565b6080830135613050576040517f2898482a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61309360408401356060850135608086013560a087013560c0880135604080519586526020860194909452928401919091526060830152608082015260a0902090565b5f8181526101be6020526040812054919250036130df576040517fedeae83c00000000000000000000000000000000000000000000000000000000815260048101829052602401610fee565b6130fb6130f06101c0850185614d13565b856101a00135614069565b61311261310c6101e0850185614cb2565b84614175565b6020808401355f81815261011a909252604090912060808501359055610119556101bd819055613167610180840135610140850135610100860135604080519384526020840192909252908201526060902090565b6101bf5580602084013561317a84614f71565b60408051873581526080880135602082015291955085917fa0262dc79e4ccb71ceac8574ae906311ae338aa4a2044fd4ec4b99fad5ab60cb910160405180910390a492915050565b5f604051858152846020820152604060e0880160408301378360808201528260a082015260a0610120880160c083013761018081016101c088013588018035602081026020830184376020029091206101608301525061018090207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190069695505050505050565b6040805160018082528183019092525f916020808301908036833701905050905084815f8151811061327e5761327e614d9a565b6020908102919091018101919091525f85815261011b90915260409020546001600160a01b0316806132dc576040517f69ed70ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80826001600160a01b0316637e4f7a8a60e01b87878760405160240161330593929190615065565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161337091906150d6565b5f604051808303815f865af19150503d805f81146133a9576040519150601f19603f3d011682016040523d82523d5f602084013e6133ae565b606091505b509150915081613455578051156133f357602081017bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81511663ca389c4460e01b178152815181fd5b6040517fca389c4400000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f556e6b6e6f776e000000000000000000000000000000000000000000000000006044820152606401610fee565b5f8180602001905181019061346a91906150e1565b9050806134a3576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050565b600881901c5f90815261014f6020526040902054600160ff83161b1615613504576040517f335a4a9000000000000000000000000000000000000000000000000000000000815260048101829052602401610fee565b600881901c5f90815261014f602052604090208054600160ff84161b17905550565b5f806135476001613538876002615221565b6135429190614c4b565b614202565b90508063ffffffff168463ffffffff16111561359f576040517ff7ec909700000000000000000000000000000000000000000000000000000000815263ffffffff808616600483015282166024820152604401610fee565b865f5b8681101561362557600163ffffffff8716821c811690036135ef576135e88888838181106135d2576135d2614d9a565b90506020020135835f9182526020526040902090565b915061361d565b61361a8289898481811061360557613605614d9a565b905060200201355f9182526020526040902090565b91505b6001016135a2565b509092149695505050505050565b5f61363f60208461522c565b15613676576040517f6426c6c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f729eebce00000000000000000000000000000000000000000000000000000000835b801561372b57602081039050808601357fff000000000000000000000000000000000000000000000000000000000000008116156136dc57604051838152600481fd5b7f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001817f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff0000000187870908935050613699565b50509392505050565b7f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001840693505f80600a6001600160a01b0316878787878760405160200161377f959493929190615264565b60408051601f1981840301815290829052613799916150d6565b5f60405180830381855afa9150503d805f81146137d1576040519150601f19603f3d011682016040523d82523d5f602084013e6137d6565b606091505b509150915081613812576040517fa71194af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604081511461385a578051604080517ff75db381000000000000000000000000000000000000000000000000000000008152610fee9290600401918252602082015260400190565b602081015160408201516110008214158061389557507f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff000000018114155b156134a3576040517f68dcad5f0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610fee565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015f90815261014e60208181526040808420548452848252808420868552929091528083208290555190918391839186917fea3b023b4c8680d4b4824f0143132c95476359a2bb70a81d6c5a36f6918f63399190a4505050565b5f54610100900460ff166139e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610fee565b5f5b83811015613af057848482818110613a0457613a04614d9a565b9050604002016020013560db5f878785818110613a2357613a23614d9a565b613a3992602060409092020190810191506146e0565b6008811115613a4a57613a4a614bb2565b6008811115613a5b57613a5b614bb2565b815260208101919091526040015f2055848482818110613a7d57613a7d614d9a565b90506040020160200135858583818110613a9957613a99614d9a565b613aaf92602060409092020190810191506146e0565b6008811115613ac057613ac0614bb2565b6040517f33aa8fd1ce49e1761bc8d27fd53414bfefc45d690feed0ce55019d7d3aec6091905f90a36001016139ea565b505f5b81811015613bf957828282818110613b0d57613b0d614d9a565b9050604002016020013560dc5f858585818110613b2c57613b2c614d9a565b613b4292602060409092020190810191506146e0565b6008811115613b5357613b53614bb2565b6008811115613b6457613b64614bb2565b815260208101919091526040015f2055828282818110613b8657613b86614d9a565b90506040020160200135838383818110613ba257613ba2614d9a565b613bb892602060409092020190810191506146e0565b6008811115613bc957613bc9614bb2565b6040517fe7bf4b8dc0c17a52dc9e52323a3ab61cb2079db35f969125b1f8a3d984c6f6c2905f90a3600101613af3565b5050505050565b5f54610100900460ff16613c96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610fee565b613c9e61424f565b613ca661424f565b613cae61424f565b613cb882826142e5565b5050600160e455565b5f54610100900460ff16613d57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610fee565b5f5b81811015611143575f838383818110613d7457613d74614d9a565b613d8a9260206040909202019081019150614c97565b6001600160a01b031603613dca576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828282818110613ddc57613ddc614d9a565b905060400201602001355f801b03613e20576040517f0742d05300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613e67838383818110613e3557613e35614d9a565b90506040020160200135848484818110613e5157613e51614d9a565b6122c89260206040909202019081019150614c97565b600101613d59565b5f8281526065602090815260408083206001600160a01b038516845290915290205460ff161561119b575f8281526065602090815260408083206001600160a01b038516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b5f8281526065602090815260408083206001600160a01b038516845290915290205460ff1661119b57613f408161444b565b613f4b83602061445d565b604051602001613f5c92919061528a565b60408051601f19818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252610fee91600401614757565b815f03613fde57801561119b576040517f0c25659200000000000000000000000000000000000000000000000000000000815260048101829052602401610fee565b80614018576040517f5228f4c800000000000000000000000000000000000000000000000000000000815260048101839052602401610fee565b5f82815261014e6020526040902054811461119b576040517f36459fa00000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610fee565b5f5b8281101561416f576101505f85858481811061408957614089614d9a565b9050602002013581526020019081526020015f20545f146140f2578383828181106140b6576140b6614d9a565b905060200201356040517fe5d14425000000000000000000000000000000000000000000000000000000008152600401610fee91815260200190565b816101505f86868581811061410957614109614d9a565b9050602002013581526020019081526020015f20819055508184848381811061413457614134614d9a565b905060200201357f300e6f978eee6a4b0bba78dd8400dc64fd5652dbfc868a2258e16d0977be222b60405160405180910390a360010161406b565b50505050565b61418060028361522c565b156141ba576040517f0c91d77600000000000000000000000000000000000000000000000000000000815260048101839052602401610fee565b5f805b83811015613bf9576040518582013560f01c9250838301907f3c116827db9db3a30c1a25db8b0ee4bab9d2b223560209cfd839601b621c726d905f90a26002016141bd565b5f63ffffffff82111561424b576040517f6dfcc6500000000000000000000000000000000000000000000000000000000081526020600482015260248101839052604401610fee565b5090565b5f54610100900460ff16612ce3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610fee565b5f54610100900460ff1661437b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610fee565b815f036143b4576040517fb5ed5a3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f036143ed576040517fd10d72bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609782905560988190556144018242614c5e565b60998190556097546098546040805192835260208301919091528101919091527f8f805c372b66240792580418b7328c0c554ae235f0932475c51b026887fe26a9906060016124bb565b6060610f6a6001600160a01b03831660145b60605f61446b836002614c80565b614476906002614c5e565b67ffffffffffffffff81111561448e5761448e614e03565b6040519080825280601f01601f1916602001820160405280156144b8576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106144ee576144ee614d9a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061455057614550614d9a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f61458a846002614c80565b614595906001614c5e565b90505b6001811115614631577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106145d6576145d6614d9a565b1a60f81b8282815181106145ec576145ec614d9a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c9361462a816152f4565b9050614598565b50831561469a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610fee565b9392505050565b5f602082840312156146b1575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461469a575f80fd5b5f602082840312156146f0575f80fd5b81356009811061469a575f80fd5b5f6020828403121561470e575f80fd5b5035919050565b6001600160a01b0381168114611a69575f80fd5b5f806040838503121561473a575f80fd5b82359150602083013561474c81614715565b809150509250929050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f8083601f84011261479c575f80fd5b50813567ffffffffffffffff8111156147b3575f80fd5b6020830191508360208285010111156147ca575f80fd5b9250929050565b5f805f805f805f8060e0898b0312156147e8575f80fd5b88356147f381614715565b9750602089013561480381614715565b96506040890135955060608901359450608089013561482181614715565b935060a089013567ffffffffffffffff81111561483c575f80fd5b6148488b828c0161478c565b999c989b50969995989497949560c00135949350505050565b5f805f8060608587031215614874575f80fd5b843567ffffffffffffffff81111561488a575f80fd5b6148968782880161478c565b90955093505060208501359150604085013567ffffffffffffffff8111156148bc575f80fd5b850161020081880312156148ce575f80fd5b939692955090935050565b5f602082840312156148e9575f80fd5b813567ffffffffffffffff8111156148ff575f80fd5b8201610140818503121561469a575f80fd5b5f805f60608486031215614923575f80fd5b833567ffffffffffffffff811115614939575f80fd5b84016060818703121561494a575f80fd5b95602085013595506040909401359392505050565b5f805f8060608587031215614972575f80fd5b843567ffffffffffffffff811115614988575f80fd5b8501601f81018713614998575f80fd5b803567ffffffffffffffff8111156149ae575f80fd5b8760208260051b84010111156149c2575f80fd5b602091820198909750908601359560400135945092505050565b5f805f80606085870312156149ef575f80fd5b84356149fa81614715565b935060208501359250604085013567ffffffffffffffff811115614a1c575f80fd5b614a288782880161478c565b95989497509550505050565b5f60208284031215614a44575f80fd5b813567ffffffffffffffff811115614a5a575f80fd5b8201610160818503121561469a575f80fd5b5f805f60608486031215614a7e575f80fd5b505081359360208301359350604090920135919050565b5f8083601f840112614aa5575f80fd5b50813567ffffffffffffffff811115614abc575f80fd5b6020830191508360208260061b85010111156147ca575f80fd5b5f805f805f805f6080888a031215614aec575f80fd5b873567ffffffffffffffff811115614b02575f80fd5b614b0e8a828b01614a95565b909850965050602088013567ffffffffffffffff811115614b2d575f80fd5b614b398a828b01614a95565b909650945050604088013567ffffffffffffffff811115614b58575f80fd5b614b648a828b01614a95565b9094509250506060880135614b7881614715565b8091505092959891949750929550565b5f8060408385031215614b99575f80fd5b8235614ba481614715565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6020810160098310614c18577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b91905290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610f6a57610f6a614c1e565b80820180821115610f6a57610f6a614c1e565b818382375f9101908152919050565b8082028115828204841417610f6a57610f6a614c1e565b5f60208284031215614ca7575f80fd5b813561469a81614715565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614ce5575f80fd5b83018035915067ffffffffffffffff821115614cff575f80fd5b6020019150368190038213156147ca575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614d46575f80fd5b83018035915067ffffffffffffffff821115614d60575f80fd5b6020019150600581901b36038213156147ca575f80fd5b5f60208284031215614d87575f80fd5b813563ffffffff8116811461469a575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61833603018112614df9575f80fd5b9190910192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405160a0810167ffffffffffffffff81118282101715614e5357614e53614e03565b60405290565b5f82601f830112614e68575f80fd5b813567ffffffffffffffff811115614e8257614e82614e03565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715614eb157614eb1614e03565b604052818152838201602001851015614ec8575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60a08236031215614ef4575f80fd5b614efc614e30565b82358152602083013567ffffffffffffffff811115614f19575f80fd5b614f2536828601614e59565b602083015250604083013567ffffffffffffffff811115614f44575f80fd5b614f5036828601614e59565b60408301525060608381013590820152608092830135928101929092525090565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614fa157614fa1614c1e565b5060010190565b81835281816020850137505f602082840101525f6020601f19601f840116840101905092915050565b858152846020820152836040820152608060608201525f614ff6608083018486614fa8565b979650505050505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615034575f80fd5b83018035915067ffffffffffffffff82111561504e575f80fd5b6020019150600681901b36038213156147ca575f80fd5b604081525f615078604083018587614fa8565b82810360208401528084518083526020830191506020860192505f5b818110156150b2578351835260209384019390920191600101615094565b5090979650505050505050565b5f81518060208401855e5f93019283525090919050565b5f61469a82846150bf565b5f602082840312156150f1575f80fd5b8151801515811461469a575f80fd5b6001815b600184111561513b5780850481111561511f5761511f614c1e565b600184161561512d57908102905b60019390931c928002615104565b935093915050565b5f8261515157506001610f6a565b8161515d57505f610f6a565b8160018114615173576002811461517d57615199565b6001915050610f6a565b60ff84111561518e5761518e614c1e565b50506001821b610f6a565b5060208310610133831016604e8410600b84101617156151bc575081810a610f6a565b6151e77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484615100565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561521957615219614c1e565b029392505050565b5f61469a8383615143565b5f8261525f577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500690565b8581528460208201528360408201525f614ff661528460608401866150bf565b846150bf565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f6152bb60178301856150bf565b7f206973206d697373696e6720726f6c652000000000000000000000000000000081526152eb60118201856150bf565b95945050505050565b5f8161530257615302614c1e565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220f37ab9d49b246192cc1f4c0273d18fcd431dc83c67e6b7fb35993ccad3328d4e64736f6c634300081a0033", "linkReferences": {}, "deployedLinkReferences": {} }