Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- GaugeController
- Optimization enabled
- true
- Compiler version
- v0.3.1+commit.0463ea4c
- EVM Version
- istanbul
- Verified at
- 2025-08-13T16:51:14.300320Z
Constructor Arguments
0x000000000000000000000000013d14a7fd6569cc97f84393ab5dc877d7536675000000000000000000000000be0d92a98a7892258b08669479527efb910bcf97
Arg [0] (address) : 0x013d14a7fd6569cc97f84393ab5dc877d7536675
Arg [1] (address) : 0xbe0d92a98a7892258b08669479527efb910bcf97
Contract source code
# @version 0.3.1
"""
@title Gauge Controller
@author Curve Finance
@license MIT
@notice Controls liquidity gauges and the issuance of coins through the gauges
"""
# 7 * 86400 seconds - all future times are rounded by week
WEEK: constant(uint256) = 604800
# Cannot change weight votes more often than once in 10 days
WEIGHT_VOTE_DELAY: constant(uint256) = 10 * 86400
struct Point:
bias: uint256
slope: uint256
struct VotedSlope:
slope: uint256
power: uint256
end: uint256
interface VotingEscrow:
def token() -> address: view
def get_last_user_slope(addr: address) -> int128: view
def locked__end(addr: address) -> uint256: view
event AddType:
name: String[64]
type_id: int128
event NewTypeWeight:
type_id: int128
time: uint256
weight: uint256
total_weight: uint256
event NewGaugeWeight:
gauge_address: address
time: uint256
weight: uint256
total_weight: uint256
event VoteForGauge:
time: uint256
user: address
gauge_addr: address
weight: uint256
event NewGauge:
addr: address
gauge_type: int128
weight: uint256
MULTIPLIER: constant(uint256) = 10 ** 18
TOKEN: immutable(address) # 80-20 BAL-WETH BPT token
VOTING_ESCROW: immutable(address) # Voting escrow
AUTHORIZER_ADAPTOR: immutable(address) # Authorizer Adaptor
# Gauge parameters
# All numbers are "fixed point" on the basis of 1e18
n_gauge_types: public(int128)
n_gauges: public(int128)
gauge_type_names: public(HashMap[int128, String[64]])
# Needed for enumeration
gauges: public(address[1000000000])
# we increment values by 1 prior to storing them here so we can rely on a value
# of zero as meaning the gauge has not been set
gauge_types_: HashMap[address, int128]
vote_user_slopes: public(HashMap[address, HashMap[address, VotedSlope]]) # user -> gauge_addr -> VotedSlope
vote_user_power: public(HashMap[address, uint256]) # Total vote power used by user
last_user_vote: public(HashMap[address, HashMap[address, uint256]]) # Last user vote's timestamp for each gauge address
# Past and scheduled points for gauge weight, sum of weights per type, total weight
# Point is for bias+slope
# changes_* are for changes in slope
# time_* are for the last change timestamp
# timestamps are rounded to whole weeks
points_weight: public(HashMap[address, HashMap[uint256, Point]]) # gauge_addr -> time -> Point
changes_weight: HashMap[address, HashMap[uint256, uint256]] # gauge_addr -> time -> slope
time_weight: public(HashMap[address, uint256]) # gauge_addr -> last scheduled time (next week)
points_sum: public(HashMap[int128, HashMap[uint256, Point]]) # type_id -> time -> Point
changes_sum: HashMap[int128, HashMap[uint256, uint256]] # type_id -> time -> slope
time_sum: public(uint256[1000000000]) # type_id -> last scheduled time (next week)
points_total: public(HashMap[uint256, uint256]) # time -> total weight
time_total: public(uint256) # last scheduled time
points_type_weight: public(HashMap[int128, HashMap[uint256, uint256]]) # type_id -> time -> type weight
time_type_weight: public(uint256[1000000000]) # type_id -> last scheduled time (next week)
@external
def __init__(_voting_escrow: address, _authorizer_adaptor: address):
"""
@notice Contract constructor
@param _voting_escrow `VotingEscrow` contract address
@param _authorizer_adaptor `AuthorizerAdaptor` contract address
"""
assert _voting_escrow != ZERO_ADDRESS
assert _authorizer_adaptor != ZERO_ADDRESS
TOKEN = VotingEscrow(_voting_escrow).token()
VOTING_ESCROW = _voting_escrow
AUTHORIZER_ADAPTOR = _authorizer_adaptor
self.time_total = block.timestamp / WEEK * WEEK
@external
@view
def token() -> address:
return TOKEN
@external
@view
def voting_escrow() -> address:
return VOTING_ESCROW
@external
@view
def admin() -> address:
return AUTHORIZER_ADAPTOR
@external
@view
def gauge_exists(_addr: address) -> bool:
"""
@notice Get whether gauge already exists on GaugeController
@param _addr Gauge address
@return true if the gauge exists
"""
gauge_type: int128 = self.gauge_types_[_addr]
return gauge_type > 0
@external
@view
def gauge_types(_addr: address) -> int128:
"""
@notice Get gauge type for address
@param _addr Gauge address
@return Gauge type id
"""
gauge_type: int128 = self.gauge_types_[_addr]
assert gauge_type != 0
return gauge_type - 1
@internal
def _get_type_weight(gauge_type: int128) -> uint256:
"""
@notice Fill historic type weights week-over-week for missed checkins
and return the type weight for the future week
@param gauge_type Gauge type id
@return Type weight
"""
t: uint256 = self.time_type_weight[gauge_type]
if t > 0:
w: uint256 = self.points_type_weight[gauge_type][t]
for i in range(500):
if t > block.timestamp:
break
t += WEEK
self.points_type_weight[gauge_type][t] = w
if t > block.timestamp:
self.time_type_weight[gauge_type] = t
return w
else:
return 0
@internal
def _get_sum(gauge_type: int128) -> uint256:
"""
@notice Fill sum of gauge weights for the same type week-over-week for
missed checkins and return the sum for the future week
@param gauge_type Gauge type id
@return Sum of weights
"""
t: uint256 = self.time_sum[gauge_type]
if t > 0:
pt: Point = self.points_sum[gauge_type][t]
for i in range(500):
if t > block.timestamp:
break
t += WEEK
d_bias: uint256 = pt.slope * WEEK
if pt.bias > d_bias:
pt.bias -= d_bias
d_slope: uint256 = self.changes_sum[gauge_type][t]
pt.slope -= d_slope
else:
pt.bias = 0
pt.slope = 0
self.points_sum[gauge_type][t] = pt
if t > block.timestamp:
self.time_sum[gauge_type] = t
return pt.bias
else:
return 0
@internal
def _get_total() -> uint256:
"""
@notice Fill historic total weights week-over-week for missed checkins
and return the total for the future week
@return Total weight
"""
t: uint256 = self.time_total
_n_gauge_types: int128 = self.n_gauge_types
if t > block.timestamp:
# If we have already checkpointed - still need to change the value
t -= WEEK
pt: uint256 = self.points_total[t]
for gauge_type in range(100):
if gauge_type == _n_gauge_types:
break
self._get_sum(gauge_type)
self._get_type_weight(gauge_type)
for i in range(500):
if t > block.timestamp:
break
t += WEEK
pt = 0
# Scales as n_types * n_unchecked_weeks (hopefully 1 at most)
for gauge_type in range(100):
if gauge_type == _n_gauge_types:
break
type_sum: uint256 = self.points_sum[gauge_type][t].bias
type_weight: uint256 = self.points_type_weight[gauge_type][t]
pt += type_sum * type_weight
self.points_total[t] = pt
if t > block.timestamp:
self.time_total = t
return pt
@internal
def _get_weight(gauge_addr: address) -> uint256:
"""
@notice Fill historic gauge weights week-over-week for missed checkins
and return the total for the future week
@param gauge_addr Address of the gauge
@return Gauge weight
"""
t: uint256 = self.time_weight[gauge_addr]
if t > 0:
pt: Point = self.points_weight[gauge_addr][t]
for i in range(500):
if t > block.timestamp:
break
t += WEEK
d_bias: uint256 = pt.slope * WEEK
if pt.bias > d_bias:
pt.bias -= d_bias
d_slope: uint256 = self.changes_weight[gauge_addr][t]
pt.slope -= d_slope
else:
pt.bias = 0
pt.slope = 0
self.points_weight[gauge_addr][t] = pt
if t > block.timestamp:
self.time_weight[gauge_addr] = t
return pt.bias
else:
return 0
@external
def add_gauge(addr: address, gauge_type: int128, weight: uint256 = 0):
"""
@notice Add gauge `addr` of type `gauge_type` with weight `weight`
@param addr Gauge address
@param gauge_type Gauge type
@param weight Gauge weight
"""
assert msg.sender == AUTHORIZER_ADAPTOR
assert (gauge_type >= 0) and (gauge_type < self.n_gauge_types)
assert self.gauge_types_[addr] == 0 # dev: cannot add the same gauge twice
n: int128 = self.n_gauges
self.n_gauges = n + 1
self.gauges[n] = addr
self.gauge_types_[addr] = gauge_type + 1
next_time: uint256 = (block.timestamp + WEEK) / WEEK * WEEK
if weight > 0:
_type_weight: uint256 = self._get_type_weight(gauge_type)
_old_sum: uint256 = self._get_sum(gauge_type)
_old_total: uint256 = self._get_total()
self.points_sum[gauge_type][next_time].bias = weight + _old_sum
self.time_sum[gauge_type] = next_time
self.points_total[next_time] = _old_total + _type_weight * weight
self.time_total = next_time
self.points_weight[addr][next_time].bias = weight
if self.time_sum[gauge_type] == 0:
self.time_sum[gauge_type] = next_time
self.time_weight[addr] = next_time
log NewGauge(addr, gauge_type, weight)
@external
def checkpoint():
"""
@notice Checkpoint to fill data common for all gauges
"""
self._get_total()
@external
def checkpoint_gauge(addr: address):
"""
@notice Checkpoint to fill data for both a specific gauge and common for all gauges
@param addr Gauge address
"""
self._get_weight(addr)
self._get_total()
@internal
@view
def _gauge_relative_weight(addr: address, time: uint256) -> uint256:
"""
@notice Get Gauge relative weight (not more than 1.0) normalized to 1e18
(e.g. 1.0 == 1e18). Inflation which will be received by it is
inflation_rate * relative_weight / 1e18
@param addr Gauge address
@param time Relative weight at the specified timestamp in the past or present
@return Value of relative weight normalized to 1e18
"""
t: uint256 = time / WEEK * WEEK
_total_weight: uint256 = self.points_total[t]
if _total_weight > 0:
gauge_type: int128 = self.gauge_types_[addr] - 1
_type_weight: uint256 = self.points_type_weight[gauge_type][t]
_gauge_weight: uint256 = self.points_weight[addr][t].bias
return MULTIPLIER * _type_weight * _gauge_weight / _total_weight
else:
return 0
@external
@view
def gauge_relative_weight(addr: address, time: uint256 = block.timestamp) -> uint256:
"""
@notice Get Gauge relative weight (not more than 1.0) normalized to 1e18
(e.g. 1.0 == 1e18). Inflation which will be received by it is
inflation_rate * relative_weight / 1e18
@param addr Gauge address
@param time Relative weight at the specified timestamp in the past or present
@return Value of relative weight normalized to 1e18
"""
return self._gauge_relative_weight(addr, time)
@external
def gauge_relative_weight_write(addr: address, time: uint256 = block.timestamp) -> uint256:
"""
@notice Get gauge weight normalized to 1e18 and also fill all the unfilled
values for type and gauge records
@dev Any address can call, however nothing is recorded if the values are filled already
@param addr Gauge address
@param time Relative weight at the specified timestamp in the past or present
@return Value of relative weight normalized to 1e18
"""
self._get_weight(addr)
self._get_total() # Also calculates get_sum
return self._gauge_relative_weight(addr, time)
@internal
def _change_type_weight(type_id: int128, weight: uint256):
"""
@notice Change type weight
@param type_id Type id
@param weight New type weight
"""
old_weight: uint256 = self._get_type_weight(type_id)
old_sum: uint256 = self._get_sum(type_id)
_total_weight: uint256 = self._get_total()
next_time: uint256 = (block.timestamp + WEEK) / WEEK * WEEK
_total_weight = _total_weight + old_sum * weight - old_sum * old_weight
self.points_total[next_time] = _total_weight
self.points_type_weight[type_id][next_time] = weight
self.time_total = next_time
self.time_type_weight[type_id] = next_time
log NewTypeWeight(type_id, next_time, weight, _total_weight)
@external
def add_type(_name: String[64], weight: uint256 = 0):
"""
@notice Add gauge type with name `_name` and weight `weight`
@param _name Name of gauge type
@param weight Weight of gauge type
"""
assert msg.sender == AUTHORIZER_ADAPTOR
type_id: int128 = self.n_gauge_types
self.gauge_type_names[type_id] = _name
self.n_gauge_types = type_id + 1
if weight != 0:
self._change_type_weight(type_id, weight)
log AddType(_name, type_id)
@external
def change_type_weight(type_id: int128, weight: uint256):
"""
@notice Change gauge type `type_id` weight to `weight`
@param type_id Gauge type id
@param weight New Gauge weight
"""
assert msg.sender == AUTHORIZER_ADAPTOR
self._change_type_weight(type_id, weight)
@internal
def _change_gauge_weight(addr: address, weight: uint256):
# Change gauge weight
# Only needed when testing in reality
gauge_type: int128 = self.gauge_types_[addr] - 1
old_gauge_weight: uint256 = self._get_weight(addr)
type_weight: uint256 = self._get_type_weight(gauge_type)
old_sum: uint256 = self._get_sum(gauge_type)
_total_weight: uint256 = self._get_total()
next_time: uint256 = (block.timestamp + WEEK) / WEEK * WEEK
self.points_weight[addr][next_time].bias = weight
self.time_weight[addr] = next_time
new_sum: uint256 = old_sum + weight - old_gauge_weight
self.points_sum[gauge_type][next_time].bias = new_sum
self.time_sum[gauge_type] = next_time
_total_weight = _total_weight + new_sum * type_weight - old_sum * type_weight
self.points_total[next_time] = _total_weight
self.time_total = next_time
log NewGaugeWeight(addr, block.timestamp, weight, _total_weight)
@external
def change_gauge_weight(addr: address, weight: uint256):
"""
@notice Change weight of gauge `addr` to `weight`
@param addr `GaugeController` contract address
@param weight New Gauge weight
"""
assert msg.sender == AUTHORIZER_ADAPTOR
self._change_gauge_weight(addr, weight)
@internal
def _vote_for_gauge_weights(_user: address, _gauge_addr: address, _user_weight: uint256):
"""
@notice Allocate voting power for changing pool weights
@param _user User to allocate voting power for
@param _gauge_addr Gauge which _user votes for
@param _user_weight Weight for a gauge in bps (units of 0.01%). Minimal is 0.01%. Ignored if 0
"""
slope: uint256 = convert(VotingEscrow(VOTING_ESCROW).get_last_user_slope(_user), uint256)
lock_end: uint256 = VotingEscrow(VOTING_ESCROW).locked__end(_user)
_n_gauges: int128 = self.n_gauges
next_time: uint256 = (block.timestamp + WEEK) / WEEK * WEEK
assert lock_end > next_time, "Your token lock expires too soon"
assert (_user_weight >= 0) and (_user_weight <= 10000), "You used all your voting power"
assert block.timestamp >= self.last_user_vote[_user][_gauge_addr] + WEIGHT_VOTE_DELAY, "Cannot vote so often"
gauge_type: int128 = self.gauge_types_[_gauge_addr] - 1
assert gauge_type >= 0, "Gauge not added"
# Prepare slopes and biases in memory
old_slope: VotedSlope = self.vote_user_slopes[_user][_gauge_addr]
old_dt: uint256 = 0
if old_slope.end > next_time:
old_dt = old_slope.end - next_time
old_bias: uint256 = old_slope.slope * old_dt
new_slope: VotedSlope = VotedSlope({
slope: slope * _user_weight / 10000,
end: lock_end,
power: _user_weight
})
new_dt: uint256 = lock_end - next_time # dev: raises when expired
new_bias: uint256 = new_slope.slope * new_dt
# Check and update powers (weights) used
power_used: uint256 = self.vote_user_power[_user]
power_used = power_used + new_slope.power - old_slope.power
self.vote_user_power[_user] = power_used
assert (power_used >= 0) and (power_used <= 10000), 'Used too much power'
## Remove old and schedule new slope changes
# Remove slope changes for old slopes
# Schedule recording of initial slope for next_time
old_weight_bias: uint256 = self._get_weight(_gauge_addr)
old_weight_slope: uint256 = self.points_weight[_gauge_addr][next_time].slope
old_sum_bias: uint256 = self._get_sum(gauge_type)
old_sum_slope: uint256 = self.points_sum[gauge_type][next_time].slope
self.points_weight[_gauge_addr][next_time].bias = max(old_weight_bias + new_bias, old_bias) - old_bias
self.points_sum[gauge_type][next_time].bias = max(old_sum_bias + new_bias, old_bias) - old_bias
if old_slope.end > next_time:
self.points_weight[_gauge_addr][next_time].slope = max(old_weight_slope + new_slope.slope, old_slope.slope) - old_slope.slope
self.points_sum[gauge_type][next_time].slope = max(old_sum_slope + new_slope.slope, old_slope.slope) - old_slope.slope
else:
self.points_weight[_gauge_addr][next_time].slope += new_slope.slope
self.points_sum[gauge_type][next_time].slope += new_slope.slope
if old_slope.end > block.timestamp:
# Cancel old slope changes if they still didn't happen
self.changes_weight[_gauge_addr][old_slope.end] -= old_slope.slope
self.changes_sum[gauge_type][old_slope.end] -= old_slope.slope
# Add slope changes for new slopes
self.changes_weight[_gauge_addr][new_slope.end] += new_slope.slope
self.changes_sum[gauge_type][new_slope.end] += new_slope.slope
self._get_total()
self.vote_user_slopes[_user][_gauge_addr] = new_slope
# Record last action time
self.last_user_vote[_user][_gauge_addr] = block.timestamp
log VoteForGauge(block.timestamp, _user, _gauge_addr, _user_weight)
@external
@nonreentrant('lock')
def vote_for_many_gauge_weights(_gauge_addrs: address[8], _user_weight: uint256[8]):
for i in range(8):
if _gauge_addrs[i] == ZERO_ADDRESS:
break
self._vote_for_gauge_weights(msg.sender, _gauge_addrs[i], _user_weight[i])
@external
def vote_for_gauge_weights(_gauge_addr: address, _user_weight: uint256):
self._vote_for_gauge_weights(msg.sender, _gauge_addr, _user_weight)
@external
@view
def get_gauge_weight(addr: address) -> uint256:
"""
@notice Get current gauge weight
@param addr Gauge address
@return Gauge weight
"""
return self.points_weight[addr][self.time_weight[addr]].bias
@external
@view
def get_type_weight(type_id: int128) -> uint256:
"""
@notice Get current type weight
@param type_id Type id
@return Type weight
"""
return self.points_type_weight[type_id][self.time_type_weight[type_id]]
@external
@view
def get_total_weight() -> uint256:
"""
@notice Get current total (type-weighted) weight
@return Total weight
"""
return self.points_total[self.time_total]
@external
@view
def get_weights_sum_per_type(type_id: int128) -> uint256:
"""
@notice Get sum of gauge weights per type
@param type_id Type id
@return Sum of gauge weights
"""
return self.points_sum[type_id][self.time_sum[type_id]].bias
Contract ABI
[{"type":"event","name":"AddType","inputs":[{"type":"string","name":"name","indexed":false},{"type":"int128","name":"type_id","indexed":false}],"anonymous":false},{"type":"event","name":"NewTypeWeight","inputs":[{"type":"int128","name":"type_id","indexed":false},{"type":"uint256","name":"time","indexed":false},{"type":"uint256","name":"weight","indexed":false},{"type":"uint256","name":"total_weight","indexed":false}],"anonymous":false},{"type":"event","name":"NewGaugeWeight","inputs":[{"type":"address","name":"gauge_address","indexed":false},{"type":"uint256","name":"time","indexed":false},{"type":"uint256","name":"weight","indexed":false},{"type":"uint256","name":"total_weight","indexed":false}],"anonymous":false},{"type":"event","name":"VoteForGauge","inputs":[{"type":"uint256","name":"time","indexed":false},{"type":"address","name":"user","indexed":false},{"type":"address","name":"gauge_addr","indexed":false},{"type":"uint256","name":"weight","indexed":false}],"anonymous":false},{"type":"event","name":"NewGauge","inputs":[{"type":"address","name":"addr","indexed":false},{"type":"int128","name":"gauge_type","indexed":false},{"type":"uint256","name":"weight","indexed":false}],"anonymous":false},{"type":"constructor","stateMutability":"nonpayable","outputs":[],"inputs":[{"type":"address","name":"_voting_escrow"},{"type":"address","name":"_authorizer_adaptor"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":""}],"name":"token","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":""}],"name":"voting_escrow","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":""}],"name":"admin","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":""}],"name":"gauge_exists","inputs":[{"type":"address","name":"_addr"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"int128","name":""}],"name":"gauge_types","inputs":[{"type":"address","name":"_addr"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"add_gauge","inputs":[{"type":"address","name":"addr"},{"type":"int128","name":"gauge_type"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"add_gauge","inputs":[{"type":"address","name":"addr"},{"type":"int128","name":"gauge_type"},{"type":"uint256","name":"weight"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"checkpoint","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"checkpoint_gauge","inputs":[{"type":"address","name":"addr"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"gauge_relative_weight","inputs":[{"type":"address","name":"addr"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"gauge_relative_weight","inputs":[{"type":"address","name":"addr"},{"type":"uint256","name":"time"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":""}],"name":"gauge_relative_weight_write","inputs":[{"type":"address","name":"addr"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":""}],"name":"gauge_relative_weight_write","inputs":[{"type":"address","name":"addr"},{"type":"uint256","name":"time"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"add_type","inputs":[{"type":"string","name":"_name"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"add_type","inputs":[{"type":"string","name":"_name"},{"type":"uint256","name":"weight"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"change_type_weight","inputs":[{"type":"int128","name":"type_id"},{"type":"uint256","name":"weight"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"change_gauge_weight","inputs":[{"type":"address","name":"addr"},{"type":"uint256","name":"weight"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"vote_for_many_gauge_weights","inputs":[{"type":"address[8]","name":"_gauge_addrs"},{"type":"uint256[8]","name":"_user_weight"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"vote_for_gauge_weights","inputs":[{"type":"address","name":"_gauge_addr"},{"type":"uint256","name":"_user_weight"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"get_gauge_weight","inputs":[{"type":"address","name":"addr"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"get_type_weight","inputs":[{"type":"int128","name":"type_id"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"get_total_weight","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"get_weights_sum_per_type","inputs":[{"type":"int128","name":"type_id"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"int128","name":""}],"name":"n_gauge_types","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"int128","name":""}],"name":"n_gauges","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":""}],"name":"gauge_type_names","inputs":[{"type":"int128","name":"arg0"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":""}],"name":"gauges","inputs":[{"type":"uint256","name":"arg0"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","components":[{"type":"uint256","name":"slope"},{"type":"uint256","name":"power"},{"type":"uint256","name":"end"}]}],"name":"vote_user_slopes","inputs":[{"type":"address","name":"arg0"},{"type":"address","name":"arg1"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"vote_user_power","inputs":[{"type":"address","name":"arg0"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"last_user_vote","inputs":[{"type":"address","name":"arg0"},{"type":"address","name":"arg1"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","components":[{"type":"uint256","name":"bias"},{"type":"uint256","name":"slope"}]}],"name":"points_weight","inputs":[{"type":"address","name":"arg0"},{"type":"uint256","name":"arg1"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"time_weight","inputs":[{"type":"address","name":"arg0"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","components":[{"type":"uint256","name":"bias"},{"type":"uint256","name":"slope"}]}],"name":"points_sum","inputs":[{"type":"int128","name":"arg0"},{"type":"uint256","name":"arg1"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"time_sum","inputs":[{"type":"uint256","name":"arg0"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"points_total","inputs":[{"type":"uint256","name":"arg0"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"time_total","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"points_type_weight","inputs":[{"type":"int128","name":"arg0"},{"type":"uint256","name":"arg1"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"time_type_weight","inputs":[{"type":"uint256","name":"arg0"}]}]
Contract Creation Code
0x60206124046080396080518060a01c6123ff5760e05260206020612404016080396080518060a01c6123ff5761010052600060e051146123ff57600061010051146123ff5763fc0c546a610120526020610120600461013c60e0515afa61006b573d600060003e3d6000fd5b601f3d11156123ff57610120518060a01c6123ff576101605260e0516101205261010051610140524262093a808082049050905062093a808082028215828483041417156123ff5790509050637735940e556123c356600436101561000d57610de2565b60046000601c37600051346122fc5763fc0c546a811861003c5760206060380360803960805160e052602060e0f35b63dfe05031811861005c5760206040380360803960805160e052602060e0f35b63f851a440811861007c5760206020380360803960805160e052602060e0f35b6361df1bf981186100bf576004358060a01c6122fc5760e052633b9aca0460e05160a0526080526040608020546101005260006101005113610120526020610120f35b633f9095b78118610120576004358060a01c6122fc5760e052633b9aca0460e05160a05260805260406080205461010052600061010051146122fc576101005160018082038060801d81607f1d186122fc5790509050610120526020610120f35b633a04f90081186101365760006102e052610149565b6318dfe921811861041e576044356102e0525b6004358060a01c6122fc576102a0526024358060801d81607f1d186122fc576102c05260206020380360803960805133186122fc5760006102c051121561019157600061019a565b6001546102c051125b156122fc57633b9aca046102a05160a0526080526040608020546122fc57600254610300526103005160018082018060801d81607f1d186122fc57905090506002556102a051600161030051633b9aca008110156122fc5702600401556102c05160018082018060801d81607f1d186122fc5790509050633b9aca046102a05160a0526080526040608020554262093a8081818301106122fc578082019050905062093a808082049050905062093a808082028215828483041417156122fc57905090506103205260006102e0511115610387576102c05160e052610280610360610de8565b61036051610340526102c05160e05261029a610380610eee565b61038051610360526102ad6103a06110a4565b6103a051610380526102e0516103605181818301106122fc5780820190509050633b9aca0b6102c05160a05260805260406080206103205160a0526080526040608020556103205160016102c051633b9aca008110156122fc5702633b9aca0d015561038051610340516102e0518082028215828483041417156122fc579050905081818301106122fc5780820190509050637735940d6103205160a05260805260406080205561032051637735940e556102e051633b9aca086102a05160a05260805260406080206103205160a0526080526040608020555b60016102c051633b9aca008110156122fc5702633b9aca0d01546103c4576103205160016102c051633b9aca008110156122fc5702633b9aca0d01555b61032051633b9aca0a6102a05160a0526080526040608020557ffd55b3191f9c9dd92f4f134dd700e7d76f6a0c836a08687023d6d38f03ebd8776102a051610340526102c051610360526102e051610380526060610340a1005b63c2c4c5c1811861043a576104346102a06110a4565b6102a050005b63615e5237811861047b576004358060a01c6122fc576102a0526102a05160e0526104666102c061128d565b6102c0506104756102c06110a4565b6102c050005b636207d866811861049057426101e0526104a3565b63d3078c9481186104db576024356101e0525b6004358060a01c6122fc576101c0526101c05160e0526101e051610100526104cc610200611439565b61020051610220526020610220f35b6395cfcec381186104f057426102c052610503565b636472eee18118610560576024356102c0525b6004358060a01c6122fc576102a0526102a05160e0526105246102e061128d565b6102e0506105336102e06110a4565b6102e0506102a05160e0526102c051610100526105516102e0611439565b6102e051610300526020610300f35b6326e56d5e811861057657600061044052610589565b6392d0d23281186106ee57602435610440525b60043560040160408135116122fc5780803560200180826103e03750505060206020380360803960805133186122fc57600154610460526103e08060036104605160a0526080526040608020602082510160c060006003818352015b8260c05160200211156105f757610616565b60c05160200285015160c05185015581516001018083528114156105e5575b5050505050506104605160018082018060801d81607f1d186122fc5790509050600155600061044051146106ec57610460516102a052610440516102c05261065c611567565b7f6fbe76157c712f16b5a3c44ed48baa04e3450bc3fab0c020e848aca72bbccc84610480806040808252808301806103e080516020018083828460045afa905050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f8201039050905090508101905060208201915061046051825290509050610480a15b005b63db1ca2608118610738576004358060801d81607f1d186122fc576103e05260206020380360803960805133186122fc576103e0516102a0526024356102c052610736611567565b005b63d4d2646e811861077d576004358060a01c6122fc576104405260206020380360803960805133186122fc57610440516102a0526024356102c05261077b6116f9565b005b632e4e99a18118610885576004358060a01c6122fc57610600526024358060a01c6122fc57610620526044358060a01c6122fc57610640526064358060a01c6122fc57610660526084358060a01c6122fc576106805260a4358060a01c6122fc576106a05260c4358060a01c6122fc576106c05260e4358060a01c6122fc576106e0526000546122fc57600160005561070060006008818352015b6106006107005160088110156122fc5760200201516108365761087c565b336102a0526106006107005160088110156122fc5760200201516102c0526020610700510261010401356102e05261086c611941565b8151600101808352811415610818575b50506000600055005b63d713632881186108bd576004358060a01c6122fc5761060052336102a052610600516102c0526024356102e0526108bb611941565b005b634e791a3a8118610914576004358060a01c6122fc5760e052633b9aca0860e05160a0526080526040608020633b9aca0a60e05160a05260805260406080205460a052608052604060802054610100526020610100f35b6372fdccfa8118610975576004358060801d81607f1d186122fc5760e052637735940f60e05160a0526080526040608020600160e051633b9aca008110156122fc57026377359410015460a052608052604060802054610100526020610100f35b636977ff9281186109a057637735940d637735940e5460a05260805260406080205460e052602060e0f35b636f214a6a8118610a01576004358060801d81607f1d186122fc5760e052633b9aca0b60e05160a0526080526040608020600160e051633b9aca008110156122fc5702633b9aca0d015460a052608052604060802054610100526020610100f35b639fba03a18118610a185760015460e052602060e0f35b63e93841d08118610a2f5760025460e052602060e0f35b63d958a8fc8118610af8576004358060801d81607f1d186122fc5760e052610100806020808252600360e05160a052608052604060802081840180828082602082540160c060006003818352015b8260c0516020021115610a8f57610aae565b60c05185015460c0516020028501528151600101808352811415610a7d575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f82010390509050905090508101905090509050610100f35b63b05391878118610b22576001600435633b9aca008110156122fc57026004015460e052602060e0f35b630f467f988118610b8c576004358060a01c6122fc5760e0526024358060a01c6122fc5761010052633b9aca0560e05160a05260805260406080206101005160a0526080526040608020805461012052600181015461014052600281015461016052506060610120f35b63411e74b58118610bc4576004358060a01c6122fc5760e052633b9aca0660e05160a052608052604060802054610100526020610100f35b637e418fa08118610c1a576004358060a01c6122fc5760e0526024358060a01c6122fc5761010052633b9aca0760e05160a05260805260406080206101005160a052608052604060802054610120526020610120f35b63edba52738118610c6b576004358060a01c6122fc5760e052633b9aca0860e05160a052608052604060802060243560a0526080526040608020805461010052600181015461012052506040610100f35b63a4d7a2508118610ca3576004358060a01c6122fc5760e052633b9aca0a60e05160a052608052604060802054610100526020610100f35b63a9b48c018118610cf9576004358060801d81607f1d186122fc5760e052633b9aca0b60e05160a052608052604060802060243560a0526080526040608020805461010052600181015461012052506040610100f35b635a5491588118610d26576001600435633b9aca008110156122fc5702633b9aca0d015460e052602060e0f35b631142916b8118610d4e57637735940d60043560a05260805260406080205460e052602060e0f35b63513872bd8118610d6857637735940e5460e052602060e0f35b63afd2bb498118610db3576004358060801d81607f1d186122fc5760e052637735940f60e05160a052608052604060802060243560a052608052604060802054610100526020610100f35b6351ce6b598118610de0576001600435633b9aca008110156122fc57026377359410015460e052602060e0f35b505b60006000fd5b600160e051633b9aca008110156122fc5702637735941001546101005260006101005111610e1e576000815250610eec56610eec565b637735940f60e05160a05260805260406080206101005160a0526080526040608020546101205261014060006101f4818352015b42610100511115610e6257610ede565b610100805162093a8081818301106122fc578082019050905081525061012051637735940f60e05160a05260805260406080206101005160a05260805260406080205542610100511115610ece5761010051600160e051633b9aca008110156122fc5702637735941001555b8151600101808352811415610e52575b505061012051815250610eec565b565b600160e051633b9aca008110156122fc5702633b9aca0d01546101005260006101005111610f245760008152506110a2566110a2565b633b9aca0b60e05160a05260805260406080206101005160a05260805260406080208054610120526001810154610140525061016060006101f4818352015b42610100511115610f7357611094565b610100805162093a8081818301106122fc57808201905090508152506101405162093a808082028215828483041417156122fc579050905061018052610180516101205111610fcd57600061012052600061014052611029565b6101208051610180518082106122fc5780820390509050815250633b9aca0c60e05160a05260805260406080206101005160a0526080526040608020546101a05261014080516101a0518082106122fc57808203905090508152505b633b9aca0b60e05160a05260805260406080206101005160a052608052604060802061012051815561014051600182015550426101005111156110845761010051600160e051633b9aca008110156122fc5702633b9aca0d01555b8151600101808352811415610f63575b5050610120518152506110a2565b565b637735940e546101c0526001546101e052426101c05111156110db576101c0805162093a808082106122fc57808203905090508152505b637735940d6101c05160a0526080526040608020546102005261022060006064818352015b6101e05161022051186111125761114e565b6102205160e052611124610240610eee565b610240506102205160e05261113a610240610de8565b610240508151600101808352811415611100575b505061022060006101f4818352015b426101c051111561116d57611282565b6101c0805162093a8081818301106122fc578082019050905081525060006102005261024060006064818352015b6101e05161024051186111ad57611241565b633b9aca0b6102405160a05260805260406080206101c05160a05260805260406080205461026052637735940f6102405160a05260805260406080206101c05160a05260805260406080205461028052610200805161026051610280518082028215828483041417156122fc579050905081818301106122fc5780820190509050815250815160010180835281141561119b575b505061020051637735940d6101c05160a052608052604060802055426101c0511115611272576101c051637735940e555b815160010180835281141561115d575b505061020051815250565b633b9aca0a60e05160a05260805260406080205461010052600061010051116112be57600081525061143756611437565b633b9aca0860e05160a05260805260406080206101005160a05260805260406080208054610120526001810154610140525061016060006101f4818352015b4261010051111561130d57611429565b610100805162093a8081818301106122fc57808201905090508152506101405162093a808082028215828483041417156122fc579050905061018052610180516101205111611367576000610120526000610140526113c3565b6101208051610180518082106122fc5780820390509050815250633b9aca0960e05160a05260805260406080206101005160a0526080526040608020546101a05261014080516101a0518082106122fc57808203905090508152505b633b9aca0860e05160a05260805260406080206101005160a052608052604060802061012051815561014051600182015550426101005111156114195761010051633b9aca0a60e05160a0526080526040608020555b81516001018083528114156112fd575b505061012051815250611437565b565b6101005162093a808082049050905062093a808082028215828483041417156122fc579050905061012052637735940d6101205160a052608052604060802054610140526000610140511161149657600081525061156556611565565b633b9aca0460e05160a05260805260406080205460018082038060801d81607f1d186122fc579050905061016052637735940f6101605160a05260805260406080206101205160a05260805260406080205461018052633b9aca0860e05160a05260805260406080206101205160a0526080526040608020546101a052670de0b6b3a7640000610180518082028215828483041417156122fc57905090506101a0518082028215828483041417156122fc5790509050610140518080156122fc57820490509050815250611565565b565b6102a05160e052611579610300610de8565b610300516102e0526102a05160e052611593610320610eee565b61032051610300526115a66103406110a4565b61034051610320524262093a8081818301106122fc578082019050905062093a808082049050905062093a808082028215828483041417156122fc57905090506103405261032051610300516102c0518082028215828483041417156122fc579050905081818301106122fc5780820190509050610300516102e0518082028215828483041417156122fc57905090508082106122fc57808203905090506103205261032051637735940d6103405160a0526080526040608020556102c051637735940f6102a05160a05260805260406080206103405160a05260805260406080205561034051637735940e556103405160016102a051633b9aca008110156122fc5702637735941001557e170bcdc909b6ac6e12d020fe8942256312cdcd555fb6d712899eba56d2f9016102a0516103605261034051610380526102c0516103a052610320516103c0526080610360a1565b633b9aca046102a05160a05260805260406080205460018082038060801d81607f1d186122fc57905090506102e0526102a05160e05261173a61032061128d565b61032051610300526102e05160e052611754610340610de8565b61034051610320526102e05160e05261176e610360610eee565b61036051610340526117816103806110a4565b61038051610360524262093a8081818301106122fc578082019050905062093a808082049050905062093a808082028215828483041417156122fc5790509050610380526102c051633b9aca086102a05160a05260805260406080206103805160a05260805260406080205561038051633b9aca0a6102a05160a052608052604060802055610340516102c05181818301106122fc5780820190509050610300518082106122fc57808203905090506103a0526103a051633b9aca0b6102e05160a05260805260406080206103805160a0526080526040608020556103805160016102e051633b9aca008110156122fc5702633b9aca0d0155610360516103a051610320518082028215828483041417156122fc579050905081818301106122fc578082019050905061034051610320518082028215828483041417156122fc57905090508082106122fc57808203905090506103605261036051637735940d6103805160a05260805260406080205561038051637735940e557f54c0cf3647e6cdb2fc0a7876e60ba77563fceedf2e06c01c597f8dccb9e6bd726102a0516103c052426103e0526102c05161040052610360516104205260806103c0a1565b637c74a174610320526102a051610340526020610320602461033c6020604038036080396080515afa611979573d600060003e3d6000fd5b601f3d11156122fc5761032051600081126122fc576103005263adc63589610340526102a051610360526020610340602461035c6020604038036080396080515afa6119ca573d600060003e3d6000fd5b601f3d11156122fc576103405161032052600254610340524262093a8081818301106122fc578082019050905062093a808082049050905062093a808082028215828483041417156122fc579050905061036052610360516103205111611aa2576020610380527f596f757220746f6b656e206c6f636b206578706972657320746f6f20736f6f6e6103a0526103805061038051806103a001818260206001820306601f82010390500336823750506308c379a0610340526020610360526103805160206001820306601f820103905060440161035cfd5b60006102e0511015611ab5576000611abf565b6127106102e05111155b611b3a57601e610380527f596f75207573656420616c6c20796f757220766f74696e6720706f77657200006103a0526103805061038051806103a001818260206001820306601f82010390500336823750506308c379a0610340526020610360526103805160206001820306601f820103905060440161035cfd5b633b9aca076102a05160a05260805260406080206102c05160a052608052604060802054620d2f0081818301106122fc5780820190509050421015611bf0576014610380527f43616e6e6f7420766f746520736f206f6674656e0000000000000000000000006103a0526103805061038051806103a001818260206001820306601f82010390500336823750506308c379a0610340526020610360526103805160206001820306601f820103905060440161035cfd5b633b9aca046102c05160a05260805260406080205460018082038060801d81607f1d186122fc5790509050610380526000610380511215611ca257600f6103a0527f4761756765206e6f7420616464656400000000000000000000000000000000006103c0526103a0506103a051806103c001818260206001820306601f82010390500336823750506308c379a0610360526020610380526103a05160206001820306601f820103905060440161037cfd5b633b9aca056102a05160a05260805260406080206102c05160a052608052604060802080546103a05260018101546103c05260028101546103e05250600061040052610360516103e0511115611d0d576103e051610360518082106122fc5780820390509050610400525b6103a051610400518082028215828483041417156122fc579050905061042052610300516102e0518082028215828483041417156122fc579050905061271080820490509050610440526102e05161046052610320516104805261032051610360518082106122fc57808203905090506104a052610440516104a0518082028215828483041417156122fc57905090506104c052633b9aca066102a05160a0526080526040608020546104e0526104e0516104605181818301106122fc57808201905090506103c0518082106122fc57808203905090506104e0526104e051633b9aca066102a05160a05260805260406080205560006104e0511015611e14576000611e1e565b6127106104e05111155b611e99576013610500527f5573656420746f6f206d75636820706f776572000000000000000000000000006105205261050050610500518061052001818260206001820306601f82010390500336823750506308c379a06104c05260206104e0526105005160206001820306601f82010390506044016104dcfd5b6102c05160e052611eab61052061128d565b61052051610500526001633b9aca086102c05160a05260805260406080206103605160a05260805260406080200154610520526103805160e052611ef0610560610eee565b61056051610540526001633b9aca0b6103805160a05260805260406080206103605160a0526080526040608020015461056052610500516104c05181818301106122fc578082019050905061042051808210611f4c5781611f4e565b805b90509050610420518082106122fc5780820390509050633b9aca086102c05160a05260805260406080206103605160a052608052604060802055610540516104c05181818301106122fc578082019050905061042051808210611fb15781611fb3565b805b90509050610420518082106122fc5780820390509050633b9aca0b6103805160a05260805260406080206103605160a052608052604060802055610360516103e0511161207d576001633b9aca086102c05160a05260805260406080206103605160a05260805260406080200180546104405181818301106122fc57808201905090508155506001633b9aca0b6103805160a05260805260406080206103605160a05260805260406080200180546104405181818301106122fc578082019050905081555061214e565b610520516104405181818301106122fc57808201905090506103a0518082106120a657816120a8565b805b905090506103a0518082106122fc57808203905090506001633b9aca086102c05160a05260805260406080206103605160a05260805260406080200155610560516104405181818301106122fc57808201905090506103a05180821061210e5781612110565b805b905090506103a0518082106122fc57808203905090506001633b9aca0b6103805160a05260805260406080206103605160a052608052604060802001555b426103e05111156121ce57633b9aca096102c05160a05260805260406080206103e05160a052608052604060802080546103a0518082106122fc5780820390509050815550633b9aca0c6103805160a05260805260406080206103e05160a052608052604060802080546103a0518082106122fc57808203905090508155505b633b9aca096102c05160a05260805260406080206104805160a052608052604060802080546104405181818301106122fc5780820190509050815550633b9aca0c6103805160a05260805260406080206104805160a052608052604060802080546104405181818301106122fc57808201905090508155506122516105806110a4565b61058050633b9aca056102a05160a05260805260406080206102c05160a05260805260406080206104405181556104605160018201556104805160028201555042633b9aca076102a05160a05260805260406080206102c05160a0526080526040608020557f45ca9a4c8d0119eb329e580d28fe689e484e1be230da8037ade9547d2d25cc9142610580526102a0516105a0526102c0516105c0526102e0516105e0526080610580a1565b600080fd5b6100c26123c3036100c2610180396100c26123c30361012051816101a0015261014051816101c001526101605181610180015280606001610180f35b600080fd000000000000000000000000013d14a7fd6569cc97f84393ab5dc877d7536675000000000000000000000000be0d92a98a7892258b08669479527efb910bcf97
Deployed ByteCode
0x600436101561000d57610de2565b60046000601c37600051346122fc5763fc0c546a811861003c5760206060380360803960805160e052602060e0f35b63dfe05031811861005c5760206040380360803960805160e052602060e0f35b63f851a440811861007c5760206020380360803960805160e052602060e0f35b6361df1bf981186100bf576004358060a01c6122fc5760e052633b9aca0460e05160a0526080526040608020546101005260006101005113610120526020610120f35b633f9095b78118610120576004358060a01c6122fc5760e052633b9aca0460e05160a05260805260406080205461010052600061010051146122fc576101005160018082038060801d81607f1d186122fc5790509050610120526020610120f35b633a04f90081186101365760006102e052610149565b6318dfe921811861041e576044356102e0525b6004358060a01c6122fc576102a0526024358060801d81607f1d186122fc576102c05260206020380360803960805133186122fc5760006102c051121561019157600061019a565b6001546102c051125b156122fc57633b9aca046102a05160a0526080526040608020546122fc57600254610300526103005160018082018060801d81607f1d186122fc57905090506002556102a051600161030051633b9aca008110156122fc5702600401556102c05160018082018060801d81607f1d186122fc5790509050633b9aca046102a05160a0526080526040608020554262093a8081818301106122fc578082019050905062093a808082049050905062093a808082028215828483041417156122fc57905090506103205260006102e0511115610387576102c05160e052610280610360610de8565b61036051610340526102c05160e05261029a610380610eee565b61038051610360526102ad6103a06110a4565b6103a051610380526102e0516103605181818301106122fc5780820190509050633b9aca0b6102c05160a05260805260406080206103205160a0526080526040608020556103205160016102c051633b9aca008110156122fc5702633b9aca0d015561038051610340516102e0518082028215828483041417156122fc579050905081818301106122fc5780820190509050637735940d6103205160a05260805260406080205561032051637735940e556102e051633b9aca086102a05160a05260805260406080206103205160a0526080526040608020555b60016102c051633b9aca008110156122fc5702633b9aca0d01546103c4576103205160016102c051633b9aca008110156122fc5702633b9aca0d01555b61032051633b9aca0a6102a05160a0526080526040608020557ffd55b3191f9c9dd92f4f134dd700e7d76f6a0c836a08687023d6d38f03ebd8776102a051610340526102c051610360526102e051610380526060610340a1005b63c2c4c5c1811861043a576104346102a06110a4565b6102a050005b63615e5237811861047b576004358060a01c6122fc576102a0526102a05160e0526104666102c061128d565b6102c0506104756102c06110a4565b6102c050005b636207d866811861049057426101e0526104a3565b63d3078c9481186104db576024356101e0525b6004358060a01c6122fc576101c0526101c05160e0526101e051610100526104cc610200611439565b61020051610220526020610220f35b6395cfcec381186104f057426102c052610503565b636472eee18118610560576024356102c0525b6004358060a01c6122fc576102a0526102a05160e0526105246102e061128d565b6102e0506105336102e06110a4565b6102e0506102a05160e0526102c051610100526105516102e0611439565b6102e051610300526020610300f35b6326e56d5e811861057657600061044052610589565b6392d0d23281186106ee57602435610440525b60043560040160408135116122fc5780803560200180826103e03750505060206020380360803960805133186122fc57600154610460526103e08060036104605160a0526080526040608020602082510160c060006003818352015b8260c05160200211156105f757610616565b60c05160200285015160c05185015581516001018083528114156105e5575b5050505050506104605160018082018060801d81607f1d186122fc5790509050600155600061044051146106ec57610460516102a052610440516102c05261065c611567565b7f6fbe76157c712f16b5a3c44ed48baa04e3450bc3fab0c020e848aca72bbccc84610480806040808252808301806103e080516020018083828460045afa905050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f8201039050905090508101905060208201915061046051825290509050610480a15b005b63db1ca2608118610738576004358060801d81607f1d186122fc576103e05260206020380360803960805133186122fc576103e0516102a0526024356102c052610736611567565b005b63d4d2646e811861077d576004358060a01c6122fc576104405260206020380360803960805133186122fc57610440516102a0526024356102c05261077b6116f9565b005b632e4e99a18118610885576004358060a01c6122fc57610600526024358060a01c6122fc57610620526044358060a01c6122fc57610640526064358060a01c6122fc57610660526084358060a01c6122fc576106805260a4358060a01c6122fc576106a05260c4358060a01c6122fc576106c05260e4358060a01c6122fc576106e0526000546122fc57600160005561070060006008818352015b6106006107005160088110156122fc5760200201516108365761087c565b336102a0526106006107005160088110156122fc5760200201516102c0526020610700510261010401356102e05261086c611941565b8151600101808352811415610818575b50506000600055005b63d713632881186108bd576004358060a01c6122fc5761060052336102a052610600516102c0526024356102e0526108bb611941565b005b634e791a3a8118610914576004358060a01c6122fc5760e052633b9aca0860e05160a0526080526040608020633b9aca0a60e05160a05260805260406080205460a052608052604060802054610100526020610100f35b6372fdccfa8118610975576004358060801d81607f1d186122fc5760e052637735940f60e05160a0526080526040608020600160e051633b9aca008110156122fc57026377359410015460a052608052604060802054610100526020610100f35b636977ff9281186109a057637735940d637735940e5460a05260805260406080205460e052602060e0f35b636f214a6a8118610a01576004358060801d81607f1d186122fc5760e052633b9aca0b60e05160a0526080526040608020600160e051633b9aca008110156122fc5702633b9aca0d015460a052608052604060802054610100526020610100f35b639fba03a18118610a185760015460e052602060e0f35b63e93841d08118610a2f5760025460e052602060e0f35b63d958a8fc8118610af8576004358060801d81607f1d186122fc5760e052610100806020808252600360e05160a052608052604060802081840180828082602082540160c060006003818352015b8260c0516020021115610a8f57610aae565b60c05185015460c0516020028501528151600101808352811415610a7d575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f82010390509050905090508101905090509050610100f35b63b05391878118610b22576001600435633b9aca008110156122fc57026004015460e052602060e0f35b630f467f988118610b8c576004358060a01c6122fc5760e0526024358060a01c6122fc5761010052633b9aca0560e05160a05260805260406080206101005160a0526080526040608020805461012052600181015461014052600281015461016052506060610120f35b63411e74b58118610bc4576004358060a01c6122fc5760e052633b9aca0660e05160a052608052604060802054610100526020610100f35b637e418fa08118610c1a576004358060a01c6122fc5760e0526024358060a01c6122fc5761010052633b9aca0760e05160a05260805260406080206101005160a052608052604060802054610120526020610120f35b63edba52738118610c6b576004358060a01c6122fc5760e052633b9aca0860e05160a052608052604060802060243560a0526080526040608020805461010052600181015461012052506040610100f35b63a4d7a2508118610ca3576004358060a01c6122fc5760e052633b9aca0a60e05160a052608052604060802054610100526020610100f35b63a9b48c018118610cf9576004358060801d81607f1d186122fc5760e052633b9aca0b60e05160a052608052604060802060243560a0526080526040608020805461010052600181015461012052506040610100f35b635a5491588118610d26576001600435633b9aca008110156122fc5702633b9aca0d015460e052602060e0f35b631142916b8118610d4e57637735940d60043560a05260805260406080205460e052602060e0f35b63513872bd8118610d6857637735940e5460e052602060e0f35b63afd2bb498118610db3576004358060801d81607f1d186122fc5760e052637735940f60e05160a052608052604060802060243560a052608052604060802054610100526020610100f35b6351ce6b598118610de0576001600435633b9aca008110156122fc57026377359410015460e052602060e0f35b505b60006000fd5b600160e051633b9aca008110156122fc5702637735941001546101005260006101005111610e1e576000815250610eec56610eec565b637735940f60e05160a05260805260406080206101005160a0526080526040608020546101205261014060006101f4818352015b42610100511115610e6257610ede565b610100805162093a8081818301106122fc578082019050905081525061012051637735940f60e05160a05260805260406080206101005160a05260805260406080205542610100511115610ece5761010051600160e051633b9aca008110156122fc5702637735941001555b8151600101808352811415610e52575b505061012051815250610eec565b565b600160e051633b9aca008110156122fc5702633b9aca0d01546101005260006101005111610f245760008152506110a2566110a2565b633b9aca0b60e05160a05260805260406080206101005160a05260805260406080208054610120526001810154610140525061016060006101f4818352015b42610100511115610f7357611094565b610100805162093a8081818301106122fc57808201905090508152506101405162093a808082028215828483041417156122fc579050905061018052610180516101205111610fcd57600061012052600061014052611029565b6101208051610180518082106122fc5780820390509050815250633b9aca0c60e05160a05260805260406080206101005160a0526080526040608020546101a05261014080516101a0518082106122fc57808203905090508152505b633b9aca0b60e05160a05260805260406080206101005160a052608052604060802061012051815561014051600182015550426101005111156110845761010051600160e051633b9aca008110156122fc5702633b9aca0d01555b8151600101808352811415610f63575b5050610120518152506110a2565b565b637735940e546101c0526001546101e052426101c05111156110db576101c0805162093a808082106122fc57808203905090508152505b637735940d6101c05160a0526080526040608020546102005261022060006064818352015b6101e05161022051186111125761114e565b6102205160e052611124610240610eee565b610240506102205160e05261113a610240610de8565b610240508151600101808352811415611100575b505061022060006101f4818352015b426101c051111561116d57611282565b6101c0805162093a8081818301106122fc578082019050905081525060006102005261024060006064818352015b6101e05161024051186111ad57611241565b633b9aca0b6102405160a05260805260406080206101c05160a05260805260406080205461026052637735940f6102405160a05260805260406080206101c05160a05260805260406080205461028052610200805161026051610280518082028215828483041417156122fc579050905081818301106122fc5780820190509050815250815160010180835281141561119b575b505061020051637735940d6101c05160a052608052604060802055426101c0511115611272576101c051637735940e555b815160010180835281141561115d575b505061020051815250565b633b9aca0a60e05160a05260805260406080205461010052600061010051116112be57600081525061143756611437565b633b9aca0860e05160a05260805260406080206101005160a05260805260406080208054610120526001810154610140525061016060006101f4818352015b4261010051111561130d57611429565b610100805162093a8081818301106122fc57808201905090508152506101405162093a808082028215828483041417156122fc579050905061018052610180516101205111611367576000610120526000610140526113c3565b6101208051610180518082106122fc5780820390509050815250633b9aca0960e05160a05260805260406080206101005160a0526080526040608020546101a05261014080516101a0518082106122fc57808203905090508152505b633b9aca0860e05160a05260805260406080206101005160a052608052604060802061012051815561014051600182015550426101005111156114195761010051633b9aca0a60e05160a0526080526040608020555b81516001018083528114156112fd575b505061012051815250611437565b565b6101005162093a808082049050905062093a808082028215828483041417156122fc579050905061012052637735940d6101205160a052608052604060802054610140526000610140511161149657600081525061156556611565565b633b9aca0460e05160a05260805260406080205460018082038060801d81607f1d186122fc579050905061016052637735940f6101605160a05260805260406080206101205160a05260805260406080205461018052633b9aca0860e05160a05260805260406080206101205160a0526080526040608020546101a052670de0b6b3a7640000610180518082028215828483041417156122fc57905090506101a0518082028215828483041417156122fc5790509050610140518080156122fc57820490509050815250611565565b565b6102a05160e052611579610300610de8565b610300516102e0526102a05160e052611593610320610eee565b61032051610300526115a66103406110a4565b61034051610320524262093a8081818301106122fc578082019050905062093a808082049050905062093a808082028215828483041417156122fc57905090506103405261032051610300516102c0518082028215828483041417156122fc579050905081818301106122fc5780820190509050610300516102e0518082028215828483041417156122fc57905090508082106122fc57808203905090506103205261032051637735940d6103405160a0526080526040608020556102c051637735940f6102a05160a05260805260406080206103405160a05260805260406080205561034051637735940e556103405160016102a051633b9aca008110156122fc5702637735941001557e170bcdc909b6ac6e12d020fe8942256312cdcd555fb6d712899eba56d2f9016102a0516103605261034051610380526102c0516103a052610320516103c0526080610360a1565b633b9aca046102a05160a05260805260406080205460018082038060801d81607f1d186122fc57905090506102e0526102a05160e05261173a61032061128d565b61032051610300526102e05160e052611754610340610de8565b61034051610320526102e05160e05261176e610360610eee565b61036051610340526117816103806110a4565b61038051610360524262093a8081818301106122fc578082019050905062093a808082049050905062093a808082028215828483041417156122fc5790509050610380526102c051633b9aca086102a05160a05260805260406080206103805160a05260805260406080205561038051633b9aca0a6102a05160a052608052604060802055610340516102c05181818301106122fc5780820190509050610300518082106122fc57808203905090506103a0526103a051633b9aca0b6102e05160a05260805260406080206103805160a0526080526040608020556103805160016102e051633b9aca008110156122fc5702633b9aca0d0155610360516103a051610320518082028215828483041417156122fc579050905081818301106122fc578082019050905061034051610320518082028215828483041417156122fc57905090508082106122fc57808203905090506103605261036051637735940d6103805160a05260805260406080205561038051637735940e557f54c0cf3647e6cdb2fc0a7876e60ba77563fceedf2e06c01c597f8dccb9e6bd726102a0516103c052426103e0526102c05161040052610360516104205260806103c0a1565b637c74a174610320526102a051610340526020610320602461033c6020604038036080396080515afa611979573d600060003e3d6000fd5b601f3d11156122fc5761032051600081126122fc576103005263adc63589610340526102a051610360526020610340602461035c6020604038036080396080515afa6119ca573d600060003e3d6000fd5b601f3d11156122fc576103405161032052600254610340524262093a8081818301106122fc578082019050905062093a808082049050905062093a808082028215828483041417156122fc579050905061036052610360516103205111611aa2576020610380527f596f757220746f6b656e206c6f636b206578706972657320746f6f20736f6f6e6103a0526103805061038051806103a001818260206001820306601f82010390500336823750506308c379a0610340526020610360526103805160206001820306601f820103905060440161035cfd5b60006102e0511015611ab5576000611abf565b6127106102e05111155b611b3a57601e610380527f596f75207573656420616c6c20796f757220766f74696e6720706f77657200006103a0526103805061038051806103a001818260206001820306601f82010390500336823750506308c379a0610340526020610360526103805160206001820306601f820103905060440161035cfd5b633b9aca076102a05160a05260805260406080206102c05160a052608052604060802054620d2f0081818301106122fc5780820190509050421015611bf0576014610380527f43616e6e6f7420766f746520736f206f6674656e0000000000000000000000006103a0526103805061038051806103a001818260206001820306601f82010390500336823750506308c379a0610340526020610360526103805160206001820306601f820103905060440161035cfd5b633b9aca046102c05160a05260805260406080205460018082038060801d81607f1d186122fc5790509050610380526000610380511215611ca257600f6103a0527f4761756765206e6f7420616464656400000000000000000000000000000000006103c0526103a0506103a051806103c001818260206001820306601f82010390500336823750506308c379a0610360526020610380526103a05160206001820306601f820103905060440161037cfd5b633b9aca056102a05160a05260805260406080206102c05160a052608052604060802080546103a05260018101546103c05260028101546103e05250600061040052610360516103e0511115611d0d576103e051610360518082106122fc5780820390509050610400525b6103a051610400518082028215828483041417156122fc579050905061042052610300516102e0518082028215828483041417156122fc579050905061271080820490509050610440526102e05161046052610320516104805261032051610360518082106122fc57808203905090506104a052610440516104a0518082028215828483041417156122fc57905090506104c052633b9aca066102a05160a0526080526040608020546104e0526104e0516104605181818301106122fc57808201905090506103c0518082106122fc57808203905090506104e0526104e051633b9aca066102a05160a05260805260406080205560006104e0511015611e14576000611e1e565b6127106104e05111155b611e99576013610500527f5573656420746f6f206d75636820706f776572000000000000000000000000006105205261050050610500518061052001818260206001820306601f82010390500336823750506308c379a06104c05260206104e0526105005160206001820306601f82010390506044016104dcfd5b6102c05160e052611eab61052061128d565b61052051610500526001633b9aca086102c05160a05260805260406080206103605160a05260805260406080200154610520526103805160e052611ef0610560610eee565b61056051610540526001633b9aca0b6103805160a05260805260406080206103605160a0526080526040608020015461056052610500516104c05181818301106122fc578082019050905061042051808210611f4c5781611f4e565b805b90509050610420518082106122fc5780820390509050633b9aca086102c05160a05260805260406080206103605160a052608052604060802055610540516104c05181818301106122fc578082019050905061042051808210611fb15781611fb3565b805b90509050610420518082106122fc5780820390509050633b9aca0b6103805160a05260805260406080206103605160a052608052604060802055610360516103e0511161207d576001633b9aca086102c05160a05260805260406080206103605160a05260805260406080200180546104405181818301106122fc57808201905090508155506001633b9aca0b6103805160a05260805260406080206103605160a05260805260406080200180546104405181818301106122fc578082019050905081555061214e565b610520516104405181818301106122fc57808201905090506103a0518082106120a657816120a8565b805b905090506103a0518082106122fc57808203905090506001633b9aca086102c05160a05260805260406080206103605160a05260805260406080200155610560516104405181818301106122fc57808201905090506103a05180821061210e5781612110565b805b905090506103a0518082106122fc57808203905090506001633b9aca0b6103805160a05260805260406080206103605160a052608052604060802001555b426103e05111156121ce57633b9aca096102c05160a05260805260406080206103e05160a052608052604060802080546103a0518082106122fc5780820390509050815550633b9aca0c6103805160a05260805260406080206103e05160a052608052604060802080546103a0518082106122fc57808203905090508155505b633b9aca096102c05160a05260805260406080206104805160a052608052604060802080546104405181818301106122fc5780820190509050815550633b9aca0c6103805160a05260805260406080206104805160a052608052604060802080546104405181818301106122fc57808201905090508155506122516105806110a4565b61058050633b9aca056102a05160a05260805260406080206102c05160a05260805260406080206104405181556104605160018201556104805160028201555042633b9aca076102a05160a05260805260406080206102c05160a0526080526040608020557f45ca9a4c8d0119eb329e580d28fe689e484e1be230da8037ade9547d2d25cc9142610580526102a0516105a0526102c0516105c0526102e0516105e0526080610580a1565b600080fd0000000000000000000000008ae7f93479f90ae6ea123d60c683325006c11a92000000000000000000000000013d14a7fd6569cc97f84393ab5dc877d7536675000000000000000000000000be0d92a98a7892258b08669479527efb910bcf97