/* Autogenerated file. Do not edit manually. */ /* tslint:disable */ /* eslint-disable */ import { Signer, BigNumberish } from 'ethers'; import { Provider, TransactionRequest } from '@ethersproject/providers'; import { Contract, ContractFactory, Overrides } from '@ethersproject/contracts'; import type { StakedToken } from './StakedToken'; export class StakedTokenFactory extends ContractFactory { constructor(signer?: Signer) { super(_abi, _bytecode, signer); } deploy( stakedToken: string, rewardToken: string, cooldownSeconds: BigNumberish, unstakeWindow: BigNumberish, rewardsVault: string, emissionManager: string, distributionDuration: BigNumberish, overrides?: Overrides, ): Promise { return super.deploy( stakedToken, rewardToken, cooldownSeconds, unstakeWindow, rewardsVault, emissionManager, distributionDuration, overrides || {}, ) as Promise; } getDeployTransaction( stakedToken: string, rewardToken: string, cooldownSeconds: BigNumberish, unstakeWindow: BigNumberish, rewardsVault: string, emissionManager: string, distributionDuration: BigNumberish, overrides?: Overrides, ): TransactionRequest { return super.getDeployTransaction( stakedToken, rewardToken, cooldownSeconds, unstakeWindow, rewardsVault, emissionManager, distributionDuration, overrides || {}, ); } attach(address: string): StakedToken { return super.attach(address) as StakedToken; } connect(signer: Signer): StakedTokenFactory { return super.connect(signer) as StakedTokenFactory; } static connect( address: string, signerOrProvider: Signer | Provider, ): StakedToken { return new Contract(address, _abi, signerOrProvider) as StakedToken; } } const _abi = [ { inputs: [ { internalType: 'contract IERC20', name: 'stakedToken', type: 'address', }, { internalType: 'contract IERC20', name: 'rewardToken', type: 'address', }, { internalType: 'uint256', name: 'cooldownSeconds', type: 'uint256', }, { internalType: 'uint256', name: 'unstakeWindow', type: 'uint256', }, { internalType: 'address', name: 'rewardsVault', type: 'address', }, { internalType: 'address', name: 'emissionManager', type: 'address', }, { internalType: 'uint128', name: 'distributionDuration', type: 'uint128', }, ], stateMutability: 'nonpayable', type: 'constructor', }, { anonymous: false, inputs: [ { indexed: true, internalType: 'address', name: 'owner', type: 'address', }, { indexed: true, internalType: 'address', name: 'spender', type: 'address', }, { indexed: false, internalType: 'uint256', name: 'value', type: 'uint256', }, ], name: 'Approval', type: 'event', }, { anonymous: false, inputs: [ { indexed: true, internalType: 'address', name: 'asset', type: 'address', }, { indexed: false, internalType: 'uint256', name: 'emission', type: 'uint256', }, ], name: 'AssetConfigUpdated', type: 'event', }, { anonymous: false, inputs: [ { indexed: true, internalType: 'address', name: 'asset', type: 'address', }, { indexed: false, internalType: 'uint256', name: 'index', type: 'uint256', }, ], name: 'AssetIndexUpdated', type: 'event', }, { anonymous: false, inputs: [ { indexed: true, internalType: 'address', name: 'user', type: 'address', }, ], name: 'Cooldown', type: 'event', }, { anonymous: false, inputs: [ { indexed: true, internalType: 'address', name: 'newAdmin', type: 'address', }, ], name: 'CooldownPauseAdminChanged', type: 'event', }, { anonymous: false, inputs: [ { indexed: false, internalType: 'bool', name: 'pause', type: 'bool', }, ], name: 'CooldownPauseChanged', type: 'event', }, { anonymous: false, inputs: [ { indexed: false, internalType: 'uint256', name: 'newPercentage', type: 'uint256', }, ], name: 'MaxSlashablePercentageChanged', type: 'event', }, { anonymous: false, inputs: [ { indexed: true, internalType: 'address', name: 'newPendingAdmin', type: 'address', }, ], name: 'PendingAdminChanged', type: 'event', }, { anonymous: false, inputs: [ { indexed: true, internalType: 'address', name: 'from', type: 'address', }, { indexed: true, internalType: 'address', name: 'to', type: 'address', }, { indexed: false, internalType: 'uint256', name: 'amount', type: 'uint256', }, { indexed: false, internalType: 'uint256', name: 'underlyingTransferred', type: 'uint256', }, ], name: 'Redeem', type: 'event', }, { anonymous: false, inputs: [ { indexed: false, internalType: 'address', name: 'user', type: 'address', }, { indexed: false, internalType: 'uint256', name: 'amount', type: 'uint256', }, ], name: 'RewardsAccrued', type: 'event', }, { anonymous: false, inputs: [ { indexed: true, internalType: 'address', name: 'from', type: 'address', }, { indexed: true, internalType: 'address', name: 'to', type: 'address', }, { indexed: false, internalType: 'uint256', name: 'amount', type: 'uint256', }, ], name: 'RewardsClaimed', type: 'event', }, { anonymous: false, inputs: [ { indexed: true, internalType: 'address', name: 'newAdming', type: 'address', }, { indexed: false, internalType: 'uint256', name: 'role', type: 'uint256', }, ], name: 'RoleClaimed', type: 'event', }, { anonymous: false, inputs: [ { indexed: true, internalType: 'address', name: 'destination', type: 'address', }, { indexed: false, internalType: 'uint256', name: 'amount', type: 'uint256', }, ], name: 'Slashed', type: 'event', }, { anonymous: false, inputs: [ { indexed: true, internalType: 'address', name: 'newAdmin', type: 'address', }, ], name: 'SlashingAdminChanged', type: 'event', }, { anonymous: false, inputs: [ { indexed: true, internalType: 'address', name: 'from', type: 'address', }, { indexed: true, internalType: 'address', name: 'to', type: 'address', }, { indexed: false, internalType: 'uint256', name: 'amount', type: 'uint256', }, { indexed: false, internalType: 'uint256', name: 'sharesMinted', type: 'uint256', }, ], name: 'Staked', type: 'event', }, { anonymous: false, inputs: [ { indexed: true, internalType: 'address', name: 'from', type: 'address', }, { indexed: true, internalType: 'address', name: 'to', type: 'address', }, { indexed: false, internalType: 'uint256', name: 'value', type: 'uint256', }, ], name: 'Transfer', type: 'event', }, { anonymous: false, inputs: [ { indexed: true, internalType: 'address', name: 'user', type: 'address', }, { indexed: true, internalType: 'address', name: 'asset', type: 'address', }, { indexed: false, internalType: 'uint256', name: 'index', type: 'uint256', }, ], name: 'UserIndexUpdated', type: 'event', }, { inputs: [], name: 'CLAIM_HELPER_ROLE', outputs: [ { internalType: 'uint256', name: '', type: 'uint256', }, ], stateMutability: 'view', type: 'function', }, { inputs: [], name: 'COOLDOWN_ADMIN_ROLE', outputs: [ { internalType: 'uint256', name: '', type: 'uint256', }, ], stateMutability: 'view', type: 'function', }, { inputs: [], name: 'COOLDOWN_SECONDS', outputs: [ { internalType: 'uint256', name: '', type: 'uint256', }, ], stateMutability: 'view', type: 'function', }, { inputs: [], name: 'DISTRIBUTION_END', outputs: [ { internalType: 'uint256', name: '', type: 'uint256', }, ], stateMutability: 'view', type: 'function', }, { inputs: [], name: 'DOMAIN_SEPARATOR', outputs: [ { internalType: 'bytes32', name: '', type: 'bytes32', }, ], stateMutability: 'view', type: 'function', }, { inputs: [], name: 'EIP712_REVISION', outputs: [ { internalType: 'bytes', name: '', type: 'bytes', }, ], stateMutability: 'view', type: 'function', }, { inputs: [], name: 'EMISSION_MANAGER', outputs: [ { internalType: 'address', name: '', type: 'address', }, ], stateMutability: 'view', type: 'function', }, { inputs: [], name: 'PERMIT_TYPEHASH', outputs: [ { internalType: 'bytes32', name: '', type: 'bytes32', }, ], stateMutability: 'view', type: 'function', }, { inputs: [], name: 'PRECISION', outputs: [ { internalType: 'uint8', name: '', type: 'uint8', }, ], stateMutability: 'view', type: 'function', }, { inputs: [], name: 'REWARDS_VAULT', outputs: [ { internalType: 'address', name: '', type: 'address', }, ], stateMutability: 'view', type: 'function', }, { inputs: [], name: 'REWARD_TOKEN', outputs: [ { internalType: 'contract IERC20', name: '', type: 'address', }, ], stateMutability: 'view', type: 'function', }, { inputs: [], name: 'SLASH_ADMIN_ROLE', outputs: [ { internalType: 'uint256', name: '', type: 'uint256', }, ], stateMutability: 'view', type: 'function', }, { inputs: [], name: 'STAKED_TOKEN', outputs: [ { internalType: 'contract IERC20', name: '', type: 'address', }, ], stateMutability: 'view', type: 'function', }, { inputs: [], name: 'UNSTAKE_WINDOW', outputs: [ { internalType: 'uint256', name: '', type: 'uint256', }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { internalType: 'address', name: '', type: 'address', }, ], name: '_nonces', outputs: [ { internalType: 'uint256', name: '', type: 'uint256', }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { internalType: 'address', name: 'owner', type: 'address', }, { internalType: 'address', name: 'spender', type: 'address', }, ], name: 'allowance', outputs: [ { internalType: 'uint256', name: '', type: 'uint256', }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { internalType: 'address', name: 'spender', type: 'address', }, { internalType: 'uint256', name: 'amount', type: 'uint256', }, ], name: 'approve', outputs: [ { internalType: 'bool', name: '', type: 'bool', }, ], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { internalType: 'address', name: '', type: 'address', }, ], name: 'assets', outputs: [ { internalType: 'uint128', name: 'emissionPerSecond', type: 'uint128', }, { internalType: 'uint128', name: 'lastUpdateTimestamp', type: 'uint128', }, { internalType: 'uint256', name: 'index', type: 'uint256', }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { internalType: 'address', name: 'account', type: 'address', }, ], name: 'balanceOf', outputs: [ { internalType: 'uint256', name: '', type: 'uint256', }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { internalType: 'address', name: 'to', type: 'address', }, { internalType: 'uint256', name: 'amount', type: 'uint256', }, ], name: 'claimRewards', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { internalType: 'address', name: 'to', type: 'address', }, { internalType: 'uint256', name: 'claimAmount', type: 'uint256', }, { internalType: 'uint256', name: 'redeemAmount', type: 'uint256', }, ], name: 'claimRewardsAndRedeem', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { internalType: 'address', name: 'from', type: 'address', }, { internalType: 'address', name: 'to', type: 'address', }, { internalType: 'uint256', name: 'claimAmount', type: 'uint256', }, { internalType: 'uint256', name: 'redeemAmount', type: 'uint256', }, ], name: 'claimRewardsAndRedeemOnBehalf', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { internalType: 'address', name: 'to', type: 'address', }, { internalType: 'uint256', name: 'amount', type: 'uint256', }, ], name: 'claimRewardsAndStake', outputs: [ { internalType: 'uint256', name: '', type: 'uint256', }, ], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { internalType: 'address', name: 'from', type: 'address', }, { internalType: 'address', name: 'to', type: 'address', }, { internalType: 'uint256', name: 'amount', type: 'uint256', }, ], name: 'claimRewardsAndStakeOnBehalf', outputs: [ { internalType: 'uint256', name: '', type: 'uint256', }, ], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { internalType: 'address', name: 'from', type: 'address', }, { internalType: 'address', name: 'to', type: 'address', }, { internalType: 'uint256', name: 'amount', type: 'uint256', }, ], name: 'claimRewardsOnBehalf', outputs: [ { internalType: 'uint256', name: '', type: 'uint256', }, ], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { internalType: 'uint256', name: 'role', type: 'uint256', }, ], name: 'claimRoleAdmin', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { components: [ { internalType: 'uint128', name: 'emissionPerSecond', type: 'uint128', }, { internalType: 'uint256', name: 'totalStaked', type: 'uint256', }, { internalType: 'address', name: 'underlyingAsset', type: 'address', }, ], internalType: 'struct DistributionTypes.AssetConfigInput[]', name: 'assetsConfigInput', type: 'tuple[]', }, ], name: 'configureAssets', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [], name: 'cooldown', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [], name: 'decimals', outputs: [ { internalType: 'uint8', name: '', type: 'uint8', }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { internalType: 'address', name: 'spender', type: 'address', }, { internalType: 'uint256', name: 'subtractedValue', type: 'uint256', }, ], name: 'decreaseAllowance', outputs: [ { internalType: 'bool', name: '', type: 'bool', }, ], stateMutability: 'nonpayable', type: 'function', }, { inputs: [], name: 'exchangeRate', outputs: [ { internalType: 'uint256', name: '', type: 'uint256', }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { internalType: 'uint256', name: 'role', type: 'uint256', }, ], name: 'getAdmin', outputs: [ { internalType: 'address', name: '', type: 'address', }, ], stateMutability: 'view', type: 'function', }, { inputs: [], name: 'getCooldownPaused', outputs: [ { internalType: 'bool', name: '', type: 'bool', }, ], stateMutability: 'view', type: 'function', }, { inputs: [], name: 'getMaxSlashablePercentage', outputs: [ { internalType: 'uint256', name: '', type: 'uint256', }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { internalType: 'uint256', name: 'fromCooldownTimestamp', type: 'uint256', }, { internalType: 'uint256', name: 'amountToReceive', type: 'uint256', }, { internalType: 'address', name: 'toAddress', type: 'address', }, { internalType: 'uint256', name: 'toBalance', type: 'uint256', }, ], name: 'getNextCooldownTimestamp', outputs: [ { internalType: 'uint256', name: '', type: 'uint256', }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { internalType: 'uint256', name: 'role', type: 'uint256', }, ], name: 'getPendingAdmin', outputs: [ { internalType: 'address', name: '', type: 'address', }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { internalType: 'address', name: 'staker', type: 'address', }, ], name: 'getTotalRewardsBalance', outputs: [ { internalType: 'uint256', name: '', type: 'uint256', }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { internalType: 'address', name: 'user', type: 'address', }, { internalType: 'address', name: 'asset', type: 'address', }, ], name: 'getUserAssetData', outputs: [ { internalType: 'uint256', name: '', type: 'uint256', }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { internalType: 'address', name: 'spender', type: 'address', }, { internalType: 'uint256', name: 'addedValue', type: 'uint256', }, ], name: 'increaseAllowance', outputs: [ { internalType: 'bool', name: '', type: 'bool', }, ], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { internalType: 'address', name: 'slashingAdmin', type: 'address', }, { internalType: 'address', name: 'cooldownPauseAdmin', type: 'address', }, { internalType: 'address', name: 'claimHelper', type: 'address', }, { internalType: 'uint256', name: 'maxSlashablePercentage', type: 'uint256', }, ], name: 'initialize', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [], name: 'name', outputs: [ { internalType: 'string', name: '', type: 'string', }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { internalType: 'address', name: 'owner', type: 'address', }, { internalType: 'address', name: 'spender', type: 'address', }, { internalType: 'uint256', name: 'value', type: 'uint256', }, { internalType: 'uint256', name: 'deadline', type: 'uint256', }, { internalType: 'uint8', name: 'v', type: 'uint8', }, { internalType: 'bytes32', name: 'r', type: 'bytes32', }, { internalType: 'bytes32', name: 's', type: 'bytes32', }, ], name: 'permit', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { internalType: 'address', name: 'to', type: 'address', }, { internalType: 'uint256', name: 'amount', type: 'uint256', }, ], name: 'redeem', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { internalType: 'address', name: 'from', type: 'address', }, { internalType: 'address', name: 'to', type: 'address', }, { internalType: 'uint256', name: 'amount', type: 'uint256', }, ], name: 'redeemOnBehalf', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { internalType: 'bool', name: 'paused', type: 'bool', }, ], name: 'setCooldownPause', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { internalType: 'uint256', name: 'percentage', type: 'uint256', }, ], name: 'setMaxSlashablePercentage', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { internalType: 'uint256', name: 'role', type: 'uint256', }, { internalType: 'address', name: 'newPendingAdmin', type: 'address', }, ], name: 'setPendingAdmin', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { internalType: 'address', name: 'destination', type: 'address', }, { internalType: 'uint256', name: 'amount', type: 'uint256', }, ], name: 'slash', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { internalType: 'address', name: 'to', type: 'address', }, { internalType: 'uint256', name: 'amount', type: 'uint256', }, ], name: 'stake', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { internalType: 'address', name: 'from', type: 'address', }, { internalType: 'address', name: 'to', type: 'address', }, { internalType: 'uint256', name: 'amount', type: 'uint256', }, { internalType: 'uint256', name: 'deadline', type: 'uint256', }, { internalType: 'uint8', name: 'v', type: 'uint8', }, { internalType: 'bytes32', name: 'r', type: 'bytes32', }, { internalType: 'bytes32', name: 's', type: 'bytes32', }, ], name: 'stakeWithPermit', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { internalType: 'address', name: '', type: 'address', }, ], name: 'stakerRewardsToClaim', outputs: [ { internalType: 'uint256', name: '', type: 'uint256', }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { internalType: 'address', name: '', type: 'address', }, ], name: 'stakersCooldowns', outputs: [ { internalType: 'uint256', name: '', type: 'uint256', }, ], stateMutability: 'view', type: 'function', }, { inputs: [], name: 'symbol', outputs: [ { internalType: 'string', name: '', type: 'string', }, ], stateMutability: 'view', type: 'function', }, { inputs: [], name: 'totalSupply', outputs: [ { internalType: 'uint256', name: '', type: 'uint256', }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { internalType: 'address', name: 'recipient', type: 'address', }, { internalType: 'uint256', name: 'amount', type: 'uint256', }, ], name: 'transfer', outputs: [ { internalType: 'bool', name: '', type: 'bool', }, ], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { internalType: 'address', name: 'sender', type: 'address', }, { internalType: 'address', name: 'recipient', type: 'address', }, { internalType: 'uint256', name: 'amount', type: 'uint256', }, ], name: 'transferFrom', outputs: [ { internalType: 'bool', name: '', type: 'bool', }, ], stateMutability: 'nonpayable', type: 'function', }, ]; const _bytecode = '0x61016060405260006009553480156200001757600080fd5b5060405162004daa38038062004daa8339810160408190526200003a9162000224565b6040518060400160405280600b81526020016a5374616b6564204f6d6e6960a81b81525060405180604001604052806005815260200164734f4d4e4960d81b81525083836001600160801b0316620000a181426200013a60201b620026051790919060201c565b608052506001600160a01b031660a0528151620000c690600690602085019062000165565b508051620000dc90600790602084019062000165565b505060088054601260ff1990911681179091556001600160a01b0389811660c05288811660e0526101008890526101208790528516610140526200012d91506200014f602090811b6200261117901c565b5050505050505062000327565b6000620001488284620002c3565b9392505050565b6008805460ff191660ff92909216919091179055565b8280546200017390620002ea565b90600052602060002090601f016020900481019282620001975760008555620001e2565b82601f10620001b257805160ff1916838001178555620001e2565b82800160010185558215620001e2579182015b82811115620001e2578251825591602001919060010190620001c5565b50620001f0929150620001f4565b5090565b5b80821115620001f05760008155600101620001f5565b6001600160a01b03811681146200022157600080fd5b50565b600080600080600080600060e0888a0312156200024057600080fd5b87516200024d816200020b565b602089015190975062000260816200020b565b809650506040880151945060608801519350608088015162000282816200020b565b60a089015190935062000295816200020b565b60c08901519092506001600160801b0381168114620002b357600080fd5b8091505092959891949750929550565b60008219821115620002e557634e487b7160e01b600052601160045260246000fd5b500190565b600181811c90821680620002ff57607f821691505b602082108114156200032157634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e051610100516101205161014051614995620004156000396000818161070d0152612e14015260008181610577015281816124450152612aee01526000818161062e0152818161246a01528181612a5f0152612b1601526000818161074f0152818161147601528181611be70152612df20152600081816104ef01528181610a9201528181610bb1015281816110a30152818161143f0152818161168501528181611bb001528181612c69015261335e01526000818161085c01526118900152600081816106e401528181613e1801528181613e5d0152613e8a01526149956000f3fe608060405234801561001057600080fd5b50600436106103785760003560e01c8063919cd40f116101d3578063b2a5dbfa11610104578063dbc0ed8a116100a2578063f11b81881161007c578063f11b818814610905578063f1cc432a14610986578063f34d96da14610999578063fde9eb69146109a157600080fd5b8063dbc0ed8a146108a4578063dd62ed3e146108ac578063eab52318146108f257600080fd5b8063c18f539a116100de578063c18f539a14610844578063cbcbb50714610857578063cf756fdf1461087e578063d505accf1461089157600080fd5b8063b2a5dbfa14610806578063b81c0a5b14610819578063b9844d8d1461082457600080fd5b80639e3ffce011610171578063a9059cbb1161014b578063a9059cbb146107c5578063aaf5eb68146107d8578063ab406fe6146107e0578063adc9772e146107f357600080fd5b80639e3ffce0146107975780639e4f545e1461079f578063a457c2d7146107b257600080fd5b806395d89b41116101ad57806395d89b411461074257806399248ea71461074a5780639a99b4f0146107715780639c9b51541461078457600080fd5b8063919cd40f146106e2578063946776cd14610708578063955e18af1461072f57600080fd5b80633373ee4c116102ad57806372b49d631161024b578063787a08a611610225578063787a08a61461069f5780637e90d7ef146106a75780638c9a281d146106c75780638dbefee2146106cf57600080fd5b806372b49d631461062957806374011f5614610650578063781603761461066357600080fd5b8063395093511161028757806339509351146105a25780633ba0b9a9146105b55780634575e69b146105bd57806370a08231146105f357600080fd5b80633373ee4c1461052a578063359c4a96146105725780633644e5151461059957600080fd5b80631cb218f31161031a57806323b872dd116102f457806323b872dd146104b057806330adf81f146104c3578063312f6b83146104ea578063313ce5671461051157600080fd5b80631cb218f3146104775780631e9a69501461048a57806320fb80b51461049d57600080fd5b8063095ea7b311610356578063095ea7b3146103de578063111fd88b14610401578063112d037c1461045c57806318160ddd1461046f57600080fd5b806302fb4d851461037d57806306fdde0314610392578063091030c3146103b0575b600080fd5b61039061038b36600461420c565b6109b4565b005b61039a610c2e565b6040516103a791906142ac565b60405180910390f35b6103d06103be3660046142bf565b603e6020526000908152604090205481565b6040519081526020016103a7565b6103f16103ec36600461420c565b610cc0565b60405190151581526020016103a7565b61043761040f3660046142da565b60009081526020819052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103a7565b61039061046a3660046142f3565b610cd7565b6005546103d0565b610390610485366004614340565b610d91565b61039061049836600461420c565b610ea1565b6103d06104ab3660046142f3565b610eb0565b6103f16104be3660046142f3565b610f71565b6103d07f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6104377f000000000000000000000000000000000000000000000000000000000000000081565b60085460ff165b60405160ff90911681526020016103a7565b6103d061053836600461435d565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600260208181526040808420959094168352930190925290205490565b6103d07f000000000000000000000000000000000000000000000000000000000000000081565b6103d0603f5481565b6103f16105b036600461420c565b610fe7565b6103d061102a565b6104376105cb3660046142da565b60009081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6103d06106013660046142bf565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b6103d07f000000000000000000000000000000000000000000000000000000000000000081565b61039061065e3660046142da565b611120565b61039a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b610390611267565b6103d06106b53660046142bf565b603d6020526000908152604090205481565b6103d0600081565b6103d06106dd3660046142bf565b611317565b7f00000000000000000000000000000000000000000000000000000000000000006103d0565b6104377f000000000000000000000000000000000000000000000000000000000000000081565b6103d061073d36600461420c565b61143b565b61039a611534565b6104377f000000000000000000000000000000000000000000000000000000000000000081565b61039061077f36600461420c565b611543565b610390610792366004614390565b61154e565b6103d0600181565b6103906107ad3660046143d2565b611615565b6103f16107c036600461420c565b6116f7565b6103f16107d336600461420c565b611753565b610518601281565b6103906107ee366004614445565b611760565b61039061080136600461420c565b61186b565b610390610814366004614468565b611878565b60415460ff166103f1565b6103d06108323660046142bf565b60426020526000908152604090205481565b6103d06108523660046142f3565b611b02565b6104377f000000000000000000000000000000000000000000000000000000000000000081565b61039061088c3660046144dd565b611c9f565b61039061089f3660046143d2565b6120d1565b6103d0600281565b6103d06108ba36600461435d565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260046020908152604080832093909416825291909152205490565b610390610900366004614528565b6123f2565b6109576109133660046142bf565b600260205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff808316927001000000000000000000000000000000009004169083565b604080516fffffffffffffffffffffffffffffffff9485168152939092166020840152908201526060016103a7565b6103d061099436600461455b565b612409565b6040546103d0565b6103906109af3660046142da565b612507565b60008080526020527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb55473ffffffffffffffffffffffffffffffffffffffff163314610a61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f43414c4c45525f4e4f545f534c415348494e475f41444d494e0000000000000060448201526064015b60405180910390fd5b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610aee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b129190614588565b90506000610b2b6040548361264590919063ffffffff16565b905080831115610b97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f494e56414c49445f534c415348494e475f414d4f554e540000000000000000006044820152606401610a58565b610bd873ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168585612736565b8373ffffffffffffffffffffffffffffffffffffffff167f4ed05e9673c26d2ed44f7ef6a7f2942df0ee3b5e1e17db4b99f9dcd261a339cd84604051610c2091815260200190565b60405180910390a250505050565b606060068054610c3d906145a1565b80601f0160208091040260200160405190810160405280929190818152602001828054610c69906145a1565b8015610cb65780601f10610c8b57610100808354040283529160200191610cb6565b820191906000526020600020905b815481529060010190602001808311610c9957829003601f168201915b5050505050905090565b6000610ccd33848461280a565b5060015b92915050565b600260009081526020527fabbb5caa7dda850e60932de0934eb1f9d0f59695050f761dc64e443e5030a5695473ffffffffffffffffffffffffffffffffffffffff163314610d81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43414c4c45525f4e4f545f434c41494d5f48454c5045520000000000000000006044820152606401610a58565b610d8c8383836129be565b505050565b600160009081526020527fada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d5473ffffffffffffffffffffffffffffffffffffffff163314610e3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f43414c4c45525f4e4f545f434f4f4c444f574e5f41444d494e000000000000006044820152606401610a58565b604180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040519081527f444eeeac0f37e626f7d68b623e62a27b8eff19bb6ece73e1d4233a25d678225b906020015b60405180910390a150565b610eac3383836129be565b5050565b6002600090815260208190527fabbb5caa7dda850e60932de0934eb1f9d0f59695050f761dc64e443e5030a5695473ffffffffffffffffffffffffffffffffffffffff163314610f5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43414c4c45525f4e4f545f434c41494d5f48454c5045520000000000000000006044820152606401610a58565b610f67848484612d09565b90505b9392505050565b6000610f7e848484612eaa565b610fdd8433610fd8856040518060600160405280602881526020016149136028913973ffffffffffffffffffffffffffffffffffffffff8a1660009081526004602090815260408083203384529091529020549190612fe3565b61280a565b5060019392505050565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610ccd918590610fd89086612605565b60008061103660055490565b90508061104c57670de0b6b3a764000091505090565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015261111a90829061111490670de0b6b3a76400009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156110ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110e9190614588565b90613029565b90613035565b91505090565b60008080526020527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb55473ffffffffffffffffffffffffffffffffffffffff1633146111c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f43414c4c45525f4e4f545f534c415348494e475f41444d494e000000000000006044820152606401610a58565b612710811115611234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f494e56414c49445f534c415348494e475f50455243454e5441474500000000006044820152606401610a58565b6040818155518181527fb79c2d6c7f5c95eec9dc05affc0ed002620a4ec6d72b7b0744cc8638168c600a90602001610e96565b336000908152600360205260409020546112dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f494e56414c49445f42414c414e43455f4f4e5f434f4f4c444f574e00000000006044820152606401610a58565b336000818152603e6020526040808220429055517ff52f50426b32362d3e6bb8cb36b7074756b224622def6352a59eac7f66ebe6e89190a2565b604080516001808252818301909252600091829190816020015b61136b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b81526020019060019003908161133157905050905060405180606001604052803073ffffffffffffffffffffffffffffffffffffffff1681526020016113d38573ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b81526020016113e160055490565b815250816000815181106113f7576113f76145f5565b6020026020010181905250610f6a61140f8483613041565b73ffffffffffffffffffffffffffffffffffffffff85166000908152603d602052604090205490612605565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614611512576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f5245574152445f544f4b454e5f49535f4e4f545f5354414b45445f544f4b454e6044820152606401610a58565b600061151f333085612d09565b90508015610f6a57610f6a308583600061318c565b606060078054610c3d906145a1565b610d8c338383612d09565b600260009081526020527fabbb5caa7dda850e60932de0934eb1f9d0f59695050f761dc64e443e5030a5695473ffffffffffffffffffffffffffffffffffffffff1633146115f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43414c4c45525f4e4f545f434c41494d5f48454c5045520000000000000000006044820152606401610a58565b611603848484612d09565b5061160f8484836129be565b50505050565b6040517fd505accf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152306024830152604482018790526064820186905260ff8516608483015260a4820184905260c482018390527f0000000000000000000000000000000000000000000000000000000000000000169063d505accf9060e401600060405180830381600087803b1580156116c957600080fd5b505af11580156116dd573d6000803e3d6000fd5b505050506116ee878787600161318c565b50505050505050565b6000610ccd3384610fd88560405180606001604052806025815260200161493b6025913933600090815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8d1684529091529020549190612fe3565b6000610ccd338484612eaa565b600082815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff1633146117ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f43414c4c45525f4e4f545f524f4c455f41444d494e00000000000000000000006044820152606401610a58565b60008381526001602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616908117909155905190917f8a3466f9d131f979249b9ebf68c3232124fbcda6334435f53e6788663f05387a91a2505050565b610eac338383600161318c565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614611917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4f4e4c595f454d495353494f4e5f4d414e4147455200000000000000000000006044820152606401610a58565b60005b81811015610d8c5760006002600085858581811061193a5761193a6145f5565b905060600201604001602081019061195291906142bf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506119dd8484848181106119a3576119a36145f5565b90506060020160400160208101906119bb91906142bf565b828686868181106119ce576119ce6145f5565b905060600201602001356133ee565b508383838181106119f0576119f06145f5565b611a069260206060909202019081019150614624565b81547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116178155838383818110611a5457611a546145f5565b9050606002016040016020810190611a6c91906142bf565b73ffffffffffffffffffffffffffffffffffffffff167f87fa03892a0556cb6b8f97e6d533a150d4d55fcbf275fff5fa003fa636bcc7fa858585818110611ab557611ab56145f5565b611acb9260206060909202019081019150614624565b6040516fffffffffffffffffffffffffffffffff909116815260200160405180910390a25080611afa81614685565b91505061191a565b6002600090815260208190527fabbb5caa7dda850e60932de0934eb1f9d0f59695050f761dc64e443e5030a5695473ffffffffffffffffffffffffffffffffffffffff163314611bae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43414c4c45525f4e4f545f434c41494d5f48454c5045520000000000000000006044820152606401610a58565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614611c83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f5245574152445f544f4b454e5f49535f4e4f545f5354414b45445f544f4b454e6044820152606401610a58565b6000611c90853085612d09565b9050610f67308583600061318c565b600a5460019060ff1680611cb25750303b155b80611cbe575060095481115b611d4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560448201527f656e20696e697469616c697a65640000000000000000000000000000000000006064820152608401610a58565b600a5460ff16158015611d8857600a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560098290555b60408051808201909152600b8082527f5374616b6564204f6d6e690000000000000000000000000000000000000000006020909201918252611dcc9160069161414a565b506040805180820190915260058082527f734f4d4e490000000000000000000000000000000000000000000000000000006020909201918252611e119160079161414a565b50467f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611e3c610c2e565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018290523060a082015260c001604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181528282528051602090910120603f55600380835260808301909152600091908160200160208202803683375050604080516003808252608082019092529293506000929150602082016060803683370190505090508882600081518110611f4f57611f4f6145f5565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508782600181518110611f9d57611f9d6145f5565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508682600281518110611feb57611feb6145f5565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060008160008151811061203a5761203a6145f5565b60200260200101818152505060018160018151811061205b5761205b6145f5565b60200260200101818152505060028160028151811061207c5761207c6145f5565b60200260200101818152505061209281836134e8565b505050604083905580156120c957600a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b505050505050565b73ffffffffffffffffffffffffffffffffffffffff871661214e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f494e56414c49445f4f574e4552000000000000000000000000000000000000006044820152606401610a58565b834211156121b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f494e56414c49445f45585049524154494f4e00000000000000000000000000006044820152606401610a58565b73ffffffffffffffffffffffffffffffffffffffff878116600081815260426020908152604080832054603f5482517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958c166060860152608085018b905260a0850181905260c08086018b90528251808703909101815260e08601909252815191909201207f19010000000000000000000000000000000000000000000000000000000000006101008501526101028401949094526101228301939093529061014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206000845290830180835281905260ff8816918301919091526060820186905260808201859052915060019060a0016020604051602081039080840390855afa15801561230d573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16146123ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f5349474e41545552450000000000000000000000000000006044820152606401610a58565b6123b6826001612605565b73ffffffffffffffffffffffffffffffffffffffff8a166000908152604260205260409020556123e789898961280a565b505050505050505050565b6123fd338484612d09565b50610d8c3384836129be565b73ffffffffffffffffffffffffffffffffffffffff82166000908152603e60205260408120548061243e5760009150506124ff565b60006124947f000000000000000000000000000000000000000000000000000000000000000061248e427f0000000000000000000000000000000000000000000000000000000000000000613702565b90613702565b9050818111156124a757600091506124fb565b60008782116124b657876124b8565b425b9050828110156124cd578293505050506124ff565b6124f76124da8887612605565b6111146124e78887613029565b6124f18b86613029565b90612605565b9250505b5090505b949350505050565b600081815260016020526040902054819073ffffffffffffffffffffffffffffffffffffffff163314612596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f43414c4c45525f4e4f545f50454e44494e475f524f4c455f41444d494e0000006044820152606401610a58565b6000828152602081815260409182902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000163390811790915591518481527f83a9ddad961dcb7c6894c9585a16ff7792c2ec8281256a3cc7303ae830152dcf910160405180910390a25050565b6000610f6a82846146be565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055565b6000821580612652575081155b1561265f57506000610cd1565b8161266d60026127106146d6565b612697907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614711565b6126a191906146d6565b83111561270a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4d4154485f4d554c5449504c49434154494f4e5f4f564552464c4f57000000006044820152606401610a58565b6127106127186002826146d6565b6127228486614728565b61272c91906146be565b610f6a91906146d6565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610d8c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261370e565b73ffffffffffffffffffffffffffffffffffffffff83166128ac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a58565b73ffffffffffffffffffffffffffffffffffffffff821661294f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610a58565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b80612a25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f494e56414c49445f5a45524f5f414d4f554e54000000000000000000000000006044820152606401610a58565b73ffffffffffffffffffffffffffffffffffffffff83166000908152603e602052604090205460415460ff16158015612a865750612a83817f0000000000000000000000000000000000000000000000000000000000000000612605565b42115b612aec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f494e53554646494349454e545f434f4f4c444f574e00000000000000000000006044820152606401610a58565b7f0000000000000000000000000000000000000000000000000000000000000000612b41612b3a837f0000000000000000000000000000000000000000000000000000000000000000612605565b4290613702565b1115612ba9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f554e5354414b455f57494e444f575f46494e49534845440000000000000000006044820152606401610a58565b73ffffffffffffffffffffffffffffffffffffffff841660009081526003602052604081205490818411612bdd5783612bdf565b815b9050612bed86836001613910565b506000612c0e670de0b6b3a7640000611114612c0761102a565b8590613029565b9050612c1a87836139e6565b612c248383613702565b612c4f5773ffffffffffffffffffffffffffffffffffffffff87166000908152603e60205260408120555b612c9073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783612736565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f3f693fff038bb8a046aa76d9516190ac7444f7d69cf952c4cbdc086fdef2d6fc8484604051612cf8929190918252602082015260400190565b60405180910390a350505050505050565b600080612d4385612d3c8773ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b6000613910565b905060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8414612d745783612d76565b815b9050612dc2816040518060400160405280600e81526020017f494e56414c49445f414d4f554e5400000000000000000000000000000000000081525084612fe39092919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152603d6020526040902091909155612e3a907f0000000000000000000000000000000000000000000000000000000000000000167f00000000000000000000000000000000000000000000000000000000000000008784613b5c565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f9310ccfcb8de723f578a9e4282ea9f521f05ae40dc08f3068dfad528a65ee3c783604051612e9991815260200190565b60405180910390a395945050505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040902054612edc84826001613910565b508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612fd85773ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040902054612f4284826001613910565b5073ffffffffffffffffffffffffffffffffffffffff85166000908152603e6020526040902054612f7581858785612409565b73ffffffffffffffffffffffffffffffffffffffff86166000908152603e60205260409020558284148015612fa957508015155b15612fd55773ffffffffffffffffffffffffffffffffffffffff86166000908152603e60205260408120555b50505b61160f848484613bba565b60008184841115613021576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5891906142ac565b505050900390565b6000610f6a8284614728565b6000610f6a82846146d6565b600080805b835181101561318457600060026000868481518110613067576130676145f5565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160009081206001810154815488519294506130f8926fffffffffffffffffffffffffffffffff80831692700100000000000000000000000000000000900416908a90889081106130e7576130e76145f5565b602002602001015160400151613de7565b905061316d613166878581518110613112576131126145f5565b602002602001015160200151838560020160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ef8565b8590612605565b93505050808061317c90614685565b915050613046565b509392505050565b816131f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f494e56414c49445f5a45524f5f414d4f554e54000000000000000000000000006044820152606401610a58565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120549050600061323185308461322c60055490565b613f1d565b905080156132df576040805173ffffffffffffffffffffffffffffffffffffffff87168152602081018390527f2468f9268c60ad90e2d49edb0032c8a001e733ae888b3ab8e982edf535be1a76910160405180910390a173ffffffffffffffffffffffffffffffffffffffff85166000908152603d60205260409020546132b89082612605565b73ffffffffffffffffffffffffffffffffffffffff86166000908152603d60205260409020555b6132ec6000858785612409565b73ffffffffffffffffffffffffffffffffffffffff86166000908152603e602052604081209190915561333261332061102a565b61111487670de0b6b3a7640000613029565b905061333e8682613ff6565b83156133865761338673ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016883088613b5c565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f6c86f3fd5118b3aa8bb4f389a617046de0a3d3d477de1a1673d227f802f616dc8784604051612cf8929190918252602082015260400190565b600182015482546000919070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff164281141561342f57509050610f6a565b84546000906134539084906fffffffffffffffffffffffffffffffff168488613de7565b90508281146134af576001860181905560405181815273ffffffffffffffffffffffffffffffffffffffff8816907f5777ca300dfe5bead41006fbce4389794dbc0ed8d6cccebfaf94630aa04184bc9060200160405180910390a25b85546fffffffffffffffffffffffffffffffff428116700100000000000000000000000000000000029116178655925050509392505050565b8051825114613553576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f494e434f4e53495354454e545f494e495449414c495a4154494f4e00000000006044820152606401610a58565b60005b8251811015610d8c5760008181526020819052604090205473ffffffffffffffffffffffffffffffffffffffff16156135eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f41444d494e5f414c52454144595f494e495449414c495a4544000000000000006044820152606401610a58565b8181815181106135fd576135fd6145f5565b602002602001015160008085848151811061361a5761361a6145f5565b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818181518110613680576136806145f5565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f83a9ddad961dcb7c6894c9585a16ff7792c2ec8281256a3cc7303ae830152dcf8483815181106136d1576136d16145f5565b60200260200101516040516136e891815260200190565b60405180910390a2806136fa81614685565b915050613556565b6000610f6a8284614711565b61372d8273ffffffffffffffffffffffffffffffffffffffff16614111565b613793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e7472616374006044820152606401610a58565b6000808373ffffffffffffffffffffffffffffffffffffffff16836040516137bb9190614765565b6000604051808303816000865af19150503d80600081146137f8576040519150601f19603f3d011682016040523d82523d6000602084013e6137fd565b606091505b509150915081613869576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646044820152606401610a58565b80511561160f57808060200190518101906138849190614781565b61160f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a58565b60008061392285308661322c60055490565b73ffffffffffffffffffffffffffffffffffffffff86166000908152603d6020526040812054919250906139569083612605565b905081156139dd57831561398d5773ffffffffffffffffffffffffffffffffffffffff86166000908152603d602052604090208190555b6040805173ffffffffffffffffffffffffffffffffffffffff88168152602081018490527f2468f9268c60ad90e2d49edb0032c8a001e733ae888b3ab8e982edf535be1a76910160405180910390a15b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8216613a89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610a58565b613ad3816040518060600160405280602281526020016148cb6022913973ffffffffffffffffffffffffffffffffffffffff85166000908152600360205260409020549190612fe3565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040902055600554613b069082613702565b60055560405181815260009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261160f9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612788565b73ffffffffffffffffffffffffffffffffffffffff8316613c5d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610a58565b73ffffffffffffffffffffffffffffffffffffffff8216613d00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610a58565b613d4a816040518060600160405280602681526020016148ed6026913973ffffffffffffffffffffffffffffffffffffffff86166000908152600360205260409020549190612fe3565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600360205260408082209390935590841681522054613d869082612605565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526003602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906129b19085815260200190565b6000831580613df4575081155b80613e10575042836fffffffffffffffffffffffffffffffff16145b80613e4d57507f0000000000000000000000000000000000000000000000000000000000000000836fffffffffffffffffffffffffffffffff1610155b15613e595750836124ff565b60007f00000000000000000000000000000000000000000000000000000000000000004211613e885742613eaa565b7f00000000000000000000000000000000000000000000000000000000000000005b90506000613eca826fffffffffffffffffffffffffffffffff8716613702565b9050613eed876124f186611114613ee36012600a6148be565b61110e8c88613029565b979650505050505050565b6000610f67613f096012600a6148be565b611114613f168686613702565b8790613029565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600260208181526040808420948916845291840190528120549091908280613f638885886133ee565b9050808314613fea578615613f8057613f7d878285613ef8565b91505b73ffffffffffffffffffffffffffffffffffffffff808a1660008181526002870160205260409081902084905551918a16917fbb123b5c06d5408bbea3c4fef481578175cfb432e3b482c6186f02ed9086585b90613fe19085815260200190565b60405180910390a35b50979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8216614073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610a58565b6005546140809082612605565b60055573ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260409020546140b39082612605565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600360205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613b509085815260200190565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906124ff575050151592915050565b828054614156906145a1565b90600052602060002090601f01602090048101928261417857600085556141be565b82601f1061419157805160ff19168380011785556141be565b828001600101855582156141be579182015b828111156141be5782518255916020019190600101906141a3565b506141ca9291506141ce565b5090565b5b808211156141ca57600081556001016141cf565b803573ffffffffffffffffffffffffffffffffffffffff8116811461420757600080fd5b919050565b6000806040838503121561421f57600080fd5b614228836141e3565b946020939093013593505050565b60005b83811015614251578181015183820152602001614239565b8381111561160f5750506000910152565b6000815180845261427a816020860160208601614236565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610f6a6020830184614262565b6000602082840312156142d157600080fd5b610f6a826141e3565b6000602082840312156142ec57600080fd5b5035919050565b60008060006060848603121561430857600080fd5b614311846141e3565b925061431f602085016141e3565b9150604084013590509250925092565b801515811461433d57600080fd5b50565b60006020828403121561435257600080fd5b8135610f6a8161432f565b6000806040838503121561437057600080fd5b614379836141e3565b9150614387602084016141e3565b90509250929050565b600080600080608085870312156143a657600080fd5b6143af856141e3565b93506143bd602086016141e3565b93969395505050506040820135916060013590565b600080600080600080600060e0888a0312156143ed57600080fd5b6143f6886141e3565b9650614404602089016141e3565b95506040880135945060608801359350608088013560ff8116811461442857600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561445857600080fd5b82359150614387602084016141e3565b6000806020838503121561447b57600080fd5b823567ffffffffffffffff8082111561449357600080fd5b818501915085601f8301126144a757600080fd5b8135818111156144b657600080fd5b8660206060830285010111156144cb57600080fd5b60209290920196919550909350505050565b600080600080608085870312156144f357600080fd5b6144fc856141e3565b935061450a602086016141e3565b9250614518604086016141e3565b9396929550929360600135925050565b60008060006060848603121561453d57600080fd5b614546846141e3565b95602085013595506040909401359392505050565b6000806000806080858703121561457157600080fd5b8435935060208501359250614518604086016141e3565b60006020828403121561459a57600080fd5b5051919050565b600181811c908216806145b557607f821691505b602082108114156145ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561463657600080fd5b81356fffffffffffffffffffffffffffffffff81168114610f6a57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146b7576146b7614656565b5060010190565b600082198211156146d1576146d1614656565b500190565b60008261470c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008282101561472357614723614656565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561476057614760614656565b500290565b60008251614777818460208701614236565b9190910192915050565b60006020828403121561479357600080fd5b8151610f6a8161432f565b600181815b808511156147f757817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156147dd576147dd614656565b808516156147ea57918102915b93841c93908002906147a3565b509250929050565b60008261480e57506001610cd1565b8161481b57506000610cd1565b8160018114614831576002811461483b57614857565b6001915050610cd1565b60ff84111561484c5761484c614656565b50506001821b610cd1565b5060208310610133831016604e8410600b841016171561487a575081810a610cd1565b614884838361479e565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156148b6576148b6614656565b029392505050565b6000610f6a83836147ff56fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220c87a749513f69d223bda57cdbf50d254d7a45ed7df3a3ff744cb718963edf1a264736f6c634300080a0033';