diff --git a/_development/helpers.py b/_development/helpers.py
index 8af8f9733..ad1447371 100644
--- a/_development/helpers.py
+++ b/_development/helpers.py
@@ -100,8 +100,8 @@ def DBInMemory():
import eos.db
# Output debug info to help us troubleshoot Travis
- print((eos.db.saveddata_engine))
- print((eos.db.gamedata_engine))
+ print(eos.db.saveddata_engine)
+ print(eos.db.gamedata_engine)
helper = {
'config': eos.config,
diff --git a/_development/helpers_fits.py b/_development/helpers_fits.py
index a0506827d..347b0622b 100644
--- a/_development/helpers_fits.py
+++ b/_development/helpers_fits.py
@@ -1,7 +1,6 @@
import pytest
# noinspection PyPackageRequirements
-from _development.helpers import DBInMemory as DB, Gamedata, Saveddata
# noinspection PyShadowingNames
diff --git a/_development/helpers_items.py b/_development/helpers_items.py
index 7ae722e23..d77adb026 100644
--- a/_development/helpers_items.py
+++ b/_development/helpers_items.py
@@ -1,7 +1,6 @@
import pytest
# noinspection PyPackageRequirements
-from _development.helpers import DBInMemory as DB, Gamedata, Saveddata
# noinspection PyShadowingNames
diff --git a/config.py b/config.py
index d10dda270..d65e2d9f7 100644
--- a/config.py
+++ b/config.py
@@ -24,9 +24,9 @@ saveInRoot = False
# Version data
-version = "2.4.0"
+version = "2.5.0"
tag = "Stable"
-expansionName = "YC120.8"
+expansionName = "YC120.10"
expansionVersion = "1.0"
evemonMinVersion = "4081"
@@ -229,20 +229,6 @@ def defLogging():
)
])
- with logging_setup.threadbound():
-
- # Output all stdout (print) messages as warnings
- try:
- sys.stdout = LoggerWriter(pyfalog.warning)
- except:
- pyfalog.critical("Cannot redirect. Continuing without writing stdout to log.")
-
- # Output all stderr (stacktrace) messages as critical
- try:
- sys.stderr = LoggerWriter(pyfalog.critical)
- except:
- pyfalog.critical("Cannot redirect. Continuing without writing stderr to log.")
-
class LoggerWriter(object):
def __init__(self, level):
diff --git a/dist_assets/win/dist.py b/dist_assets/win/dist.py
index a34ed3140..ec6da3928 100644
--- a/dist_assets/win/dist.py
+++ b/dist_assets/win/dist.py
@@ -38,7 +38,7 @@ call([
iscc,
os.path.join(os.getcwd(), "dist_assets", "win", "pyfa-setup.iss"),
"/dMyAppVersion=%s" % (config['version']),
- "/dMyAppExpansion=%s" % (expansion),
+ "/dMyAppExpansion=%s" % expansion,
"/dMyAppDir=%s" % source,
"/dMyOutputDir=%s" % os.path.join(os.getcwd(), "dist"),
"/dMyOutputFile=%s" % fileName]) # stdout=devnull, stderr=devnull
diff --git a/eos/db/gamedata/category.py b/eos/db/gamedata/category.py
index c167cf1df..502f26c22 100644
--- a/eos/db/gamedata/category.py
+++ b/eos/db/gamedata/category.py
@@ -17,8 +17,8 @@
# along with eos. If not, see .
# ===============================================================================
-from sqlalchemy import Column, String, Integer, ForeignKey, Boolean, Table
-from sqlalchemy.orm import relation, mapper, synonym, deferred
+from sqlalchemy import Boolean, Column, Integer, String, Table
+from sqlalchemy.orm import deferred, mapper, synonym
from eos.db import gamedata_meta
from eos.gamedata import Category
diff --git a/eos/db/gamedata/item.py b/eos/db/gamedata/item.py
index fba3e9820..df7508e43 100644
--- a/eos/db/gamedata/item.py
+++ b/eos/db/gamedata/item.py
@@ -17,15 +17,15 @@
# along with eos. If not, see .
# ===============================================================================
-from sqlalchemy import Column, String, Integer, Boolean, ForeignKey, Table, Float
+from sqlalchemy import Boolean, Column, Float, ForeignKey, Integer, String, Table
from sqlalchemy.ext.associationproxy import association_proxy
-from sqlalchemy.orm import relation, mapper, synonym, deferred, backref
+from sqlalchemy.orm import backref, deferred, mapper, relation, synonym
from sqlalchemy.orm.collections import attribute_mapped_collection
-from eos.db.gamedata.effect import typeeffects_table
from eos.db import gamedata_meta
-from eos.gamedata import Attribute, Effect, Group, Item, MetaType, Traits, DynamicItemItem, DynamicItem
-from eos.db.gamedata.dynamicAttributes import dynamicApplicable_table, dynamic_table
+from eos.db.gamedata.dynamicAttributes import dynamicApplicable_table
+from eos.db.gamedata.effect import typeeffects_table
+from eos.gamedata import Attribute, DynamicItem, Effect, Group, Item, MetaType, Traits
items_table = Table("invtypes", gamedata_meta,
Column("typeID", Integer, primary_key=True),
diff --git a/eos/db/gamedata/queries.py b/eos/db/gamedata/queries.py
index 90e757788..a026704cb 100644
--- a/eos/db/gamedata/queries.py
+++ b/eos/db/gamedata/queries.py
@@ -17,16 +17,16 @@
# along with eos. If not, see .
# ===============================================================================
-from sqlalchemy.orm import join, exc, aliased, joinedload, subqueryload
-from sqlalchemy.sql import and_, or_, select
from sqlalchemy.inspection import inspect
+from sqlalchemy.orm import aliased, exc, join
+from sqlalchemy.sql import and_, or_, select
import eos.config
from eos.db import gamedata_session
-from eos.db.gamedata.metaGroup import metatypes_table, items_table
from eos.db.gamedata.group import groups_table
+from eos.db.gamedata.metaGroup import items_table, metatypes_table
from eos.db.util import processEager, processWhere
-from eos.gamedata import AlphaClone, Attribute, Category, Group, Item, MarketGroup, MetaGroup, AttributeInfo, MetaData, DynamicItem
+from eos.gamedata import AlphaClone, Attribute, AttributeInfo, Category, DynamicItem, Group, Item, MarketGroup, MetaData, MetaGroup
cache = {}
configVal = getattr(eos.config, "gamedataCache", None)
@@ -396,6 +396,21 @@ def getAbyssalTypes():
return set([r.resultingTypeID for r in gamedata_session.query(DynamicItem.resultingTypeID).distinct()])
+@cachedQuery(1, "itemID")
+def getDynamicItem(itemID, eager=None):
+ try:
+ if isinstance(itemID, int):
+ if eager is None:
+ result = gamedata_session.query(DynamicItem).filter(DynamicItem.ID == itemID).one()
+ else:
+ result = gamedata_session.query(DynamicItem).options(*processEager(eager)).filter(DynamicItem.ID == itemID).one()
+ else:
+ raise TypeError("Need integer as argument")
+ except exc.NoResultFound:
+ result = None
+ return result
+
+
def getRequiredFor(itemID, attrMapping):
Attribute1 = aliased(Attribute)
Attribute2 = aliased(Attribute)
diff --git a/eos/db/saveddata/fit.py b/eos/db/saveddata/fit.py
index 0ae4509e2..dbee2c622 100644
--- a/eos/db/saveddata/fit.py
+++ b/eos/db/saveddata/fit.py
@@ -17,33 +17,32 @@
# along with eos. If not, see .
# ===============================================================================
-from sqlalchemy.ext.associationproxy import association_proxy
-from sqlalchemy.orm.collections import attribute_mapped_collection
-from sqlalchemy.sql import and_
-from sqlalchemy.orm import relation, reconstructor, mapper, relationship
-from sqlalchemy import ForeignKey, Column, Integer, String, Table, Boolean, DateTime
import datetime
-from eos.db import saveddata_meta
-from eos.db import saveddata_session
+from sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer, String, Table
+from sqlalchemy.ext.associationproxy import association_proxy
+from sqlalchemy.orm import mapper, reconstructor, relation, relationship
+from sqlalchemy.orm.collections import attribute_mapped_collection
+from sqlalchemy.sql import and_
+
+from eos.db import saveddata_meta, saveddata_session
from eos.db.saveddata.cargo import cargo_table
from eos.db.saveddata.drone import drones_table
from eos.db.saveddata.fighter import fighters_table
from eos.db.saveddata.implant import fitImplants_table
from eos.db.saveddata.module import modules_table
-from eos.effectHandlerHelpers import HandledModuleList, HandledImplantBoosterList, HandledProjectedModList, \
- HandledDroneCargoList, HandledProjectedDroneList
-from eos.saveddata.implant import Implant
-from eos.saveddata.character import Character
-from eos.saveddata.user import User
-from eos.saveddata.fighter import Fighter
-from eos.saveddata.fit import Fit as es_Fit, ImplantLocation
-from eos.saveddata.drone import Drone
+from eos.effectHandlerHelpers import HandledDroneCargoList, HandledImplantBoosterList, HandledModuleList, HandledProjectedDroneList, HandledProjectedModList
from eos.saveddata.booster import Booster
-from eos.saveddata.module import Module
from eos.saveddata.cargo import Cargo
+from eos.saveddata.character import Character
from eos.saveddata.damagePattern import DamagePattern
+from eos.saveddata.drone import Drone
+from eos.saveddata.fighter import Fighter
+from eos.saveddata.fit import Fit as es_Fit
+from eos.saveddata.implant import Implant
+from eos.saveddata.module import Module
from eos.saveddata.targetResists import TargetResists
+from eos.saveddata.user import User
fits_table = Table("fits", saveddata_meta,
Column("ID", Integer, primary_key=True),
@@ -132,13 +131,13 @@ class CommandFit(object):
)
-es_Fit._Fit__projectedFits = association_proxy(
+es_Fit.projectedFitDict = association_proxy(
"victimOf", # look at the victimOf association...
"source_fit", # .. and return the source fits
creator=lambda sourceID, source_fit: ProjectedFit(sourceID, source_fit)
)
-es_Fit._Fit__commandFits = association_proxy(
+es_Fit.commandFitDict = association_proxy(
"boostedOf", # look at the boostedOf association...
"booster_fit", # .. and return the booster fit
creator=lambda boosterID, booster_fit: CommandFit(boosterID, booster_fit)
diff --git a/eos/db/saveddata/mutator.py b/eos/db/saveddata/mutator.py
index 11b595025..1ba81e097 100644
--- a/eos/db/saveddata/mutator.py
+++ b/eos/db/saveddata/mutator.py
@@ -17,10 +17,11 @@
# along with eos. If not, see .
# ===============================================================================
-from sqlalchemy import Table, Column, Integer, ForeignKey, Boolean, DateTime, Float
-from sqlalchemy.orm import mapper
import datetime
+from sqlalchemy import Column, DateTime, Float, ForeignKey, Integer, Table
+from sqlalchemy.orm import mapper
+
from eos.db import saveddata_meta
from eos.saveddata.mutator import Mutator
diff --git a/eos/effectHandlerHelpers.py b/eos/effectHandlerHelpers.py
index f890ae0ed..3e9350b66 100644
--- a/eos/effectHandlerHelpers.py
+++ b/eos/effectHandlerHelpers.py
@@ -18,6 +18,7 @@
# ===============================================================================
from logbook import Logger
+from utils.deprecated import deprecated
pyfalog = Logger(__name__)
@@ -113,6 +114,7 @@ class HandledList(list):
class HandledModuleList(HandledList):
+
def append(self, mod):
emptyPosition = float("Inf")
for i in range(len(self)):
@@ -130,6 +132,9 @@ class HandledModuleList(HandledList):
self.remove(mod)
return
+ self.appendIgnoreEmpty(mod)
+
+ def appendIgnoreEmpty(self, mod):
mod.position = len(self)
HandledList.append(self, mod)
if mod.isInvalid:
@@ -163,6 +168,7 @@ class HandledModuleList(HandledList):
mod.position = index
self[index] = mod
+ @deprecated
def freeSlot(self, slot):
for i in range(len(self)):
mod = self[i]
@@ -195,14 +201,20 @@ class HandledImplantBoosterList(HandledList):
self.remove(thing)
return
+ self.makeRoom(thing)
+ HandledList.append(self, thing)
+
+ def makeRoom(self, thing):
# if needed, remove booster that was occupying slot
oldObj = next((m for m in self if m.slot == thing.slot), None)
if oldObj:
- pyfalog.info("Slot {0} occupied with {1}, replacing with {2}", thing.slot, oldObj.item.name, thing.item.name)
+ pyfalog.info("Slot {0} occupied with {1}, replacing with {2}", thing.slot, oldObj.item.name,
+ thing.item.name)
+ itemID = oldObj.itemID
oldObj.itemID = 0 # hack to remove from DB. See GH issue #324
self.remove(oldObj)
-
- HandledList.append(self, thing)
+ return itemID
+ return None
class HandledSsoCharacterList(list):
@@ -228,12 +240,7 @@ class HandledProjectedModList(HandledList):
isSystemEffect = proj.item.group.name == "Effect Beacon"
if isSystemEffect:
- # remove other system effects - only 1 per fit plz
- oldEffect = next((m for m in self if m.item.group.name == "Effect Beacon"), None)
-
- if oldEffect:
- pyfalog.info("System effect occupied with {0}, replacing with {1}", oldEffect.item.name, proj.item.name)
- self.remove(oldEffect)
+ self.makeRoom(proj)
HandledList.append(self, proj)
@@ -241,6 +248,16 @@ class HandledProjectedModList(HandledList):
if not proj.item.isType("projected") and not isSystemEffect:
self.remove(proj)
+ def makeRoom(self, proj):
+ # remove other system effects - only 1 per fit plz
+ oldEffect = next((m for m in self if m.item.group.name == "Effect Beacon"), None)
+
+ if oldEffect:
+ pyfalog.info("System effect occupied with {0}, replacing with {1}", oldEffect.item.name, proj.item.name)
+ self.remove(oldEffect)
+ return oldEffect.itemID
+ return None
+
class HandledProjectedDroneList(HandledDroneCargoList):
def append(self, proj):
diff --git a/eos/effects/elitebonuscovertops3pctdamagepercycle.py b/eos/effects/elitebonuscovertops3pctdamagepercycle.py
new file mode 100644
index 000000000..80083c966
--- /dev/null
+++ b/eos/effects/elitebonuscovertops3pctdamagepercycle.py
@@ -0,0 +1,6 @@
+type = "passive"
+
+
+def handler(fit, src, context):
+ fit.modules.filteredItemIncrease(lambda mod: mod.item.requiresSkill("Small Precursor Weapon"), "damageMultiplierBonusPerCycle",
+ src.getModifiedItemAttr("eliteBonusCovertOps3"), skill="Covert Ops")
diff --git a/eos/effects/elitebonusreconship3pctdamagepercycle.py b/eos/effects/elitebonusreconship3pctdamagepercycle.py
new file mode 100644
index 000000000..96fab9026
--- /dev/null
+++ b/eos/effects/elitebonusreconship3pctdamagepercycle.py
@@ -0,0 +1,6 @@
+type = "passive"
+
+
+def handler(fit, src, context):
+ fit.modules.filteredItemIncrease(lambda mod: mod.item.requiresSkill("Medium Precursor Weapon"), "damageMultiplierBonusPerCycle",
+ src.getModifiedItemAttr("eliteBonusReconShip3"), skill="Recon Ships")
diff --git a/eos/effects/emergencyhullenergizer.py b/eos/effects/emergencyhullenergizer.py
new file mode 100644
index 000000000..122ef6e46
--- /dev/null
+++ b/eos/effects/emergencyhullenergizer.py
@@ -0,0 +1,7 @@
+type = "active"
+runtime = "late"
+
+
+def handler(fit, src, context):
+ for dmgType in ('em', 'thermal', 'kinetic', 'explosive'):
+ fit.ship.forceItemAttr('{}DamageResonance'.format(dmgType), src.getModifiedItemAttr("hull{}DamageResonance".format(dmgType.title())))
diff --git a/eos/effects/massentanglereffect5.py b/eos/effects/massentanglereffect5.py
new file mode 100644
index 000000000..8ec34a55d
--- /dev/null
+++ b/eos/effects/massentanglereffect5.py
@@ -0,0 +1,13 @@
+type = "active"
+
+
+def handler(fit, src, context):
+ fit.ship.increaseItemAttr("warpScrambleStatus", src.getModifiedItemAttr("warpScrambleStrength"))
+ fit.ship.boostItemAttr("mass", src.getModifiedItemAttr("massBonusPercentage"), stackingPenalties=True)
+ fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Afterburner"), "speedFactor",
+ src.getModifiedItemAttr("speedFactorBonus"), stackingPenalties=True)
+ fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Afterburner"), "speedBoostFactor",
+ src.getModifiedItemAttr("speedBoostFactorBonus"))
+ fit.modules.filteredItemIncrease(lambda mod: mod.item.requiresSkill("High Speed Maneuvering"), "activationBlocked",
+ src.getModifiedItemAttr("activationBlockedStrenght"))
+ fit.ship.boostItemAttr("maxVelocity", src.getModifiedItemAttr("maxVelocityBonus"), stackingPenalties=True)
diff --git a/eos/effects/modulebonuswarfarelinkarmor.py b/eos/effects/modulebonuswarfarelinkarmor.py
index be5843988..c7cf29ce3 100644
--- a/eos/effects/modulebonuswarfarelinkarmor.py
+++ b/eos/effects/modulebonuswarfarelinkarmor.py
@@ -3,14 +3,14 @@
# Used by:
# Variations of module: Armor Command Burst I (2 of 2)
-'''
+"""
Some documentation:
When the fit is calculated, we gather up all the gang effects and stick them onto the fit. We don't run the actual
effect yet, only give the fit details so that it can run the effect at a later time. We need to do this so that we can
only run the strongest effect. When we are done, one of the last things that we do with the fit is to loop through those
bonuses and actually run the effect. To do this, we have a special argument passed into the effect handler that tells it
which warfareBuffID to run (shouldn't need this right now, but better safe than sorry)
-'''
+"""
type = "active", "gang"
diff --git a/eos/effects/rolebonuswarpspeed.py b/eos/effects/rolebonuswarpspeed.py
new file mode 100644
index 000000000..1b295565f
--- /dev/null
+++ b/eos/effects/rolebonuswarpspeed.py
@@ -0,0 +1,5 @@
+type = "passive"
+
+
+def handler(fit, src, context):
+ fit.ship.boostItemAttr("warpSpeedMultiplier", src.getModifiedItemAttr("shipRoleBonusWarpSpeed"))
diff --git a/eos/gamedata.py b/eos/gamedata.py
index 7c7f85b8f..9c14f23ac 100644
--- a/eos/gamedata.py
+++ b/eos/gamedata.py
@@ -166,14 +166,14 @@ class Effect(EqBase):
t = t if isinstance(t, tuple) or t is None else (t,)
self.__type = t
- except (ImportError) as e:
+ except ImportError as e:
# Effect probably doesn't exist, so create a dummy effect and flag it with a warning.
self.__handler = effectDummy
self.__runTime = "normal"
self.__activeByDefault = True
self.__type = None
pyfalog.debug("ImportError generating handler: {0}", e)
- except (AttributeError) as e:
+ except AttributeError as e:
# Effect probably exists but there is an issue with it. Turn it into a dummy effect so we can continue, but flag it with an error.
self.__handler = effectDummy
self.__runTime = "normal"
@@ -476,6 +476,10 @@ class Item(EqBase):
def getAbyssalYypes(cls):
cls.ABYSSAL_TYPES = eos.db.getAbyssalTypes()
+ @property
+ def isCharge(self):
+ return self.category.name == "Charge"
+
def __repr__(self):
return "Item(ID={}, name={}) at {}".format(
self.ID, self.name, hex(id(self))
@@ -626,8 +630,8 @@ class Unit(EqBase):
def attributeIDCallback(v):
v = int(v)
if not v: # some attributes come through with a value of 0? See #1387
- return "%d" % (v)
- attribute = eos.db.getAttributeInfo(v, eager=("unit"))
+ return "%d" % v
+ attribute = eos.db.getAttributeInfo(v, eager="unit")
return "%s (%d)" % (attribute.name.capitalize(), v)
def TranslateValue(self, value):
diff --git a/eos/modifiedAttributeDict.py b/eos/modifiedAttributeDict.py
index 06d348b81..d660dd38b 100644
--- a/eos/modifiedAttributeDict.py
+++ b/eos/modifiedAttributeDict.py
@@ -34,10 +34,10 @@ class ItemAttrShortcut(object):
return return_value or default
def getBaseAttrValue(self, key, default=0):
- '''
+ """
Gets base value in this order:
Mutated value > override value > attribute value
- '''
+ """
return_value = self.itemModifiedAttributes.getOriginal(key)
return return_value or default
@@ -382,7 +382,7 @@ class ModifiedAttributeDict(collections.MutableMapping):
if resist:
afflictPenal += "r"
- self.__afflict(attributeName, "%s*" % (afflictPenal), multiplier, multiplier != 1)
+ self.__afflict(attributeName, "%s*" % afflictPenal, multiplier, multiplier != 1)
def boost(self, attributeName, boostFactor, skill=None, *args, **kwargs):
"""Boost value by some percentage"""
diff --git a/eos/saveddata/fighter.py b/eos/saveddata/fighter.py
index 694970343..8c515b945 100644
--- a/eos/saveddata/fighter.py
+++ b/eos/saveddata/fighter.py
@@ -53,6 +53,20 @@ class Fighter(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
self.build()
+ standardAttackActive = False
+ for ability in self.abilities:
+ if ability.effect.isImplemented and ability.effect.handlerName == 'fighterabilityattackm':
+ # Activate "standard attack" if available
+ ability.active = True
+ standardAttackActive = True
+ else:
+ # Activate all other abilities (Neut, Web, etc) except propmods if no standard attack is active
+ if ability.effect.isImplemented and \
+ standardAttackActive is False and \
+ ability.effect.handlerName != 'fighterabilitymicrowarpdrive' and \
+ ability.effect.handlerName != 'fighterabilityevasivemaneuvers':
+ ability.active = True
+
@reconstructor
def init(self):
"""Initialize a fighter from the database and validate"""
diff --git a/eos/saveddata/fit.py b/eos/saveddata/fit.py
index dc183d3c0..e00b522fd 100644
--- a/eos/saveddata/fit.py
+++ b/eos/saveddata/fit.py
@@ -35,7 +35,6 @@ from eos.saveddata.character import Character
from eos.saveddata.citadel import Citadel
from eos.saveddata.module import Module, State, Slot, Hardpoint
from logbook import Logger
-
pyfalog = Logger(__name__)
@@ -258,11 +257,11 @@ class Fit(object):
def projectedFits(self):
# only in extreme edge cases will the fit be invalid, but to be sure do
# not return them.
- return [fit for fit in list(self.__projectedFits.values()) if not fit.isInvalid]
+ return [fit for fit in list(self.projectedFitDict.values()) if not fit.isInvalid]
@property
def commandFits(self):
- return [fit for fit in list(self.__commandFits.values()) if not fit.isInvalid]
+ return [fit for fit in list(self.commandFitDict.values()) if not fit.isInvalid]
def getProjectionInfo(self, fitID):
return self.projectedOnto.get(fitID, None)
@@ -911,6 +910,9 @@ class Fit(object):
Fill this fit's module slots with enough dummy slots so that all slots are used.
This is mostly for making the life of gui's easier.
GUI's can call fill() and then stop caring about empty slots completely.
+
+ todo: want to get rid of using this from the gui/commands, and instead make it a more built-in feature within
+ recalc. Figure out a way to keep track of any changes to slot layout and call this automatically
"""
if self.ship is None:
return
@@ -1603,7 +1605,7 @@ class Fit(object):
eos.db.saveddata_session.refresh(fit)
for fit in self.commandFits:
- copy_ship.__commandFits[fit.ID] = fit
+ copy_ship.commandFitDict[fit.ID] = fit
forceUpdateSavedata(fit)
copyCommandInfo = fit.getCommandInfo(copy_ship.ID)
originalCommandInfo = fit.getCommandInfo(self.ID)
@@ -1611,7 +1613,7 @@ class Fit(object):
forceUpdateSavedata(fit)
for fit in self.projectedFits:
- copy_ship.__projectedFits[fit.ID] = fit
+ copy_ship.projectedFitDict[fit.ID] = fit
forceUpdateSavedata(fit)
copyProjectionInfo = fit.getProjectionInfo(copy_ship.ID)
originalProjectionInfo = fit.getProjectionInfo(self.ID)
diff --git a/eos/saveddata/module.py b/eos/saveddata/module.py
index d95afc5c6..57aacf101 100644
--- a/eos/saveddata/module.py
+++ b/eos/saveddata/module.py
@@ -17,16 +17,15 @@
# along with eos. If not, see .
# ===============================================================================
-from logbook import Logger
-from copy import deepcopy
-
-from sqlalchemy.orm import validates, reconstructor
from math import floor
+from logbook import Logger
+from sqlalchemy.orm import reconstructor, validates
+
import eos.db
-from eos.effectHandlerHelpers import HandledItem, HandledCharge
+from eos.effectHandlerHelpers import HandledCharge, HandledItem
from eos.enum import Enum
-from eos.modifiedAttributeDict import ModifiedAttributeDict, ItemAttrShortcut, ChargeAttrShortcut
+from eos.modifiedAttributeDict import ChargeAttrShortcut, ItemAttrShortcut, ModifiedAttributeDict
from eos.saveddata.citadel import Citadel
from eos.saveddata.mutator import Mutator
@@ -64,6 +63,30 @@ class Slot(Enum):
FS_HEAVY = 15
+ProjectedMap = {
+ State.OVERHEATED: State.ACTIVE,
+ State.ACTIVE: State.OFFLINE,
+ State.OFFLINE: State.ACTIVE,
+ State.ONLINE: State.ACTIVE # Just in case
+}
+
+
+# Old state : New State
+LocalMap = {
+ State.OVERHEATED: State.ACTIVE,
+ State.ACTIVE: State.ONLINE,
+ State.OFFLINE: State.ONLINE,
+ State.ONLINE: State.ACTIVE
+}
+
+
+# For system effects. They should only ever be online or offline
+ProjectedSystem = {
+ State.OFFLINE: State.ONLINE,
+ State.ONLINE: State.OFFLINE
+}
+
+
class Hardpoint(Enum):
NONE = 0
MISSILE = 1
@@ -626,7 +649,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
for i in range(5):
itemChargeGroup = self.getModifiedItemAttr('chargeGroup' + str(i), None)
if itemChargeGroup is not None:
- g = eos.db.getGroup(int(itemChargeGroup), eager=("items.attributes"))
+ g = eos.db.getGroup(int(itemChargeGroup), eager="items.attributes")
if g is None:
continue
for singleItem in g.items:
@@ -832,6 +855,36 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
else:
return 0
+ @staticmethod
+ def getProposedState(mod, click, proposedState=None):
+ # todo: instead of passing in module, make this a instanced function.
+ pyfalog.debug("Get proposed state for module.")
+ if mod.slot == Slot.SUBSYSTEM or mod.isEmpty:
+ return State.ONLINE
+
+ if mod.slot == Slot.SYSTEM:
+ transitionMap = ProjectedSystem
+ else:
+ transitionMap = ProjectedMap if mod.projected else LocalMap
+
+ currState = mod.state
+
+ if proposedState is not None:
+ state = proposedState
+ elif click == "right":
+ state = State.OVERHEATED
+ elif click == "ctrl":
+ state = State.OFFLINE
+ else:
+ state = transitionMap[currState]
+ if not mod.isValidState(state):
+ state = -1
+
+ if mod.isValidState(state):
+ return state
+ else:
+ return currState
+
def __deepcopy__(self, memo):
item = self.item
if item is None:
diff --git a/eos/saveddata/ship.py b/eos/saveddata/ship.py
index 1e1dd30d6..a7cbc15b7 100644
--- a/eos/saveddata/ship.py
+++ b/eos/saveddata/ship.py
@@ -131,7 +131,7 @@ class Ship(ItemAttrShortcut, HandledItem):
return None
items = []
- g = eos.db.getGroup("Ship Modifiers", eager=("items.attributes"))
+ g = eos.db.getGroup("Ship Modifiers", eager="items.attributes")
for item in g.items:
# Rely on name detection because race is not reliable
if item.name.lower().startswith(self.item.name.lower()):
diff --git a/eve.db b/eve.db
index 9727bd3fb..055aa6091 100644
Binary files a/eve.db and b/eve.db differ
diff --git a/gui/attribute_gauge.py b/gui/attribute_gauge.py
index 1057775f7..27b5c6dbd 100644
--- a/gui/attribute_gauge.py
+++ b/gui/attribute_gauge.py
@@ -1,10 +1,9 @@
-import copy
-import wx
import math
-from gui.utils import color as color_utils
-from gui.utils import draw, anim_effects
-from service.fit import Fit
+import wx
+
+from gui.utils import anim_effects
+
# todo: clean class up. Took from pyfa gauge, has a bunch of extra shit we don't need
diff --git a/gui/bitmap_loader.py b/gui/bitmap_loader.py
index 061e05a0c..e9590e6b8 100644
--- a/gui/bitmap_loader.py
+++ b/gui/bitmap_loader.py
@@ -19,15 +19,14 @@
import io
import os.path
-import zipfile
from collections import OrderedDict
# noinspection PyPackageRequirements
import wx
+from logbook import Logger
import config
-from logbook import Logger
logging = Logger(__name__)
@@ -46,6 +45,8 @@ class BitmapLoader(object):
dont_use_cached_bitmaps = False
max_cached_bitmaps = 500
+ scaling_factor = None
+
@classmethod
def getStaticBitmap(cls, name, parent, location):
static = wx.StaticBitmap(parent)
@@ -55,9 +56,7 @@ class BitmapLoader(object):
@classmethod
def getBitmap(cls, name, location):
if cls.dont_use_cached_bitmaps:
- img = cls.getImage(name, location)
- if img is not None:
- return img.ConvertToBitmap()
+ return cls.loadBitmap(name, location)
path = "%s%s" % (name, location)
@@ -65,11 +64,7 @@ class BitmapLoader(object):
cls.cached_bitmaps.popitem(False)
if path not in cls.cached_bitmaps:
- img = cls.getImage(name, location)
- if img is not None:
- bmp = img.ConvertToBitmap()
- else:
- bmp = None
+ bmp = cls.loadBitmap(name, location)
cls.cached_bitmaps[path] = bmp
else:
bmp = cls.cached_bitmaps[path]
@@ -78,8 +73,35 @@ class BitmapLoader(object):
@classmethod
def getImage(cls, name, location):
- filename = "{0}.png".format(name)
+ return cls.getBitmap(name, location).ConvertToImage()
+ @classmethod
+ def loadBitmap(cls, name, location):
+ if cls.scaling_factor is None:
+ import gui.mainFrame
+ cls.scaling_factor = int(gui.mainFrame.MainFrame.getInstance().GetContentScaleFactor())
+ scale = cls.scaling_factor
+
+ filenameScaled = "{0}@{1}x.png".format(name, scale)
+ img = cls.loadImage(filenameScaled, location)
+
+ if img is None:
+ # can't find the scaled image, fallback to no scaling
+ filename = "{0}.png".format(name)
+ img = cls.loadImage(filename, location)
+ scale = 1
+
+ if img is None:
+ print(("Missing icon file: {0}/{1}".format(location, filename)))
+ return None
+
+ bmp: wx.Bitmap = img.ConvertToBitmap()
+ if scale > 1:
+ bmp.SetSize((int(bmp.GetWidth()/scale), int(bmp.GetHeight()/scale)))
+ return bmp
+
+ @classmethod
+ def loadImage(cls, filename, location):
if cls.archive:
path = os.path.join(location, filename)
if os.sep != "/" and os.sep in path:
@@ -97,4 +119,4 @@ class BitmapLoader(object):
if os.path.exists(path):
return wx.Image(path)
else:
- print(("Missing icon file: {0}".format(path)))
+ return None
diff --git a/gui/builtinAdditionPanes/boosterView.py b/gui/builtinAdditionPanes/boosterView.py
index 8923f83de..11bac08ca 100644
--- a/gui/builtinAdditionPanes/boosterView.py
+++ b/gui/builtinAdditionPanes/boosterView.py
@@ -26,6 +26,7 @@ from gui.builtinViewColumns.state import State
from gui.contextMenu import ContextMenu
from gui.utils.staticHelpers import DragDropHelper
from service.fit import Fit
+import gui.fitCommands as cmd
class BoosterViewDrop(wx.DropTarget):
@@ -134,9 +135,7 @@ class BoosterView(d.Display):
event.Skip()
return
- trigger = sFit.addBooster(fitID, event.itemID)
- if trigger:
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+ if self.mainFrame.command.Submit(cmd.GuiAddBoosterCommand(fitID, event.itemID)):
self.mainFrame.additionsPane.select("Boosters")
event.Skip()
@@ -150,9 +149,7 @@ class BoosterView(d.Display):
def removeBooster(self, booster):
fitID = self.mainFrame.getActiveFit()
- sFit = Fit.getInstance()
- sFit.removeBooster(fitID, self.origional.index(booster))
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+ self.mainFrame.command.Submit(cmd.GuiRemoveBoosterCommand(fitID, self.origional.index(booster)))
def click(self, event):
event.Skip()
@@ -161,9 +158,7 @@ class BoosterView(d.Display):
col = self.getColumn(event.Position)
if col == self.getColIndex(State):
fitID = self.mainFrame.getActiveFit()
- sFit = Fit.getInstance()
- sFit.toggleBooster(fitID, row)
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+ self.mainFrame.command.Submit(cmd.GuiToggleBoosterCommand(fitID, row))
def scheduleMenu(self, event):
event.Skip()
diff --git a/gui/builtinAdditionPanes/cargoView.py b/gui/builtinAdditionPanes/cargoView.py
index a5b94f31b..8eb54875f 100644
--- a/gui/builtinAdditionPanes/cargoView.py
+++ b/gui/builtinAdditionPanes/cargoView.py
@@ -26,6 +26,7 @@ import gui.globalEvents as GE
from gui.utils.staticHelpers import DragDropHelper
from service.fit import Fit
from service.market import Market
+import gui.fitCommands as cmd
class CargoViewDrop(wx.DropTarget):
@@ -80,9 +81,7 @@ class CargoView(d.Display):
if data[0] == "fitting":
self.swapModule(x, y, int(data[1]))
elif data[0] == "market":
- sFit = Fit.getInstance()
- sFit.addCargo(self.mainFrame.getActiveFit(), int(data[1]), 1)
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.mainFrame.getActiveFit()))
+ self.mainFrame.command.Submit(cmd.GuiAddCargoCommand(self.mainFrame.getActiveFit(), int(data[1])))
def startDrag(self, event):
row = event.GetIndex()
@@ -127,18 +126,14 @@ class CargoView(d.Display):
if not result:
return
- if dstRow != -1: # we're swapping with cargo
- if mstate.cmdDown: # if copying, append to cargo
- sFit.addCargo(self.mainFrame.getActiveFit(), module.item.ID if not module.item.isAbyssal else module.baseItemID)
- else: # else, move / swap
- sFit.moveCargoToModule(self.mainFrame.getActiveFit(), module.position, dstRow)
- else: # dragging to blank spot, append
- sFit.addCargo(self.mainFrame.getActiveFit(), module.item.ID if not module.item.isAbyssal else module.baseItemID)
+ cargoPos = dstRow if dstRow > -1 else None
- if not mstate.cmdDown: # if not copying, remove module
- sFit.removeModule(self.mainFrame.getActiveFit(), module.position)
-
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.mainFrame.getActiveFit(), action="moddel", typeID=module.item.ID))
+ self.mainFrame.command.Submit(cmd.GuiModuleToCargoCommand(
+ self.mainFrame.getActiveFit(),
+ module.modPosition,
+ cargoPos,
+ mstate.cmdDown
+ ))
def fitChanged(self, event):
sFit = Fit.getInstance()
diff --git a/gui/builtinAdditionPanes/commandView.py b/gui/builtinAdditionPanes/commandView.py
index 2bfa700c9..ce73e06b8 100644
--- a/gui/builtinAdditionPanes/commandView.py
+++ b/gui/builtinAdditionPanes/commandView.py
@@ -30,6 +30,7 @@ from gui.builtinViewColumns.state import State
from gui.contextMenu import ContextMenu
from gui.utils.staticHelpers import DragDropHelper
from service.fit import Fit
+import gui.fitCommands as cmd
class DummyItem(object):
@@ -100,21 +101,16 @@ class CommandView(d.Display):
keycode = event.GetKeyCode()
if keycode == wx.WXK_DELETE or keycode == wx.WXK_NUMPAD_DELETE:
fitID = self.mainFrame.getActiveFit()
- sFit = Fit.getInstance()
row = self.GetFirstSelected()
if row != -1:
- sFit.removeCommand(fitID, self.get(row))
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+ self.mainFrame.command.Submit(cmd.GuiRemoveCommandCommand(fitID, self.get(row).ID))
def handleDrag(self, type, fitID):
# Those are drags coming from pyfa sources, NOT builtin wx drags
if type == "fit":
activeFit = self.mainFrame.getActiveFit()
if activeFit:
- sFit = Fit.getInstance()
- draggedFit = sFit.getFit(fitID)
- sFit.addCommandFit(activeFit, draggedFit)
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFit))
+ self.mainFrame.command.Submit(cmd.GuiAddCommandCommand(activeFit, fitID))
def startDrag(self, event):
row = event.GetIndex()
@@ -190,9 +186,7 @@ class CommandView(d.Display):
col = self.getColumn(event.Position)
if col == self.getColIndex(State):
fitID = self.mainFrame.getActiveFit()
- sFit = Fit.getInstance()
- sFit.toggleCommandFit(fitID, item)
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+ self.mainFrame.command.Submit(cmd.GuiToggleCommandCommand(fitID, item.ID))
def scheduleMenu(self, event):
event.Skip()
@@ -224,8 +218,6 @@ class CommandView(d.Display):
col = self.getColumn(event.Position)
if col != self.getColIndex(State):
fitID = self.mainFrame.getActiveFit()
- sFit = Fit.getInstance()
thing = self.get(row)
if thing: # thing doesn't exist if it's the dummy value
- sFit.removeCommand(fitID, thing)
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+ self.mainFrame.command.Submit(cmd.GuiRemoveCommandCommand(fitID, thing.ID))
diff --git a/gui/builtinAdditionPanes/droneView.py b/gui/builtinAdditionPanes/droneView.py
index e9b893047..2918c5aa4 100644
--- a/gui/builtinAdditionPanes/droneView.py
+++ b/gui/builtinAdditionPanes/droneView.py
@@ -29,6 +29,7 @@ from gui.contextMenu import ContextMenu
from gui.utils.staticHelpers import DragDropHelper
from service.fit import Fit
from service.market import Market
+import gui.fitCommands as cmd
class DroneViewDrop(wx.DropTarget):
@@ -144,10 +145,12 @@ class DroneView(Display):
data[1] is typeID or index of data we want to manipulate
"""
if data[0] == "drone": # we want to merge drones
- srcRow = int(data[1])
- dstRow, _ = self.HitTest((x, y))
- if srcRow != -1 and dstRow != -1:
- self._merge(srcRow, dstRow)
+ pass
+ # remove merge functionality, if people complain in the next while, can add it back
+ # srcRow = int(data[1])
+ # dstRow, _ = self.HitTest((x, y))
+ # if srcRow != -1 and dstRow != -1:
+ # self._merge(srcRow, dstRow)
elif data[0] == "market":
wx.PostEvent(self.mainFrame, ItemSelected(itemID=int(data[1])))
@@ -213,9 +216,7 @@ class DroneView(Display):
event.Skip()
return
- trigger = sFit.addDrone(fitID, event.itemID)
- if trigger:
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+ if self.mainFrame.command.Submit(cmd.GuiAddDroneCommand(fitID, event.itemID)):
self.mainFrame.additionsPane.select("Drones")
event.Skip()
@@ -230,9 +231,7 @@ class DroneView(Display):
def removeDrone(self, drone):
fitID = self.mainFrame.getActiveFit()
- sFit = Fit.getInstance()
- sFit.removeDrone(fitID, self.original.index(drone))
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+ self.mainFrame.command.Submit(cmd.GuiRemoveDroneCommand(fitID, self.original.index(drone)))
def click(self, event):
event.Skip()
@@ -241,10 +240,8 @@ class DroneView(Display):
col = self.getColumn(event.Position)
if col == self.getColIndex(State):
fitID = self.mainFrame.getActiveFit()
- sFit = Fit.getInstance()
drone = self.drones[row]
- sFit.toggleDrone(fitID, self.original.index(drone))
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+ self.mainFrame.command.Submit(cmd.GuiToggleDroneCommand(fitID, self.original.index(drone)))
def scheduleMenu(self, event):
event.Skip()
diff --git a/gui/builtinAdditionPanes/fighterView.py b/gui/builtinAdditionPanes/fighterView.py
index 3292583fd..bf797ae15 100644
--- a/gui/builtinAdditionPanes/fighterView.py
+++ b/gui/builtinAdditionPanes/fighterView.py
@@ -30,6 +30,7 @@ from gui.contextMenu import ContextMenu
from gui.utils.staticHelpers import DragDropHelper
from service.fit import Fit
from service.market import Market
+import gui.fitCommands as cmd
class FighterViewDrop(wx.DropTarget):
@@ -269,11 +270,9 @@ class FighterDisplay(d.Display):
event.Skip()
def addItem(self, event):
- sFit = Fit.getInstance()
fitID = self.mainFrame.getActiveFit()
- trigger = sFit.addFighter(fitID, event.itemID)
- if trigger:
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+
+ if self.mainFrame.command.Submit(cmd.GuiAddFighterCommand(fitID, event.itemID)):
self.mainFrame.additionsPane.select("Fighters")
event.Skip()
@@ -288,9 +287,7 @@ class FighterDisplay(d.Display):
def removeFighter(self, fighter):
fitID = self.mainFrame.getActiveFit()
- sFit = Fit.getInstance()
- sFit.removeFighter(fitID, self.original.index(fighter))
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+ self.mainFrame.command.Submit(cmd.GuiRemoveFighterCommand(fitID, self.original.index(fighter)))
def click(self, event):
event.Skip()
@@ -299,10 +296,8 @@ class FighterDisplay(d.Display):
col = self.getColumn(event.Position)
if col == self.getColIndex(State):
fitID = self.mainFrame.getActiveFit()
- sFit = Fit.getInstance()
fighter = self.fighters[row]
- sFit.toggleFighter(fitID, self.original.index(fighter))
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+ self.mainFrame.command.Submit(cmd.GuiToggleFighterCommand(fitID, self.original.index(fighter)))
def scheduleMenu(self, event):
event.Skip()
diff --git a/gui/builtinAdditionPanes/implantView.py b/gui/builtinAdditionPanes/implantView.py
index b1d7bbe66..323b7c89b 100644
--- a/gui/builtinAdditionPanes/implantView.py
+++ b/gui/builtinAdditionPanes/implantView.py
@@ -28,6 +28,7 @@ import gui.globalEvents as GE
from eos.saveddata.fit import ImplantLocation
from service.fit import Fit
from service.market import Market
+import gui.fitCommands as cmd
class ImplantView(wx.Panel):
@@ -155,9 +156,7 @@ class ImplantDisplay(d.Display):
event.Skip()
return
- trigger = sFit.addImplant(fitID, event.itemID)
- if trigger:
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+ if self.mainFrame.command.Submit(cmd.GuiAddImplantCommand(fitID, event.itemID)):
self.mainFrame.additionsPane.select("Implants")
event.Skip()
@@ -175,10 +174,7 @@ class ImplantDisplay(d.Display):
def removeImplant(self, implant):
fitID = self.mainFrame.getActiveFit()
- sFit = Fit.getInstance()
-
- sFit.removeImplant(fitID, self.original.index(implant))
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+ self.mainFrame.command.Submit(cmd.GuiRemoveImplantCommand(fitID, self.original.index(implant)))
def click(self, event):
event.Skip()
@@ -192,9 +188,7 @@ class ImplantDisplay(d.Display):
col = self.getColumn(event.Position)
if col == self.getColIndex(State):
fitID = self.mainFrame.getActiveFit()
- sFit = Fit.getInstance()
- sFit.toggleImplant(fitID, row)
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+ self.mainFrame.command.Submit(cmd.GuiToggleImplantCommand(fitID, row))
def scheduleMenu(self, event):
event.Skip()
diff --git a/gui/builtinAdditionPanes/projectedView.py b/gui/builtinAdditionPanes/projectedView.py
index 24ca11f3a..1b941fd83 100644
--- a/gui/builtinAdditionPanes/projectedView.py
+++ b/gui/builtinAdditionPanes/projectedView.py
@@ -32,6 +32,7 @@ from gui.contextMenu import ContextMenu
from gui.utils.staticHelpers import DragDropHelper
from service.fit import Fit
from service.market import Market
+import gui.fitCommands as cmd
pyfalog = Logger(__name__)
@@ -100,21 +101,26 @@ class ProjectedView(d.Display):
data[1] is typeID or index of data we want to manipulate
"""
sFit = Fit.getInstance()
+ fitID = self.mainFrame.getActiveFit()
fit = sFit.getFit(self.mainFrame.getActiveFit())
if data[0] == "projected":
# if source is coming from projected, we are trying to combine drones.
- self.mergeDrones(x, y, int(data[1]))
+ pass
+ # removing merge functionality - if people complain about it, can add it back as a command
+ # self.mergeDrones(x, y, int(data[1]))
elif data[0] == "fitting":
dstRow, _ = self.HitTest((x, y))
# Gather module information to get position
module = fit.modules[int(data[1])]
- sFit.project(fit.ID, module)
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fit.ID))
+ self.mainFrame.command.Submit(cmd.GuiAddProjectedCommand(fitID, module.itemID, 'item'))
+ # sFit.project(fit.ID, module)
+ # wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fit.ID))
elif data[0] == "market":
- sFit = Fit.getInstance()
- sFit.project(fit.ID, int(data[1]))
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fit.ID))
+ # sFit = Fit.getInstance()
+ self.mainFrame.command.Submit(cmd.GuiAddProjectedCommand(fitID, int(data[1]), 'item'))
+ # sFit.project(fit.ID, int(data[1]))
+ # wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fit.ID))
def kbEvent(self, event):
keycode = event.GetKeyCode()
@@ -131,10 +137,7 @@ class ProjectedView(d.Display):
if type == "fit":
activeFit = self.mainFrame.getActiveFit()
if activeFit:
- sFit = Fit.getInstance()
- draggedFit = sFit.getFit(fitID)
- sFit.project(activeFit, draggedFit)
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFit))
+ self.mainFrame.command.Submit(cmd.GuiAddProjectedCommand(activeFit, fitID, 'fit'))
def startDrag(self, event):
row = event.GetIndex()
@@ -185,7 +188,7 @@ class ProjectedView(d.Display):
def fitChanged(self, event):
sFit = Fit.getInstance()
fit = sFit.getFit(event.fitID)
- pyfalog.debug("ProjectedView::fitChanged: {}", repr(fit))
+ # pyfalog.debug("ProjectedView::fitChanged: {}", repr(fit))
self.Parent.Parent.DisablePage(self, not fit or fit.isStructure)
@@ -319,8 +322,6 @@ class ProjectedView(d.Display):
col = self.getColumn(event.Position)
if col != self.getColIndex(State):
fitID = self.mainFrame.getActiveFit()
- sFit = Fit.getInstance()
thing = self.get(row)
if thing: # thing doesn't exist if it's the dummy value
- sFit.removeProjected(fitID, thing)
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+ self.mainFrame.command.Submit(cmd.GuiRemoveProjectedCommand(fitID, thing))
diff --git a/gui/builtinContextMenus/amount.py b/gui/builtinContextMenus/amount.py
index ed23e606a..3a70896f9 100644
--- a/gui/builtinContextMenus/amount.py
+++ b/gui/builtinContextMenus/amount.py
@@ -6,9 +6,11 @@ import gui.globalEvents as GE
import wx
import re
from service.fit import Fit
+from eos.saveddata.drone import Drone
from eos.saveddata.cargo import Cargo as es_Cargo
from eos.saveddata.fighter import Fighter as es_Fighter
from service.settings import ContextMenuSettings
+import gui.fitCommands as cmd
class ChangeAmount(ContextMenu):
@@ -20,7 +22,7 @@ class ChangeAmount(ContextMenu):
if not self.settings.get('amount'):
return False
- return srcContext in ("cargoItem", "projectedFit", "fighterItem", "projectedFighter")
+ return srcContext in ("droneItem", "projectedDrone", "cargoItem", "projectedFit", "fighterItem", "projectedFighter")
def getText(self, itmContext, selection):
return u"Change {0} Quantity".format(itmContext)
@@ -29,7 +31,7 @@ class ChangeAmount(ContextMenu):
thing = selection[0]
mainFrame = gui.mainFrame.MainFrame.getInstance()
fitID = mainFrame.getActiveFit()
-
+ srcContext = fullContext[0]
if isinstance(thing, es_Fit):
value = thing.getProjectionInfo(fitID).amount
else:
@@ -42,14 +44,23 @@ class ChangeAmount(ContextMenu):
return
sFit = Fit.getInstance()
+ fit = sFit.getFit(fitID)
cleanInput = re.sub(r'[^0-9.]', '', dlg.input.GetLineText(0).strip())
if isinstance(thing, es_Cargo):
- sFit.addCargo(fitID, thing.item.ID, int(float(cleanInput)), replace=True)
+ self.mainFrame.command.Submit(cmd.GuiChangeCargoQty(fitID, fit.cargo.index(thing), int(float(cleanInput))))
+ return # no need for post event here
+ elif isinstance(thing, Drone):
+ if srcContext == "droneItem":
+ self.mainFrame.command.Submit(cmd.GuiChangeDroneQty(fitID, fit.drones.index(thing), int(float(cleanInput))))
+ else:
+ self.mainFrame.command.Submit(cmd.GuiChangeProjectedDroneQty(fitID, fit.projectedDrones.index(thing), int(float(cleanInput))))
elif isinstance(thing, es_Fit):
- sFit.changeAmount(fitID, thing, int(float(cleanInput)))
+ self.mainFrame.command.Submit(cmd.GuiChangeProjectedFitQty(fitID, thing.ID, int(float(cleanInput))))
+ return
elif isinstance(thing, es_Fighter):
- sFit.changeActiveFighters(fitID, thing, int(float(cleanInput)))
+ self.mainFrame.command.Submit(cmd.GuiChangeFighterQty(fitID, fit.fighters.index(thing), int(float(cleanInput))))
+ return
wx.PostEvent(mainFrame, GE.FitChanged(fitID=fitID))
diff --git a/gui/builtinContextMenus/boosterSideEffects.py b/gui/builtinContextMenus/boosterSideEffects.py
index a936e9340..d6dbc38c6 100644
--- a/gui/builtinContextMenus/boosterSideEffects.py
+++ b/gui/builtinContextMenus/boosterSideEffects.py
@@ -16,7 +16,7 @@ class BoosterSideEffect(ContextMenu):
# if not self.settings.get('fighterAbilities'):
# return False
- if self.mainFrame.getActiveFit() is None or srcContext not in ("boosterItem"):
+ if self.mainFrame.getActiveFit() is None or srcContext not in "boosterItem":
return False
self.booster = selection[0]
@@ -50,7 +50,7 @@ class BoosterSideEffect(ContextMenu):
if not effect.effect.isImplemented:
continue
menuItem = self.addEffect(rootMenu if msw else sub, effect)
- sub.AppendItem(menuItem)
+ sub.Append(menuItem)
menuItem.Check(effect.active)
return sub
diff --git a/gui/builtinContextMenus/cargo.py b/gui/builtinContextMenus/cargo.py
index 32d6370cf..3bcadfa31 100644
--- a/gui/builtinContextMenus/cargo.py
+++ b/gui/builtinContextMenus/cargo.py
@@ -1,8 +1,7 @@
-from gui.contextMenu import ContextMenu
+import gui.fitCommands as cmd
import gui.mainFrame
-import gui.globalEvents as GE
+from gui.contextMenu import ContextMenu
# noinspection PyPackageRequirements
-import wx
from service.fit import Fit
from service.settings import ContextMenuSettings
@@ -32,13 +31,12 @@ class Cargo(ContextMenu):
return "Add {0} to Cargo".format(itmContext)
def activate(self, fullContext, selection, i):
- sFit = Fit.getInstance()
fitID = self.mainFrame.getActiveFit()
typeID = int(selection[0].ID)
- sFit.addCargo(fitID, typeID)
+
+ self.mainFrame.command.Submit(cmd.GuiAddCargoCommand(fitID, typeID))
self.mainFrame.additionsPane.select("Cargo")
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
Cargo.register()
diff --git a/gui/builtinContextMenus/cargoAmmo.py b/gui/builtinContextMenus/cargoAmmo.py
index 12ebe552f..b92ba8e3a 100644
--- a/gui/builtinContextMenus/cargoAmmo.py
+++ b/gui/builtinContextMenus/cargoAmmo.py
@@ -1,9 +1,7 @@
-from gui.contextMenu import ContextMenu
+import gui.fitCommands as cmd
import gui.mainFrame
-import gui.globalEvents as GE
-import wx
+from gui.contextMenu import ContextMenu
from service.settings import ContextMenuSettings
-from service.fit import Fit
class CargoAmmo(ContextMenu):
@@ -28,13 +26,10 @@ class CargoAmmo(ContextMenu):
return "Add {0} to Cargo (x1000)".format(itmContext)
def activate(self, fullContext, selection, i):
- sFit = Fit.getInstance()
fitID = self.mainFrame.getActiveFit()
-
typeID = int(selection[0].ID)
- sFit.addCargo(fitID, typeID, 1000)
+ self.mainFrame.command.Submit(cmd.GuiAddCargoCommand(fitID, typeID, 1000))
self.mainFrame.additionsPane.select("Cargo")
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
CargoAmmo.register()
diff --git a/gui/builtinContextMenus/commandFits.py b/gui/builtinContextMenus/commandFits.py
index 936dd0cc0..97496bb75 100644
--- a/gui/builtinContextMenus/commandFits.py
+++ b/gui/builtinContextMenus/commandFits.py
@@ -1,11 +1,11 @@
# noinspection PyPackageRequirements
import wx
+import gui.fitCommands as cmd
+import gui.mainFrame
+from gui.contextMenu import ContextMenu
from service.fit import Fit
from service.market import Market
-import gui.mainFrame
-import gui.globalEvents as GE
-from gui.contextMenu import ContextMenu
from service.settings import ContextMenuSettings
@@ -25,7 +25,7 @@ class CommandFits(ContextMenu):
if evt is not None:
ids = getattr(evt, 'typeID')
if not isinstance(ids, set):
- ids = set([ids])
+ ids = {ids}
if evt is None or not ids.isdisjoint(cls.commandTypeIDs):
# we are adding or removing an item that defines a command fit. Need to refresh fit list
@@ -97,11 +97,8 @@ class CommandFits(ContextMenu):
event.Skip()
return
- sFit = Fit.getInstance()
fitID = self.mainFrame.getActiveFit()
-
- sFit.addCommandFit(fitID, fit)
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+ self.mainFrame.command.Submit(cmd.GuiAddCommandCommand(fitID, fit.ID))
CommandFits.populateFits(None)
diff --git a/gui/builtinContextMenus/droneRemoveStack.py b/gui/builtinContextMenus/droneRemoveStack.py
index c7dae1e03..fad83f1e8 100644
--- a/gui/builtinContextMenus/droneRemoveStack.py
+++ b/gui/builtinContextMenus/droneRemoveStack.py
@@ -1,8 +1,7 @@
-from gui.contextMenu import ContextMenu
+import gui.fitCommands as cmd
import gui.mainFrame
+from gui.contextMenu import ContextMenu
# noinspection PyPackageRequirements
-import wx
-import gui.globalEvents as GE
from service.fit import Fit
from service.settings import ContextMenuSettings
@@ -27,9 +26,7 @@ class ItemRemove(ContextMenu):
fit = sFit.getFit(fitID)
idx = fit.drones.index(selection[0])
- sFit.removeDrone(fitID, idx, numDronesToRemove=fit.drones[idx].amount)
-
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+ self.mainFrame.command.Submit(cmd.GuiRemoveDroneCommand(fitID, idx, fit.drones[idx].amount))
ItemRemove.register()
diff --git a/gui/builtinContextMenus/droneSplit.py b/gui/builtinContextMenus/droneSplit.py
index ec52db3f8..462bd7198 100644
--- a/gui/builtinContextMenus/droneSplit.py
+++ b/gui/builtinContextMenus/droneSplit.py
@@ -5,6 +5,7 @@ from service.fit import Fit
# noinspection PyPackageRequirements
import wx
from service.settings import ContextMenuSettings
+import re
class DroneSplit(ContextMenu):
@@ -23,14 +24,93 @@ class DroneSplit(ContextMenu):
def activate(self, fullContext, selection, i):
srcContext = fullContext[0]
- dlg = DroneSpinner(self.mainFrame, selection[0], srcContext)
- dlg.ShowModal()
- dlg.Destroy()
+ drone = selection[0]
+ dlg = DroneStackSplit(self.mainFrame, drone.amount)
+
+ if dlg.ShowModal() == wx.ID_OK:
+
+ if dlg.input.GetLineText(0).strip() == '':
+ return
+
+ sFit = Fit.getInstance()
+ cleanInput = re.sub(r'[^0-9.]', '', dlg.input.GetLineText(0).strip())
+ fitID = self.mainFrame.getActiveFit()
+
+ if srcContext == "droneItem":
+ sFit.splitDroneStack(fitID, drone, int(float(cleanInput)))
+ else:
+ sFit.splitProjectedDroneStack(fitID, drone, int(float(cleanInput)))
+
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+
+ # if isinstance(thing, es_Cargo):
+ # self.mainFrame.command.Submit(
+ # cmd.GuiAddCargoCommand(fitID, thing.item.ID, int(float(cleanInput)), replace=True))
+ # return # no need for post event here
+ # elif isinstance(thing, es_Fit):
+ # sFit.changeAmount(fitID, thing, int(float(cleanInput)))
+ # elif isinstance(thing, es_Fighter):
+ # sFit.changeActiveFighters(fitID, thing, int(float(cleanInput)))
+ #
+ # wx.PostEvent(mainFrame, GE.FitChanged(fitID=fitID))
+ #
+ # dlg = DroneSpinner(self.mainFrame, selection[0], srcContext)
+ # dlg.ShowModal()
+ # dlg.Destroy()
DroneSplit.register()
+class DroneStackSplit(wx.Dialog):
+ def __init__(self, parent, value):
+ wx.Dialog.__init__(self, parent, title="Split Drone Stack")
+ self.SetMinSize((346, 156))
+
+ bSizer1 = wx.BoxSizer(wx.VERTICAL)
+
+ bSizer2 = wx.BoxSizer(wx.VERTICAL)
+ text = wx.StaticText(self, wx.ID_ANY, "New Amount:")
+ bSizer2.Add(text, 0)
+
+ bSizer1.Add(bSizer2, 0, wx.ALL, 10)
+
+ self.input = wx.TextCtrl(self, wx.ID_ANY, style=wx.TE_PROCESS_ENTER)
+ self.input.SetValue(str(value))
+ self.input.SelectAll()
+
+ bSizer1.Add(self.input, 0, wx.LEFT | wx.RIGHT | wx.EXPAND, 15)
+
+ bSizer3 = wx.BoxSizer(wx.VERTICAL)
+ bSizer3.Add(wx.StaticLine(self, wx.ID_ANY), 0, wx.BOTTOM | wx.EXPAND, 15)
+
+ bSizer3.Add(self.CreateStdDialogButtonSizer(wx.OK | wx.CANCEL), 0, wx.EXPAND)
+ bSizer1.Add(bSizer3, 0, wx.ALL | wx.EXPAND, 10)
+
+ self.input.SetFocus()
+ self.input.Bind(wx.EVT_CHAR, self.onChar)
+ self.input.Bind(wx.EVT_TEXT_ENTER, self.processEnter)
+ self.SetSizer(bSizer1)
+ self.CenterOnParent()
+ self.Fit()
+
+ def processEnter(self, evt):
+ self.EndModal(wx.ID_OK)
+
+ # checks to make sure it's valid number
+ @staticmethod
+ def onChar(event):
+ key = event.GetKeyCode()
+
+ acceptable_characters = "1234567890"
+ acceptable_keycode = [3, 22, 13, 8, 127] # modifiers like delete, copy, paste
+ if key in acceptable_keycode or key >= 255 or (key < 255 and chr(key) in acceptable_characters):
+ event.Skip()
+ return
+ else:
+ return False
+
+
class DroneSpinner(wx.Dialog):
def __init__(self, parent, drone, context):
wx.Dialog.__init__(self, parent, title="Select Amount", size=wx.Size(220, 60))
diff --git a/gui/builtinContextMenus/itemRemove.py b/gui/builtinContextMenus/itemRemove.py
index 8e9ede5c6..e5d083471 100644
--- a/gui/builtinContextMenus/itemRemove.py
+++ b/gui/builtinContextMenus/itemRemove.py
@@ -5,6 +5,7 @@ import wx
import gui.globalEvents as GE
from service.fit import Fit
from service.settings import ContextMenuSettings
+import gui.fitCommands as cmd
class ItemRemove(ContextMenu):
@@ -35,26 +36,33 @@ class ItemRemove(ContextMenu):
fit = sFit.getFit(fitID)
if srcContext == "fittingModule":
- for module in selection:
- if module is not None:
- sFit.removeModule(fitID, fit.modules.index(module))
+ modules = [module for module in selection if module is not None]
+ self.mainFrame.command.Submit(cmd.GuiModuleRemoveCommand(fitID, modules))
+ return # the command takes care of the PostEvent
elif srcContext in ("fittingCharge", "projectedCharge"):
- sFit.setAmmo(fitID, None, selection)
+ self.mainFrame.command.Submit(cmd.GuiModuleAddChargeCommand(fitID, None, selection))
+ return
elif srcContext == "droneItem":
- sFit.removeDrone(fitID, fit.drones.index(selection[0]))
+ self.mainFrame.command.Submit(cmd.GuiRemoveDroneCommand(fitID, fit.drones.index(selection[0])))
+ return
elif srcContext == "fighterItem":
- sFit.removeFighter(fitID, fit.fighters.index(selection[0]))
+ self.mainFrame.command.Submit(cmd.GuiRemoveFighterCommand(fitID, fit.fighters.index(selection[0])))
+ return # the command takes care of the PostEvent
elif srcContext == "implantItem":
- sFit.removeImplant(fitID, fit.implants.index(selection[0]))
+ self.mainFrame.command.Submit(cmd.GuiRemoveImplantCommand(fitID, fit.implants.index(selection[0])))
+ return # the command takes care of the PostEvent
elif srcContext == "boosterItem":
- sFit.removeBooster(fitID, fit.boosters.index(selection[0]))
+ self.mainFrame.command.Submit(cmd.GuiRemoveBoosterCommand(fitID, fit.boosters.index(selection[0])))
+ return # the command takes care of the PostEvent
elif srcContext == "cargoItem":
- sFit.removeCargo(fitID, fit.cargo.index(selection[0]))
+ self.mainFrame.command.Submit(cmd.GuiRemoveCargoCommand(fitID, selection[0].itemID))
+ return # the command takes care of the PostEvent
elif srcContext in ("projectedFit", "projectedModule", "projectedDrone", "projectedFighter"):
- sFit.removeProjected(fitID, selection[0])
+ self.mainFrame.command.Submit(cmd.GuiRemoveProjectedCommand(fitID, selection[0]))
+ return # the command takes care of the PostEvent
elif srcContext == "commandFit":
- sFit.removeCommand(fitID, selection[0])
-
+ self.mainFrame.command.Submit(cmd.GuiRemoveCommandCommand(fitID, selection[0].ID))
+ return # the command takes care of the PostEvent
wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
diff --git a/gui/builtinContextMenus/metaSwap.py b/gui/builtinContextMenus/metaSwap.py
index a5f6371e3..2cbbb2221 100644
--- a/gui/builtinContextMenus/metaSwap.py
+++ b/gui/builtinContextMenus/metaSwap.py
@@ -3,18 +3,11 @@
# noinspection PyPackageRequirements
import wx
-from service.fit import Fit
-from service.market import Market
+import gui.fitCommands as cmd
import gui.mainFrame
-import gui.globalEvents as GE
from gui.contextMenu import ContextMenu
+from service.market import Market
from service.settings import ContextMenuSettings
-from eos.saveddata.booster import Booster
-from eos.saveddata.module import Module
-from eos.saveddata.drone import Drone
-from eos.saveddata.fighter import Fighter
-from eos.saveddata.implant import Implant
-from eos.saveddata.cargo import Cargo
class MetaSwap(ContextMenu):
@@ -91,7 +84,7 @@ class MetaSwap(ContextMenu):
# Sort items by metalevel, and group within that metalevel
items = list(self.variations)
- print(context)
+
if "implantItem" in context:
# sort implants based on name
items.sort(key=lambda x: x.name)
@@ -122,79 +115,35 @@ class MetaSwap(ContextMenu):
id = ContextMenu.nextID()
mitem = wx.MenuItem(rootMenu, id, item.name)
bindmenu.Bind(wx.EVT_MENU, self.handleModule, mitem)
- self.moduleLookup[id] = item
+
+ self.moduleLookup[id] = item, context
m.Append(mitem)
return m
def handleModule(self, event):
- item = self.moduleLookup.get(event.Id, None)
+ item, context = self.moduleLookup.get(event.Id, None)
if item is None:
event.Skip()
return
- sFit = Fit.getInstance()
fitID = self.mainFrame.getActiveFit()
- fit = sFit.getFit(fitID)
- for selected_item in self.selection:
- if isinstance(selected_item, Module):
- pos = fit.modules.index(selected_item)
- sFit.changeModule(fitID, pos, item.ID)
+ self.mainFrame.command.Submit(cmd.GuiMetaSwapCommand(fitID, context, item.ID, self.selection))
- elif isinstance(selected_item, Drone):
- drone_count = None
+ # for selected_item in self.selection:
- for idx, drone_stack in enumerate(fit.drones):
- if drone_stack is selected_item:
- drone_count = drone_stack.amount
- sFit.removeDrone(fitID, idx, drone_count, False)
- break
-
- if drone_count:
- sFit.addDrone(fitID, item.ID, drone_count, True)
-
- elif isinstance(selected_item, Fighter):
- fighter_count = None
-
- for idx, fighter_stack in enumerate(fit.fighters):
- # Right now fighters always will have max stack size.
- # Including this for future improvement, so if adjustable
- # fighter stacks get added we're ready for it.
- if fighter_stack is selected_item:
- if fighter_stack.amount > 0:
- fighter_count = fighter_stack.amount
- elif fighter_stack.amount == -1:
- fighter_count = fighter_stack.amountActive
- else:
- fighter_count.amount = 0
-
- sFit.removeFighter(fitID, idx, False)
- break
-
- sFit.addFighter(fitID, item.ID, True)
-
- elif isinstance(selected_item, Booster):
- for idx, booster_stack in enumerate(fit.boosters):
- if booster_stack is selected_item:
- sFit.removeBooster(fitID, idx, False)
- sFit.addBooster(fitID, item.ID, True)
- break
-
- elif isinstance(selected_item, Implant):
- for idx, implant_stack in enumerate(fit.implants):
- if implant_stack is selected_item:
- sFit.removeImplant(fitID, idx, False)
- sFit.addImplant(fitID, item.ID, True)
- break
-
- elif isinstance(selected_item, Cargo):
- for idx, cargo_stack in enumerate(fit.cargo):
- if cargo_stack is selected_item:
- sFit.removeCargo(fitID, idx)
- sFit.addCargo(fitID, item.ID, cargo_stack.amount, True)
- break
-
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+ #
+ # elif isinstance(selected_item, Drone):
+ # drone_count = None
+ #
+ # for idx, drone_stack in enumerate(fit.drones):
+ # if drone_stack is selected_item:
+ # drone_count = drone_stack.amount
+ # sFit.removeDrone(fitID, idx, drone_count, False)
+ # break
+ #
+ # if drone_count:
+ # sFit.addDrone(fitID, item.ID, drone_count, True)
MetaSwap.register()
diff --git a/gui/builtinContextMenus/moduleAmmoPicker.py b/gui/builtinContextMenus/moduleAmmoPicker.py
index 38a498eb0..f4de653b4 100644
--- a/gui/builtinContextMenus/moduleAmmoPicker.py
+++ b/gui/builtinContextMenus/moduleAmmoPicker.py
@@ -3,13 +3,12 @@
# noinspection PyPackageRequirements
import wx
-from service.fit import Fit
-from service.market import Market
-from eos.saveddata.module import Hardpoint
+import gui.fitCommands as cmd
import gui.mainFrame
-import gui.globalEvents as GE
-from gui.contextMenu import ContextMenu
+from eos.saveddata.module import Hardpoint
from gui.bitmap_loader import BitmapLoader
+from gui.contextMenu import ContextMenu
+from service.market import Market
from service.settings import ContextMenuSettings
@@ -228,11 +227,8 @@ class ModuleAmmoPicker(ContextMenu):
event.Skip()
return
- sFit = Fit.getInstance()
fitID = self.mainFrame.getActiveFit()
-
- sFit.setAmmo(fitID, charge.ID if charge is not None else None, self.modules)
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+ self.mainFrame.command.Submit(cmd.GuiModuleAddChargeCommand(fitID, charge.ID if charge is not None else None, self.modules))
ModuleAmmoPicker.register()
diff --git a/gui/builtinContextMenus/moduleGlobalAmmoPicker.py b/gui/builtinContextMenus/moduleGlobalAmmoPicker.py
index 5e516e68f..70a41c351 100644
--- a/gui/builtinContextMenus/moduleGlobalAmmoPicker.py
+++ b/gui/builtinContextMenus/moduleGlobalAmmoPicker.py
@@ -1,11 +1,9 @@
# -*- coding: utf-8 -*-
+import gui.fitCommands as cmd
import gui.mainFrame
-# noinspection PyPackageRequirements
-import wx
-import gui.globalEvents as GE
-from gui.builtinContextMenus.moduleAmmoPicker import ModuleAmmoPicker
from eos.db.saveddata.queries import getFit as db_getFit
-from service.fit import Fit
+# noinspection PyPackageRequirements
+from gui.builtinContextMenus.moduleAmmoPicker import ModuleAmmoPicker
from service.settings import ContextMenuSettings
@@ -28,7 +26,6 @@ class ModuleGlobalAmmoPicker(ModuleAmmoPicker):
event.Skip()
return
- sFit = Fit.getInstance()
fitID = self.mainFrame.getActiveFit()
fit = db_getFit(fitID)
@@ -40,8 +37,7 @@ class ModuleGlobalAmmoPicker(ModuleAmmoPicker):
if mod.itemID == selectedModule.itemID:
allModules.append(mod)
- sFit.setAmmo(fitID, charge.ID if charge is not None else None, allModules)
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+ self.mainFrame.command.Submit(cmd.GuiModuleAddChargeCommand(fitID, charge.ID if charge is not None else None, allModules))
def display(self, srcContext, selection):
if not self.settings.get('moduleGlobalAmmoPicker'):
diff --git a/gui/builtinContextMenus/mutaplasmids.py b/gui/builtinContextMenus/mutaplasmids.py
index 253cdac60..98656b840 100644
--- a/gui/builtinContextMenus/mutaplasmids.py
+++ b/gui/builtinContextMenus/mutaplasmids.py
@@ -18,7 +18,7 @@ class MutaplasmidCM(ContextMenu):
# if not self.settings.get('ammoPattern'):
# return False
- if srcContext not in ("fittingModule") or self.mainFrame.getActiveFit() is None:
+ if srcContext not in "fittingModule" or self.mainFrame.getActiveFit() is None:
return False
mod = selection[0]
diff --git a/gui/builtinContextMenus/project.py b/gui/builtinContextMenus/project.py
index f06c29152..6bbb974b3 100644
--- a/gui/builtinContextMenus/project.py
+++ b/gui/builtinContextMenus/project.py
@@ -1,8 +1,7 @@
-from gui.contextMenu import ContextMenu
+import gui.fitCommands as cmd
import gui.mainFrame
-import gui.globalEvents as GE
+from gui.contextMenu import ContextMenu
# noinspection PyPackageRequirements
-import wx
from service.fit import Fit
from service.settings import ContextMenuSettings
@@ -33,12 +32,13 @@ class Project(ContextMenu):
return "Project {0} onto Fit".format(itmContext)
def activate(self, fullContext, selection, i):
- sFit = Fit.getInstance()
fitID = self.mainFrame.getActiveFit()
- trigger = sFit.project(fitID, selection[0])
- if trigger:
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
- self.mainFrame.additionsPane.select("Projected")
+ self.mainFrame.command.Submit(cmd.GuiAddProjectedCommand(fitID, selection[0].ID, 'item'))
+
+ # trigger = sFit.project(fitID, selection[0])
+ # if trigger:
+ # wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+ # self.mainFrame.additionsPane.select("Projected")
Project.register()
diff --git a/gui/builtinContextMenus/tabbedFits.py b/gui/builtinContextMenus/tabbedFits.py
index c55a90b35..f86562fa6 100644
--- a/gui/builtinContextMenus/tabbedFits.py
+++ b/gui/builtinContextMenus/tabbedFits.py
@@ -3,11 +3,11 @@
# noinspection PyPackageRequirements
import wx
-from service.fit import Fit
+import gui.fitCommands as cmd
import gui.mainFrame
-import gui.globalEvents as GE
-from gui.contextMenu import ContextMenu
from gui.builtinViews.emptyView import BlankPage
+from gui.contextMenu import ContextMenu
+from service.fit import Fit
class TabbedFits(ContextMenu):
@@ -51,17 +51,14 @@ class TabbedFits(ContextMenu):
return m
def handleSelection(self, event):
- sFit = Fit.getInstance()
fitID = self.mainFrame.getActiveFit()
fit = self.fitLookup[event.Id]
if self.context == 'commandView':
- sFit.addCommandFit(fitID, fit)
+ self.mainFrame.command.Submit(cmd.GuiAddCommandCommand(fitID, fit.ID))
elif self.context == 'projected':
- sFit.project(fitID, fit)
-
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+ self.mainFrame.command.Submit(cmd.GuiAddProjectedCommand(fitID, fit.ID, 'fit'))
TabbedFits.register()
diff --git a/gui/builtinContextMenus/tacticalMode.py b/gui/builtinContextMenus/tacticalMode.py
index e09b26940..94bfc1076 100644
--- a/gui/builtinContextMenus/tacticalMode.py
+++ b/gui/builtinContextMenus/tacticalMode.py
@@ -1,9 +1,9 @@
# noinspection PyPackageRequirements
import wx
-from gui.contextMenu import ContextMenu
-import gui.mainFrame
-import gui.globalEvents as GE
+import gui.fitCommands as cmd
+import gui.mainFrame
+from gui.contextMenu import ContextMenu
from service.fit import Fit
from service.settings import ContextMenuSettings
@@ -60,10 +60,8 @@ class TacticalMode(ContextMenu):
event.Skip()
return
- sFit = Fit.getInstance()
fitID = self.mainFrame.getActiveFit()
- sFit.setMode(fitID, self.modeIds[event.Id])
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+ self.mainFrame.command.Submit(cmd.GuiSetModeCommand(fitID, self.modeIds[event.Id]))
TacticalMode.register()
diff --git a/gui/builtinContextMenus/whProjector.py b/gui/builtinContextMenus/whProjector.py
index ac0bd5c1b..c6e083676 100644
--- a/gui/builtinContextMenus/whProjector.py
+++ b/gui/builtinContextMenus/whProjector.py
@@ -1,13 +1,14 @@
-from gui.contextMenu import ContextMenu
-import gui.mainFrame
-import gui.globalEvents as GE
+import re
+from itertools import chain
+
# noinspection PyPackageRequirements
import wx
+
+import gui.fitCommands as cmd
+import gui.mainFrame
+from gui.contextMenu import ContextMenu
from service.market import Market
-from service.fit import Fit
from service.settings import ContextMenuSettings
-from itertools import chain
-import re
class WhProjector(ContextMenu):
@@ -87,10 +88,8 @@ class WhProjector(ContextMenu):
event.Skip()
return
- sFit = Fit.getInstance()
fitID = self.mainFrame.getActiveFit()
- sFit.project(fitID, swObj)
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+ self.mainFrame.command.Submit(cmd.GuiAddProjectedCommand(fitID, swObj.ID, 'item'))
def buildMenu(self, data, local_menu, rootMenu, msw):
for swType in sorted(data):
diff --git a/gui/builtinItemStatsViews/attributeSlider.py b/gui/builtinItemStatsViews/attributeSlider.py
index 69358278c..8de27e347 100644
--- a/gui/builtinItemStatsViews/attributeSlider.py
+++ b/gui/builtinItemStatsViews/attributeSlider.py
@@ -1,9 +1,7 @@
import wx
import wx.lib.newevent
-from gui.attribute_gauge import AttributeGauge
-import eos
-import eos.db
+from gui.attribute_gauge import AttributeGauge
_ValueChanged, EVT_VALUE_CHANGED = wx.lib.newevent.NewEvent()
diff --git a/gui/builtinItemStatsViews/itemMutator.py b/gui/builtinItemStatsViews/itemMutator.py
index 614274e6e..30ba82fd9 100644
--- a/gui/builtinItemStatsViews/itemMutator.py
+++ b/gui/builtinItemStatsViews/itemMutator.py
@@ -1,18 +1,16 @@
# noinspection PyPackageRequirements
-import wx
-
-from service.fit import Fit
-from .attributeSlider import AttributeSlider, EVT_VALUE_CHANGED
-
-import gui.mainFrame
-from gui.contextMenu import ContextMenu
-from .itemAttributes import ItemParams
-from gui.bitmap_loader import BitmapLoader
-import gui.globalEvents as GE
import random
+import wx
from logbook import Logger
+import gui.globalEvents as GE
+import gui.mainFrame
+from gui.bitmap_loader import BitmapLoader
+from service.fit import Fit
+from .attributeSlider import AttributeSlider, EVT_VALUE_CHANGED
+from .itemAttributes import ItemParams
+
pyfalog = Logger(__name__)
diff --git a/gui/builtinMarketBrowser/itemView.py b/gui/builtinMarketBrowser/itemView.py
index 7a26cfed1..82454502a 100644
--- a/gui/builtinMarketBrowser/itemView.py
+++ b/gui/builtinMarketBrowser/itemView.py
@@ -1,16 +1,13 @@
import wx
-
-import config
-import gui.builtinMarketBrowser.pfSearchBox as SBox
-from gui.contextMenu import ContextMenu
-from gui.display import Display
-from service.attribute import Attribute
-from service.fit import Fit
-from gui.utils.staticHelpers import DragDropHelper
-
from logbook import Logger
-from gui.builtinMarketBrowser.events import RECENTLY_USED_MODULES, MAX_RECENTLY_USED_MODULES, ItemSelected
+import gui.builtinMarketBrowser.pfSearchBox as SBox
+from gui.builtinMarketBrowser.events import ItemSelected, MAX_RECENTLY_USED_MODULES, RECENTLY_USED_MODULES
+from gui.contextMenu import ContextMenu
+from gui.display import Display
+from gui.utils.staticHelpers import DragDropHelper
+from service.attribute import Attribute
+from service.fit import Fit
pyfalog = Logger(__name__)
diff --git a/gui/builtinPreferenceViews/pyfaEsiPreferences.py b/gui/builtinPreferenceViews/pyfaEsiPreferences.py
index 7eaf31a4e..39125ed38 100644
--- a/gui/builtinPreferenceViews/pyfaEsiPreferences.py
+++ b/gui/builtinPreferenceViews/pyfaEsiPreferences.py
@@ -1,17 +1,13 @@
# noinspection PyPackageRequirements
import wx
-from gui.preferenceView import PreferenceView
-from gui.bitmap_loader import BitmapLoader
-
import gui.mainFrame
-
+from gui.bitmap_loader import BitmapLoader
+from gui.preferenceView import PreferenceView
from service.settings import EsiSettings
-# noinspection PyPackageRequirements
-from wx.lib.intctrl import IntCtrl
-from service.esi import Esi
+# noinspection PyPackageRequirements
class PFEsiPref(PreferenceView):
diff --git a/gui/builtinPreferenceViews/pyfaGaugePreferences.py b/gui/builtinPreferenceViews/pyfaGaugePreferences.py
index c0ca68a98..7ba91eff3 100644
--- a/gui/builtinPreferenceViews/pyfaGaugePreferences.py
+++ b/gui/builtinPreferenceViews/pyfaGaugePreferences.py
@@ -3,12 +3,9 @@
# noinspection PyPackageRequirements
import wx
-import copy
-from gui.preferenceView import PreferenceView
from gui.bitmap_loader import BitmapLoader
-from gui.utils.color import CalculateTransition
-import gui.utils.draw as drawUtils
+from gui.preferenceView import PreferenceView
###########################################################################
diff --git a/gui/builtinShipBrowser/fitItem.py b/gui/builtinShipBrowser/fitItem.py
index 2f05229d0..c0bd9c07b 100644
--- a/gui/builtinShipBrowser/fitItem.py
+++ b/gui/builtinShipBrowser/fitItem.py
@@ -2,21 +2,21 @@
import re
import time
-import config
import wx
from logbook import Logger
+import config
import gui.builtinShipBrowser.sfBrowserItem as SFItem
-import gui.globalEvents as GE
+import gui.fitCommands as cmd
import gui.mainFrame
import gui.utils.color as colorUtils
import gui.utils.draw as drawUtils
import gui.utils.fonts as fonts
-from .events import ImportSelected, SearchSelected, FitSelected, BoosterListUpdated, Stage3Selected, FitRenamed, FitRemoved
from gui.bitmap_loader import BitmapLoader
from gui.builtinShipBrowser.pfBitmapFrame import PFBitmapFrame
from service.fit import Fit
+from .events import BoosterListUpdated, FitRemoved, FitSelected, ImportSelected, SearchSelected, Stage3Selected
pyfalog = Logger(__name__)
@@ -183,18 +183,14 @@ class FitItem(SFItem.SFBrowserItem):
if activeFit:
sFit = Fit.getInstance()
projectedFit = sFit.getFit(self.fitID)
- sFit.project(activeFit, projectedFit)
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFit))
- self.mainFrame.additionsPane.select("Projected")
+ if self.mainFrame.command.Submit(cmd.GuiAddProjectedCommand(activeFit, projectedFit.ID, 'fit')):
+ self.mainFrame.additionsPane.select("Projected")
def OnAddCommandFit(self, event):
activeFit = self.mainFrame.getActiveFit()
if activeFit:
- sFit = Fit.getInstance()
- commandFit = sFit.getFit(self.fitID)
- sFit.addCommandFit(activeFit, commandFit)
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFit))
- self.mainFrame.additionsPane.select("Command")
+ if self.mainFrame.command.Submit(cmd.GuiAddCommandCommand(activeFit, self.fitID)):
+ self.mainFrame.additionsPane.select("Command")
def OnMouseCaptureLost(self, event):
""" Destroy drag information (GH issue #479)"""
@@ -325,14 +321,12 @@ class FitItem(SFItem.SFBrowserItem):
self.Refresh()
def renameFit(self, event=None):
- sFit = Fit.getInstance()
self.tcFitName.Show(False)
self.editWasShown = 0
fitName = self.tcFitName.GetValue()
if fitName:
self.fitName = fitName
- sFit.renameFit(self.fitID, self.fitName)
- wx.PostEvent(self.mainFrame, FitRenamed(fitID=self.fitID))
+ self.mainFrame.command.Submit(cmd.GuiFitRenameCommand(self.fitID, self.fitName))
else:
self.tcFitName.SetValue(self.fitName)
diff --git a/gui/builtinShipBrowser/shipItem.py b/gui/builtinShipBrowser/shipItem.py
index 517648ad6..cf1de024c 100644
--- a/gui/builtinShipBrowser/shipItem.py
+++ b/gui/builtinShipBrowser/shipItem.py
@@ -8,11 +8,11 @@ import gui.mainFrame
import gui.utils.color as colorUtils
import gui.utils.draw as drawUtils
import gui.utils.fonts as fonts
-from .events import Stage3Selected, Stage2Selected, Stage1Selected, FitSelected
from gui.bitmap_loader import BitmapLoader
from gui.contextMenu import ContextMenu
from service.fit import Fit
from service.market import Market
+from .events import FitSelected, Stage3Selected
pyfalog = Logger(__name__)
diff --git a/gui/builtinStatsViews/priceViewFull.py b/gui/builtinStatsViews/priceViewFull.py
index 9eb03ea22..767ad958f 100644
--- a/gui/builtinStatsViews/priceViewFull.py
+++ b/gui/builtinStatsViews/priceViewFull.py
@@ -129,15 +129,15 @@ class PriceViewFull(StatsView):
total_price = 0
- if (self.settings.get("ship")):
+ if self.settings.get("ship"):
total_price += ship_price
- if (self.settings.get("modules")):
+ if self.settings.get("modules"):
total_price += module_price
- if (self.settings.get("drones")):
+ if self.settings.get("drones"):
total_price += drone_price + fighter_price
- if (self.settings.get("cargo")):
+ if self.settings.get("cargo"):
total_price += cargo_price
- if (self.settings.get("character")):
+ if self.settings.get("character"):
total_price += booster_price + implant_price
self.labelPriceShip.SetLabel("%s ISK" % formatAmount(ship_price, 3, 3, 9, currency=True))
diff --git a/gui/builtinStatsViews/priceViewMinimal.py b/gui/builtinStatsViews/priceViewMinimal.py
index ec1d5357f..8d6a5ce83 100644
--- a/gui/builtinStatsViews/priceViewMinimal.py
+++ b/gui/builtinStatsViews/priceViewMinimal.py
@@ -125,15 +125,15 @@ class PriceViewMinimal(StatsView):
total_price = 0
- if (self.settings.get("ship")):
+ if self.settings.get("ship"):
total_price += ship_price
- if (self.settings.get("modules")):
+ if self.settings.get("modules"):
total_price += module_price
- if (self.settings.get("drones")):
+ if self.settings.get("drones"):
total_price += drone_price + fighter_price
- if (self.settings.get("cargo")):
+ if self.settings.get("cargo"):
total_price += cargo_price
- if (self.settings.get("character")):
+ if self.settings.get("character"):
total_price += booster_price + implant_price
self.labelPriceShip.SetLabel("%s ISK" % formatAmount(ship_price, 3, 3, 9, currency=True))
diff --git a/gui/builtinViewColumns/price.py b/gui/builtinViewColumns/price.py
index ad99b8fb3..a68614b83 100644
--- a/gui/builtinViewColumns/price.py
+++ b/gui/builtinViewColumns/price.py
@@ -50,10 +50,13 @@ class Price(ViewColumn):
if not price or not price.isValid:
return False
- if isinstance(stuff, Drone) or isinstance(stuff, Cargo):
- price.price *= stuff.amount
+ # Fetch actual price as float to not modify its value on Price object
+ price = price.price
- return formatAmount(price.price, 3, 3, 9, currency=True)
+ if isinstance(stuff, Drone) or isinstance(stuff, Cargo):
+ price *= stuff.amount
+
+ return formatAmount(price, 3, 3, 9, currency=True)
def delayedText(self, mod, display, colItem):
sPrice = ServicePrice.getInstance()
diff --git a/gui/builtinViews/fittingView.py b/gui/builtinViews/fittingView.py
index 458aa4ff2..a0aea6043 100644
--- a/gui/builtinViews/fittingView.py
+++ b/gui/builtinViews/fittingView.py
@@ -21,28 +21,26 @@
import wx
# noinspection PyPackageRequirements
import wx.lib.newevent
-import gui.mainFrame
-from gui.builtinMarketBrowser.events import ItemSelected, ITEM_SELECTED
+from logbook import Logger
+
+import gui.builtinViews.emptyView
import gui.display as d
-from gui.contextMenu import ContextMenu
-from gui.builtinShipBrowser.events import EVT_FIT_RENAMED, EVT_FIT_REMOVED, FitSelected, EVT_FIT_SELECTED
+import gui.fitCommands as cmd
+import gui.globalEvents as GE
+import gui.mainFrame
import gui.multiSwitch
from eos.saveddata.mode import Mode
-from eos.saveddata.module import Module, Slot, Rack
-from gui.builtinViewColumns.state import State
+from eos.saveddata.module import Module, Rack, Slot
from gui.bitmap_loader import BitmapLoader
-import gui.builtinViews.emptyView
-from logbook import Logger
+from gui.builtinMarketBrowser.events import ITEM_SELECTED
+from gui.builtinShipBrowser.events import EVT_FIT_REMOVED, EVT_FIT_RENAMED, EVT_FIT_SELECTED, FitSelected
+from gui.builtinViewColumns.state import State
from gui.chrome_tabs import EVT_NOTEBOOK_PAGE_CHANGED
-
+from gui.contextMenu import ContextMenu
+from gui.utils.staticHelpers import DragDropHelper
from service.fit import Fit
from service.market import Market
-from gui.utils.staticHelpers import DragDropHelper
-import gui.utils.fonts as fonts
-
-import gui.globalEvents as GE
-
pyfalog = Logger(__name__)
@@ -265,7 +263,9 @@ class FittingView(d.Display):
sel = []
row = self.GetFirstSelected()
while row != -1:
- sel.append(self.mods[self.GetItemData(row)])
+ mod = self.mods[self.GetItemData(row)]
+ if mod and not isinstance(mod, Rack):
+ sel.append(mod)
row = self.GetNextSelected(row)
return sel
@@ -358,6 +358,9 @@ class FittingView(d.Display):
self.parent.SetPageTextIcon(pageIndex, text, bitmap)
def appendItem(self, event):
+ """
+ Adds items that are double clicks from the market browser. We handle both modules and ammo
+ """
if not self:
event.Skip()
return
@@ -367,6 +370,7 @@ class FittingView(d.Display):
if fitID is not None:
sFit = Fit.getInstance()
if sFit.isAmmo(itemID):
+ # If we've selected ammo, then apply to the selected module(s)
modules = []
sel = self.GetFirstSelected()
while sel != -1 and sel not in self.blanks:
@@ -376,17 +380,14 @@ class FittingView(d.Display):
sel = self.GetNextSelected(sel)
if len(modules) > 0:
- sFit.setAmmo(fitID, itemID, modules)
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
+ self.mainFrame.command.Submit(cmd.GuiModuleAddChargeCommand(fitID, itemID, modules))
else:
- populate = sFit.appendModule(fitID, itemID)
- if populate is not None:
- self.slotsChanged()
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID, action="modadd", typeID=itemID))
+ self.mainFrame.command.Submit(cmd.GuiModuleAddCommand(fitID, itemID))
event.Skip()
def removeItem(self, event):
+ """Double Left Click - remove module"""
if event.CmdDown():
return
row, _ = self.HitTest(event.Position)
@@ -400,36 +401,22 @@ class FittingView(d.Display):
def removeModule(self, modules):
"""Removes a list of modules from the fit"""
- sFit = Fit.getInstance()
-
if not isinstance(modules, list):
modules = [modules]
- positions = [mod.modPosition for mod in modules]
- result = sFit.removeModule(self.activeFitID, positions)
+ self.mainFrame.command.Submit(cmd.GuiModuleRemoveCommand(self.activeFitID, modules))
- if result is not None:
- self.slotsChanged()
- ids = {mod.item.ID for mod in modules}
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.activeFitID, action="moddel", typeID=ids))
-
- def addModule(self, x, y, srcIdx):
- """Add a module from the market browser"""
+ def addModule(self, x, y, itemID):
+ """Add a module from the market browser (from dragging it)"""
dstRow, _ = self.HitTest((x, y))
if dstRow != -1 and dstRow not in self.blanks:
- sFit = Fit.getInstance()
fitID = self.mainFrame.getActiveFit()
mod = self.mods[dstRow]
if not isinstance(mod, Module): # make sure we're not adding something to a T3D Mode
return
- moduleChanged = sFit.changeModule(fitID, self.mods[dstRow].modPosition, srcIdx)
- if moduleChanged is None:
- # the new module doesn't fit in specified slot, try to simply append it
- wx.PostEvent(self.mainFrame, ItemSelected(itemID=srcIdx))
-
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.mainFrame.getActiveFit(), action="modadd", typeID=srcIdx))
+ self.mainFrame.command.Submit(cmd.GuiModuleAddCommand(fitID, itemID, self.mods[dstRow].modPosition))
def swapCargo(self, x, y, srcIdx):
"""Swap a module from cargo to fitting window"""
@@ -442,14 +429,11 @@ class FittingView(d.Display):
if not isinstance(module, Module):
return
- sFit = Fit.getInstance()
- fit = sFit.getFit(self.activeFitID)
- typeID = fit.cargo[srcIdx].item.ID
-
- sFit.moveCargoToModule(self.mainFrame.getActiveFit(), module.modPosition, srcIdx,
- mstate.CmdDown() and module.isEmpty)
-
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.mainFrame.getActiveFit(), action="modadd", typeID=typeID))
+ self.mainFrame.command.Submit(cmd.GuiCargoToModuleCommand(
+ self.mainFrame.getActiveFit(),
+ module.modPosition,
+ srcIdx,
+ mstate.CmdDown() and module.isEmpty))
def swapItems(self, x, y, srcIdx):
"""Swap two modules in fitting window"""
@@ -457,15 +441,9 @@ class FittingView(d.Display):
sFit = Fit.getInstance()
fit = sFit.getFit(self.activeFitID)
- if mstate.CmdDown():
- clone = True
- else:
- clone = False
-
dstRow, _ = self.HitTest((x, y))
if dstRow != -1 and dstRow not in self.blanks:
-
mod1 = fit.modules[srcIdx]
mod2 = self.mods[dstRow]
@@ -476,13 +454,11 @@ class FittingView(d.Display):
if mod1.slot != mod2.slot:
return
- if getattr(mod2, "modPosition") is not None:
- if clone and mod2.isEmpty and mod1.getModifiedItemAttr("maxGroupFitted", 0) < 1.0:
- sFit.cloneModule(self.mainFrame.getActiveFit(), srcIdx, mod2.modPosition)
- else:
- sFit.swapModules(self.mainFrame.getActiveFit(), srcIdx, mod2.modPosition)
+ clone = mstate.CmdDown() and mod2.isEmpty
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.mainFrame.getActiveFit()))
+ fitID = self.mainFrame.getActiveFit()
+ if getattr(mod2, "modPosition") is not None:
+ self.mainFrame.command.Submit(cmd.GuiModuleSwapOrCloneCommand(fitID, srcIdx, mod2.modPosition, clone))
else:
pyfalog.error("Missing module position for: {0}", str(getattr(mod2, "ID", "Unknown")))
@@ -541,7 +517,7 @@ class FittingView(d.Display):
self.populate(self.mods)
def fitChanged(self, event):
- print('====== Fit Changed: {} {} activeFitID: {}, eventFitID: {}'.format(repr(self), str(bool(self)), self.activeFitID, event.fitID))
+ # print('====== Fit Changed: {} {} activeFitID: {}, eventFitID: {}'.format(repr(self), str(bool(self)), self.activeFitID, event.fitID))
if not self:
event.Skip()
return
@@ -638,18 +614,18 @@ class FittingView(d.Display):
else:
mods = self.getSelectedMods()
- sFit = Fit.getInstance()
fitID = self.mainFrame.getActiveFit()
ctrl = event.cmdDown or event.middleIsDown
click = "ctrl" if ctrl is True else "right" if event.GetButton() == 3 else "left"
- sFit.toggleModulesState(fitID, self.mods[self.GetItemData(row)], mods, click)
+
+ self.mainFrame.command.Submit(cmd.GuiModuleStateChangeCommand(
+ fitID, self.mods[self.GetItemData(row)].modPosition, [mod.modPosition for mod in mods], click))
# update state tooltip
tooltip = self.activeColumns[col].getToolTip(self.mods[self.GetItemData(row)])
if tooltip:
self.SetToolTip(tooltip)
- wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.mainFrame.getActiveFit()))
else:
event.Skip()
diff --git a/gui/characterEditor.py b/gui/characterEditor.py
index c0d8de298..6fe7c809a 100644
--- a/gui/characterEditor.py
+++ b/gui/characterEditor.py
@@ -17,35 +17,30 @@
# along with pyfa. If not, see .
# =============================================================================
+import re
+
+import roman
# noinspection PyPackageRequirements
import wx
import wx.dataview
import wx.lib.agw.hyperlink
-
# noinspection PyPackageRequirements
import wx.lib.newevent
+from logbook import Logger
# noinspection PyPackageRequirements
from wx.dataview import TreeListCtrl
-from gui.bitmap_loader import BitmapLoader
-from gui.contextMenu import ContextMenu
-import gui.globalEvents as GE
-from gui.builtinViews.implantEditor import BaseImplantEditorView
-from gui.builtinViews.entityEditor import EntityEditor, BaseValidator, TextEntryValidatedDialog
-from service.fit import Fit
-from service.character import Character
-from service.esi import Esi
-from service.network import AuthenticationError, TimeoutError
-from service.market import Market
-from logbook import Logger
-
from wx.lib.agw.floatspin import FloatSpin
-
-from gui.utils.clipboard import toClipboard, fromClipboard
-
-import roman
-import re
-import webbrowser
+import gui.globalEvents as GE
+from gui.bitmap_loader import BitmapLoader
+from gui.builtinViews.entityEditor import BaseValidator, EntityEditor, TextEntryValidatedDialog
+from gui.builtinViews.implantEditor import BaseImplantEditorView
+from gui.contextMenu import ContextMenu
+from gui.utils.clipboard import fromClipboard, toClipboard
+from service.character import Character
+from service.esi import Esi
+from service.fit import Fit
+from service.market import Market
pyfalog = Logger(__name__)
diff --git a/gui/chrome_tabs.py b/gui/chrome_tabs.py
index 95d79415d..b50073565 100644
--- a/gui/chrome_tabs.py
+++ b/gui/chrome_tabs.py
@@ -30,7 +30,7 @@ PageAdded, EVT_NOTEBOOK_PAGE_ADDED = wx.lib.newevent.NewEvent()
PageClosed, EVT_NOTEBOOK_PAGE_CLOSED = wx.lib.newevent.NewEvent()
-class VetoAble():
+class VetoAble:
def __init__(self):
self.__vetoed = False
@@ -41,7 +41,7 @@ class VetoAble():
return self.__vetoed
-class NotebookTabChangeEvent():
+class NotebookTabChangeEvent:
def __init__(self, old, new):
self.__old = old
self.__new = new
diff --git a/gui/contextMenu.py b/gui/contextMenu.py
index 08ea258d5..be972b0f8 100644
--- a/gui/contextMenu.py
+++ b/gui/contextMenu.py
@@ -186,7 +186,7 @@ from gui.builtinContextMenus import ( # noqa: E402,F401
itemStats,
damagePattern,
marketJump,
- droneSplit,
+ # droneSplit,
itemRemove,
droneRemoveStack,
ammoPattern,
@@ -202,7 +202,7 @@ from gui.builtinContextMenus import ( # noqa: E402,F401
priceOptions,
amount,
cargoAmmo,
- droneStack,
+ # droneStack,
metaSwap,
implantSets,
fighterAbilities,
diff --git a/gui/copySelectDialog.py b/gui/copySelectDialog.py
index 9f5291026..10eff2647 100644
--- a/gui/copySelectDialog.py
+++ b/gui/copySelectDialog.py
@@ -20,51 +20,84 @@
# noinspection PyPackageRequirements
import wx
+from service.port.eft import EFT_OPTIONS
+from service.settings import SettingsProvider
class CopySelectDialog(wx.Dialog):
copyFormatEft = 0
- copyFormatEftImps = 1
- copyFormatXml = 2
- copyFormatDna = 3
- copyFormatEsi = 4
- copyFormatMultiBuy = 5
- copyFormatEfs = 6
+ copyFormatXml = 1
+ copyFormatDna = 2
+ copyFormatEsi = 3
+ copyFormatMultiBuy = 4
+ copyFormatEfs = 5
def __init__(self, parent):
wx.Dialog.__init__(self, parent, id=wx.ID_ANY, title="Select a format", size=(-1, -1),
style=wx.DEFAULT_DIALOG_STYLE)
mainSizer = wx.BoxSizer(wx.VERTICAL)
- copyFormats = ["EFT", "EFT (Implants)", "XML", "DNA", "ESI", "MultiBuy", "EFS"]
- copyFormatTooltips = {CopySelectDialog.copyFormatEft: "EFT text format",
- CopySelectDialog.copyFormatEftImps: "EFT text format",
- CopySelectDialog.copyFormatXml: "EVE native XML format",
- CopySelectDialog.copyFormatDna: "A one-line text format",
- CopySelectDialog.copyFormatEsi: "A JSON format used for ESI",
- CopySelectDialog.copyFormatMultiBuy: "MultiBuy text format",
- CopySelectDialog.copyFormatEfs: "JSON data format used by EFS"}
- selector = wx.RadioBox(self, wx.ID_ANY, label="Copy to the clipboard using:", choices=copyFormats,
- style=wx.RA_SPECIFY_ROWS)
- selector.Bind(wx.EVT_RADIOBOX, self.Selected)
- for format, tooltip in copyFormatTooltips.items():
- selector.SetItemToolTip(format, tooltip)
+ self.settings = SettingsProvider.getInstance().getSettings("pyfaExport", {"format": 0, "options": 0})
- self.copyFormat = CopySelectDialog.copyFormatEft
- selector.SetSelection(self.copyFormat)
+ self.copyFormats = {
+ "EFT": CopySelectDialog.copyFormatEft,
+ "XML": CopySelectDialog.copyFormatXml,
+ "DNA": CopySelectDialog.copyFormatDna,
+ "ESI": CopySelectDialog.copyFormatEsi,
+ "MultiBuy": CopySelectDialog.copyFormatMultiBuy,
+ "EFS": CopySelectDialog.copyFormatEfs
+ }
- mainSizer.Add(selector, 0, wx.EXPAND | wx.ALL, 5)
+ self.options = {}
+
+ for i, format in enumerate(self.copyFormats.keys()):
+ if i == 0:
+ rdo = wx.RadioButton(self, wx.ID_ANY, format, style=wx.RB_GROUP)
+ else:
+ rdo = wx.RadioButton(self, wx.ID_ANY, format)
+ rdo.Bind(wx.EVT_RADIOBUTTON, self.Selected)
+ if self.settings['format'] == self.copyFormats[format]:
+ rdo.SetValue(True)
+ self.copyFormat = self.copyFormats[format]
+ mainSizer.Add(rdo, 0, wx.EXPAND | wx.ALL, 5)
+
+ if format == "EFT":
+ bsizer = wx.BoxSizer(wx.VERTICAL)
+
+ for x, v in EFT_OPTIONS.items():
+ ch = wx.CheckBox(self, -1, v['name'])
+ self.options[x] = ch
+ if self.settings['options'] & x:
+ ch.SetValue(True)
+ bsizer.Add(ch, 1, wx.EXPAND | wx.TOP | wx.BOTTOM, 3)
+ mainSizer.Add(bsizer, 1, wx.EXPAND | wx.LEFT, 20)
buttonSizer = self.CreateButtonSizer(wx.OK | wx.CANCEL)
if buttonSizer:
mainSizer.Add(buttonSizer, 0, wx.EXPAND | wx.ALL, 5)
+ self.toggleOptions()
self.SetSizer(mainSizer)
self.Fit()
self.Center()
def Selected(self, event):
- self.copyFormat = event.GetSelection()
+ obj = event.GetEventObject()
+ format = obj.GetLabel()
+ self.copyFormat = self.copyFormats[format]
+ self.toggleOptions()
+ self.Fit()
+
+ def toggleOptions(self):
+ for ch in self.options.values():
+ ch.Enable(self.GetSelected() == CopySelectDialog.copyFormatEft)
def GetSelected(self):
return self.copyFormat
+
+ def GetOptions(self):
+ i = 0
+ for x, v in self.options.items():
+ if v.IsChecked():
+ i = i ^ x
+ return i
diff --git a/gui/devTools.py b/gui/devTools.py
index 98a14662c..44012128c 100644
--- a/gui/devTools.py
+++ b/gui/devTools.py
@@ -35,7 +35,7 @@ class DevTools(wx.Dialog):
def __init__(self, parent):
wx.Dialog.__init__(self, parent, id=wx.ID_ANY, title="Damage Pattern Editor", size=wx.Size(400, 240))
-
+ self.mainFrame = parent
self.block = False
self.SetSizeHints(wx.DefaultSize, wx.DefaultSize)
@@ -56,13 +56,19 @@ class DevTools(wx.Dialog):
self.fitTest = wx.Button(self, wx.ID_ANY, "Test fits", wx.DefaultPosition, wx.DefaultSize, 0)
mainSizer.Add(self.fitTest, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
- self.fitTest .Bind(wx.EVT_BUTTON, self.fit_test)
+ self.fitTest.Bind(wx.EVT_BUTTON, self.fit_test)
+
+ self.cmdPrint = wx.Button(self, wx.ID_ANY, "Command Print", wx.DefaultPosition, wx.DefaultSize, 0)
+ mainSizer.Add(self.cmdPrint, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
+
+ self.cmdPrint.Bind(wx.EVT_BUTTON, self.cmd_print)
self.SetSizer(mainSizer)
self.Layout()
self.CenterOnParent()
self.Show()
+ print(parent)
def objects_by_id(self, evt):
input = self.id_get.GetValue()
@@ -81,6 +87,11 @@ class DevTools(wx.Dialog):
else:
print(None)
+ def cmd_print(self, evt):
+ print("=" * 20)
+ for x in self.mainFrame.command.GetCommands():
+ print("{}{} {}".format("==> " if x == self.mainFrame.command.GetCurrentCommand() else "", x.GetName(), x))
+
def gc_collect(self, evt):
print(gc.collect())
print(gc.get_debug())
diff --git a/gui/esiFittings.py b/gui/esiFittings.py
index af3da77a5..20fc2ed74 100644
--- a/gui/esiFittings.py
+++ b/gui/esiFittings.py
@@ -15,7 +15,7 @@ import gui.globalEvents as GE
from logbook import Logger
from service.esi import Esi
from service.esiAccess import APIException
-from service.port import ESIExportException
+from service.port.esi import ESIExportException
pyfalog = Logger(__name__)
@@ -319,7 +319,7 @@ class SsoCharacterMgmt(wx.Dialog):
self.Centre(wx.BOTH)
def ssoLogin(self, event):
- if (self):
+ if self:
# todo: these events don't unbind properly when window is closed (?), hence the `if`. Figure out better way of doing this.
self.popCharList()
event.Skip()
@@ -384,7 +384,7 @@ class FittingsTreeView(wx.Panel):
dict = {}
fits = data
for fit in fits:
- if (fit['fitting_id'] in sEsi.fittings_deleted):
+ if fit['fitting_id'] in sEsi.fittings_deleted:
continue
ship = getItem(fit['ship_type_id'])
if ship is None:
diff --git a/gui/fitCommands/__init__.py b/gui/fitCommands/__init__.py
new file mode 100644
index 000000000..ae651d7bd
--- /dev/null
+++ b/gui/fitCommands/__init__.py
@@ -0,0 +1,34 @@
+from .guiToggleModuleState import GuiModuleStateChangeCommand
+from .guiAddModule import GuiModuleAddCommand
+from .guiRemoveModule import GuiModuleRemoveCommand
+from .guiAddCharge import GuiModuleAddChargeCommand
+from .guiSwapCloneModule import GuiModuleSwapOrCloneCommand
+from .guiRemoveCargo import GuiRemoveCargoCommand
+from .guiAddCargo import GuiAddCargoCommand
+from .guiRemoveImplant import GuiRemoveImplantCommand
+from .guiAddImplant import GuiAddImplantCommand
+from .guiAddBooster import GuiAddBoosterCommand
+from .guiRemoveBooster import GuiRemoveBoosterCommand
+from .guiAddCommand import GuiAddCommandCommand
+from .guiRemoveCommand import GuiRemoveCommandCommand
+from .guiSetMode import GuiSetModeCommand
+from .guiToggleCommand import GuiToggleCommandCommand
+from .guiAddProjected import GuiAddProjectedCommand
+from .guiRemoveProjected import GuiRemoveProjectedCommand
+from .guiCargoToModule import GuiCargoToModuleCommand
+from .guiModuleToCargo import GuiModuleToCargoCommand
+from .guiAddFighter import GuiAddFighterCommand
+from .guiRemoveFighter import GuiRemoveFighterCommand
+from .guiMetaSwap import GuiMetaSwapCommand
+from .guiToggleFighter import GuiToggleFighterCommand
+from .guiToggleImplant import GuiToggleImplantCommand
+from .guiToggleBooster import GuiToggleBoosterCommand
+from .guiAddDrone import GuiAddDroneCommand
+from .guiRemoveDrone import GuiRemoveDroneCommand
+from .guiChangeFighterQty import GuiChangeFighterQty
+from .guiChangeCargoQty import GuiChangeCargoQty
+from .guiChangeProjectedFitQty import GuiChangeProjectedFitQty
+from .guiChangeDroneQty import GuiChangeDroneQty
+from .guiChangeProjectedDroneQty import GuiChangeProjectedDroneQty
+from .guiToggleDrone import GuiToggleDroneCommand
+from .guiFitRename import GuiFitRenameCommand
\ No newline at end of file
diff --git a/gui/fitCommands/calc/__init__.py b/gui/fitCommands/calc/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/gui/fitCommands/calc/fitAddBooster.py b/gui/fitCommands/calc/fitAddBooster.py
new file mode 100644
index 000000000..0470b556b
--- /dev/null
+++ b/gui/fitCommands/calc/fitAddBooster.py
@@ -0,0 +1,49 @@
+import wx
+import eos.db
+from logbook import Logger
+from eos.saveddata.booster import Booster
+pyfalog = Logger(__name__)
+
+
+class FitAddBoosterCommand(wx.Command):
+ """"
+ from sFit.addBooster
+ """
+ def __init__(self, fitID, itemID):
+ wx.Command.__init__(self, True)
+ self.fitID = fitID
+ self.itemID = itemID
+ self.new_index = None
+ self.old_item = None
+
+ def Do(self):
+ pyfalog.debug("Adding booster ({0}) to fit ID: {1}", self.itemID, self.fitID)
+
+ fit = eos.db.getFit(self.fitID)
+ item = eos.db.getItem(self.itemID, eager="attributes")
+
+ if next((x for x in fit.boosters if x.itemID == self.itemID), None):
+ return False # already have item in list of boosters
+
+ try:
+ booster = Booster(item)
+ except ValueError:
+ pyfalog.warning("Invalid item: {0}", self.itemID)
+ return False
+
+ self.old_item = fit.boosters.makeRoom(booster)
+ fit.boosters.append(booster)
+ self.new_index = fit.boosters.index(booster)
+ return True
+
+ def Undo(self):
+ if self.old_item:
+ # If we had an item in the slot previously, add it back.
+ cmd = FitAddBoosterCommand(self.fitID, self.old_item)
+ cmd.Do()
+ return True
+
+ from .fitRemoveBooster import FitRemoveBoosterCommand # Avoid circular import
+ cmd = FitRemoveBoosterCommand(self.fitID, self.new_index)
+ cmd.Do()
+ return True
diff --git a/gui/fitCommands/calc/fitAddCargo.py b/gui/fitCommands/calc/fitAddCargo.py
new file mode 100644
index 000000000..fff3abd26
--- /dev/null
+++ b/gui/fitCommands/calc/fitAddCargo.py
@@ -0,0 +1,43 @@
+import wx
+import eos.db
+from logbook import Logger
+from eos.saveddata.cargo import Cargo
+pyfalog = Logger(__name__)
+
+
+class FitAddCargoCommand(wx.Command):
+ """"
+ from sFit.addCargo
+ """
+ def __init__(self, fitID, itemID, amount=1, replace=False):
+ wx.Command.__init__(self, True, "Cargo add")
+ self.fitID = fitID
+ self.itemID = itemID
+ self.amount = amount # add x amount. If this goes over amount, removes stack
+ self.replace = replace # if this is false, we increment.
+
+ def Do(self):
+ pyfalog.debug("Adding cargo {0} (x{1}) for fit {2}", self.itemID, self.amount, self.fitID)
+
+ fit = eos.db.getFit(self.fitID)
+ item = eos.db.getItem(self.itemID)
+
+ cargo = next((x for x in fit.cargo if x.itemID == self.itemID), None)
+
+ if cargo is None:
+ cargo = Cargo(item)
+ fit.cargo.append(cargo)
+
+ if self.replace:
+ cargo.amount = self.amount
+ else:
+ cargo.amount += self.amount
+
+ eos.db.commit()
+ return True
+
+ def Undo(self):
+ from .fitRemoveCargo import FitRemoveCargoCommand # Avoid circular import
+ cmd = FitRemoveCargoCommand(self.fitID, self.itemID, self.amount)
+ cmd.Do()
+ return True
diff --git a/gui/fitCommands/calc/fitAddCommand.py b/gui/fitCommands/calc/fitAddCommand.py
new file mode 100644
index 000000000..660d7b5a0
--- /dev/null
+++ b/gui/fitCommands/calc/fitAddCommand.py
@@ -0,0 +1,47 @@
+import wx
+import eos.db
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class FitAddCommandCommand(wx.Command): # well that's an unfrtunate name
+ """"
+ from sFit.addCommand
+ """
+ def __init__(self, fitID, commandFitID):
+ wx.Command.__init__(self, True)
+ self.fitID = fitID
+ self.commandFitID = commandFitID
+
+ def Do(self):
+ pyfalog.debug("Projecting command fit ({0}) onto: {1}", self.fitID, self.commandFitID)
+ fit = eos.db.getFit(self.fitID)
+ command = eos.db.getFit(self.commandFitID)
+
+ if not command:
+ # if redoing when the command fit has been deleted, simply fail this command
+ return False
+
+ if command in fit.commandFits:
+ return
+
+ fit.commandFitDict[command.ID] = command
+
+ # this bit is required -- see GH issue # 83
+ eos.db.saveddata_session.flush()
+ eos.db.saveddata_session.refresh(command)
+
+ eos.db.commit()
+ return True
+
+ def Undo(self):
+ command = eos.db.getFit(self.commandFitID)
+
+ if not command:
+ # can't find the command fit, it must have been deleted. Just skip this undo
+ return True
+
+ from .fitRemoveCommand import FitRemoveCommandCommand
+ cmd = FitRemoveCommandCommand(self.fitID, self.commandFitID)
+ cmd.Do()
+ return True
diff --git a/gui/fitCommands/calc/fitAddDrone.py b/gui/fitCommands/calc/fitAddDrone.py
new file mode 100644
index 000000000..a7b8ed41c
--- /dev/null
+++ b/gui/fitCommands/calc/fitAddDrone.py
@@ -0,0 +1,49 @@
+import wx
+import eos.db
+from logbook import Logger
+from eos.saveddata.drone import Drone
+pyfalog = Logger(__name__)
+
+
+class FitAddDroneCommand(wx.Command):
+ """"
+ from sFit.addDrone
+ """
+ def __init__(self, fitID, itemID, amount=1, replace=False):
+ wx.Command.__init__(self, True, "Drone add")
+ self.fitID = fitID
+ self.itemID = itemID
+ self.amount = amount # add x amount. If this goes over amount, removes stack
+ self.replace = replace # if this is false, we increment.
+ self.index = None
+
+ def Do(self):
+ pyfalog.debug("Adding {0} drones ({1}) to fit ID: {2}", self.amount, self.itemID, self.fitID)
+
+ fit = eos.db.getFit(self.fitID)
+ item = eos.db.getItem(self.itemID, eager=("attributes", "group.category"))
+
+ for d in fit.drones.find(item):
+ if d is not None and d.amountActive == 0 and d.amount < max(5, fit.extraAttributes["maxActiveDrones"]):
+ drone = d
+ break
+ else:
+ try:
+ drone = Drone(item)
+ except ValueError:
+ pyfalog.warning("Invalid drone: {}", item)
+ return False
+
+ if not drone.fits(fit):
+ return False
+ fit.drones.append(drone)
+
+ drone.amount += self.amount
+ eos.db.commit()
+ self.index = fit.drones.index(drone)
+ return True
+
+ def Undo(self):
+ from .fitRemoveDrone import FitRemoveDroneCommand # Avoid circular import
+ cmd = FitRemoveDroneCommand(self.fitID, self.index, self.amount)
+ return cmd.Do()
diff --git a/gui/fitCommands/calc/fitAddFighter.py b/gui/fitCommands/calc/fitAddFighter.py
new file mode 100644
index 000000000..42ca59be1
--- /dev/null
+++ b/gui/fitCommands/calc/fitAddFighter.py
@@ -0,0 +1,48 @@
+import wx
+import eos.db
+from logbook import Logger
+from eos.saveddata.fighter import Fighter
+pyfalog = Logger(__name__)
+
+
+class FitAddFighterCommand(wx.Command):
+ """"
+ from sFit.addFighter
+ """
+ def __init__(self, fitID, itemID):
+ wx.Command.__init__(self, True, "Cargo add")
+ self.fitID = fitID
+ self.itemID = itemID
+ self.new_index = None
+
+ def Do(self):
+ fit = eos.db.getFit(self.fitID)
+ item = eos.db.getItem(self.itemID, eager=("attributes", "group.category"))
+
+ try:
+ fighter = Fighter(item)
+ except ValueError:
+ pyfalog.warning("Invalid fighter: {}", item)
+ return False
+
+ if not fighter.fits(fit):
+ return False
+
+ used = fit.getSlotsUsed(fighter.slot)
+ total = fit.getNumSlots(fighter.slot)
+
+ if used >= total:
+ fighter.active = False
+
+ fit.fighters.append(fighter)
+ self.new_index = fit.fighters.index(fighter)
+
+ eos.db.commit()
+
+ return True
+
+ def Undo(self):
+ from .fitRemoveFighter import FitRemoveFighterCommand # Avoid circular import
+ cmd = FitRemoveFighterCommand(self.fitID, self.new_index)
+ cmd.Do()
+ return True
diff --git a/gui/fitCommands/calc/fitAddImplant.py b/gui/fitCommands/calc/fitAddImplant.py
new file mode 100644
index 000000000..4e3fd372c
--- /dev/null
+++ b/gui/fitCommands/calc/fitAddImplant.py
@@ -0,0 +1,48 @@
+import wx
+import eos.db
+from logbook import Logger
+from eos.saveddata.implant import Implant
+pyfalog = Logger(__name__)
+
+
+class FitAddImplantCommand(wx.Command):
+ """"
+ from sFit.addImplant
+ """
+ def __init__(self, fitID, itemID):
+ wx.Command.__init__(self, True, "Cargo add")
+ self.fitID = fitID
+ self.itemID = itemID
+ self.old_item = None
+
+ def Do(self):
+ pyfalog.debug("Adding implant to fit ({0}) for item ID: {1}", self.fitID, self.itemID)
+
+ fit = eos.db.getFit(self.fitID)
+ item = eos.db.getItem(self.itemID, eager="attributes")
+
+ if next((x for x in fit.implants if x.itemID == self.itemID), None):
+ return False # already have item in list of implants
+
+ try:
+ implant = Implant(item)
+ except ValueError:
+ pyfalog.warning("Invalid item: {0}", self.itemID)
+ return False
+
+ self.old_item = fit.implants.makeRoom(implant)
+ fit.implants.append(implant)
+ self.new_index = fit.implants.index(implant)
+ return True
+
+ def Undo(self):
+ if self.old_item:
+ # If we had an item in the slot previously, add it back.
+ cmd = FitAddImplantCommand(self.fitID, self.old_item)
+ cmd.Do()
+ return True
+
+ from .fitRemoveImplant import FitRemoveImplantCommand # Avoid circular import
+ cmd = FitRemoveImplantCommand(self.fitID, self.new_index)
+ cmd.Do()
+ return True
diff --git a/gui/fitCommands/calc/fitAddModule.py b/gui/fitCommands/calc/fitAddModule.py
new file mode 100644
index 000000000..cd96b6d4f
--- /dev/null
+++ b/gui/fitCommands/calc/fitAddModule.py
@@ -0,0 +1,83 @@
+import wx
+from eos.saveddata.module import Module, State
+import eos.db
+from logbook import Logger
+from service.fit import Fit
+pyfalog = Logger(__name__)
+
+
+class FitAddModuleCommand(wx.Command):
+ """"
+ Fitting command that appends a module to a fit using the first available slot. In the case of a Subsystem, it checks
+ if there is already a subsystem with the same slot, and runs the replace command instead.
+
+ from sFit.appendModule
+ """
+ def __init__(self, fitID, itemID, mutaplasmidID=None, baseID=None):
+ wx.Command.__init__(self, True)
+ self.fitID = fitID
+ self.itemID = itemID
+ self.mutaplasmidID = mutaplasmidID
+ self.baseID = baseID
+ self.new_position = None
+ self.change = None
+ self.replace_cmd = None
+
+ def Do(self):
+ sFit = Fit.getInstance()
+ fitID = self.fitID
+ itemID = self.itemID
+ fit = eos.db.getFit(fitID)
+ item = eos.db.getItem(itemID, eager=("attributes", "group.category"))
+
+ bItem = eos.db.getItem(self.baseID) if self.baseID else None
+ mItem = next((x for x in bItem.mutaplasmids if x.ID == self.mutaplasmidID)) if self.mutaplasmidID else None
+
+ try:
+ self.module = Module(item, bItem, mItem)
+ except ValueError:
+ pyfalog.warning("Invalid module: {}", item)
+ return False
+
+ # If subsystem and we need to replace, run the replace command instead and bypass the rest of this command
+ if self.module.item.category.name == "Subsystem":
+ for mod in fit.modules:
+ if mod.getModifiedItemAttr("subSystemSlot") == self.module.getModifiedItemAttr("subSystemSlot"):
+ from .fitReplaceModule import FitReplaceModuleCommand
+ self.replace_cmd = FitReplaceModuleCommand(self.fitID, mod.modPosition, itemID)
+ return self.replace_cmd.Do()
+
+ if self.module.fits(fit):
+ pyfalog.debug("Adding {} as module for fit {}", self.module, fit)
+ self.module.owner = fit
+ numSlots = len(fit.modules)
+ fit.modules.append(self.module)
+ if self.module.isValidState(State.ACTIVE):
+ self.module.state = State.ACTIVE
+
+ # todo: fix these
+ # As some items may affect state-limiting attributes of the ship, calculate new attributes first
+ # self.recalc(fit)
+ # Then, check states of all modules and change where needed. This will recalc if needed
+ sFit.checkStates(fit, self.module)
+
+ # fit.fill()
+ eos.db.commit()
+
+ self.change = numSlots != len(fit.modules)
+ self.new_position = self.module.modPosition
+ else:
+ return False
+
+ return True
+
+ def Undo(self):
+ # We added a subsystem module, which actually ran the replace command. Run the undo for that guy instead
+ if self.replace_cmd:
+ return self.replace_cmd.Undo()
+
+ from .fitRemoveModule import FitRemoveModuleCommand # Avoid circular import
+ if self.new_position:
+ cmd = FitRemoveModuleCommand(self.fitID, [self.new_position])
+ cmd.Do()
+ return True
diff --git a/gui/fitCommands/calc/fitAddProjectedDrone.py b/gui/fitCommands/calc/fitAddProjectedDrone.py
new file mode 100644
index 000000000..6c2ddf270
--- /dev/null
+++ b/gui/fitCommands/calc/fitAddProjectedDrone.py
@@ -0,0 +1,45 @@
+import wx
+import eos.db
+from logbook import Logger
+from eos.saveddata.drone import Drone
+pyfalog = Logger(__name__)
+
+
+class FitAddProjectedDroneCommand(wx.Command):
+ """"
+ from sFit.project
+ """
+ def __init__(self, fitID, itemID):
+ wx.Command.__init__(self, True)
+ self.fitID = fitID
+ self.itemID = itemID
+ self.index = None
+
+ def Do(self):
+ pyfalog.debug("Projecting fit ({0}) onto: {1}", self.fitID, self.itemID)
+ fit = eos.db.getFit(self.fitID)
+ item = eos.db.getItem(self.itemID)
+
+ drone = None
+ for d in fit.projectedDrones.find(item):
+ if d is None or d.amountActive == d.amount or d.amount >= 5:
+ drone = d
+ break
+
+ if drone is None:
+ drone = Drone(item)
+ if not drone.item.isType("projected"):
+ return False
+ fit.projectedDrones.append(drone)
+
+ self.index = fit.projectedDrones.index(drone)
+ drone.amount += 1
+
+ eos.db.commit()
+ return True
+
+ def Undo(self):
+ from gui.fitCommands.calc.fitRemoveProjectedDrone import FitRemoveProjectedDroneCommand # avoids circular import
+ cmd = FitRemoveProjectedDroneCommand(self.fitID, self.index)
+ cmd.Do()
+ return True
diff --git a/gui/fitCommands/calc/fitAddProjectedEnv.py b/gui/fitCommands/calc/fitAddProjectedEnv.py
new file mode 100644
index 000000000..f896a77df
--- /dev/null
+++ b/gui/fitCommands/calc/fitAddProjectedEnv.py
@@ -0,0 +1,50 @@
+import wx
+from eos.saveddata.module import Module, State
+import eos.db
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class FitAddProjectedEnvCommand(wx.Command):
+ """"
+ from sFit.project
+ """
+ def __init__(self, fitID, itemID):
+ wx.Command.__init__(self, True)
+ self.fitID = fitID
+ self.itemID = itemID
+ self.new_index = None
+ self.old_item = None
+
+ def Do(self):
+ pyfalog.debug("Projecting fit ({0}) onto: {1}", self.fitID, self.itemID)
+ fit = eos.db.getFit(self.fitID)
+ item = eos.db.getItem(self.itemID, eager=("attributes", "group.category"))
+
+ try:
+ module = Module(item)
+ except ValueError:
+ return False
+
+ # todo: thing to check for existing environmental effects
+
+ self.old_item = fit.projectedModules.makeRoom(module)
+
+ module.state = State.ONLINE
+ fit.projectedModules.append(module)
+
+ eos.db.commit()
+ self.new_index = fit.projectedModules.index(module)
+ return True
+
+ def Undo(self):
+ if self.old_item:
+ # If we had an item in the slot previously, add it back.
+ cmd = FitAddProjectedEnvCommand(self.fitID, self.old_item)
+ cmd.Do()
+ return True
+ from gui.fitCommands.calc.fitRemoveProjectedEnv import FitRemoveProjectedEnvCommand # avoids circular import
+ cmd = FitRemoveProjectedEnvCommand(self.fitID, self.itemID)
+ cmd.Do()
+
+ return True
diff --git a/gui/fitCommands/calc/fitAddProjectedFighter.py b/gui/fitCommands/calc/fitAddProjectedFighter.py
new file mode 100644
index 000000000..17d50e14b
--- /dev/null
+++ b/gui/fitCommands/calc/fitAddProjectedFighter.py
@@ -0,0 +1,40 @@
+import wx
+import eos.db
+from logbook import Logger
+from eos.saveddata.fighter import Fighter
+pyfalog = Logger(__name__)
+
+
+class FitAddProjectedFighterCommand(wx.Command):
+ """"
+ from sFit.project
+ """
+ def __init__(self, fitID, itemID):
+ wx.Command.__init__(self, True)
+ self.fitID = fitID
+ self.itemID = itemID
+ self.new_index = None
+
+ def Do(self):
+ pyfalog.debug("Projecting fit ({0}) onto: {1}", self.fitID, self.itemID)
+ fit = eos.db.getFit(self.fitID)
+ item = eos.db.getItem(self.itemID, eager=("attributes", "group.category"))
+
+ try:
+ fighter = Fighter(item)
+ except ValueError:
+ return False
+
+ fit.projectedFighters.append(fighter)
+ # sometimes fighters aren't added because they aren't valid projectionable ones. todo: move that logic into here
+ if fighter in fit.projectedFighters:
+ eos.db.commit()
+ self.new_index = fit.projectedFighters.index(fighter)
+ return True
+ return False
+
+ def Undo(self):
+ from gui.fitCommands.calc.fitRemoveProjectedFighter import FitRemoveProjectedFighterCommand # avoids circular import
+ cmd = FitRemoveProjectedFighterCommand(self.fitID, self.new_index)
+ cmd.Do()
+ return True
diff --git a/gui/fitCommands/calc/fitAddProjectedFit.py b/gui/fitCommands/calc/fitAddProjectedFit.py
new file mode 100644
index 000000000..cd1e1a7f9
--- /dev/null
+++ b/gui/fitCommands/calc/fitAddProjectedFit.py
@@ -0,0 +1,39 @@
+import wx
+import eos.db
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class FitAddProjectedFitCommand(wx.Command):
+ """"
+ from sFit.project
+ """
+ def __init__(self, fitID, projectedFitID):
+ wx.Command.__init__(self, True)
+ self.fitID = fitID
+ self.projectedFitID = projectedFitID
+ self.new_index = None
+ self.old_item = None
+
+ def Do(self):
+ pyfalog.debug("Projecting fit ({0}) onto: {1}", self.fitID, self.projectedFitID)
+ fit = eos.db.getFit(self.fitID)
+ projectedFit = eos.db.getFit(self.projectedFitID)
+
+ if projectedFit is None or projectedFit in fit.projectedFits:
+ return False
+
+ fit.projectedFitDict[projectedFit.ID] = projectedFit
+
+ # this bit is required -- see GH issue # 83
+ eos.db.saveddata_session.flush()
+ eos.db.saveddata_session.refresh(projectedFit)
+
+ eos.db.commit()
+ return True
+
+ def Undo(self):
+ from gui.fitCommands.calc.fitRemoveProjectedFit import FitRemoveProjectedFitCommand # avoids circular import
+ cmd = FitRemoveProjectedFitCommand(self.fitID, self.projectedFitID)
+ cmd.Do()
+ return True
diff --git a/gui/fitCommands/calc/fitAddProjectedModule.py b/gui/fitCommands/calc/fitAddProjectedModule.py
new file mode 100644
index 000000000..6d2ad3f4f
--- /dev/null
+++ b/gui/fitCommands/calc/fitAddProjectedModule.py
@@ -0,0 +1,43 @@
+import wx
+import eos.db
+from logbook import Logger
+from eos.saveddata.module import Module, State
+pyfalog = Logger(__name__)
+
+
+class FitAddProjectedModuleCommand(wx.Command):
+ """"
+ from sFit.project
+ """
+ def __init__(self, fitID, itemID):
+ wx.Command.__init__(self, True)
+ self.fitID = fitID
+ self.itemID = itemID
+ self.new_index = None
+
+ def Do(self):
+ pyfalog.debug("Projecting fit ({0}) onto: {1}", self.fitID, self.itemID)
+ fit = eos.db.getFit(self.fitID)
+ item = eos.db.getItem(self.itemID, eager=("attributes", "group.category"))
+
+ try:
+ module = Module(item)
+ if not module.item.isType("projected"):
+ return False
+ except ValueError:
+ return False
+
+ module.state = State.ACTIVE
+ if not module.canHaveState(module.state, fit):
+ module.state = State.OFFLINE
+ fit.projectedModules.append(module)
+
+ eos.db.commit()
+ self.new_index = fit.projectedModules.index(module)
+ return True
+
+ def Undo(self):
+ from gui.fitCommands.calc.fitRemoveProjectedModule import FitRemoveProjectedModuleCommand # avoids circular import
+ cmd = FitRemoveProjectedModuleCommand(self.fitID, self.new_index)
+ cmd.Do()
+ return True
diff --git a/gui/fitCommands/calc/fitChangeCargoQty.py b/gui/fitCommands/calc/fitChangeCargoQty.py
new file mode 100644
index 000000000..2ba30e085
--- /dev/null
+++ b/gui/fitCommands/calc/fitChangeCargoQty.py
@@ -0,0 +1,27 @@
+import wx
+import eos.db
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class FitChangeCargoQty(wx.Command):
+ def __init__(self, fitID, position, amount=1):
+ wx.Command.__init__(self, True, "Drone add")
+ self.fitID = fitID
+ self.position = position
+ self.amount = amount # add x amount. If this goes over amount, removes stack
+ self.old_amount = None
+
+ def Do(self):
+ pyfalog.debug("Changing cargo ({0}) for fit ({1}) to amount: {2}", self.position, self.fitID, self.amount)
+ fit = eos.db.getFit(self.fitID)
+ cargo = fit.cargo[self.position]
+ self.old_amount = cargo.amount
+ cargo.amount = self.amount
+
+ eos.db.commit()
+ return True
+
+ def Undo(self):
+ cmd = FitChangeCargoQty(self.fitID, self.position, self.old_amount)
+ return cmd.Do()
diff --git a/gui/fitCommands/calc/fitChangeDroneQty.py b/gui/fitCommands/calc/fitChangeDroneQty.py
new file mode 100644
index 000000000..8f7e8e801
--- /dev/null
+++ b/gui/fitCommands/calc/fitChangeDroneQty.py
@@ -0,0 +1,27 @@
+import wx
+import eos.db
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class FitChangeDroneQty(wx.Command):
+ def __init__(self, fitID, position, amount=1):
+ wx.Command.__init__(self, True, "Drone add")
+ self.fitID = fitID
+ self.position = position
+ self.amount = amount # add x amount. If this goes over amount, removes stack
+ self.old_amount = None
+
+ def Do(self):
+ pyfalog.debug("Changing active fighters ({0}) for fit ({1}) to amount: {2}", self.position, self.fitID, self.amount)
+ fit = eos.db.getFit(self.fitID)
+ drone = fit.drones[self.position]
+ self.old_amount = drone.amount
+ drone.amount = self.amount
+
+ eos.db.commit()
+ return True
+
+ def Undo(self):
+ cmd = FitChangeDroneQty(self.fitID, self.position, self.old_amount)
+ return cmd.Do()
diff --git a/gui/fitCommands/calc/fitChangeFighterQty.py b/gui/fitCommands/calc/fitChangeFighterQty.py
new file mode 100644
index 000000000..4cef20034
--- /dev/null
+++ b/gui/fitCommands/calc/fitChangeFighterQty.py
@@ -0,0 +1,30 @@
+import wx
+import eos.db
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class FitChangeFighterQty(wx.Command):
+ """"
+ from sFit.changeActiveFighters
+ """
+ def __init__(self, fitID, position, amount=1):
+ wx.Command.__init__(self, True, "Drone add")
+ self.fitID = fitID
+ self.position = position
+ self.amount = amount # add x amount. If this goes over amount, removes stack
+ self.old_amount = None
+
+ def Do(self):
+ pyfalog.debug("Changing active fighters ({0}) for fit ({1}) to amount: {2}", self.position, self.fitID, self.amount)
+ fit = eos.db.getFit(self.fitID)
+ fighter = fit.fighters[self.position]
+ self.old_amount = fighter.amountActive
+ fighter.amountActive = self.amount
+
+ eos.db.commit()
+ return True
+
+ def Undo(self):
+ cmd = FitChangeFighterQty(self.fitID, self.position, self.old_amount)
+ return cmd.Do()
diff --git a/gui/fitCommands/calc/fitChangeProjectedDroneQty.py b/gui/fitCommands/calc/fitChangeProjectedDroneQty.py
new file mode 100644
index 000000000..3ca926c17
--- /dev/null
+++ b/gui/fitCommands/calc/fitChangeProjectedDroneQty.py
@@ -0,0 +1,27 @@
+import wx
+import eos.db
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class FitChangeProjectedDroneQty(wx.Command):
+ def __init__(self, fitID, position, amount=1):
+ wx.Command.__init__(self, True, "Drone add")
+ self.fitID = fitID
+ self.position = position
+ self.amount = amount # add x amount. If this goes over amount, removes stack
+ self.old_amount = None
+
+ def Do(self):
+ pyfalog.debug("Changing active fighters ({0}) for fit ({1}) to amount: {2}", self.position, self.fitID, self.amount)
+ fit = eos.db.getFit(self.fitID)
+ drone = fit.projectedDrones[self.position]
+ self.old_amount = drone.amount
+ drone.amount = self.amount
+
+ eos.db.commit()
+ return True
+
+ def Undo(self):
+ cmd = FitChangeProjectedDroneQty(self.fitID, self.position, self.old_amount)
+ return cmd.Do()
diff --git a/gui/fitCommands/calc/fitChangeProjectedFitQty.py b/gui/fitCommands/calc/fitChangeProjectedFitQty.py
new file mode 100644
index 000000000..aa75e8491
--- /dev/null
+++ b/gui/fitCommands/calc/fitChangeProjectedFitQty.py
@@ -0,0 +1,36 @@
+import wx
+import eos.db
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class FitChangeProjectedFitQty(wx.Command):
+ """"
+ from sFit.changeAmount
+ """
+ def __init__(self, fitID, pfitID, amount=1):
+ wx.Command.__init__(self, True, "Drone add")
+ self.fitID = fitID
+ self.pfitID = pfitID
+ self.amount = amount
+ self.old_amount = None
+
+ def Do(self):
+ pfit = eos.db.getFit(self.pfitID)
+
+ if not pfit: # fit was deleted
+ return False
+
+ amount = min(20, max(1, self.amount)) # 1 <= a <= 20
+
+ projectionInfo = pfit.getProjectionInfo(self.fitID)
+ if projectionInfo:
+ self.old_amount = projectionInfo.amount
+ projectionInfo.amount = amount
+
+ eos.db.commit()
+ return True
+
+ def Undo(self):
+ cmd = FitChangeProjectedFitQty(self.fitID, self.pfitID, self.old_amount)
+ return cmd.Do()
diff --git a/gui/fitCommands/calc/fitChangeState.py b/gui/fitCommands/calc/fitChangeState.py
new file mode 100644
index 000000000..0b901e640
--- /dev/null
+++ b/gui/fitCommands/calc/fitChangeState.py
@@ -0,0 +1,76 @@
+import wx
+from logbook import Logger
+
+import gui.mainFrame
+from eos.saveddata.module import Module
+from service.fit import Fit
+import eos.db
+
+pyfalog = Logger(__name__)
+
+
+class FitChangeStatesCommand(wx.Command):
+ """
+ Fitting command that trys to change the state of modules in [positions]. We use the base module to determine the
+ state that we will try to apply for all modules.
+
+
+ """
+ def __init__(self, fitID, baseModPos, positions, click):
+ # todo: instead of modules, needs to be positions. Dead objects are a thing
+ wx.Command.__init__(self, True, "Module State Change")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.fitID = fitID
+ self.baseModPos = baseModPos
+ self.positions = positions
+ self.click = click
+ self.changed = None
+ self.old_states = {}
+
+ def Do(self):
+ fit = eos.db.getFit(self.fitID)
+ sFit = Fit.getInstance()
+ baseMod = fit.modules[self.baseModPos]
+
+ # make sure positions only include non-empty positions
+ self.positions = [x for x in self.positions if not fit.modules[x].isEmpty]
+
+ for x in self.positions:
+ self.old_states[x] = fit.modules[x].state
+
+ proposedState = Module.getProposedState(baseMod, self.click)
+ pyfalog.debug("Attempting to change modules to {}", proposedState)
+
+ if proposedState != baseMod.state:
+ pyfalog.debug("Toggle {} state: {} for fit ID: {}", baseMod, proposedState, self.fitID)
+
+ self.changed = True
+ baseMod.state = proposedState
+ for i in [x for x in self.positions if x != self.baseModPos]: # dont consider base module position
+ mod = fit.modules[i]
+ p = Module.getProposedState(mod, self.click, proposedState)
+ mod.state = p
+ if p != mod.state:
+ pyfalog.debug("Toggle {} state: {} for fit ID: {}", mod, p, self.fitID)
+ self.changed = True
+
+ # if we haven't change the state (eg, overheat -> overheat), simply fail the command
+ if self.changed:
+ eos.db.commit()
+ # As some items may affect state-limiting attributes of the ship, calculate new attributes first
+ # self.recalc(fit)
+ # # Then, check states of all modules and change where needed. This will recalc if needed
+ sFit.checkStates(fit, baseMod)
+ # self.checkStates(fit, base)
+ return True
+ return False
+
+ def Undo(self):
+ # todo: some sanity checking to make sure that we are applying state back to the same modules?
+ fit = self.sFit.getFit(self.fitID)
+ for k, v in self.old_states.items():
+ mod = fit.modules[k]
+ pyfalog.debug("Reverting {} to state {} for fit ID", mod, v, self.fitID)
+ mod.state = v
+ return True
diff --git a/gui/fitCommands/calc/fitCloneModule.py b/gui/fitCommands/calc/fitCloneModule.py
new file mode 100644
index 000000000..519b653ef
--- /dev/null
+++ b/gui/fitCommands/calc/fitCloneModule.py
@@ -0,0 +1,44 @@
+import wx
+import eos.db
+from logbook import Logger
+import copy
+pyfalog = Logger(__name__)
+
+
+class FitCloneModuleCommand(wx.Command):
+ """
+ Clone a module from src to dst
+ This will overwrite dst! Checking for empty module must be
+ done at a higher level
+
+ from sFit.cloneModule
+ """
+ def __init__(self, fitID, src, dst):
+ wx.Command.__init__(self, True, "Module Clone")
+ self.fitID = fitID
+ self.src = src
+ self.dst = dst
+
+ def Do(self):
+ fit = eos.db.getFit(self.fitID)
+ # Gather modules
+ srcMod = fit.modules[self.src]
+ dstMod = fit.modules[self.dst] # should be a placeholder module
+
+ new = copy.deepcopy(srcMod)
+ new.owner = fit
+ if new.fits(fit):
+ pyfalog.debug("Cloning {} from source {} to destination {} for fit ID {}", srcMod, self.src, self.dst, self.fitID)
+ # insert copy if module meets hardpoint restrictions
+ fit.modules.remove(dstMod)
+ fit.modules.insert(self.dst, new)
+
+ eos.db.commit()
+ return True
+ return False
+
+ def Undo(self):
+ from .fitRemoveModule import FitRemoveModuleCommand # Avoid circular import
+ cmd = FitRemoveModuleCommand(self.fitID, [self.dst])
+ cmd.Do()
+ return True
diff --git a/gui/fitCommands/calc/fitRemoveBooster.py b/gui/fitCommands/calc/fitRemoveBooster.py
new file mode 100644
index 000000000..14733c93b
--- /dev/null
+++ b/gui/fitCommands/calc/fitRemoveBooster.py
@@ -0,0 +1,30 @@
+import wx
+import eos.db
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class FitRemoveBoosterCommand(wx.Command):
+ """"
+ from sFit.removeBooster
+ """
+ def __init__(self, fitID, position):
+ wx.Command.__init__(self, True, "Implant remove")
+ self.fitID = fitID
+ self.position = position
+ self.old = None
+
+ def Do(self):
+ pyfalog.debug("Removing booster from position ({0}) for fit ID: {1}", self.position, self.fitID)
+
+ fit = eos.db.getFit(self.fitID)
+ booster = fit.boosters[self.position]
+ self.old = booster.itemID
+ fit.boosters.remove(booster)
+ return True
+
+ def Undo(self):
+ from .fitAddBooster import FitAddBoosterCommand # Avoid circular import
+ cmd = FitAddBoosterCommand(self.fitID, self.old)
+ cmd.Do()
+ return True
diff --git a/gui/fitCommands/calc/fitRemoveCargo.py b/gui/fitCommands/calc/fitRemoveCargo.py
new file mode 100644
index 000000000..779c7c757
--- /dev/null
+++ b/gui/fitCommands/calc/fitRemoveCargo.py
@@ -0,0 +1,47 @@
+import wx
+import eos.db
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class FitRemoveCargoCommand(wx.Command):
+ """"
+ Fitting command that sets the amount for an item within the cargo.
+
+ from sFit.removeCargo
+ """
+ def __init__(self, fitID, itemID, amount=1, stack=False):
+ wx.Command.__init__(self, True, "Cargo remove")
+ self.fitID = fitID
+ self.itemID = itemID
+ self.stack = stack # remove entire stack
+ self.amount = amount # remove x amount. If this goes over amount, removes stack
+ self.old_amount = None
+
+ def Do(self):
+ pyfalog.debug("Removing cargo {0} (x{1}) for fit {2}", self.itemID, self.amount, self.fitID)
+ fit = eos.db.getFit(self.fitID)
+ cargo = next((x for x in fit.cargo if x.itemID == self.itemID), None)
+
+ if cargo is None:
+ return False
+
+ self.old_amount = cargo.amount
+
+ if self.amount >= cargo.amount:
+ self.stack = True # set to full stack, this allows easier logic in the Undo function
+
+ if self.stack or self.amount >= cargo.amount:
+ fit.cargo.remove(cargo)
+ eos.db.commit()
+ return True
+
+ cargo.amount -= self.amount
+ eos.db.commit()
+ return True
+
+ def Undo(self):
+ from gui.fitCommands.calc.fitAddCargo import FitAddCargoCommand # Avoid circular import
+ cmd = FitAddCargoCommand(self.fitID, self.itemID, self.old_amount, True)
+ cmd.Do()
+ return True
diff --git a/gui/fitCommands/calc/fitRemoveCommand.py b/gui/fitCommands/calc/fitRemoveCommand.py
new file mode 100644
index 000000000..29e681b60
--- /dev/null
+++ b/gui/fitCommands/calc/fitRemoveCommand.py
@@ -0,0 +1,37 @@
+import wx
+import eos.db
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class FitRemoveCommandCommand(wx.Command): # well that's an unfortunate name
+ """"
+ from sFit.removeCommand
+ """
+ def __init__(self, fitID, commandFitID):
+ wx.Command.__init__(self, True)
+ self.fitID = fitID
+ self.commandFitID = commandFitID
+
+ def Do(self):
+ pyfalog.debug("Removing command projection from fit ({0}) for: {1}", self.fitID, self.commandFitID)
+ fit = eos.db.getFit(self.fitID)
+ command = eos.db.getFit(self.commandFitID)
+ if not command:
+ return False
+ del fit.commandFitDict[command.ID]
+
+ eos.db.commit()
+ return True
+
+ def Undo(self):
+ command = eos.db.getFit(self.commandFitID)
+
+ if not command:
+ # can't find the command fit, it must have been deleted. Just skip this undo
+ return True
+
+ from .fitAddCommand import FitAddCommandCommand
+ cmd = FitAddCommandCommand(self.fitID, self.commandFitID)
+ cmd.Do()
+ return True
diff --git a/gui/fitCommands/calc/fitRemoveDrone.py b/gui/fitCommands/calc/fitRemoveDrone.py
new file mode 100644
index 000000000..4e1fb0a6a
--- /dev/null
+++ b/gui/fitCommands/calc/fitRemoveDrone.py
@@ -0,0 +1,43 @@
+import wx
+import eos.db
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class FitRemoveDroneCommand(wx.Command):
+ """"
+ from sFit.addDrone
+ """
+ def __init__(self, fitID, position, amount=1):
+ wx.Command.__init__(self, True, "Drone add")
+ self.fitID = fitID
+ self.position = position
+ self.amount = amount # add x amount. If this goes over amount, removes stack
+ self.removed_item = None
+
+ def Do(self):
+ pyfalog.debug("Removing {0} drones for fit ID: {1}", self.amount, self.fitID)
+ fit = eos.db.getFit(self.fitID)
+ d = fit.drones[self.position]
+ d.amount -= self.amount
+ if d.amountActive > 0:
+ d.amountActive -= self.amount
+
+ if d.amount == 0:
+ self.removed_item = d.itemID
+ del fit.drones[self.position]
+
+ eos.db.commit()
+ return True
+
+ def Undo(self):
+ if self.removed_item:
+ from .fitAddDrone import FitAddDroneCommand # Avoid circular import
+ cmd = FitAddDroneCommand(self.fitID, self.removed_item, self.amount)
+ return cmd.Do()
+ else:
+ fit = eos.db.getFit(self.fitID)
+ d = fit.drones[self.position]
+ d.amount += self.amount
+ eos.db.commit()
+ return True
diff --git a/gui/fitCommands/calc/fitRemoveFighter.py b/gui/fitCommands/calc/fitRemoveFighter.py
new file mode 100644
index 000000000..da186bd48
--- /dev/null
+++ b/gui/fitCommands/calc/fitRemoveFighter.py
@@ -0,0 +1,34 @@
+import wx
+from logbook import Logger
+
+import eos.db
+
+pyfalog = Logger(__name__)
+
+
+class FitRemoveFighterCommand(wx.Command):
+ """"
+ Fitting command that removes a module at a specified positions
+
+ from sFit.removeFighter
+ """
+ def __init__(self, fitID: int, position: int):
+ wx.Command.__init__(self, True)
+ self.fitID = fitID
+ self.position = position
+ self.change = None
+ self.removed_item = None
+
+ def Do(self):
+ fitID = self.fitID
+ fit = eos.db.getFit(fitID)
+ f = fit.fighters[self.position]
+ fit.fighters.remove(f)
+ self.removed_item = f.itemID
+ eos.db.commit()
+ return True
+
+ def Undo(self):
+ from gui.fitCommands.calc.fitAddFighter import FitAddFighterCommand # avoids circular import
+ cmd = FitAddFighterCommand(self.fitID, self.removed_item)
+ return cmd.Do()
diff --git a/gui/fitCommands/calc/fitRemoveImplant.py b/gui/fitCommands/calc/fitRemoveImplant.py
new file mode 100644
index 000000000..d0f8101cd
--- /dev/null
+++ b/gui/fitCommands/calc/fitRemoveImplant.py
@@ -0,0 +1,32 @@
+import wx
+import eos.db
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class FitRemoveImplantCommand(wx.Command):
+ """"
+ Fitting command that sets the amount for an item within the cargo.
+
+ from sFit.removeImplant
+ """
+ def __init__(self, fitID, position):
+ wx.Command.__init__(self, True, "Implant remove")
+ self.fitID = fitID
+ self.position = position
+ self.old_implant = None
+
+ def Do(self):
+ pyfalog.debug("Removing implant from position ({0}) for fit ID: {1}", self.position, self.fitID)
+
+ fit = eos.db.getFit(self.fitID)
+ implant = fit.implants[self.position]
+ self.old_implant = implant.itemID
+ fit.implants.remove(implant)
+ return True
+
+ def Undo(self):
+ from gui.fitCommands.calc.fitAddImplant import FitAddImplantCommand # Avoid circular import
+ cmd = FitAddImplantCommand(self.fitID, self.old_implant)
+ cmd.Do()
+ return True
diff --git a/gui/fitCommands/calc/fitRemoveModule.py b/gui/fitCommands/calc/fitRemoveModule.py
new file mode 100644
index 000000000..5134f2f1b
--- /dev/null
+++ b/gui/fitCommands/calc/fitRemoveModule.py
@@ -0,0 +1,59 @@
+import wx
+
+from gui.fitCommands.helpers import ModuleInfoCache
+import eos.db
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class FitRemoveModuleCommand(wx.Command):
+ """"
+ Fitting command that removes a module at a specified positions
+
+ from sFit.removeModule
+ """
+ def __init__(self, fitID: int, positions: list = None):
+ wx.Command.__init__(self, True)
+ self.fitID = fitID
+ self.positions = positions
+ self.modCache = []
+ self.change = None
+
+ def Do(self):
+ fitID = self.fitID
+ fit = eos.db.getFit(fitID)
+
+ pyfalog.debug("Removing module from position ({0}) for fit ID: {1}", self.positions, fitID)
+
+ for x in self.positions:
+ mod = fit.modules[x]
+ if not mod.isEmpty:
+ pyfalog.debug(" -- Removing {}", mod)
+ self.modCache.append(ModuleInfoCache(mod.modPosition, mod.item.ID, mod.state, mod.charge, mod.baseItemID, mod.mutaplasmidID))
+ fit.modules.toDummy(x)
+
+ # if no modules have changes, skip command
+ if not len(self.modCache) > 0:
+ return False
+
+ numSlots = len(fit.modules)
+ # todo: determine if we need to do this still
+ # self.recalc(fit)
+ # self.checkStates(fit, None)
+ # fit.fill()
+ eos.db.commit()
+ self.slotsChanged = numSlots != len(fit.modules)
+ return True
+
+ def Undo(self):
+ pyfalog.debug("Reapplying {} removed module(s) for {}", len(self.modCache), self.fitID)
+
+ from gui.fitCommands.calc.fitReplaceModule import FitReplaceModuleCommand # avoids circular import
+ for mod in self.modCache:
+ pyfalog.debug(" -- {}", mod)
+ # todo, send the state and charge?
+ cmd = FitReplaceModuleCommand(self.fitID, mod.modPosition, mod.itemID)
+ cmd.Do()
+ cmd.module.state = mod.state
+ cmd.module.charge = mod.charge
+ return True
diff --git a/gui/fitCommands/calc/fitRemoveProjectedDrone.py b/gui/fitCommands/calc/fitRemoveProjectedDrone.py
new file mode 100644
index 000000000..9d70ade2e
--- /dev/null
+++ b/gui/fitCommands/calc/fitRemoveProjectedDrone.py
@@ -0,0 +1,42 @@
+import wx
+import eos.db
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+# this has the same exact definition that regular projected modules, besides the undo
+class FitRemoveProjectedDroneCommand(wx.Command):
+ """"
+ from sFit.project
+ """
+
+ def __init__(self, fitID, position, stack=False):
+ wx.Command.__init__(self, True)
+ self.fitID = fitID
+ self.position = position
+ self.removed_item = None
+ self.stack = stack
+
+ def Do(self):
+ pyfalog.debug("Removing ({0}) onto: {1}", self.fitID, self.position)
+ fit = eos.db.getFit(self.fitID)
+
+ drone = fit.projectedDrones[self.position]
+ if self.stack:
+ fit.projectedDrones.remove(drone)
+ else:
+ if drone.amount > 1:
+ drone.amount -= 1
+ else:
+ fit.projectedDrones.remove(drone)
+
+ self.drone_item = drone.itemID
+
+ eos.db.commit()
+ return True
+
+ def Undo(self):
+ from gui.fitCommands.calc.fitAddProjectedDrone import FitAddProjectedDroneCommand
+ cmd = FitAddProjectedDroneCommand(self.fitID, self.drone_item)
+ cmd.Do()
+ return True
diff --git a/gui/fitCommands/calc/fitRemoveProjectedEnv.py b/gui/fitCommands/calc/fitRemoveProjectedEnv.py
new file mode 100644
index 000000000..61b6ee939
--- /dev/null
+++ b/gui/fitCommands/calc/fitRemoveProjectedEnv.py
@@ -0,0 +1,35 @@
+import wx
+import eos.db
+from logbook import Logger
+from .fitRemoveProjectedModule import FitRemoveProjectedModuleCommand
+pyfalog = Logger(__name__)
+
+
+# this has the same exact definition that regular rpojected modules, besides the undo
+class FitRemoveProjectedEnvCommand(FitRemoveProjectedModuleCommand):
+ """"
+ from sFit.project
+ """
+
+ def __init__(self, fitID, itemID):
+ wx.Command.__init__(self, True)
+ self.fitID = fitID
+ self.itemID = itemID
+ self.removed_item = None
+
+ def Do(self):
+ pyfalog.debug("Removing ({0}) onto: {1}", self.fitID, self.itemID)
+ fit = eos.db.getFit(self.fitID)
+
+ item = next((x for x in fit.projectedModules if x.itemID == self.itemID), None)
+ self.removed_item = item.itemID
+ fit.projectedModules.remove(item)
+
+ eos.db.commit()
+ return True
+
+ def Undo(self):
+ from gui.fitCommands.calc.fitAddProjectedEnv import FitAddProjectedEnvCommand
+ cmd = FitAddProjectedEnvCommand(self.fitID, self.removed_item)
+ cmd.Do()
+ return True
diff --git a/gui/fitCommands/calc/fitRemoveProjectedFighter.py b/gui/fitCommands/calc/fitRemoveProjectedFighter.py
new file mode 100644
index 000000000..d3550b43e
--- /dev/null
+++ b/gui/fitCommands/calc/fitRemoveProjectedFighter.py
@@ -0,0 +1,34 @@
+import wx
+import eos.db
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+# this has the same exact definition that regular rpojected modules, besides the undo
+class FitRemoveProjectedFighterCommand(wx.Command):
+ """"
+ from sFit.project
+ """
+
+ def __init__(self, fitID, position):
+ wx.Command.__init__(self, True)
+ self.fitID = fitID
+ self.position = position
+ self.removed_item = None
+
+ def Do(self):
+ pyfalog.debug("Removing ({0}) onto: {1}", self.fitID, self.position)
+ fit = eos.db.getFit(self.fitID)
+
+ fighter = fit.projectedFighters[self.position]
+ fit.projectedFighters.remove(fighter)
+ self.removed_item = fighter.itemID
+
+ eos.db.commit()
+ return True
+
+ def Undo(self):
+ from gui.fitCommands.calc.fitAddProjectedFighter import FitAddProjectedFighterCommand
+ cmd = FitAddProjectedFighterCommand(self.fitID, self.removed_item)
+ cmd.Do()
+ return True
diff --git a/gui/fitCommands/calc/fitRemoveProjectedFit.py b/gui/fitCommands/calc/fitRemoveProjectedFit.py
new file mode 100644
index 000000000..66d62ab10
--- /dev/null
+++ b/gui/fitCommands/calc/fitRemoveProjectedFit.py
@@ -0,0 +1,37 @@
+import wx
+import eos.db
+from logbook import Logger
+from .fitRemoveProjectedModule import FitRemoveProjectedModuleCommand
+pyfalog = Logger(__name__)
+
+
+# this has the same exact definition that regular rpojected modules, besides the undo
+class FitRemoveProjectedFitCommand(FitRemoveProjectedModuleCommand):
+ """"
+ from sFit.project
+ """
+
+ def __init__(self, fitID, projectedFitID):
+ wx.Command.__init__(self, True)
+ self.fitID = fitID
+ self.projectedFitID = projectedFitID
+
+ def Do(self):
+ pyfalog.debug("Removing ({0}) onto: {1}", self.fitID, self.projectedFitID)
+ fit = eos.db.getFit(self.fitID)
+ projectedFit = eos.db.getFit(self.projectedFitID)
+
+ if projectedFit is None:
+ return False
+
+ del fit.projectedFitDict[projectedFit.ID]
+
+ eos.db.commit()
+ return True
+
+ def Undo(self):
+ # todo: figure out if I need to return false here if the fit doesn't return true (means it was deleted)
+ from gui.fitCommands.calc.fitAddProjectedFit import FitAddProjectedFitCommand
+ cmd = FitAddProjectedFitCommand(self.fitID, self.projectedFitID)
+ cmd.Do()
+ return True
diff --git a/gui/fitCommands/calc/fitRemoveProjectedModule.py b/gui/fitCommands/calc/fitRemoveProjectedModule.py
new file mode 100644
index 000000000..46f8dadba
--- /dev/null
+++ b/gui/fitCommands/calc/fitRemoveProjectedModule.py
@@ -0,0 +1,30 @@
+import wx
+import eos.db
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class FitRemoveProjectedModuleCommand(wx.Command):
+ """"
+ from sFit.project
+ """
+ def __init__(self, fitID, position):
+ wx.Command.__init__(self, True)
+ self.fitID = fitID
+ self.position = position
+ self.removed_item = None
+
+ def Do(self):
+ pyfalog.debug("Removing ({0}) onto: {1}", self.fitID, self.position)
+ fit = eos.db.getFit(self.fitID)
+ self.removed_item = fit.projectedModules[self.position].itemID
+ del fit.projectedModules[self.position]
+
+ eos.db.commit()
+ return True
+
+ def Undo(self):
+ from gui.fitCommands.calc.fitAddProjectedModule import FitAddProjectedModuleCommand
+ cmd = FitAddProjectedModuleCommand(self.fitID, self.removed_item)
+ cmd.Do()
+ return True
diff --git a/gui/fitCommands/calc/fitRename.py b/gui/fitCommands/calc/fitRename.py
new file mode 100644
index 000000000..38a72c519
--- /dev/null
+++ b/gui/fitCommands/calc/fitRename.py
@@ -0,0 +1,26 @@
+import wx
+from logbook import Logger
+
+import eos.db
+
+pyfalog = Logger(__name__)
+
+
+class FitRenameCommand(wx.Command):
+ def __init__(self, fitID, newName):
+ wx.Command.__init__(self, True, "FitRename")
+ self.fitID = fitID
+ self.newName = newName
+ self.oldName = None
+
+ def Do(self):
+ pyfalog.debug("Renaming fit ({0}) to: {1}", self.fitID, self.newName)
+ fit = eos.db.getFit(self.fitID)
+ self.oldName = fit.name
+ fit.name = self.newName
+ eos.db.commit()
+ return True
+
+ def Undo(self):
+ cmd = FitRenameCommand(self.fitID, self.oldName)
+ return cmd.Do()
diff --git a/gui/fitCommands/calc/fitReplaceModule.py b/gui/fitCommands/calc/fitReplaceModule.py
new file mode 100644
index 000000000..19674df80
--- /dev/null
+++ b/gui/fitCommands/calc/fitReplaceModule.py
@@ -0,0 +1,84 @@
+import wx
+from logbook import Logger
+
+import eos.db
+from eos.saveddata.module import Module, State
+from gui.fitCommands.helpers import ModuleInfoCache
+
+pyfalog = Logger(__name__)
+
+
+class FitReplaceModuleCommand(wx.Command):
+ """"
+ Fitting command that changes an existing module into another.
+
+ from sFit.changeModule
+ """
+ def __init__(self, fitID, position, itemID):
+ wx.Command.__init__(self, True, "Change Module")
+ self.fitID = fitID
+ self.itemID = itemID
+ self.position = position
+ self.module = None # the module version of itemID
+ self.old_module = None
+
+ def Do(self):
+ return self.change_module(self.fitID, self.position, self.itemID)
+
+ def Undo(self):
+ if self.old_module is None:
+ fit = eos.db.getFit(self.fitID)
+ fit.modules.toDummy(self.position)
+ return True
+
+ self.change_module(self.fitID, self.position, self.old_module.itemID)
+ self.module.state = self.old_module.state
+ self.module.charge = self.old_module.charge
+ return True
+
+ def change_module(self, fitID, position, itemID):
+ fit = eos.db.getFit(fitID)
+
+ # We're trying to add a charge to a slot, which won't work. Instead, try to add the charge to the module in that slot.
+ # todo: evaluate if this is still a thing
+ # actually, this seems like it should be handled higher up...
+ #
+ # if self.isAmmo(itemID):
+ # module = fit.modules[self.position]
+ # if not module.isEmpty:
+ # self.setAmmo(fitID, itemID, [module])
+ # return True
+
+ pyfalog.debug("Changing position of module from position ({0}) for fit ID: {1}", self.position, fitID)
+
+ item = eos.db.getItem(itemID, eager=("attributes", "group.category"))
+
+ mod = fit.modules[self.position]
+ if not mod.isEmpty:
+ self.old_module = ModuleInfoCache(mod.modPosition, mod.item.ID, mod.state, mod.charge, mod.baseItemID, mod.mutaplasmidID)
+
+ try:
+ self.module = Module(item)
+ except ValueError:
+ pyfalog.warning("Invalid item: {0}", itemID)
+ return False
+
+ if self.module.slot != mod.slot:
+ return False
+
+ # Dummy it out in case the next bit fails
+ fit.modules.toDummy(self.position)
+
+ if self.module.fits(fit):
+ self.module.owner = fit
+ fit.modules.toModule(self.position, self.module)
+ if self.module.isValidState(State.ACTIVE):
+ self.module.state = State.ACTIVE
+
+ # Then, check states of all modules and change where needed. This will recalc if needed
+ # self.checkStates(fit, m)
+
+ # fit.fill()
+ eos.db.commit()
+ return True
+ return False
diff --git a/gui/fitCommands/calc/fitSetCharge.py b/gui/fitCommands/calc/fitSetCharge.py
new file mode 100644
index 000000000..93a6da4ae
--- /dev/null
+++ b/gui/fitCommands/calc/fitSetCharge.py
@@ -0,0 +1,46 @@
+import wx
+from logbook import Logger
+
+import eos.db
+import gui.mainFrame
+from service.fit import Fit
+
+pyfalog = Logger(__name__)
+
+
+class FitSetChargeCommand(wx.Command):
+ def __init__(self, fitID, positions, chargeID=None):
+ # todo: determine if this command really should be used with a group of modules, or a simple per module basis
+ wx.Command.__init__(self, True, "Module Charge Add")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.fitID = fitID
+ self.chargeID = chargeID
+ self.positions = positions
+ self.cache = None
+
+ def Do(self):
+ return self.__setAmmo(self.positions, self.chargeID)
+
+ def Undo(self):
+ for position, chargeID in self.cache.items():
+ self.__setAmmo([position], chargeID)
+ return True
+
+ def __setAmmo(self, positions, chargeID):
+ fit = eos.db.getFit(self.fitID)
+ self.cache = {fit.modules[i].modPosition: fit.modules[i].chargeID for i in positions}
+ ammo = eos.db.getItem(chargeID) if chargeID else None
+
+ if ammo is not None and not ammo.isCharge:
+ return False
+ result = False
+
+ for pos in positions:
+ mod = fit.modules[pos]
+ if not mod.isEmpty and mod.isValidCharge(ammo):
+ pyfalog.debug("Set ammo {} for {} on fit {}", ammo, mod, self.fitID)
+ result = True
+ mod.charge = ammo
+ eos.db.commit()
+ return result
diff --git a/gui/fitCommands/calc/fitSetMode.py b/gui/fitCommands/calc/fitSetMode.py
new file mode 100644
index 000000000..750be78dd
--- /dev/null
+++ b/gui/fitCommands/calc/fitSetMode.py
@@ -0,0 +1,28 @@
+import wx
+import eos.db
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class FitSetModeCommand(wx.Command):
+ """"
+ from sFit.setMode
+ """
+ def __init__(self, fitID, mode):
+ wx.Command.__init__(self, True, "Cargo add")
+ self.fitID = fitID
+ self.mode = mode
+ self.old_mode = None
+
+ def Do(self):
+ pyfalog.debug("Set mode for fit ID: {0}", self.fitID)
+ fit = eos.db.getFit(self.fitID)
+ self.old_mode = fit.mode
+ fit.mode = self.mode
+ eos.db.commit()
+ return True
+
+ def Undo(self):
+ cmd = FitSetModeCommand(self.fitID, self.old_mode)
+ cmd.Do()
+ return True
diff --git a/gui/fitCommands/calc/fitSwapModule.py b/gui/fitCommands/calc/fitSwapModule.py
new file mode 100644
index 000000000..38ed8d4eb
--- /dev/null
+++ b/gui/fitCommands/calc/fitSwapModule.py
@@ -0,0 +1,38 @@
+import wx
+import eos.db
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class FitSwapModuleCommand(wx.Command):
+ """"
+ from sFit.swapModules
+ """
+ def __init__(self, fitID, src, dst):
+ wx.Command.__init__(self, True, "Module Swap")
+ self.fitID = fitID
+ self.src = src
+ self.dst = dst
+
+ def Do(self):
+ self.__swap(self.fitID, self.src, self.dst)
+ return True
+
+ def Undo(self):
+ self.__swap(self.fitID, self.dst, self.src)
+ return True
+
+ def __swap(self, fitID, src, dst):
+ pyfalog.debug("Swapping modules from source ({0}) to destination ({1}) for fit ID: {1}", src, dst, fitID)
+ fit = eos.db.getFit(fitID)
+ # Gather modules
+ srcMod = fit.modules[src]
+ dstMod = fit.modules[dst]
+
+ # To swap, we simply remove mod and insert at destination.
+ fit.modules.remove(srcMod)
+ fit.modules.insert(dst, srcMod)
+ fit.modules.remove(dstMod)
+ fit.modules.insert(src, dstMod)
+
+ eos.db.commit()
diff --git a/gui/fitCommands/calc/fitToggleBooster.py b/gui/fitCommands/calc/fitToggleBooster.py
new file mode 100644
index 000000000..53b56487b
--- /dev/null
+++ b/gui/fitCommands/calc/fitToggleBooster.py
@@ -0,0 +1,27 @@
+import wx
+import eos.db
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class FitToggleBoosterCommand(wx.Command):
+ """"
+ from sFit.toggleBooster
+ """
+ def __init__(self, fitID, position):
+ wx.Command.__init__(self, True, "Cargo add")
+ self.fitID = fitID
+ self.position = position
+
+ def Do(self):
+ pyfalog.debug("Toggling booster for fit ID: {0}", self.fitID)
+ fit = eos.db.getFit(self.fitID)
+ booster = fit.boosters[self.position]
+ booster.active = not booster.active
+
+ eos.db.commit()
+ return True
+
+ def Undo(self):
+ cmd = FitToggleBoosterCommand(self.fitID, self.position)
+ return cmd.Do()
diff --git a/gui/fitCommands/calc/fitToggleCommand.py b/gui/fitCommands/calc/fitToggleCommand.py
new file mode 100644
index 000000000..c7d5a43ad
--- /dev/null
+++ b/gui/fitCommands/calc/fitToggleCommand.py
@@ -0,0 +1,36 @@
+import wx
+import eos.db
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class FitToggleCommandCommand(wx.Command):
+ """"
+ from sFit.toggleCommandFit
+ """
+ def __init__(self, fitID, commandFitId):
+ wx.Command.__init__(self, True, "Cargo add")
+ self.fitID = fitID
+ self.commandFitID = commandFitId
+
+ def Do(self):
+ pyfalog.debug("Toggle command fit ({0}) for: {1}", self.commandFitID, self.fitID)
+ commandFit = eos.db.getFit(self.commandFitID)
+
+ if not commandFit:
+ pyfalog.debug(" -- Command fit not found, deleted?")
+ return False
+
+ commandInfo = commandFit.getCommandInfo(self.fitID)
+
+ if not commandInfo:
+ pyfalog.debug(" -- Command fit info not found, deleted?")
+ return False
+
+ commandInfo.active = not commandInfo.active
+ eos.db.commit()
+ return True
+
+ def Undo(self):
+ cmd = FitToggleCommandCommand(self.fitID, self.commandFitID)
+ return cmd.Do()
diff --git a/gui/fitCommands/calc/fitToggleDrone.py b/gui/fitCommands/calc/fitToggleDrone.py
new file mode 100644
index 000000000..b281be700
--- /dev/null
+++ b/gui/fitCommands/calc/fitToggleDrone.py
@@ -0,0 +1,30 @@
+import wx
+import eos.db
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class FitToggleDroneCommand(wx.Command):
+ """"
+ from sFit.toggleDrone
+ """
+ def __init__(self, fitID, position):
+ wx.Command.__init__(self, True, "Cargo add")
+ self.fitID = fitID
+ self.position = position
+
+ def Do(self):
+ pyfalog.debug("Toggling drones for fit ID: {0}", self.fitID)
+ fit = eos.db.getFit(self.fitID)
+ d = fit.drones[self.position]
+ if d.amount == d.amountActive:
+ d.amountActive = 0
+ else:
+ d.amountActive = d.amount
+
+ eos.db.commit()
+ return True
+
+ def Undo(self):
+ cmd = FitToggleDroneCommand(self.fitID, self.position)
+ return cmd.Do()
diff --git a/gui/fitCommands/calc/fitToggleFighter.py b/gui/fitCommands/calc/fitToggleFighter.py
new file mode 100644
index 000000000..589b4bdd2
--- /dev/null
+++ b/gui/fitCommands/calc/fitToggleFighter.py
@@ -0,0 +1,27 @@
+import wx
+import eos.db
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class FitToggleFighterCommand(wx.Command):
+ """"
+ from sFit.toggleFighter
+ """
+ def __init__(self, fitID, position):
+ wx.Command.__init__(self, True, "Cargo add")
+ self.fitID = fitID
+ self.position = position
+
+ def Do(self):
+ pyfalog.debug("Toggling fighters for fit ID: {0}", self.fitID)
+ fit = eos.db.getFit(self.fitID)
+ f = fit.fighters[self.position]
+ f.active = not f.active
+
+ eos.db.commit()
+ return True
+
+ def Undo(self):
+ cmd = FitToggleFighterCommand(self.fitID, self.position)
+ return cmd.Do()
diff --git a/gui/fitCommands/calc/fitToggleImplant.py b/gui/fitCommands/calc/fitToggleImplant.py
new file mode 100644
index 000000000..c004c297d
--- /dev/null
+++ b/gui/fitCommands/calc/fitToggleImplant.py
@@ -0,0 +1,27 @@
+import wx
+import eos.db
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class FitToggleImplantCommand(wx.Command):
+ """"
+ from sFit.toggleImplant
+ """
+ def __init__(self, fitID, position):
+ wx.Command.__init__(self, True, "Cargo add")
+ self.fitID = fitID
+ self.position = position
+
+ def Do(self):
+ pyfalog.debug("Toggling implant for fit ID: {0}", self.fitID)
+ fit = eos.db.getFit(self.fitID)
+ implant = fit.implants[self.position]
+ implant.active = not implant.active
+
+ eos.db.commit()
+ return True
+
+ def Undo(self):
+ cmd = FitToggleImplantCommand(self.fitID, self.position)
+ return cmd.Do()
diff --git a/gui/fitCommands/guiAddBooster.py b/gui/fitCommands/guiAddBooster.py
new file mode 100644
index 000000000..fc732d857
--- /dev/null
+++ b/gui/fitCommands/guiAddBooster.py
@@ -0,0 +1,30 @@
+import wx
+from service.fit import Fit
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitAddBooster import FitAddBoosterCommand
+
+
+class GuiAddBoosterCommand(wx.Command):
+ def __init__(self, fitID, itemID):
+ wx.Command.__init__(self, True, "Booster Add")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.internal_history = wx.CommandProcessor()
+ self.fitID = fitID
+ self.itemID = itemID
+
+ def Do(self):
+ if self.internal_history.Submit(FitAddBoosterCommand(self.fitID, self.itemID)):
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiAddCargo.py b/gui/fitCommands/guiAddCargo.py
new file mode 100644
index 000000000..4ff0f3447
--- /dev/null
+++ b/gui/fitCommands/guiAddCargo.py
@@ -0,0 +1,30 @@
+import wx
+from service.fit import Fit
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitAddCargo import FitAddCargoCommand
+
+
+class GuiAddCargoCommand(wx.Command):
+ def __init__(self, fitID, itemID, amount=1, replace=False):
+ wx.Command.__init__(self, True, "Cargo Add")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.internal_history = wx.CommandProcessor()
+ self.fitID = fitID
+ self.itemID = itemID
+ self.amount = amount
+ self.replace = replace
+
+ def Do(self):
+ if self.internal_history.Submit(FitAddCargoCommand(self.fitID, self.itemID, self.amount, self.replace)):
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiAddCharge.py b/gui/fitCommands/guiAddCharge.py
new file mode 100644
index 000000000..ad6c5a2f2
--- /dev/null
+++ b/gui/fitCommands/guiAddCharge.py
@@ -0,0 +1,31 @@
+import wx
+from service.fit import Fit
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitSetCharge import FitSetChargeCommand
+
+
+class GuiModuleAddChargeCommand(wx.Command):
+ def __init__(self, fitID, itemID, modules):
+ wx.Command.__init__(self, True, "Module Charge Add")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.internal_history = wx.CommandProcessor()
+ self.fitID = fitID
+ self.itemID = itemID
+ self.positions = [mod.modPosition for mod in modules]
+
+ def Do(self):
+ if self.internal_history.Submit(FitSetChargeCommand(self.fitID, self.positions, self.itemID)):
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiAddCommand.py b/gui/fitCommands/guiAddCommand.py
new file mode 100644
index 000000000..06cfcbe98
--- /dev/null
+++ b/gui/fitCommands/guiAddCommand.py
@@ -0,0 +1,30 @@
+import wx
+from service.fit import Fit
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitAddCommand import FitAddCommandCommand
+
+
+class GuiAddCommandCommand(wx.Command):
+ def __init__(self, fitID, commandFitID):
+ wx.Command.__init__(self, True, "")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.internal_history = wx.CommandProcessor()
+ self.fitID = fitID
+ self.commandFitID = commandFitID
+
+ def Do(self):
+ if self.internal_history.Submit(FitAddCommandCommand(self.fitID, self.commandFitID)):
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ self.sFit.recalc(self.fitID)
+ return True
+ return False
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiAddDrone.py b/gui/fitCommands/guiAddDrone.py
new file mode 100644
index 000000000..6549d1e21
--- /dev/null
+++ b/gui/fitCommands/guiAddDrone.py
@@ -0,0 +1,30 @@
+import wx
+from service.fit import Fit
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitAddDrone import FitAddDroneCommand
+
+
+class GuiAddDroneCommand(wx.Command):
+ def __init__(self, fitID, itemID):
+ wx.Command.__init__(self, True, "Cargo Add")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.internal_history = wx.CommandProcessor()
+ self.fitID = fitID
+ self.itemID = itemID
+
+ def Do(self):
+ cmd = FitAddDroneCommand(self.fitID, self.itemID)
+ if self.internal_history.Submit(cmd):
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiAddFighter.py b/gui/fitCommands/guiAddFighter.py
new file mode 100644
index 000000000..01024e706
--- /dev/null
+++ b/gui/fitCommands/guiAddFighter.py
@@ -0,0 +1,30 @@
+import wx
+from service.fit import Fit
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitAddFighter import FitAddFighterCommand
+
+
+class GuiAddFighterCommand(wx.Command):
+ def __init__(self, fitID, itemID):
+ wx.Command.__init__(self, True, "Cargo Add")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.internal_history = wx.CommandProcessor()
+ self.fitID = fitID
+ self.itemID = itemID
+
+ def Do(self):
+ if self.internal_history.Submit(FitAddFighterCommand(self.fitID, self.itemID)):
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiAddImplant.py b/gui/fitCommands/guiAddImplant.py
new file mode 100644
index 000000000..ffbc1e0a4
--- /dev/null
+++ b/gui/fitCommands/guiAddImplant.py
@@ -0,0 +1,30 @@
+import wx
+from service.fit import Fit
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitAddImplant import FitAddImplantCommand
+
+
+class GuiAddImplantCommand(wx.Command):
+ def __init__(self, fitID, itemID):
+ wx.Command.__init__(self, True, "Implant Add")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.internal_history = wx.CommandProcessor()
+ self.fitID = fitID
+ self.itemID = itemID
+
+ def Do(self):
+ if self.internal_history.Submit(FitAddImplantCommand(self.fitID, self.itemID)):
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiAddModule.py b/gui/fitCommands/guiAddModule.py
new file mode 100644
index 000000000..f826566f4
--- /dev/null
+++ b/gui/fitCommands/guiAddModule.py
@@ -0,0 +1,68 @@
+import wx
+import eos.db
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitAddModule import FitAddModuleCommand
+from .calc.fitReplaceModule import FitReplaceModuleCommand
+from .calc.fitSetCharge import FitSetChargeCommand
+from service.fit import Fit
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class GuiModuleAddCommand(wx.Command):
+ def __init__(self, fitID, itemID, position=None):
+ """
+ Handles adding an item, usually a module, to the Fitting Window.
+
+ :param fitID: The fit ID that we are modifying
+ :param itemID: The item that is to be added to the Fitting View. If this turns out to be a charge, we attempt to
+ set the charge on the underlying module (requires position)
+ :param position: Optional. The position in fit.modules that we are attempting to set the item to
+ """
+ wx.Command.__init__(self, True, "Module Add: {}".format(itemID))
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.fitID = fitID
+ self.itemID = itemID
+ self.internal_history = wx.CommandProcessor()
+ self.position = position
+ self.old_mod = None
+
+ def Do(self):
+ pyfalog.debug("{} Do()".format(self))
+ success = False
+ item = eos.db.getItem(self.itemID)
+ if item.isCharge and self.position is not None:
+ pyfalog.debug("Trying to add a charge")
+ success = self.internal_history.Submit(FitSetChargeCommand(self.fitID, [self.position], self.itemID))
+ if not success:
+ pyfalog.debug(" Failed")
+ return False # if it's a charge item and this failed, nothing more we can try.
+ # if we have a position set, try to apply the module to that position
+ elif self.position is not None:
+ pyfalog.debug("Trying to add a module to a specific position")
+ success = self.internal_history.Submit(FitReplaceModuleCommand(self.fitID, self.position, self.itemID))
+ if not success:
+ pyfalog.debug(" Failed")
+ # something went wrong with trying to fit the module into specific location, attempt to append it
+ self.position = None
+
+ # if we're not trying to set module to a position, simply append
+ if self.position is None:
+ pyfalog.debug("Trying to append a module")
+ success = self.internal_history.Submit(FitAddModuleCommand(self.fitID, self.itemID))
+
+ if success:
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID, action="modadd", typeID=self.itemID))
+ return True
+ return False
+
+ def Undo(self):
+ pyfalog.debug("{} Undo()".format(self))
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID, action="moddel", typeID=self.itemID))
+ return True
diff --git a/gui/fitCommands/guiAddProjected.py b/gui/fitCommands/guiAddProjected.py
new file mode 100644
index 000000000..b2114e111
--- /dev/null
+++ b/gui/fitCommands/guiAddProjected.py
@@ -0,0 +1,56 @@
+import wx
+from service.fit import Fit
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from eos.saveddata.module import Module
+from .calc.fitAddProjectedModule import FitAddProjectedModuleCommand
+from .calc.fitAddProjectedEnv import FitAddProjectedEnvCommand
+from .calc.fitAddProjectedFit import FitAddProjectedFitCommand
+from .calc.fitAddProjectedFighter import FitAddProjectedFighterCommand
+from .calc.fitAddProjectedDrone import FitAddProjectedDroneCommand
+from logbook import Logger
+import eos.db
+pyfalog = Logger(__name__)
+
+
+class GuiAddProjectedCommand(wx.Command):
+ def __init__(self, fitID, id, type='item'):
+ wx.Command.__init__(self, True, "Projected Add")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.internal_history = wx.CommandProcessor()
+ self.fitID = fitID
+ self.id = id
+ self.type = type
+
+ def Do(self):
+ result = False
+ # since we can project various types, we need to switch of the fit command. We can't do this switch easily in
+ # the fit command since each type might have a different kind of undo, easier to split it out
+ if self.type == 'item':
+ item = eos.db.getItem(self.id, eager=("attributes", "group.category"))
+
+ if item.category.name == "Drone":
+ result = self.internal_history.Submit(FitAddProjectedDroneCommand(self.fitID, self.id))
+ elif item.category.name == "Fighter":
+ result = self.internal_history.Submit(FitAddProjectedFighterCommand(self.fitID, self.id))
+ elif item.group.name in Module.SYSTEM_GROUPS:
+ result = self.internal_history.Submit(FitAddProjectedEnvCommand(self.fitID, self.id))
+ else:
+ result = self.internal_history.Submit(FitAddProjectedModuleCommand(self.fitID, self.id))
+ elif self.type == 'fit':
+ result = self.internal_history.Submit(FitAddProjectedFitCommand(self.fitID, self.id))
+
+ if result:
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiCargoToModule.py b/gui/fitCommands/guiCargoToModule.py
new file mode 100644
index 000000000..a2583e47c
--- /dev/null
+++ b/gui/fitCommands/guiCargoToModule.py
@@ -0,0 +1,77 @@
+import wx
+from service.fit import Fit
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from gui.fitCommands.calc.fitSetCharge import FitSetChargeCommand
+from gui.fitCommands.calc.fitReplaceModule import FitReplaceModuleCommand
+from gui.fitCommands.calc.fitRemoveCargo import FitRemoveCargoCommand
+from .calc.fitAddCargo import FitAddCargoCommand
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class GuiCargoToModuleCommand(wx.Command):
+ """
+ Moves cargo to fitting window. Can either do a copy, move, or swap with current module
+ If we try to copy/move into a spot with a non-empty module, we swap instead.
+ To avoid redundancy in converting Cargo item, this function does the
+ sanity checks as opposed to the GUI View. This is different than how the
+ normal .swapModules() does things, which is mostly a blind swap.
+ """
+
+ def __init__(self, fitID, moduleIdx, cargoIdx, copy=False):
+ wx.Command.__init__(self, True, "Module State Change")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.fitID = fitID
+ self.moduleIdx = moduleIdx
+ self.cargoIdx = cargoIdx
+ self.copy = copy
+ self.internal_history = wx.CommandProcessor()
+
+ def Do(self):
+ sFit = Fit.getInstance()
+ fit = sFit.getFit(self.fitID)
+ module = fit.modules[self.moduleIdx]
+ cargo = fit.cargo[self.cargoIdx]
+ result = False
+
+ # We're trying to move a charge from cargo to a slot. Use SetCharge command (don't respect move vs copy)
+ if sFit.isAmmo(cargo.item.ID):
+ result = self.internal_history.Submit(FitSetChargeCommand(self.fitID, [module.modPosition], cargo.item.ID))
+ else:
+
+ pyfalog.debug("Moving cargo item to module for fit ID: {0}", self.fitID)
+
+ self.addCmd = FitReplaceModuleCommand(self.fitID, module.modPosition, cargo.itemID)
+
+ result = self.internal_history.Submit(self.addCmd)
+
+ if not result:
+ # creating module failed for whatever reason
+ return False
+
+ if self.addCmd.old_module is not None:
+ # we're swapping with an existing module, so remove cargo and add module
+ self.removeCmd = FitRemoveCargoCommand(self.fitID, cargo.itemID)
+ result = self.internal_history.Submit(self.removeCmd)
+
+ self.addCargoCmd = FitAddCargoCommand(self.fitID, self.addCmd.old_module.itemID)
+ result = self.internal_history.Submit(self.addCargoCmd)
+ elif not self.copy:
+ # move, not copying, so remove cargo
+ self.removeCmd = FitRemoveCargoCommand(self.fitID, cargo.itemID)
+ result = self.internal_history.Submit(self.removeCmd)
+
+ if result:
+ sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return result
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiChangeCargoQty.py b/gui/fitCommands/guiChangeCargoQty.py
new file mode 100644
index 000000000..80a906fc3
--- /dev/null
+++ b/gui/fitCommands/guiChangeCargoQty.py
@@ -0,0 +1,33 @@
+import wx
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitChangeCargoQty import FitChangeCargoQty
+from service.fit import Fit
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class GuiChangeCargoQty(wx.Command):
+ def __init__(self, fitID, position, amount=1):
+ wx.Command.__init__(self, True, "")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.fitID = fitID
+ self.position = position
+ self.amount = amount
+ self.internal_history = wx.CommandProcessor()
+
+ def Do(self):
+ cmd = FitChangeCargoQty(self.fitID, self.position, self.amount)
+ if self.internal_history.Submit(cmd):
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiChangeDroneQty.py b/gui/fitCommands/guiChangeDroneQty.py
new file mode 100644
index 000000000..5aa2ea12e
--- /dev/null
+++ b/gui/fitCommands/guiChangeDroneQty.py
@@ -0,0 +1,33 @@
+import wx
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitChangeDroneQty import FitChangeDroneQty
+from service.fit import Fit
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class GuiChangeDroneQty(wx.Command):
+ def __init__(self, fitID, position, amount=1):
+ wx.Command.__init__(self, True, "")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.fitID = fitID
+ self.position = position
+ self.amount = amount
+ self.internal_history = wx.CommandProcessor()
+
+ def Do(self):
+ cmd = FitChangeDroneQty(self.fitID, self.position, self.amount)
+ if self.internal_history.Submit(cmd):
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiChangeFighterQty.py b/gui/fitCommands/guiChangeFighterQty.py
new file mode 100644
index 000000000..280bd1a16
--- /dev/null
+++ b/gui/fitCommands/guiChangeFighterQty.py
@@ -0,0 +1,34 @@
+import wx
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitChangeFighterQty import FitChangeFighterQty
+from service.fit import Fit
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class GuiChangeFighterQty(wx.Command):
+ def __init__(self, fitID, position, amount=1):
+ wx.Command.__init__(self, True, "")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.fitID = fitID
+ self.position = position
+ self.amount = amount
+ self.internal_history = wx.CommandProcessor()
+
+ def Do(self):
+ cmd = FitChangeFighterQty(self.fitID, self.position, self.amount)
+ if self.internal_history.Submit(cmd):
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ pyfalog.debug("{} Undo()".format(self))
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiChangeProjectedDroneQty.py b/gui/fitCommands/guiChangeProjectedDroneQty.py
new file mode 100644
index 000000000..f7ceaa657
--- /dev/null
+++ b/gui/fitCommands/guiChangeProjectedDroneQty.py
@@ -0,0 +1,34 @@
+import wx
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitChangeProjectedDroneQty import FitChangeProjectedDroneQty
+from service.fit import Fit
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class GuiChangeProjectedDroneQty(wx.Command):
+ def __init__(self, fitID, position, amount=1):
+ wx.Command.__init__(self, True, "")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.fitID = fitID
+ self.position = position
+ self.amount = amount
+ self.internal_history = wx.CommandProcessor()
+
+ def Do(self):
+ cmd = FitChangeProjectedDroneQty(self.fitID, self.position, self.amount)
+ if self.internal_history.Submit(cmd):
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ pyfalog.debug("{} Undo()".format(self))
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiChangeProjectedFitQty.py b/gui/fitCommands/guiChangeProjectedFitQty.py
new file mode 100644
index 000000000..7014a808b
--- /dev/null
+++ b/gui/fitCommands/guiChangeProjectedFitQty.py
@@ -0,0 +1,34 @@
+import wx
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitChangeProjectedFitQty import FitChangeProjectedFitQty
+from service.fit import Fit
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class GuiChangeProjectedFitQty(wx.Command):
+ def __init__(self, fitID, pfitID, amount=1):
+ wx.Command.__init__(self, True, "")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.fitID = fitID
+ self.pfitID = pfitID
+ self.amount = amount
+ self.internal_history = wx.CommandProcessor()
+
+ def Do(self):
+ cmd = FitChangeProjectedFitQty(self.fitID, self.pfitID, self.amount)
+ if self.internal_history.Submit(cmd):
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ pyfalog.debug("{} Undo()".format(self))
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiFitRename.py b/gui/fitCommands/guiFitRename.py
new file mode 100644
index 000000000..b9a7a81d7
--- /dev/null
+++ b/gui/fitCommands/guiFitRename.py
@@ -0,0 +1,30 @@
+import wx
+import gui.mainFrame
+from .calc.fitRename import FitRenameCommand
+from service.fit import Fit
+from logbook import Logger
+from gui.builtinShipBrowser.events import FitRenamed
+pyfalog = Logger(__name__)
+
+
+class GuiFitRenameCommand(wx.Command):
+ def __init__(self, fitID, newName):
+ wx.Command.__init__(self, True)
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.fitID = fitID
+ self.newName = newName
+ self.internal_history = wx.CommandProcessor()
+
+ def Do(self):
+ if self.internal_history.Submit(FitRenameCommand(self.fitID, self.newName)):
+ wx.PostEvent(self.mainFrame, FitRenamed(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ pyfalog.debug("{} Undo()".format(self))
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ wx.PostEvent(self.mainFrame, FitRenamed(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiMetaSwap.py b/gui/fitCommands/guiMetaSwap.py
new file mode 100644
index 000000000..13497a233
--- /dev/null
+++ b/gui/fitCommands/guiMetaSwap.py
@@ -0,0 +1,63 @@
+import wx
+from service.fit import Fit
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitRemoveImplant import FitRemoveImplantCommand
+from .calc.fitAddImplant import FitAddImplantCommand
+from .calc.fitRemoveBooster import FitRemoveBoosterCommand
+from .calc.fitAddBooster import FitAddBoosterCommand
+from .calc.fitRemoveCargo import FitRemoveCargoCommand
+from .calc.fitAddCargo import FitAddCargoCommand
+from .calc.fitReplaceModule import FitReplaceModuleCommand
+from .calc.fitAddFighter import FitAddFighterCommand
+from .calc.fitRemoveFighter import FitRemoveFighterCommand
+
+
+class GuiMetaSwapCommand(wx.Command):
+ def __init__(self, fitID, context, itemID, selection: list):
+ wx.Command.__init__(self, True, "Meta Swap")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.internal_history = wx.CommandProcessor()
+ self.fitID = fitID
+ self.itemID = itemID
+ self.context = context
+ self.data = []
+ fit = self.sFit.getFit(fitID)
+
+ if context == 'fittingModule':
+ for x in selection:
+ self.data.append(((FitReplaceModuleCommand, fitID, fit.modules.index(x), itemID),),)
+ elif context == 'implantItem':
+ for x in selection:
+ idx = fit.implants.index(x)
+ self.data.append(((FitRemoveImplantCommand, fitID, idx), (FitAddImplantCommand, fitID, itemID)))
+ elif context == 'boosterItem':
+ for x in selection:
+ idx = fit.boosters.index(x)
+ self.data.append(((FitRemoveBoosterCommand, fitID, idx), (FitAddBoosterCommand, fitID, itemID)))
+ elif context == 'cargoItem':
+ for x in selection:
+ self.data.append(((FitRemoveCargoCommand, fitID, x.itemID, 1, True), (FitAddCargoCommand, fitID, itemID, x.amount)))
+ elif context == 'fighterItem':
+ for x in selection:
+ self.data.append(((FitRemoveFighterCommand, fitID, fit.fighters.index(x)), (FitAddFighterCommand, fitID, itemID)))
+ elif context == 'droneItem':
+ raise NotImplementedError()
+
+ def Do(self):
+ for cmds in self.data:
+ for cmd in cmds:
+ self.internal_history.Submit(cmd[0](*cmd[1:]))
+
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiModuleToCargo.py b/gui/fitCommands/guiModuleToCargo.py
new file mode 100644
index 000000000..66a9f9833
--- /dev/null
+++ b/gui/fitCommands/guiModuleToCargo.py
@@ -0,0 +1,73 @@
+import wx
+from logbook import Logger
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from gui.fitCommands.calc.fitRemoveCargo import FitRemoveCargoCommand
+from gui.fitCommands.calc.fitRemoveModule import FitRemoveModuleCommand
+from gui.fitCommands.calc.fitReplaceModule import FitReplaceModuleCommand
+from service.fit import Fit
+from .calc.fitAddCargo import FitAddCargoCommand
+
+pyfalog = Logger(__name__)
+
+
+class GuiModuleToCargoCommand(wx.Command):
+ def __init__(self, fitID, moduleIdx, cargoIdx, copy=False):
+ wx.Command.__init__(self, True, "Module State Change")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.fitID = fitID
+ self.moduleIdx = moduleIdx
+ self.cargoIdx = cargoIdx
+ self.copy = copy
+ self.internal_history = wx.CommandProcessor()
+
+ def Do(self):
+ sFit = Fit.getInstance()
+ fit = sFit.getFit(self.fitID)
+ module = fit.modules[self.moduleIdx]
+ result = False
+
+ if self.cargoIdx: # we're swapping with cargo
+ if self.copy: # if copying, simply add item to cargo
+ result = self.internal_history.Submit(FitAddCargoCommand(
+ self.mainFrame.getActiveFit(), module.item.ID if not module.item.isAbyssal else module.baseItemID))
+ else: # otherwise, try to swap by replacing module with cargo item. If successful, remove old cargo and add new cargo
+
+ cargo = fit.cargo[self.cargoIdx]
+ self.modReplaceCmd = FitReplaceModuleCommand(self.fitID, module.modPosition, cargo.itemID)
+
+ result = self.internal_history.Submit(self.modReplaceCmd)
+
+ if not result:
+ # creating module failed for whatever reason
+ return False
+
+ if self.modReplaceCmd.old_module is not None:
+ # we're swapping with an existing module, so remove cargo and add module
+ self.removeCmd = FitRemoveCargoCommand(self.fitID, cargo.itemID)
+ result = self.internal_history.Submit(self.removeCmd)
+
+ self.addCargoCmd = FitAddCargoCommand(self.fitID, self.modReplaceCmd.old_module.itemID)
+ result = self.internal_history.Submit(self.addCargoCmd)
+
+ else: # dragging to blank spot, append
+ result = self.internal_history.Submit(FitAddCargoCommand(self.mainFrame.getActiveFit(),
+ module.item.ID if not module.item.isAbyssal else module.baseItemID))
+
+ if not self.copy: # if not copying, remove module
+ self.internal_history.Submit(FitRemoveModuleCommand(self.mainFrame.getActiveFit(), [self.moduleIdx]))
+
+ if result:
+ sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID, action="moddel", typeID=module.item.ID))
+
+ return result
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiRemoveBooster.py b/gui/fitCommands/guiRemoveBooster.py
new file mode 100644
index 000000000..15b504575
--- /dev/null
+++ b/gui/fitCommands/guiRemoveBooster.py
@@ -0,0 +1,30 @@
+import wx
+from service.fit import Fit
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitRemoveBooster import FitRemoveBoosterCommand
+
+
+class GuiRemoveBoosterCommand(wx.Command):
+ def __init__(self, fitID, position):
+ wx.Command.__init__(self, True, "")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.internal_history = wx.CommandProcessor()
+ self.fitID = fitID
+ self.position = position
+
+ def Do(self):
+ if self.internal_history.Submit(FitRemoveBoosterCommand(self.fitID, self.position)):
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiRemoveCargo.py b/gui/fitCommands/guiRemoveCargo.py
new file mode 100644
index 000000000..f9aa5872a
--- /dev/null
+++ b/gui/fitCommands/guiRemoveCargo.py
@@ -0,0 +1,28 @@
+import wx
+from service.fit import Fit
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitRemoveCargo import FitRemoveCargoCommand
+
+
+class GuiRemoveCargoCommand(wx.Command):
+ def __init__(self, fitID, itemID):
+ wx.Command.__init__(self, True, "Module Charge Add")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.internal_history = wx.CommandProcessor()
+ self.fitID = fitID
+ self.itemID = itemID
+
+ def Do(self):
+ if self.internal_history.Submit(FitRemoveCargoCommand(self.fitID, self.itemID, stack=True)):
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ for _ in self.internal_history.GetCommands():
+ self.internal_history.Undo()
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiRemoveCommand.py b/gui/fitCommands/guiRemoveCommand.py
new file mode 100644
index 000000000..206be23c3
--- /dev/null
+++ b/gui/fitCommands/guiRemoveCommand.py
@@ -0,0 +1,30 @@
+import wx
+from service.fit import Fit
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitRemoveCommand import FitRemoveCommandCommand
+
+
+class GuiRemoveCommandCommand(wx.Command):
+ def __init__(self, fitID, commandFitID):
+ wx.Command.__init__(self, True, "")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.internal_history = wx.CommandProcessor()
+ self.fitID = fitID
+ self.commandFitID = commandFitID
+
+ def Do(self):
+ if self.internal_history.Submit(FitRemoveCommandCommand(self.fitID, self.commandFitID)):
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiRemoveDrone.py b/gui/fitCommands/guiRemoveDrone.py
new file mode 100644
index 000000000..42e651e3d
--- /dev/null
+++ b/gui/fitCommands/guiRemoveDrone.py
@@ -0,0 +1,31 @@
+import wx
+from service.fit import Fit
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitRemoveDrone import FitRemoveDroneCommand
+
+
+class GuiRemoveDroneCommand(wx.Command):
+ def __init__(self, fitID, position, amount=1):
+ wx.Command.__init__(self, True, "Cargo Add")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.internal_history = wx.CommandProcessor()
+ self.fitID = fitID
+ self.position = position
+ self.amount = amount
+
+ def Do(self):
+ cmd = FitRemoveDroneCommand(self.fitID, self.position, self.amount)
+ if self.internal_history.Submit(cmd):
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiRemoveFighter.py b/gui/fitCommands/guiRemoveFighter.py
new file mode 100644
index 000000000..f1b983ec5
--- /dev/null
+++ b/gui/fitCommands/guiRemoveFighter.py
@@ -0,0 +1,32 @@
+import wx
+from service.fit import Fit
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitRemoveFighter import FitRemoveFighterCommand
+
+
+class GuiRemoveFighterCommand(wx.Command):
+ def __init__(self, fitID, position):
+ wx.Command.__init__(self, True, "Module Remove")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.fitID = fitID
+ self.position = position
+ self.internal_history = wx.CommandProcessor()
+
+ def Do(self):
+ success = self.internal_history.Submit(FitRemoveFighterCommand(self.fitID, self.position))
+
+ if success:
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiRemoveImplant.py b/gui/fitCommands/guiRemoveImplant.py
new file mode 100644
index 000000000..af9ee74bc
--- /dev/null
+++ b/gui/fitCommands/guiRemoveImplant.py
@@ -0,0 +1,28 @@
+import wx
+from service.fit import Fit
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitRemoveImplant import FitRemoveImplantCommand
+
+
+class GuiRemoveImplantCommand(wx.Command):
+ def __init__(self, fitID, position):
+ wx.Command.__init__(self, True, "")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.internal_history = wx.CommandProcessor()
+ self.fitID = fitID
+ self.position = position
+
+ def Do(self):
+ if self.internal_history.Submit(FitRemoveImplantCommand(self.fitID, self.position)):
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiRemoveModule.py b/gui/fitCommands/guiRemoveModule.py
new file mode 100644
index 000000000..944a63160
--- /dev/null
+++ b/gui/fitCommands/guiRemoveModule.py
@@ -0,0 +1,40 @@
+import wx
+from service.fit import Fit
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from .helpers import ModuleInfoCache
+from .calc.fitRemoveModule import FitRemoveModuleCommand
+
+
+class GuiModuleRemoveCommand(wx.Command):
+ def __init__(self, fitID, modules):
+ """
+ Handles removing modules from fit.modules,
+
+ :param fitID: The fit ID that we are modifying
+ :param modules: A list of Module objects that we are attempting to remove.
+ """
+ wx.Command.__init__(self, True, "Module Remove")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.fitID = fitID
+ self.modCache = [ModuleInfoCache(
+ mod.modPosition, mod.item.ID, mod.state, mod.charge, mod.baseItemID, mod.mutaplasmidID) for mod in modules if not mod.isEmpty]
+ self.internal_history = wx.CommandProcessor()
+
+ def Do(self):
+ success = self.internal_history.Submit(FitRemoveModuleCommand(self.fitID, [mod.modPosition for mod in self.modCache]))
+
+ if success:
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID, action="moddel", typeID=set([mod.itemID for mod in self.modCache])))
+ return True
+ return False
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID, action="modadd", typeID=set([mod.itemID for mod in self.modCache])))
+ return True
diff --git a/gui/fitCommands/guiRemoveProjected.py b/gui/fitCommands/guiRemoveProjected.py
new file mode 100644
index 000000000..74d1ab308
--- /dev/null
+++ b/gui/fitCommands/guiRemoveProjected.py
@@ -0,0 +1,89 @@
+import wx
+from service.fit import Fit
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitRemoveProjectedModule import FitRemoveProjectedModuleCommand
+from .calc.fitRemoveProjectedEnv import FitRemoveProjectedEnvCommand
+from .calc.fitRemoveProjectedFit import FitRemoveProjectedFitCommand
+from .calc.fitRemoveProjectedFighter import FitRemoveProjectedFighterCommand
+from logbook import Logger
+from .calc.fitRemoveProjectedDrone import FitRemoveProjectedDroneCommand
+
+from eos.saveddata.drone import Drone
+from eos.saveddata.module import Module
+from eos.saveddata.fighter import Fighter
+
+pyfalog = Logger(__name__)
+
+
+class GuiRemoveProjectedCommand(wx.Command):
+ mapping = {
+ 'fit': FitRemoveProjectedFitCommand,
+ 'module': FitRemoveProjectedModuleCommand,
+ 'fighter': FitRemoveProjectedFighterCommand,
+ 'env': FitRemoveProjectedEnvCommand,
+ 'drone': FitRemoveProjectedDroneCommand
+ }
+
+ def __init__(self, fitID, thing):
+ wx.Command.__init__(self, True, "Projected Add")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.internal_history = wx.CommandProcessor()
+ self.fitID = fitID
+ fit = self.sFit.getFit(fitID)
+
+ if isinstance(thing, Drone):
+ self.data = fit.projectedDrones.index(thing)
+ self.type = 'drone'
+ elif isinstance(thing, Module):
+ # todo: projected stuff should be wrapped in a projected class wrapper for easier maintainence
+ if thing.item.group.name in Module.SYSTEM_GROUPS:
+ self.type = 'env'
+ self.data = thing.itemID
+ else:
+ self.type = 'module'
+ self.data = fit.projectedModules.index(thing)
+ elif isinstance(thing, Fighter):
+ self.data = fit.projectedFighters.index(thing)
+ self.type = 'fighter'
+ else:
+ # todo: fix!
+ self.data = thing.ID
+ self.type = 'fit'
+
+ def Do(self):
+ result = False
+ # since we can project various types, we need to switch of the fit command. We can't do this switch easily in
+ # the fit command since each type might have a different kind of undo, easier to split it out
+
+ cls = self.mapping.get(self.type, None)
+ if cls:
+ cmd = cls(self.fitID, self.data)
+ result = self.internal_history.Submit(cmd)
+
+ # if item.category.name == "Drone":
+ # pyfalog.warn("DRONE REMOVE PROJECTION NOT IMPLEMENTED")
+ # elif item.category.name == "Fighter":
+ # pyfalog.warn("FIGHTER REMOVE PROJECTION NOT IMPLEMENTED")
+ # elif item.group.name in Module.SYSTEM_GROUPS:
+ # result = self.internal_history.Submit(FitRemoveProjectedEnvCommand(self.fitID, self.id))
+ # else:
+ # # attempt a regular module projection
+ #
+ # elif self.type == 'fit':
+ # pyfalog.warn("FIT REMOVE PROJECTION NOT IMPLEMENTED")
+
+ if result:
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiSetMode.py b/gui/fitCommands/guiSetMode.py
new file mode 100644
index 000000000..9639028f9
--- /dev/null
+++ b/gui/fitCommands/guiSetMode.py
@@ -0,0 +1,30 @@
+import wx
+from service.fit import Fit
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitSetMode import FitSetModeCommand
+
+
+class GuiSetModeCommand(wx.Command):
+ def __init__(self, fitID, mode):
+ wx.Command.__init__(self, True, "Cargo Add")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.internal_history = wx.CommandProcessor()
+ self.fitID = fitID
+ self.mode = mode
+
+ def Do(self):
+ if self.internal_history.Submit(FitSetModeCommand(self.fitID, self.mode)):
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiSwapCloneModule.py b/gui/fitCommands/guiSwapCloneModule.py
new file mode 100644
index 000000000..cbeaf0845
--- /dev/null
+++ b/gui/fitCommands/guiSwapCloneModule.py
@@ -0,0 +1,50 @@
+import wx
+from service.fit import Fit
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from gui.fitCommands.calc.fitSwapModule import FitSwapModuleCommand
+from .calc.fitCloneModule import FitCloneModuleCommand
+from logbook import Logger
+pyfalog = Logger(__name__)
+
+
+class GuiModuleSwapOrCloneCommand(wx.Command):
+
+ def __init__(self, fitID, srcPosition, dstPosition, clone=False):
+ wx.Command.__init__(self, True, "Module State Change")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.fitID = fitID
+ self.srcPosition = srcPosition
+ self.dstPosition = dstPosition
+ self.clone = clone
+ self.internal_history = wx.CommandProcessor()
+
+ def Do(self):
+ pyfalog.debug("{} Do()".format(self))
+
+ if self.clone:
+ pyfalog.debug("Trying to clone module")
+ if self.internal_history.Submit(FitCloneModuleCommand(self.fitID, self.srcPosition, self.dstPosition)):
+ self.sFit.recalc(self.fitID) # clone needs a recalc
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ else:
+ pyfalog.debug("Trying to Swap module")
+ if self.internal_history.Submit(FitSwapModuleCommand(self.fitID, self.srcPosition, self.dstPosition)):
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+
+ return False
+
+ def Undo(self):
+ pyfalog.debug("{} Undo()".format(self))
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+
+ if self.clone:
+ self.sFit.recalc(self.fitID)
+
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiToggleBooster.py b/gui/fitCommands/guiToggleBooster.py
new file mode 100644
index 000000000..2a586a888
--- /dev/null
+++ b/gui/fitCommands/guiToggleBooster.py
@@ -0,0 +1,30 @@
+import wx
+from service.fit import Fit
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitToggleBooster import FitToggleBoosterCommand
+
+
+class GuiToggleBoosterCommand(wx.Command):
+ def __init__(self, fitID, position):
+ wx.Command.__init__(self, True, "")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.internal_history = wx.CommandProcessor()
+ self.fitID = fitID
+ self.position = position
+
+ def Do(self):
+ if self.internal_history.Submit(FitToggleBoosterCommand(self.fitID, self.position)):
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiToggleCommand.py b/gui/fitCommands/guiToggleCommand.py
new file mode 100644
index 000000000..50785da26
--- /dev/null
+++ b/gui/fitCommands/guiToggleCommand.py
@@ -0,0 +1,30 @@
+import wx
+from service.fit import Fit
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitToggleCommand import FitToggleCommandCommand
+
+
+class GuiToggleCommandCommand(wx.Command):
+ def __init__(self, fitID, commandFitID):
+ wx.Command.__init__(self, True, "")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.internal_history = wx.CommandProcessor()
+ self.fitID = fitID
+ self.commandFitID = commandFitID
+
+ def Do(self):
+ if self.internal_history.Submit(FitToggleCommandCommand(self.fitID, self.commandFitID)):
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiToggleDrone.py b/gui/fitCommands/guiToggleDrone.py
new file mode 100644
index 000000000..7913df516
--- /dev/null
+++ b/gui/fitCommands/guiToggleDrone.py
@@ -0,0 +1,30 @@
+import wx
+from service.fit import Fit
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitToggleDrone import FitToggleDroneCommand
+
+
+class GuiToggleDroneCommand(wx.Command):
+ def __init__(self, fitID, position):
+ wx.Command.__init__(self, True, "")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.internal_history = wx.CommandProcessor()
+ self.fitID = fitID
+ self.position = position
+
+ def Do(self):
+ if self.internal_history.Submit(FitToggleDroneCommand(self.fitID, self.position)):
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiToggleFighter.py b/gui/fitCommands/guiToggleFighter.py
new file mode 100644
index 000000000..f5aee10d6
--- /dev/null
+++ b/gui/fitCommands/guiToggleFighter.py
@@ -0,0 +1,30 @@
+import wx
+from service.fit import Fit
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitToggleFighter import FitToggleFighterCommand
+
+
+class GuiToggleFighterCommand(wx.Command):
+ def __init__(self, fitID, position):
+ wx.Command.__init__(self, True, "")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.internal_history = wx.CommandProcessor()
+ self.fitID = fitID
+ self.position = position
+
+ def Do(self):
+ if self.internal_history.Submit(FitToggleFighterCommand(self.fitID, self.position)):
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiToggleImplant.py b/gui/fitCommands/guiToggleImplant.py
new file mode 100644
index 000000000..899eff0ee
--- /dev/null
+++ b/gui/fitCommands/guiToggleImplant.py
@@ -0,0 +1,30 @@
+import wx
+from service.fit import Fit
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitToggleImplant import FitToggleImplantCommand
+
+
+class GuiToggleImplantCommand(wx.Command):
+ def __init__(self, fitID, position):
+ wx.Command.__init__(self, True, "")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.internal_history = wx.CommandProcessor()
+ self.fitID = fitID
+ self.position = position
+
+ def Do(self):
+ if self.internal_history.Submit(FitToggleImplantCommand(self.fitID, self.position)):
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/guiToggleModuleState.py b/gui/fitCommands/guiToggleModuleState.py
new file mode 100644
index 000000000..71e307f93
--- /dev/null
+++ b/gui/fitCommands/guiToggleModuleState.py
@@ -0,0 +1,33 @@
+import wx
+from service.fit import Fit
+
+import gui.mainFrame
+from gui import globalEvents as GE
+from .calc.fitChangeState import FitChangeStatesCommand
+
+
+class GuiModuleStateChangeCommand(wx.Command):
+ def __init__(self, fitID, baseMod, modules, click):
+ # todo: instead of modules, needs to be positions. Dead objects are a thing
+ wx.Command.__init__(self, True, "Module State Change")
+ self.mainFrame = gui.mainFrame.MainFrame.getInstance()
+ self.sFit = Fit.getInstance()
+ self.fitID = fitID
+ self.baseMod = baseMod
+ self.modules = modules
+ self.click = click
+ self.internal_history = wx.CommandProcessor()
+
+ def Do(self):
+ if self.internal_history.Submit(FitChangeStatesCommand(self.fitID, self.baseMod, self.modules, self.click)):
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
+ return False
+
+ def Undo(self):
+ for _ in self.internal_history.Commands:
+ self.internal_history.Undo()
+ self.sFit.recalc(self.fitID)
+ wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID))
+ return True
diff --git a/gui/fitCommands/helpers.py b/gui/fitCommands/helpers.py
new file mode 100644
index 000000000..63aaf4b76
--- /dev/null
+++ b/gui/fitCommands/helpers.py
@@ -0,0 +1,3 @@
+from collections import namedtuple
+
+ModuleInfoCache = namedtuple('ModuleInfoCache', ['modPosition', 'itemID', 'state', 'charge', 'baseID', 'mutaplasmidID'])
diff --git a/gui/mainFrame.py b/gui/mainFrame.py
index e5f9fd830..2a3665f74 100644
--- a/gui/mainFrame.py
+++ b/gui/mainFrame.py
@@ -17,77 +17,62 @@
# along with pyfa. If not, see .
# =============================================================================
-import sys
-import os.path
-from logbook import Logger
-
-import sqlalchemy
-# noinspection PyPackageRequirements
-import wx
-# noinspection PyPackageRequirements
-from wx.lib.wordwrap import wordwrap
-# noinspection PyPackageRequirements
-from wx.lib.inspection import InspectionTool
-import time
-
-from codecs import open
-
-import config
-
-from eos.config import gamedata_version, gamedata_date
import datetime
-
-import gui.aboutData
-from gui.chrome_tabs import ChromeNotebook
-import gui.globalEvents as GE
-
-from gui.bitmap_loader import BitmapLoader
-from gui.mainMenuBar import MainMenuBar
-from gui.additionsPane import AdditionsPane
-from gui.marketBrowser import MarketBrowser
-from gui.builtinMarketBrowser.events import ItemSelected
-from gui.multiSwitch import MultiSwitch
-from gui.statsPane import StatsPane
-from gui.shipBrowser import ShipBrowser
-from gui.builtinShipBrowser.events import FitSelected, ImportSelected, Stage3Selected
-from gui.characterEditor import CharacterEditor
-from gui.characterSelection import CharacterSelection
-from gui.patternEditor import DmgPatternEditorDlg
-from gui.resistsEditor import ResistsEditorDlg
-from gui.setEditor import ImplantSetEditorDlg
-from gui.devTools import DevTools
-from gui.preferenceDialog import PreferenceDialog
-from gui.graphFrame import GraphFrame
-from gui.ssoLogin import SsoLogin
-from gui.copySelectDialog import CopySelectDialog
-from gui.utils.clipboard import toClipboard, fromClipboard
-from gui.updateDialog import UpdateDialog
-# noinspection PyUnresolvedReferences
-from gui.builtinViews import emptyView, entityEditor, fittingView, implantEditor # noqa: F401
-from gui import graphFrame
-
-from service.settings import SettingsProvider
-from service.fit import Fit
-from service.character import Character
-from service.update import Update
-from service.esiAccess import SsoMode
-
-# import this to access override setting
-from eos.modifiedAttributeDict import ModifiedAttributeDict
-from eos.db.saveddata.loadDefaultDatabaseValues import DefaultDatabaseValues
-from eos.db.saveddata.queries import getFit as db_getFit
-from service.port import Port, IPortUser
-from service.efsPort import EfsPort
-from service.settings import HTMLExportSettings
-
+import os.path
+import threading
+import time
+import webbrowser
+from codecs import open
from time import gmtime, strftime
-import threading
-import webbrowser
+# noinspection PyPackageRequirements
+import wx
import wx.adv
+from logbook import Logger
+# noinspection PyPackageRequirements
+# noinspection PyPackageRequirements
+from wx.lib.inspection import InspectionTool
-from service.esi import Esi, LoginMethod
+import config
+import gui.globalEvents as GE
+from eos.config import gamedata_date, gamedata_version
+from eos.db.saveddata.loadDefaultDatabaseValues import DefaultDatabaseValues
+from eos.db.saveddata.queries import getFit as db_getFit
+# import this to access override setting
+from eos.modifiedAttributeDict import ModifiedAttributeDict
+from gui import graphFrame
+from gui.additionsPane import AdditionsPane
+from gui.bitmap_loader import BitmapLoader
+from gui.builtinMarketBrowser.events import ItemSelected
+from gui.builtinShipBrowser.events import FitSelected, ImportSelected, Stage3Selected
+# noinspection PyUnresolvedReferences
+from gui.builtinViews import emptyView, entityEditor, fittingView, implantEditor # noqa: F401
+from gui.characterEditor import CharacterEditor
+from gui.characterSelection import CharacterSelection
+from gui.chrome_tabs import ChromeNotebook
+from gui.copySelectDialog import CopySelectDialog
+from gui.devTools import DevTools
from gui.esiFittings import EveFittings, ExportToEve, SsoCharacterMgmt
+from gui.graphFrame import GraphFrame
+from gui.mainMenuBar import MainMenuBar
+from gui.marketBrowser import MarketBrowser
+from gui.multiSwitch import MultiSwitch
+from gui.patternEditor import DmgPatternEditorDlg
+from gui.preferenceDialog import PreferenceDialog
+from gui.resistsEditor import ResistsEditorDlg
+from gui.setEditor import ImplantSetEditorDlg
+from gui.shipBrowser import ShipBrowser
+from gui.ssoLogin import SsoLogin
+from gui.statsPane import StatsPane
+from gui.updateDialog import UpdateDialog
+from gui.utils.clipboard import fromClipboard, toClipboard
+from service.character import Character
+from service.esi import Esi, LoginMethod
+from service.esiAccess import SsoMode
+from service.fit import Fit
+from service.port import EfsPort, IPortUser, Port
+from service.settings import HTMLExportSettings, SettingsProvider
+from service.update import Update
disableOverrideEditor = False
@@ -246,6 +231,10 @@ class MainFrame(wx.Frame):
self.Bind(GE.EVT_SSO_LOGIN, self.onSSOLogin)
self.Bind(GE.EVT_SSO_LOGGING_IN, self.ShowSsoLogin)
+ @property
+ def command(self) -> wx.CommandProcessor:
+ return Fit.getCommandProcessor(self.getActiveFit())
+
def ShowSsoLogin(self, event):
if getattr(event, "login_mode", LoginMethod.SERVER) == LoginMethod.MANUAL and getattr(event, "sso_mode", SsoMode.AUTO) == SsoMode.AUTO:
dlg = SsoLogin(self)
@@ -517,6 +506,10 @@ class MainFrame(wx.Frame):
self.Bind(wx.EVT_MENU, self.showPreferenceDialog, id=wx.ID_PREFERENCES)
# User guide
self.Bind(wx.EVT_MENU, self.goWiki, id=menuBar.wikiId)
+
+ self.Bind(wx.EVT_MENU, lambda evt: MainFrame.getInstance().command.Undo(), id=wx.ID_UNDO)
+
+ self.Bind(wx.EVT_MENU, lambda evt: MainFrame.getInstance().command.Redo(), id=wx.ID_REDO)
# EVE Forums
self.Bind(wx.EVT_MENU, self.goForums, id=menuBar.forumId)
# Save current character
@@ -705,31 +698,31 @@ class MainFrame(wx.Frame):
else:
self.marketBrowser.search.Focus()
- def clipboardEft(self):
+ def clipboardEft(self, options):
fit = db_getFit(self.getActiveFit())
- toClipboard(Port.exportEft(fit))
+ toClipboard(Port.exportEft(fit, options))
- def clipboardEftImps(self):
+ def clipboardEftImps(self, options):
fit = db_getFit(self.getActiveFit())
toClipboard(Port.exportEftImps(fit))
- def clipboardDna(self):
+ def clipboardDna(self, options):
fit = db_getFit(self.getActiveFit())
toClipboard(Port.exportDna(fit))
- def clipboardEsi(self):
+ def clipboardEsi(self, options):
fit = db_getFit(self.getActiveFit())
toClipboard(Port.exportESI(fit))
- def clipboardXml(self):
+ def clipboardXml(self, options):
fit = db_getFit(self.getActiveFit())
toClipboard(Port.exportXml(None, fit))
- def clipboardMultiBuy(self):
+ def clipboardMultiBuy(self, options):
fit = db_getFit(self.getActiveFit())
toClipboard(Port.exportMultiBuy(fit))
- def clipboardEfs(self):
+ def clipboardEfs(self, options):
fit = db_getFit(self.getActiveFit())
toClipboard(EfsPort.exportEfs(fit, 0))
@@ -744,7 +737,7 @@ class MainFrame(wx.Frame):
def exportToClipboard(self, event):
CopySelectDict = {CopySelectDialog.copyFormatEft: self.clipboardEft,
- CopySelectDialog.copyFormatEftImps: self.clipboardEftImps,
+ # CopySelectDialog.copyFormatEftImps: self.clipboardEftImps,
CopySelectDialog.copyFormatXml: self.clipboardXml,
CopySelectDialog.copyFormatDna: self.clipboardDna,
CopySelectDialog.copyFormatEsi: self.clipboardEsi,
@@ -753,8 +746,13 @@ class MainFrame(wx.Frame):
dlg = CopySelectDialog(self)
dlg.ShowModal()
selected = dlg.GetSelected()
+ options = dlg.GetOptions()
- CopySelectDict[selected]()
+ settings = SettingsProvider.getInstance().getSettings("pyfaExport")
+ settings["format"] = selected
+ settings["options"] = options
+
+ CopySelectDict[selected](options)
try:
dlg.Destroy()
diff --git a/gui/mainMenuBar.py b/gui/mainMenuBar.py
index 9c421f779..c0a28f1dc 100644
--- a/gui/mainMenuBar.py
+++ b/gui/mainMenuBar.py
@@ -90,8 +90,8 @@ class MainMenuBar(wx.MenuBar):
editMenu = wx.Menu()
self.Append(editMenu, "&Edit")
- # editMenu.Append(wx.ID_UNDO)
- # editMenu.Append(wx.ID_REDO)
+ editMenu.Append(wx.ID_UNDO)
+ editMenu.Append(wx.ID_REDO)
editMenu.Append(wx.ID_COPY, "To Clipboard\tCTRL+C", "Export a fit to the clipboard")
editMenu.Append(wx.ID_PASTE, "From Clipboard\tCTRL+V", "Import a fit from the clipboard")
diff --git a/gui/pyfa_gauge.py b/gui/pyfa_gauge.py
index 61379c5b0..c3e3e1c16 100644
--- a/gui/pyfa_gauge.py
+++ b/gui/pyfa_gauge.py
@@ -14,11 +14,10 @@
# ===============================================================================
import copy
+
import wx
-from gui.utils import color as color_utils
-from gui.utils import draw, anim_effects
-from service.fit import Fit
+from gui.utils import anim_effects, color as color_utils, draw
class PyGauge(wx.Window):
diff --git a/imgs/icons/0.png b/imgs/icons/0@1x.png
similarity index 100%
rename from imgs/icons/0.png
rename to imgs/icons/0@1x.png
diff --git a/imgs/icons/0@2x.png b/imgs/icons/0@2x.png
new file mode 100644
index 000000000..e02237472
Binary files /dev/null and b/imgs/icons/0@2x.png differ
diff --git a/imgs/icons/10012.png b/imgs/icons/10012@1x.png
similarity index 100%
rename from imgs/icons/10012.png
rename to imgs/icons/10012@1x.png
diff --git a/imgs/icons/10012@2x.png b/imgs/icons/10012@2x.png
new file mode 100644
index 000000000..f87955112
Binary files /dev/null and b/imgs/icons/10012@2x.png differ
diff --git a/imgs/icons/10013.png b/imgs/icons/10013@1x.png
similarity index 100%
rename from imgs/icons/10013.png
rename to imgs/icons/10013@1x.png
diff --git a/imgs/icons/10013@2x.png b/imgs/icons/10013@2x.png
new file mode 100644
index 000000000..efab8c095
Binary files /dev/null and b/imgs/icons/10013@2x.png differ
diff --git a/imgs/icons/10014.png b/imgs/icons/10014@1x.png
similarity index 100%
rename from imgs/icons/10014.png
rename to imgs/icons/10014@1x.png
diff --git a/imgs/icons/10014@2x.png b/imgs/icons/10014@2x.png
new file mode 100644
index 000000000..d1fe53ff4
Binary files /dev/null and b/imgs/icons/10014@2x.png differ
diff --git a/imgs/icons/10015.png b/imgs/icons/10015@1x.png
similarity index 100%
rename from imgs/icons/10015.png
rename to imgs/icons/10015@1x.png
diff --git a/imgs/icons/10015@2x.png b/imgs/icons/10015@2x.png
new file mode 100644
index 000000000..1e48b6cce
Binary files /dev/null and b/imgs/icons/10015@2x.png differ
diff --git a/imgs/icons/10016.png b/imgs/icons/10016@1x.png
similarity index 100%
rename from imgs/icons/10016.png
rename to imgs/icons/10016@1x.png
diff --git a/imgs/icons/10016@2x.png b/imgs/icons/10016@2x.png
new file mode 100644
index 000000000..53ac9a1e2
Binary files /dev/null and b/imgs/icons/10016@2x.png differ
diff --git a/imgs/icons/10017.png b/imgs/icons/10017@1x.png
similarity index 100%
rename from imgs/icons/10017.png
rename to imgs/icons/10017@1x.png
diff --git a/imgs/icons/10017@2x.png b/imgs/icons/10017@2x.png
new file mode 100644
index 000000000..d88abfa3e
Binary files /dev/null and b/imgs/icons/10017@2x.png differ
diff --git a/imgs/icons/10018.png b/imgs/icons/10018@1x.png
similarity index 100%
rename from imgs/icons/10018.png
rename to imgs/icons/10018@1x.png
diff --git a/imgs/icons/10018@2x.png b/imgs/icons/10018@2x.png
new file mode 100644
index 000000000..2c3588107
Binary files /dev/null and b/imgs/icons/10018@2x.png differ
diff --git a/imgs/icons/10019.png b/imgs/icons/10019@1x.png
similarity index 100%
rename from imgs/icons/10019.png
rename to imgs/icons/10019@1x.png
diff --git a/imgs/icons/10019@2x.png b/imgs/icons/10019@2x.png
new file mode 100644
index 000000000..8288bda1f
Binary files /dev/null and b/imgs/icons/10019@2x.png differ
diff --git a/imgs/icons/10020.png b/imgs/icons/10020@1x.png
similarity index 100%
rename from imgs/icons/10020.png
rename to imgs/icons/10020@1x.png
diff --git a/imgs/icons/10020@2x.png b/imgs/icons/10020@2x.png
new file mode 100644
index 000000000..b907401f1
Binary files /dev/null and b/imgs/icons/10020@2x.png differ
diff --git a/imgs/icons/10021.png b/imgs/icons/10021@1x.png
similarity index 100%
rename from imgs/icons/10021.png
rename to imgs/icons/10021@1x.png
diff --git a/imgs/icons/10021@2x.png b/imgs/icons/10021@2x.png
new file mode 100644
index 000000000..70beb5013
Binary files /dev/null and b/imgs/icons/10021@2x.png differ
diff --git a/imgs/icons/10022.png b/imgs/icons/10022@1x.png
similarity index 100%
rename from imgs/icons/10022.png
rename to imgs/icons/10022@1x.png
diff --git a/imgs/icons/10022@2x.png b/imgs/icons/10022@2x.png
new file mode 100644
index 000000000..a9809aaee
Binary files /dev/null and b/imgs/icons/10022@2x.png differ
diff --git a/imgs/icons/10023.png b/imgs/icons/10023@1x.png
similarity index 100%
rename from imgs/icons/10023.png
rename to imgs/icons/10023@1x.png
diff --git a/imgs/icons/10023@2x.png b/imgs/icons/10023@2x.png
new file mode 100644
index 000000000..7fea2c526
Binary files /dev/null and b/imgs/icons/10023@2x.png differ
diff --git a/imgs/icons/10024.png b/imgs/icons/10024@1x.png
similarity index 100%
rename from imgs/icons/10024.png
rename to imgs/icons/10024@1x.png
diff --git a/imgs/icons/10024@2x.png b/imgs/icons/10024@2x.png
new file mode 100644
index 000000000..31dd84378
Binary files /dev/null and b/imgs/icons/10024@2x.png differ
diff --git a/imgs/icons/10025.png b/imgs/icons/10025@1x.png
similarity index 100%
rename from imgs/icons/10025.png
rename to imgs/icons/10025@1x.png
diff --git a/imgs/icons/10025@2x.png b/imgs/icons/10025@2x.png
new file mode 100644
index 000000000..cb6d4c1f6
Binary files /dev/null and b/imgs/icons/10025@2x.png differ
diff --git a/imgs/icons/10026.png b/imgs/icons/10026@1x.png
similarity index 100%
rename from imgs/icons/10026.png
rename to imgs/icons/10026@1x.png
diff --git a/imgs/icons/10026@2x.png b/imgs/icons/10026@2x.png
new file mode 100644
index 000000000..7219c8dfa
Binary files /dev/null and b/imgs/icons/10026@2x.png differ
diff --git a/imgs/icons/10027.png b/imgs/icons/10027@1x.png
similarity index 100%
rename from imgs/icons/10027.png
rename to imgs/icons/10027@1x.png
diff --git a/imgs/icons/10027@2x.png b/imgs/icons/10027@2x.png
new file mode 100644
index 000000000..788ccaec7
Binary files /dev/null and b/imgs/icons/10027@2x.png differ
diff --git a/imgs/icons/10028.png b/imgs/icons/10028@1x.png
similarity index 100%
rename from imgs/icons/10028.png
rename to imgs/icons/10028@1x.png
diff --git a/imgs/icons/10028@2x.png b/imgs/icons/10028@2x.png
new file mode 100644
index 000000000..5a80979df
Binary files /dev/null and b/imgs/icons/10028@2x.png differ
diff --git a/imgs/icons/10029.png b/imgs/icons/10029@1x.png
similarity index 100%
rename from imgs/icons/10029.png
rename to imgs/icons/10029@1x.png
diff --git a/imgs/icons/10029@2x.png b/imgs/icons/10029@2x.png
new file mode 100644
index 000000000..8c50be9c6
Binary files /dev/null and b/imgs/icons/10029@2x.png differ
diff --git a/imgs/icons/10030.png b/imgs/icons/10030@1x.png
similarity index 100%
rename from imgs/icons/10030.png
rename to imgs/icons/10030@1x.png
diff --git a/imgs/icons/10030@2x.png b/imgs/icons/10030@2x.png
new file mode 100644
index 000000000..2ffa1b48d
Binary files /dev/null and b/imgs/icons/10030@2x.png differ
diff --git a/imgs/icons/10031.png b/imgs/icons/10031@1x.png
similarity index 100%
rename from imgs/icons/10031.png
rename to imgs/icons/10031@1x.png
diff --git a/imgs/icons/10031@2x.png b/imgs/icons/10031@2x.png
new file mode 100644
index 000000000..017294ee0
Binary files /dev/null and b/imgs/icons/10031@2x.png differ
diff --git a/imgs/icons/10032.png b/imgs/icons/10032@1x.png
similarity index 100%
rename from imgs/icons/10032.png
rename to imgs/icons/10032@1x.png
diff --git a/imgs/icons/10032@2x.png b/imgs/icons/10032@2x.png
new file mode 100644
index 000000000..ae05da7c9
Binary files /dev/null and b/imgs/icons/10032@2x.png differ
diff --git a/imgs/icons/10033.png b/imgs/icons/10033@1x.png
similarity index 100%
rename from imgs/icons/10033.png
rename to imgs/icons/10033@1x.png
diff --git a/imgs/icons/10033@2x.png b/imgs/icons/10033@2x.png
new file mode 100644
index 000000000..052315bdd
Binary files /dev/null and b/imgs/icons/10033@2x.png differ
diff --git a/imgs/icons/10034.png b/imgs/icons/10034@1x.png
similarity index 100%
rename from imgs/icons/10034.png
rename to imgs/icons/10034@1x.png
diff --git a/imgs/icons/10034@2x.png b/imgs/icons/10034@2x.png
new file mode 100644
index 000000000..d053cfc5b
Binary files /dev/null and b/imgs/icons/10034@2x.png differ
diff --git a/imgs/icons/10035.png b/imgs/icons/10035@1x.png
similarity index 100%
rename from imgs/icons/10035.png
rename to imgs/icons/10035@1x.png
diff --git a/imgs/icons/10035@2x.png b/imgs/icons/10035@2x.png
new file mode 100644
index 000000000..406c44606
Binary files /dev/null and b/imgs/icons/10035@2x.png differ
diff --git a/imgs/icons/10036.png b/imgs/icons/10036@1x.png
similarity index 100%
rename from imgs/icons/10036.png
rename to imgs/icons/10036@1x.png
diff --git a/imgs/icons/10036@2x.png b/imgs/icons/10036@2x.png
new file mode 100644
index 000000000..cd840257f
Binary files /dev/null and b/imgs/icons/10036@2x.png differ
diff --git a/imgs/icons/10037.png b/imgs/icons/10037@1x.png
similarity index 100%
rename from imgs/icons/10037.png
rename to imgs/icons/10037@1x.png
diff --git a/imgs/icons/10037@2x.png b/imgs/icons/10037@2x.png
new file mode 100644
index 000000000..f951be26f
Binary files /dev/null and b/imgs/icons/10037@2x.png differ
diff --git a/imgs/icons/10038.png b/imgs/icons/10038@1x.png
similarity index 100%
rename from imgs/icons/10038.png
rename to imgs/icons/10038@1x.png
diff --git a/imgs/icons/10038@2x.png b/imgs/icons/10038@2x.png
new file mode 100644
index 000000000..5fdf380b9
Binary files /dev/null and b/imgs/icons/10038@2x.png differ
diff --git a/imgs/icons/10039.png b/imgs/icons/10039@1x.png
similarity index 100%
rename from imgs/icons/10039.png
rename to imgs/icons/10039@1x.png
diff --git a/imgs/icons/10039@2x.png b/imgs/icons/10039@2x.png
new file mode 100644
index 000000000..5ddbeea04
Binary files /dev/null and b/imgs/icons/10039@2x.png differ
diff --git a/imgs/icons/10040.png b/imgs/icons/10040@1x.png
similarity index 100%
rename from imgs/icons/10040.png
rename to imgs/icons/10040@1x.png
diff --git a/imgs/icons/10040@2x.png b/imgs/icons/10040@2x.png
new file mode 100644
index 000000000..a7ab3312c
Binary files /dev/null and b/imgs/icons/10040@2x.png differ
diff --git a/imgs/icons/10041.png b/imgs/icons/10041@1x.png
similarity index 100%
rename from imgs/icons/10041.png
rename to imgs/icons/10041@1x.png
diff --git a/imgs/icons/10041@2x.png b/imgs/icons/10041@2x.png
new file mode 100644
index 000000000..cb422d4dd
Binary files /dev/null and b/imgs/icons/10041@2x.png differ
diff --git a/imgs/icons/10042.png b/imgs/icons/10042@1x.png
similarity index 100%
rename from imgs/icons/10042.png
rename to imgs/icons/10042@1x.png
diff --git a/imgs/icons/10042@2x.png b/imgs/icons/10042@2x.png
new file mode 100644
index 000000000..3703a9b1f
Binary files /dev/null and b/imgs/icons/10042@2x.png differ
diff --git a/imgs/icons/10043.png b/imgs/icons/10043@1x.png
similarity index 100%
rename from imgs/icons/10043.png
rename to imgs/icons/10043@1x.png
diff --git a/imgs/icons/10043@2x.png b/imgs/icons/10043@2x.png
new file mode 100644
index 000000000..10ae26959
Binary files /dev/null and b/imgs/icons/10043@2x.png differ
diff --git a/imgs/icons/10044.png b/imgs/icons/10044@1x.png
similarity index 100%
rename from imgs/icons/10044.png
rename to imgs/icons/10044@1x.png
diff --git a/imgs/icons/10044@2x.png b/imgs/icons/10044@2x.png
new file mode 100644
index 000000000..ed6313db5
Binary files /dev/null and b/imgs/icons/10044@2x.png differ
diff --git a/imgs/icons/10045.png b/imgs/icons/10045@1x.png
similarity index 100%
rename from imgs/icons/10045.png
rename to imgs/icons/10045@1x.png
diff --git a/imgs/icons/10045@2x.png b/imgs/icons/10045@2x.png
new file mode 100644
index 000000000..f18f9ee8a
Binary files /dev/null and b/imgs/icons/10045@2x.png differ
diff --git a/imgs/icons/10046.png b/imgs/icons/10046@1x.png
similarity index 100%
rename from imgs/icons/10046.png
rename to imgs/icons/10046@1x.png
diff --git a/imgs/icons/10046@2x.png b/imgs/icons/10046@2x.png
new file mode 100644
index 000000000..0ba8b58ec
Binary files /dev/null and b/imgs/icons/10046@2x.png differ
diff --git a/imgs/icons/10047.png b/imgs/icons/10047@1x.png
similarity index 100%
rename from imgs/icons/10047.png
rename to imgs/icons/10047@1x.png
diff --git a/imgs/icons/10047@2x.png b/imgs/icons/10047@2x.png
new file mode 100644
index 000000000..97d850728
Binary files /dev/null and b/imgs/icons/10047@2x.png differ
diff --git a/imgs/icons/10048.png b/imgs/icons/10048@1x.png
similarity index 100%
rename from imgs/icons/10048.png
rename to imgs/icons/10048@1x.png
diff --git a/imgs/icons/10048@2x.png b/imgs/icons/10048@2x.png
new file mode 100644
index 000000000..f59ad4dc3
Binary files /dev/null and b/imgs/icons/10048@2x.png differ
diff --git a/imgs/icons/10049.png b/imgs/icons/10049@1x.png
similarity index 100%
rename from imgs/icons/10049.png
rename to imgs/icons/10049@1x.png
diff --git a/imgs/icons/10049@2x.png b/imgs/icons/10049@2x.png
new file mode 100644
index 000000000..ef9caa8d7
Binary files /dev/null and b/imgs/icons/10049@2x.png differ
diff --git a/imgs/icons/1004.png b/imgs/icons/1004@1x.png
similarity index 100%
rename from imgs/icons/1004.png
rename to imgs/icons/1004@1x.png
diff --git a/imgs/icons/1004@2x.png b/imgs/icons/1004@2x.png
new file mode 100644
index 000000000..bf71d6bb0
Binary files /dev/null and b/imgs/icons/1004@2x.png differ
diff --git a/imgs/icons/10050.png b/imgs/icons/10050@1x.png
similarity index 100%
rename from imgs/icons/10050.png
rename to imgs/icons/10050@1x.png
diff --git a/imgs/icons/10050@2x.png b/imgs/icons/10050@2x.png
new file mode 100644
index 000000000..e4614e18d
Binary files /dev/null and b/imgs/icons/10050@2x.png differ
diff --git a/imgs/icons/10051.png b/imgs/icons/10051@1x.png
similarity index 100%
rename from imgs/icons/10051.png
rename to imgs/icons/10051@1x.png
diff --git a/imgs/icons/10051@2x.png b/imgs/icons/10051@2x.png
new file mode 100644
index 000000000..377ad189c
Binary files /dev/null and b/imgs/icons/10051@2x.png differ
diff --git a/imgs/icons/10052.png b/imgs/icons/10052@1x.png
similarity index 100%
rename from imgs/icons/10052.png
rename to imgs/icons/10052@1x.png
diff --git a/imgs/icons/10052@2x.png b/imgs/icons/10052@2x.png
new file mode 100644
index 000000000..86487825b
Binary files /dev/null and b/imgs/icons/10052@2x.png differ
diff --git a/imgs/icons/10053.png b/imgs/icons/10053@1x.png
similarity index 100%
rename from imgs/icons/10053.png
rename to imgs/icons/10053@1x.png
diff --git a/imgs/icons/10053@2x.png b/imgs/icons/10053@2x.png
new file mode 100644
index 000000000..3a1ca33b3
Binary files /dev/null and b/imgs/icons/10053@2x.png differ
diff --git a/imgs/icons/10054.png b/imgs/icons/10054@1x.png
similarity index 100%
rename from imgs/icons/10054.png
rename to imgs/icons/10054@1x.png
diff --git a/imgs/icons/10054@2x.png b/imgs/icons/10054@2x.png
new file mode 100644
index 000000000..9078bb17f
Binary files /dev/null and b/imgs/icons/10054@2x.png differ
diff --git a/imgs/icons/10055.png b/imgs/icons/10055@1x.png
similarity index 100%
rename from imgs/icons/10055.png
rename to imgs/icons/10055@1x.png
diff --git a/imgs/icons/10055@2x.png b/imgs/icons/10055@2x.png
new file mode 100644
index 000000000..c2de9a541
Binary files /dev/null and b/imgs/icons/10055@2x.png differ
diff --git a/imgs/icons/10056.png b/imgs/icons/10056@1x.png
similarity index 100%
rename from imgs/icons/10056.png
rename to imgs/icons/10056@1x.png
diff --git a/imgs/icons/10056@2x.png b/imgs/icons/10056@2x.png
new file mode 100644
index 000000000..c57352686
Binary files /dev/null and b/imgs/icons/10056@2x.png differ
diff --git a/imgs/icons/10057.png b/imgs/icons/10057@1x.png
similarity index 100%
rename from imgs/icons/10057.png
rename to imgs/icons/10057@1x.png
diff --git a/imgs/icons/10057@2x.png b/imgs/icons/10057@2x.png
new file mode 100644
index 000000000..5e309e529
Binary files /dev/null and b/imgs/icons/10057@2x.png differ
diff --git a/imgs/icons/10058.png b/imgs/icons/10058@1x.png
similarity index 100%
rename from imgs/icons/10058.png
rename to imgs/icons/10058@1x.png
diff --git a/imgs/icons/10058@2x.png b/imgs/icons/10058@2x.png
new file mode 100644
index 000000000..f82c3e819
Binary files /dev/null and b/imgs/icons/10058@2x.png differ
diff --git a/imgs/icons/10071.png b/imgs/icons/10071@1x.png
similarity index 100%
rename from imgs/icons/10071.png
rename to imgs/icons/10071@1x.png
diff --git a/imgs/icons/10071@2x.png b/imgs/icons/10071@2x.png
new file mode 100644
index 000000000..8606a89df
Binary files /dev/null and b/imgs/icons/10071@2x.png differ
diff --git a/imgs/icons/10073.png b/imgs/icons/10073@1x.png
similarity index 100%
rename from imgs/icons/10073.png
rename to imgs/icons/10073@1x.png
diff --git a/imgs/icons/10073@2x.png b/imgs/icons/10073@2x.png
new file mode 100644
index 000000000..123d96c43
Binary files /dev/null and b/imgs/icons/10073@2x.png differ
diff --git a/imgs/icons/10074.png b/imgs/icons/10074@1x.png
similarity index 100%
rename from imgs/icons/10074.png
rename to imgs/icons/10074@1x.png
diff --git a/imgs/icons/10074@2x.png b/imgs/icons/10074@2x.png
new file mode 100644
index 000000000..d8061ccc0
Binary files /dev/null and b/imgs/icons/10074@2x.png differ
diff --git a/imgs/icons/10075.png b/imgs/icons/10075@1x.png
similarity index 100%
rename from imgs/icons/10075.png
rename to imgs/icons/10075@1x.png
diff --git a/imgs/icons/10075@2x.png b/imgs/icons/10075@2x.png
new file mode 100644
index 000000000..ab9e16a31
Binary files /dev/null and b/imgs/icons/10075@2x.png differ
diff --git a/imgs/icons/10076.png b/imgs/icons/10076@1x.png
similarity index 100%
rename from imgs/icons/10076.png
rename to imgs/icons/10076@1x.png
diff --git a/imgs/icons/10076@2x.png b/imgs/icons/10076@2x.png
new file mode 100644
index 000000000..fc0f8dd6e
Binary files /dev/null and b/imgs/icons/10076@2x.png differ
diff --git a/imgs/icons/10077.png b/imgs/icons/10077@1x.png
similarity index 100%
rename from imgs/icons/10077.png
rename to imgs/icons/10077@1x.png
diff --git a/imgs/icons/10077@2x.png b/imgs/icons/10077@2x.png
new file mode 100644
index 000000000..76110af19
Binary files /dev/null and b/imgs/icons/10077@2x.png differ
diff --git a/imgs/icons/10078.png b/imgs/icons/10078@1x.png
similarity index 100%
rename from imgs/icons/10078.png
rename to imgs/icons/10078@1x.png
diff --git a/imgs/icons/10078@2x.png b/imgs/icons/10078@2x.png
new file mode 100644
index 000000000..80822300e
Binary files /dev/null and b/imgs/icons/10078@2x.png differ
diff --git a/imgs/icons/10079.png b/imgs/icons/10079@1x.png
similarity index 100%
rename from imgs/icons/10079.png
rename to imgs/icons/10079@1x.png
diff --git a/imgs/icons/10079@2x.png b/imgs/icons/10079@2x.png
new file mode 100644
index 000000000..c1faf7622
Binary files /dev/null and b/imgs/icons/10079@2x.png differ
diff --git a/imgs/icons/1007.png b/imgs/icons/1007@1x.png
similarity index 100%
rename from imgs/icons/1007.png
rename to imgs/icons/1007@1x.png
diff --git a/imgs/icons/1007@2x.png b/imgs/icons/1007@2x.png
new file mode 100644
index 000000000..411159ff6
Binary files /dev/null and b/imgs/icons/1007@2x.png differ
diff --git a/imgs/icons/10132.png b/imgs/icons/10132@1x.png
similarity index 100%
rename from imgs/icons/10132.png
rename to imgs/icons/10132@1x.png
diff --git a/imgs/icons/10132@2x.png b/imgs/icons/10132@2x.png
new file mode 100644
index 000000000..48c23f3a8
Binary files /dev/null and b/imgs/icons/10132@2x.png differ
diff --git a/imgs/icons/10144.png b/imgs/icons/10144@1x.png
similarity index 100%
rename from imgs/icons/10144.png
rename to imgs/icons/10144@1x.png
diff --git a/imgs/icons/10144@2x.png b/imgs/icons/10144@2x.png
new file mode 100644
index 000000000..c8b2351a7
Binary files /dev/null and b/imgs/icons/10144@2x.png differ
diff --git a/imgs/icons/10149.png b/imgs/icons/10149@1x.png
similarity index 100%
rename from imgs/icons/10149.png
rename to imgs/icons/10149@1x.png
diff --git a/imgs/icons/10149@2x.png b/imgs/icons/10149@2x.png
new file mode 100644
index 000000000..01607d5b5
Binary files /dev/null and b/imgs/icons/10149@2x.png differ
diff --git a/imgs/icons/10151.png b/imgs/icons/10151@1x.png
similarity index 100%
rename from imgs/icons/10151.png
rename to imgs/icons/10151@1x.png
diff --git a/imgs/icons/10151@2x.png b/imgs/icons/10151@2x.png
new file mode 100644
index 000000000..dccddee0c
Binary files /dev/null and b/imgs/icons/10151@2x.png differ
diff --git a/imgs/icons/10153.png b/imgs/icons/10153@1x.png
similarity index 100%
rename from imgs/icons/10153.png
rename to imgs/icons/10153@1x.png
diff --git a/imgs/icons/10153@2x.png b/imgs/icons/10153@2x.png
new file mode 100644
index 000000000..233b4a976
Binary files /dev/null and b/imgs/icons/10153@2x.png differ
diff --git a/imgs/icons/10158.png b/imgs/icons/10158@1x.png
similarity index 100%
rename from imgs/icons/10158.png
rename to imgs/icons/10158@1x.png
diff --git a/imgs/icons/10158@2x.png b/imgs/icons/10158@2x.png
new file mode 100644
index 000000000..5ec6c6d05
Binary files /dev/null and b/imgs/icons/10158@2x.png differ
diff --git a/imgs/icons/10159.png b/imgs/icons/10159@1x.png
similarity index 100%
rename from imgs/icons/10159.png
rename to imgs/icons/10159@1x.png
diff --git a/imgs/icons/10159@2x.png b/imgs/icons/10159@2x.png
new file mode 100644
index 000000000..48bab70c3
Binary files /dev/null and b/imgs/icons/10159@2x.png differ
diff --git a/imgs/icons/10160.png b/imgs/icons/10160@1x.png
similarity index 100%
rename from imgs/icons/10160.png
rename to imgs/icons/10160@1x.png
diff --git a/imgs/icons/10160@2x.png b/imgs/icons/10160@2x.png
new file mode 100644
index 000000000..1d17b0fbf
Binary files /dev/null and b/imgs/icons/10160@2x.png differ
diff --git a/imgs/icons/10162.png b/imgs/icons/10162@1x.png
similarity index 100%
rename from imgs/icons/10162.png
rename to imgs/icons/10162@1x.png
diff --git a/imgs/icons/10162@2x.png b/imgs/icons/10162@2x.png
new file mode 100644
index 000000000..2b6642e02
Binary files /dev/null and b/imgs/icons/10162@2x.png differ
diff --git a/imgs/icons/10163.png b/imgs/icons/10163@1x.png
similarity index 100%
rename from imgs/icons/10163.png
rename to imgs/icons/10163@1x.png
diff --git a/imgs/icons/10163@2x.png b/imgs/icons/10163@2x.png
new file mode 100644
index 000000000..1458ca9c1
Binary files /dev/null and b/imgs/icons/10163@2x.png differ
diff --git a/imgs/icons/10176.png b/imgs/icons/10176@1x.png
similarity index 100%
rename from imgs/icons/10176.png
rename to imgs/icons/10176@1x.png
diff --git a/imgs/icons/10176@2x.png b/imgs/icons/10176@2x.png
new file mode 100644
index 000000000..b22ab99e0
Binary files /dev/null and b/imgs/icons/10176@2x.png differ
diff --git a/imgs/icons/10190.png b/imgs/icons/10190@1x.png
similarity index 100%
rename from imgs/icons/10190.png
rename to imgs/icons/10190@1x.png
diff --git a/imgs/icons/10190@2x.png b/imgs/icons/10190@2x.png
new file mode 100644
index 000000000..2dcf1fc50
Binary files /dev/null and b/imgs/icons/10190@2x.png differ
diff --git a/imgs/icons/10224.png b/imgs/icons/10224@1x.png
similarity index 100%
rename from imgs/icons/10224.png
rename to imgs/icons/10224@1x.png
diff --git a/imgs/icons/10224@2x.png b/imgs/icons/10224@2x.png
new file mode 100644
index 000000000..f505693b8
Binary files /dev/null and b/imgs/icons/10224@2x.png differ
diff --git a/imgs/icons/10234.png b/imgs/icons/10234@1x.png
similarity index 100%
rename from imgs/icons/10234.png
rename to imgs/icons/10234@1x.png
diff --git a/imgs/icons/10234@2x.png b/imgs/icons/10234@2x.png
new file mode 100644
index 000000000..5bc99efbb
Binary files /dev/null and b/imgs/icons/10234@2x.png differ
diff --git a/imgs/icons/10236.png b/imgs/icons/10236@1x.png
similarity index 100%
rename from imgs/icons/10236.png
rename to imgs/icons/10236@1x.png
diff --git a/imgs/icons/10236@2x.png b/imgs/icons/10236@2x.png
new file mode 100644
index 000000000..b5d0e8b53
Binary files /dev/null and b/imgs/icons/10236@2x.png differ
diff --git a/imgs/icons/10254.png b/imgs/icons/10254@1x.png
similarity index 100%
rename from imgs/icons/10254.png
rename to imgs/icons/10254@1x.png
diff --git a/imgs/icons/10254@2x.png b/imgs/icons/10254@2x.png
new file mode 100644
index 000000000..43c937518
Binary files /dev/null and b/imgs/icons/10254@2x.png differ
diff --git a/imgs/icons/10256.png b/imgs/icons/10256@1x.png
similarity index 100%
rename from imgs/icons/10256.png
rename to imgs/icons/10256@1x.png
diff --git a/imgs/icons/10256@2x.png b/imgs/icons/10256@2x.png
new file mode 100644
index 000000000..2d5e97e54
Binary files /dev/null and b/imgs/icons/10256@2x.png differ
diff --git a/imgs/icons/1029.png b/imgs/icons/1029@1x.png
similarity index 100%
rename from imgs/icons/1029.png
rename to imgs/icons/1029@1x.png
diff --git a/imgs/icons/1029@2x.png b/imgs/icons/1029@2x.png
new file mode 100644
index 000000000..82490f6dc
Binary files /dev/null and b/imgs/icons/1029@2x.png differ
diff --git a/imgs/icons/1030.png b/imgs/icons/1030@1x.png
similarity index 100%
rename from imgs/icons/1030.png
rename to imgs/icons/1030@1x.png
diff --git a/imgs/icons/1030@2x.png b/imgs/icons/1030@2x.png
new file mode 100644
index 000000000..45df201fa
Binary files /dev/null and b/imgs/icons/1030@2x.png differ
diff --git a/imgs/icons/1031.png b/imgs/icons/1031@1x.png
similarity index 100%
rename from imgs/icons/1031.png
rename to imgs/icons/1031@1x.png
diff --git a/imgs/icons/1031@2x.png b/imgs/icons/1031@2x.png
new file mode 100644
index 000000000..11b72bc59
Binary files /dev/null and b/imgs/icons/1031@2x.png differ
diff --git a/imgs/icons/1033.png b/imgs/icons/1033@1x.png
similarity index 100%
rename from imgs/icons/1033.png
rename to imgs/icons/1033@1x.png
diff --git a/imgs/icons/1033@2x.png b/imgs/icons/1033@2x.png
new file mode 100644
index 000000000..394c5e204
Binary files /dev/null and b/imgs/icons/1033@2x.png differ
diff --git a/imgs/icons/1035.png b/imgs/icons/1035@1x.png
similarity index 100%
rename from imgs/icons/1035.png
rename to imgs/icons/1035@1x.png
diff --git a/imgs/icons/1035@2x.png b/imgs/icons/1035@2x.png
new file mode 100644
index 000000000..d09ad69ce
Binary files /dev/null and b/imgs/icons/1035@2x.png differ
diff --git a/imgs/icons/1041.png b/imgs/icons/1041@1x.png
similarity index 100%
rename from imgs/icons/1041.png
rename to imgs/icons/1041@1x.png
diff --git a/imgs/icons/1041@2x.png b/imgs/icons/1041@2x.png
new file mode 100644
index 000000000..7b10108a6
Binary files /dev/null and b/imgs/icons/1041@2x.png differ
diff --git a/imgs/icons/1042.png b/imgs/icons/1042@1x.png
similarity index 100%
rename from imgs/icons/1042.png
rename to imgs/icons/1042@1x.png
diff --git a/imgs/icons/1042@2x.png b/imgs/icons/1042@2x.png
new file mode 100644
index 000000000..693604f3d
Binary files /dev/null and b/imgs/icons/1042@2x.png differ
diff --git a/imgs/icons/1044.png b/imgs/icons/1044@1x.png
similarity index 100%
rename from imgs/icons/1044.png
rename to imgs/icons/1044@1x.png
diff --git a/imgs/icons/1044@2x.png b/imgs/icons/1044@2x.png
new file mode 100644
index 000000000..d0bdf62ed
Binary files /dev/null and b/imgs/icons/1044@2x.png differ
diff --git a/imgs/icons/1046.png b/imgs/icons/1046@1x.png
similarity index 100%
rename from imgs/icons/1046.png
rename to imgs/icons/1046@1x.png
diff --git a/imgs/icons/1046@2x.png b/imgs/icons/1046@2x.png
new file mode 100644
index 000000000..54bb5e0a0
Binary files /dev/null and b/imgs/icons/1046@2x.png differ
diff --git a/imgs/icons/1047.png b/imgs/icons/1047@1x.png
similarity index 100%
rename from imgs/icons/1047.png
rename to imgs/icons/1047@1x.png
diff --git a/imgs/icons/1047@2x.png b/imgs/icons/1047@2x.png
new file mode 100644
index 000000000..a4a627745
Binary files /dev/null and b/imgs/icons/1047@2x.png differ
diff --git a/imgs/icons/104.png b/imgs/icons/104@1x.png
similarity index 100%
rename from imgs/icons/104.png
rename to imgs/icons/104@1x.png
diff --git a/imgs/icons/104@2x.png b/imgs/icons/104@2x.png
new file mode 100644
index 000000000..65cf16586
Binary files /dev/null and b/imgs/icons/104@2x.png differ
diff --git a/imgs/icons/10570.png b/imgs/icons/10570@1x.png
similarity index 100%
rename from imgs/icons/10570.png
rename to imgs/icons/10570@1x.png
diff --git a/imgs/icons/10570@2x.png b/imgs/icons/10570@2x.png
new file mode 100644
index 000000000..4b04fd933
Binary files /dev/null and b/imgs/icons/10570@2x.png differ
diff --git a/imgs/icons/105.png b/imgs/icons/105@1x.png
similarity index 100%
rename from imgs/icons/105.png
rename to imgs/icons/105@1x.png
diff --git a/imgs/icons/105@2x.png b/imgs/icons/105@2x.png
new file mode 100644
index 000000000..11487e804
Binary files /dev/null and b/imgs/icons/105@2x.png differ
diff --git a/imgs/icons/1061.png b/imgs/icons/1061@1x.png
similarity index 100%
rename from imgs/icons/1061.png
rename to imgs/icons/1061@1x.png
diff --git a/imgs/icons/1061@2x.png b/imgs/icons/1061@2x.png
new file mode 100644
index 000000000..0df1fd5c3
Binary files /dev/null and b/imgs/icons/1061@2x.png differ
diff --git a/imgs/icons/10624.png b/imgs/icons/10624@1x.png
similarity index 100%
rename from imgs/icons/10624.png
rename to imgs/icons/10624@1x.png
diff --git a/imgs/icons/10624@2x.png b/imgs/icons/10624@2x.png
new file mode 100644
index 000000000..feea425d3
Binary files /dev/null and b/imgs/icons/10624@2x.png differ
diff --git a/imgs/icons/10684.png b/imgs/icons/10684@1x.png
similarity index 100%
rename from imgs/icons/10684.png
rename to imgs/icons/10684@1x.png
diff --git a/imgs/icons/10684@2x.png b/imgs/icons/10684@2x.png
new file mode 100644
index 000000000..567befe3b
Binary files /dev/null and b/imgs/icons/10684@2x.png differ
diff --git a/imgs/icons/106.png b/imgs/icons/106@1x.png
similarity index 100%
rename from imgs/icons/106.png
rename to imgs/icons/106@1x.png
diff --git a/imgs/icons/106@2x.png b/imgs/icons/106@2x.png
new file mode 100644
index 000000000..94a9c466e
Binary files /dev/null and b/imgs/icons/106@2x.png differ
diff --git a/imgs/icons/10756.png b/imgs/icons/10756@1x.png
similarity index 100%
rename from imgs/icons/10756.png
rename to imgs/icons/10756@1x.png
diff --git a/imgs/icons/10756@2x.png b/imgs/icons/10756@2x.png
new file mode 100644
index 000000000..017903ea6
Binary files /dev/null and b/imgs/icons/10756@2x.png differ
diff --git a/imgs/icons/10785.png b/imgs/icons/10785@1x.png
similarity index 100%
rename from imgs/icons/10785.png
rename to imgs/icons/10785@1x.png
diff --git a/imgs/icons/10785@2x.png b/imgs/icons/10785@2x.png
new file mode 100644
index 000000000..e02fdef34
Binary files /dev/null and b/imgs/icons/10785@2x.png differ
diff --git a/imgs/icons/107.png b/imgs/icons/107@1x.png
similarity index 100%
rename from imgs/icons/107.png
rename to imgs/icons/107@1x.png
diff --git a/imgs/icons/107@2x.png b/imgs/icons/107@2x.png
new file mode 100644
index 000000000..892d8b467
Binary files /dev/null and b/imgs/icons/107@2x.png differ
diff --git a/imgs/icons/10828.png b/imgs/icons/10828@1x.png
similarity index 100%
rename from imgs/icons/10828.png
rename to imgs/icons/10828@1x.png
diff --git a/imgs/icons/10828@2x.png b/imgs/icons/10828@2x.png
new file mode 100644
index 000000000..cbcc0cc02
Binary files /dev/null and b/imgs/icons/10828@2x.png differ
diff --git a/imgs/icons/10829.png b/imgs/icons/10829@1x.png
similarity index 100%
rename from imgs/icons/10829.png
rename to imgs/icons/10829@1x.png
diff --git a/imgs/icons/10829@2x.png b/imgs/icons/10829@2x.png
new file mode 100644
index 000000000..0aefccf2d
Binary files /dev/null and b/imgs/icons/10829@2x.png differ
diff --git a/imgs/icons/10830.png b/imgs/icons/10830@1x.png
similarity index 100%
rename from imgs/icons/10830.png
rename to imgs/icons/10830@1x.png
diff --git a/imgs/icons/10830@2x.png b/imgs/icons/10830@2x.png
new file mode 100644
index 000000000..127c508db
Binary files /dev/null and b/imgs/icons/10830@2x.png differ
diff --git a/imgs/icons/10831.png b/imgs/icons/10831@1x.png
similarity index 100%
rename from imgs/icons/10831.png
rename to imgs/icons/10831@1x.png
diff --git a/imgs/icons/10831@2x.png b/imgs/icons/10831@2x.png
new file mode 100644
index 000000000..4f0bafd83
Binary files /dev/null and b/imgs/icons/10831@2x.png differ
diff --git a/imgs/icons/10833.png b/imgs/icons/10833@1x.png
similarity index 100%
rename from imgs/icons/10833.png
rename to imgs/icons/10833@1x.png
diff --git a/imgs/icons/10833@2x.png b/imgs/icons/10833@2x.png
new file mode 100644
index 000000000..823d02804
Binary files /dev/null and b/imgs/icons/10833@2x.png differ
diff --git a/imgs/icons/10834.png b/imgs/icons/10834@1x.png
similarity index 100%
rename from imgs/icons/10834.png
rename to imgs/icons/10834@1x.png
diff --git a/imgs/icons/10834@2x.png b/imgs/icons/10834@2x.png
new file mode 100644
index 000000000..50f632abd
Binary files /dev/null and b/imgs/icons/10834@2x.png differ
diff --git a/imgs/icons/10835.png b/imgs/icons/10835@1x.png
similarity index 100%
rename from imgs/icons/10835.png
rename to imgs/icons/10835@1x.png
diff --git a/imgs/icons/10835@2x.png b/imgs/icons/10835@2x.png
new file mode 100644
index 000000000..9b5597915
Binary files /dev/null and b/imgs/icons/10835@2x.png differ
diff --git a/imgs/icons/10836.png b/imgs/icons/10836@1x.png
similarity index 100%
rename from imgs/icons/10836.png
rename to imgs/icons/10836@1x.png
diff --git a/imgs/icons/10836@2x.png b/imgs/icons/10836@2x.png
new file mode 100644
index 000000000..6061b4508
Binary files /dev/null and b/imgs/icons/10836@2x.png differ
diff --git a/imgs/icons/10847.png b/imgs/icons/10847@1x.png
similarity index 100%
rename from imgs/icons/10847.png
rename to imgs/icons/10847@1x.png
diff --git a/imgs/icons/10847@2x.png b/imgs/icons/10847@2x.png
new file mode 100644
index 000000000..dad6f06d0
Binary files /dev/null and b/imgs/icons/10847@2x.png differ
diff --git a/imgs/icons/1084.png b/imgs/icons/1084@1x.png
similarity index 100%
rename from imgs/icons/1084.png
rename to imgs/icons/1084@1x.png
diff --git a/imgs/icons/1084@2x.png b/imgs/icons/1084@2x.png
new file mode 100644
index 000000000..90139f23d
Binary files /dev/null and b/imgs/icons/1084@2x.png differ
diff --git a/imgs/icons/10851.png b/imgs/icons/10851@1x.png
similarity index 100%
rename from imgs/icons/10851.png
rename to imgs/icons/10851@1x.png
diff --git a/imgs/icons/10851@2x.png b/imgs/icons/10851@2x.png
new file mode 100644
index 000000000..505f1a05e
Binary files /dev/null and b/imgs/icons/10851@2x.png differ
diff --git a/imgs/icons/10886@1x.png b/imgs/icons/10886@1x.png
new file mode 100644
index 000000000..bc33a7cea
Binary files /dev/null and b/imgs/icons/10886@1x.png differ
diff --git a/imgs/icons/10886@2x.png b/imgs/icons/10886@2x.png
new file mode 100644
index 000000000..72b667cce
Binary files /dev/null and b/imgs/icons/10886@2x.png differ
diff --git a/imgs/icons/10887@1x.png b/imgs/icons/10887@1x.png
new file mode 100644
index 000000000..0dc4ceb8d
Binary files /dev/null and b/imgs/icons/10887@1x.png differ
diff --git a/imgs/icons/10887@2x.png b/imgs/icons/10887@2x.png
new file mode 100644
index 000000000..8a85f1071
Binary files /dev/null and b/imgs/icons/10887@2x.png differ
diff --git a/imgs/icons/10932.png b/imgs/icons/10932@1x.png
similarity index 100%
rename from imgs/icons/10932.png
rename to imgs/icons/10932@1x.png
diff --git a/imgs/icons/10932@2x.png b/imgs/icons/10932@2x.png
new file mode 100644
index 000000000..a39826964
Binary files /dev/null and b/imgs/icons/10932@2x.png differ
diff --git a/imgs/icons/10933.png b/imgs/icons/10933@1x.png
similarity index 100%
rename from imgs/icons/10933.png
rename to imgs/icons/10933@1x.png
diff --git a/imgs/icons/10933@2x.png b/imgs/icons/10933@2x.png
new file mode 100644
index 000000000..c3556ab43
Binary files /dev/null and b/imgs/icons/10933@2x.png differ
diff --git a/imgs/icons/10934.png b/imgs/icons/10934@1x.png
similarity index 100%
rename from imgs/icons/10934.png
rename to imgs/icons/10934@1x.png
diff --git a/imgs/icons/10934@2x.png b/imgs/icons/10934@2x.png
new file mode 100644
index 000000000..0bef34277
Binary files /dev/null and b/imgs/icons/10934@2x.png differ
diff --git a/imgs/icons/10935.png b/imgs/icons/10935@1x.png
similarity index 100%
rename from imgs/icons/10935.png
rename to imgs/icons/10935@1x.png
diff --git a/imgs/icons/10935@2x.png b/imgs/icons/10935@2x.png
new file mode 100644
index 000000000..1f4d24bc3
Binary files /dev/null and b/imgs/icons/10935@2x.png differ
diff --git a/imgs/icons/10940.png b/imgs/icons/10940@1x.png
similarity index 100%
rename from imgs/icons/10940.png
rename to imgs/icons/10940@1x.png
diff --git a/imgs/icons/10940@2x.png b/imgs/icons/10940@2x.png
new file mode 100644
index 000000000..fc3137d3b
Binary files /dev/null and b/imgs/icons/10940@2x.png differ
diff --git a/imgs/icons/10941.png b/imgs/icons/10941@1x.png
similarity index 100%
rename from imgs/icons/10941.png
rename to imgs/icons/10941@1x.png
diff --git a/imgs/icons/10941@2x.png b/imgs/icons/10941@2x.png
new file mode 100644
index 000000000..e2bcf1df2
Binary files /dev/null and b/imgs/icons/10941@2x.png differ
diff --git a/imgs/icons/10942.png b/imgs/icons/10942@1x.png
similarity index 100%
rename from imgs/icons/10942.png
rename to imgs/icons/10942@1x.png
diff --git a/imgs/icons/10942@2x.png b/imgs/icons/10942@2x.png
new file mode 100644
index 000000000..1f8733a78
Binary files /dev/null and b/imgs/icons/10942@2x.png differ
diff --git a/imgs/icons/109.png b/imgs/icons/109@1x.png
similarity index 100%
rename from imgs/icons/109.png
rename to imgs/icons/109@1x.png
diff --git a/imgs/icons/109@2x.png b/imgs/icons/109@2x.png
new file mode 100644
index 000000000..b9d3ac0c8
Binary files /dev/null and b/imgs/icons/109@2x.png differ
diff --git a/imgs/icons/110.png b/imgs/icons/110@1x.png
similarity index 100%
rename from imgs/icons/110.png
rename to imgs/icons/110@1x.png
diff --git a/imgs/icons/110@2x.png b/imgs/icons/110@2x.png
new file mode 100644
index 000000000..9c90f9128
Binary files /dev/null and b/imgs/icons/110@2x.png differ
diff --git a/imgs/icons/111.png b/imgs/icons/111@1x.png
similarity index 100%
rename from imgs/icons/111.png
rename to imgs/icons/111@1x.png
diff --git a/imgs/icons/111@2x.png b/imgs/icons/111@2x.png
new file mode 100644
index 000000000..355b63507
Binary files /dev/null and b/imgs/icons/111@2x.png differ
diff --git a/imgs/icons/112.png b/imgs/icons/112@1x.png
similarity index 100%
rename from imgs/icons/112.png
rename to imgs/icons/112@1x.png
diff --git a/imgs/icons/112@2x.png b/imgs/icons/112@2x.png
new file mode 100644
index 000000000..2f6f0098d
Binary files /dev/null and b/imgs/icons/112@2x.png differ
diff --git a/imgs/icons/1131.png b/imgs/icons/1131@1x.png
similarity index 100%
rename from imgs/icons/1131.png
rename to imgs/icons/1131@1x.png
diff --git a/imgs/icons/1131@2x.png b/imgs/icons/1131@2x.png
new file mode 100644
index 000000000..32cb5dc38
Binary files /dev/null and b/imgs/icons/1131@2x.png differ
diff --git a/imgs/icons/1139.png b/imgs/icons/1139@1x.png
similarity index 100%
rename from imgs/icons/1139.png
rename to imgs/icons/1139@1x.png
diff --git a/imgs/icons/1139@2x.png b/imgs/icons/1139@2x.png
new file mode 100644
index 000000000..890016224
Binary files /dev/null and b/imgs/icons/1139@2x.png differ
diff --git a/imgs/icons/1140.png b/imgs/icons/1140@1x.png
similarity index 100%
rename from imgs/icons/1140.png
rename to imgs/icons/1140@1x.png
diff --git a/imgs/icons/1140@2x.png b/imgs/icons/1140@2x.png
new file mode 100644
index 000000000..7bc202695
Binary files /dev/null and b/imgs/icons/1140@2x.png differ
diff --git a/imgs/icons/1141.png b/imgs/icons/1141@1x.png
similarity index 100%
rename from imgs/icons/1141.png
rename to imgs/icons/1141@1x.png
diff --git a/imgs/icons/1141@2x.png b/imgs/icons/1141@2x.png
new file mode 100644
index 000000000..8c595f0ba
Binary files /dev/null and b/imgs/icons/1141@2x.png differ
diff --git a/imgs/icons/1142.png b/imgs/icons/1142@1x.png
similarity index 100%
rename from imgs/icons/1142.png
rename to imgs/icons/1142@1x.png
diff --git a/imgs/icons/1142@2x.png b/imgs/icons/1142@2x.png
new file mode 100644
index 000000000..cf3db5ea5
Binary files /dev/null and b/imgs/icons/1142@2x.png differ
diff --git a/imgs/icons/1143.png b/imgs/icons/1143@1x.png
similarity index 100%
rename from imgs/icons/1143.png
rename to imgs/icons/1143@1x.png
diff --git a/imgs/icons/1143@2x.png b/imgs/icons/1143@2x.png
new file mode 100644
index 000000000..a21543a6c
Binary files /dev/null and b/imgs/icons/1143@2x.png differ
diff --git a/imgs/icons/1144.png b/imgs/icons/1144@1x.png
similarity index 100%
rename from imgs/icons/1144.png
rename to imgs/icons/1144@1x.png
diff --git a/imgs/icons/1144@2x.png b/imgs/icons/1144@2x.png
new file mode 100644
index 000000000..25526f64e
Binary files /dev/null and b/imgs/icons/1144@2x.png differ
diff --git a/imgs/icons/1145.png b/imgs/icons/1145@1x.png
similarity index 100%
rename from imgs/icons/1145.png
rename to imgs/icons/1145@1x.png
diff --git a/imgs/icons/1145@2x.png b/imgs/icons/1145@2x.png
new file mode 100644
index 000000000..f4b1d236c
Binary files /dev/null and b/imgs/icons/1145@2x.png differ
diff --git a/imgs/icons/1159.png b/imgs/icons/1159@1x.png
similarity index 100%
rename from imgs/icons/1159.png
rename to imgs/icons/1159@1x.png
diff --git a/imgs/icons/1159@2x.png b/imgs/icons/1159@2x.png
new file mode 100644
index 000000000..d5a7e92c3
Binary files /dev/null and b/imgs/icons/1159@2x.png differ
diff --git a/imgs/icons/1162.png b/imgs/icons/1162@1x.png
similarity index 100%
rename from imgs/icons/1162.png
rename to imgs/icons/1162@1x.png
diff --git a/imgs/icons/1162@2x.png b/imgs/icons/1162@2x.png
new file mode 100644
index 000000000..2fd5b0f6c
Binary files /dev/null and b/imgs/icons/1162@2x.png differ
diff --git a/imgs/icons/1164.png b/imgs/icons/1164@1x.png
similarity index 100%
rename from imgs/icons/1164.png
rename to imgs/icons/1164@1x.png
diff --git a/imgs/icons/1164@2x.png b/imgs/icons/1164@2x.png
new file mode 100644
index 000000000..a5692f0aa
Binary files /dev/null and b/imgs/icons/1164@2x.png differ
diff --git a/imgs/icons/1171.png b/imgs/icons/1171@1x.png
similarity index 100%
rename from imgs/icons/1171.png
rename to imgs/icons/1171@1x.png
diff --git a/imgs/icons/1171@2x.png b/imgs/icons/1171@2x.png
new file mode 100644
index 000000000..9fe8d28eb
Binary files /dev/null and b/imgs/icons/1171@2x.png differ
diff --git a/imgs/icons/1172.png b/imgs/icons/1172@1x.png
similarity index 100%
rename from imgs/icons/1172.png
rename to imgs/icons/1172@1x.png
diff --git a/imgs/icons/1172@2x.png b/imgs/icons/1172@2x.png
new file mode 100644
index 000000000..55e89efc2
Binary files /dev/null and b/imgs/icons/1172@2x.png differ
diff --git a/imgs/icons/1173.png b/imgs/icons/1173@1x.png
similarity index 100%
rename from imgs/icons/1173.png
rename to imgs/icons/1173@1x.png
diff --git a/imgs/icons/1173@2x.png b/imgs/icons/1173@2x.png
new file mode 100644
index 000000000..fe14ab255
Binary files /dev/null and b/imgs/icons/1173@2x.png differ
diff --git a/imgs/icons/1174.png b/imgs/icons/1174@1x.png
similarity index 100%
rename from imgs/icons/1174.png
rename to imgs/icons/1174@1x.png
diff --git a/imgs/icons/1174@2x.png b/imgs/icons/1174@2x.png
new file mode 100644
index 000000000..dfeac172f
Binary files /dev/null and b/imgs/icons/1174@2x.png differ
diff --git a/imgs/icons/1175.png b/imgs/icons/1175@1x.png
similarity index 100%
rename from imgs/icons/1175.png
rename to imgs/icons/1175@1x.png
diff --git a/imgs/icons/1175@2x.png b/imgs/icons/1175@2x.png
new file mode 100644
index 000000000..211f69f3b
Binary files /dev/null and b/imgs/icons/1175@2x.png differ
diff --git a/imgs/icons/1177.png b/imgs/icons/1177@1x.png
similarity index 100%
rename from imgs/icons/1177.png
rename to imgs/icons/1177@1x.png
diff --git a/imgs/icons/1177@2x.png b/imgs/icons/1177@2x.png
new file mode 100644
index 000000000..1478cfbc2
Binary files /dev/null and b/imgs/icons/1177@2x.png differ
diff --git a/imgs/icons/1178.png b/imgs/icons/1178@1x.png
similarity index 100%
rename from imgs/icons/1178.png
rename to imgs/icons/1178@1x.png
diff --git a/imgs/icons/1178@2x.png b/imgs/icons/1178@2x.png
new file mode 100644
index 000000000..6aa0ea717
Binary files /dev/null and b/imgs/icons/1178@2x.png differ
diff --git a/imgs/icons/1179.png b/imgs/icons/1179@1x.png
similarity index 100%
rename from imgs/icons/1179.png
rename to imgs/icons/1179@1x.png
diff --git a/imgs/icons/1179@2x.png b/imgs/icons/1179@2x.png
new file mode 100644
index 000000000..aa0c466e0
Binary files /dev/null and b/imgs/icons/1179@2x.png differ
diff --git a/imgs/icons/1180.png b/imgs/icons/1180@1x.png
similarity index 100%
rename from imgs/icons/1180.png
rename to imgs/icons/1180@1x.png
diff --git a/imgs/icons/1180@2x.png b/imgs/icons/1180@2x.png
new file mode 100644
index 000000000..2c1034b7e
Binary files /dev/null and b/imgs/icons/1180@2x.png differ
diff --git a/imgs/icons/1181.png b/imgs/icons/1181@1x.png
similarity index 100%
rename from imgs/icons/1181.png
rename to imgs/icons/1181@1x.png
diff --git a/imgs/icons/1181@2x.png b/imgs/icons/1181@2x.png
new file mode 100644
index 000000000..482d69bc3
Binary files /dev/null and b/imgs/icons/1181@2x.png differ
diff --git a/imgs/icons/1182.png b/imgs/icons/1182@1x.png
similarity index 100%
rename from imgs/icons/1182.png
rename to imgs/icons/1182@1x.png
diff --git a/imgs/icons/1182@2x.png b/imgs/icons/1182@2x.png
new file mode 100644
index 000000000..d2d76833a
Binary files /dev/null and b/imgs/icons/1182@2x.png differ
diff --git a/imgs/icons/1183.png b/imgs/icons/1183@1x.png
similarity index 100%
rename from imgs/icons/1183.png
rename to imgs/icons/1183@1x.png
diff --git a/imgs/icons/1183@2x.png b/imgs/icons/1183@2x.png
new file mode 100644
index 000000000..68ec06f78
Binary files /dev/null and b/imgs/icons/1183@2x.png differ
diff --git a/imgs/icons/1184.png b/imgs/icons/1184@1x.png
similarity index 100%
rename from imgs/icons/1184.png
rename to imgs/icons/1184@1x.png
diff --git a/imgs/icons/1184@2x.png b/imgs/icons/1184@2x.png
new file mode 100644
index 000000000..42e732096
Binary files /dev/null and b/imgs/icons/1184@2x.png differ
diff --git a/imgs/icons/1185.png b/imgs/icons/1185@1x.png
similarity index 100%
rename from imgs/icons/1185.png
rename to imgs/icons/1185@1x.png
diff --git a/imgs/icons/1185@2x.png b/imgs/icons/1185@2x.png
new file mode 100644
index 000000000..f9fb04924
Binary files /dev/null and b/imgs/icons/1185@2x.png differ
diff --git a/imgs/icons/1186.png b/imgs/icons/1186@1x.png
similarity index 100%
rename from imgs/icons/1186.png
rename to imgs/icons/1186@1x.png
diff --git a/imgs/icons/1186@2x.png b/imgs/icons/1186@2x.png
new file mode 100644
index 000000000..cef1779e9
Binary files /dev/null and b/imgs/icons/1186@2x.png differ
diff --git a/imgs/icons/1187.png b/imgs/icons/1187@1x.png
similarity index 100%
rename from imgs/icons/1187.png
rename to imgs/icons/1187@1x.png
diff --git a/imgs/icons/1187@2x.png b/imgs/icons/1187@2x.png
new file mode 100644
index 000000000..3cec0b8b7
Binary files /dev/null and b/imgs/icons/1187@2x.png differ
diff --git a/imgs/icons/1188.png b/imgs/icons/1188@1x.png
similarity index 100%
rename from imgs/icons/1188.png
rename to imgs/icons/1188@1x.png
diff --git a/imgs/icons/1188@2x.png b/imgs/icons/1188@2x.png
new file mode 100644
index 000000000..70064bd35
Binary files /dev/null and b/imgs/icons/1188@2x.png differ
diff --git a/imgs/icons/1189.png b/imgs/icons/1189@1x.png
similarity index 100%
rename from imgs/icons/1189.png
rename to imgs/icons/1189@1x.png
diff --git a/imgs/icons/1189@2x.png b/imgs/icons/1189@2x.png
new file mode 100644
index 000000000..b27308bf2
Binary files /dev/null and b/imgs/icons/1189@2x.png differ
diff --git a/imgs/icons/1190.png b/imgs/icons/1190@1x.png
similarity index 100%
rename from imgs/icons/1190.png
rename to imgs/icons/1190@1x.png
diff --git a/imgs/icons/1190@2x.png b/imgs/icons/1190@2x.png
new file mode 100644
index 000000000..617db322a
Binary files /dev/null and b/imgs/icons/1190@2x.png differ
diff --git a/imgs/icons/1191.png b/imgs/icons/1191@1x.png
similarity index 100%
rename from imgs/icons/1191.png
rename to imgs/icons/1191@1x.png
diff --git a/imgs/icons/1191@2x.png b/imgs/icons/1191@2x.png
new file mode 100644
index 000000000..0dcc3b7b0
Binary files /dev/null and b/imgs/icons/1191@2x.png differ
diff --git a/imgs/icons/1192.png b/imgs/icons/1192@1x.png
similarity index 100%
rename from imgs/icons/1192.png
rename to imgs/icons/1192@1x.png
diff --git a/imgs/icons/1192@2x.png b/imgs/icons/1192@2x.png
new file mode 100644
index 000000000..f3b2a12db
Binary files /dev/null and b/imgs/icons/1192@2x.png differ
diff --git a/imgs/icons/1193.png b/imgs/icons/1193@1x.png
similarity index 100%
rename from imgs/icons/1193.png
rename to imgs/icons/1193@1x.png
diff --git a/imgs/icons/1193@2x.png b/imgs/icons/1193@2x.png
new file mode 100644
index 000000000..12f0bcfdd
Binary files /dev/null and b/imgs/icons/1193@2x.png differ
diff --git a/imgs/icons/1194.png b/imgs/icons/1194@1x.png
similarity index 100%
rename from imgs/icons/1194.png
rename to imgs/icons/1194@1x.png
diff --git a/imgs/icons/1194@2x.png b/imgs/icons/1194@2x.png
new file mode 100644
index 000000000..ef435726b
Binary files /dev/null and b/imgs/icons/1194@2x.png differ
diff --git a/imgs/icons/1195.png b/imgs/icons/1195@1x.png
similarity index 100%
rename from imgs/icons/1195.png
rename to imgs/icons/1195@1x.png
diff --git a/imgs/icons/1195@2x.png b/imgs/icons/1195@2x.png
new file mode 100644
index 000000000..f481fac6d
Binary files /dev/null and b/imgs/icons/1195@2x.png differ
diff --git a/imgs/icons/1196.png b/imgs/icons/1196@1x.png
similarity index 100%
rename from imgs/icons/1196.png
rename to imgs/icons/1196@1x.png
diff --git a/imgs/icons/1196@2x.png b/imgs/icons/1196@2x.png
new file mode 100644
index 000000000..f34d738ca
Binary files /dev/null and b/imgs/icons/1196@2x.png differ
diff --git a/imgs/icons/1198.png b/imgs/icons/1198@1x.png
similarity index 100%
rename from imgs/icons/1198.png
rename to imgs/icons/1198@1x.png
diff --git a/imgs/icons/1198@2x.png b/imgs/icons/1198@2x.png
new file mode 100644
index 000000000..737c16126
Binary files /dev/null and b/imgs/icons/1198@2x.png differ
diff --git a/imgs/icons/1199.png b/imgs/icons/1199@1x.png
similarity index 100%
rename from imgs/icons/1199.png
rename to imgs/icons/1199@1x.png
diff --git a/imgs/icons/1199@2x.png b/imgs/icons/1199@2x.png
new file mode 100644
index 000000000..8ade0ff37
Binary files /dev/null and b/imgs/icons/1199@2x.png differ
diff --git a/imgs/icons/1200.png b/imgs/icons/1200@1x.png
similarity index 100%
rename from imgs/icons/1200.png
rename to imgs/icons/1200@1x.png
diff --git a/imgs/icons/1200@2x.png b/imgs/icons/1200@2x.png
new file mode 100644
index 000000000..3f6045a69
Binary files /dev/null and b/imgs/icons/1200@2x.png differ
diff --git a/imgs/icons/1201.png b/imgs/icons/1201@1x.png
similarity index 100%
rename from imgs/icons/1201.png
rename to imgs/icons/1201@1x.png
diff --git a/imgs/icons/1201@2x.png b/imgs/icons/1201@2x.png
new file mode 100644
index 000000000..ce42f49ab
Binary files /dev/null and b/imgs/icons/1201@2x.png differ
diff --git a/imgs/icons/1204.png b/imgs/icons/1204@1x.png
similarity index 100%
rename from imgs/icons/1204.png
rename to imgs/icons/1204@1x.png
diff --git a/imgs/icons/1204@2x.png b/imgs/icons/1204@2x.png
new file mode 100644
index 000000000..12aad152a
Binary files /dev/null and b/imgs/icons/1204@2x.png differ
diff --git a/imgs/icons/1205.png b/imgs/icons/1205@1x.png
similarity index 100%
rename from imgs/icons/1205.png
rename to imgs/icons/1205@1x.png
diff --git a/imgs/icons/1205@2x.png b/imgs/icons/1205@2x.png
new file mode 100644
index 000000000..218039020
Binary files /dev/null and b/imgs/icons/1205@2x.png differ
diff --git a/imgs/icons/1206.png b/imgs/icons/1206@1x.png
similarity index 100%
rename from imgs/icons/1206.png
rename to imgs/icons/1206@1x.png
diff --git a/imgs/icons/1206@2x.png b/imgs/icons/1206@2x.png
new file mode 100644
index 000000000..3aa4f2cdb
Binary files /dev/null and b/imgs/icons/1206@2x.png differ
diff --git a/imgs/icons/1207.png b/imgs/icons/1207@1x.png
similarity index 100%
rename from imgs/icons/1207.png
rename to imgs/icons/1207@1x.png
diff --git a/imgs/icons/1207@2x.png b/imgs/icons/1207@2x.png
new file mode 100644
index 000000000..27c4443e5
Binary files /dev/null and b/imgs/icons/1207@2x.png differ
diff --git a/imgs/icons/1209.png b/imgs/icons/1209@1x.png
similarity index 100%
rename from imgs/icons/1209.png
rename to imgs/icons/1209@1x.png
diff --git a/imgs/icons/1209@2x.png b/imgs/icons/1209@2x.png
new file mode 100644
index 000000000..8968973cb
Binary files /dev/null and b/imgs/icons/1209@2x.png differ
diff --git a/imgs/icons/1269.png b/imgs/icons/1269@1x.png
similarity index 100%
rename from imgs/icons/1269.png
rename to imgs/icons/1269@1x.png
diff --git a/imgs/icons/1269@2x.png b/imgs/icons/1269@2x.png
new file mode 100644
index 000000000..25c95ef93
Binary files /dev/null and b/imgs/icons/1269@2x.png differ
diff --git a/imgs/icons/1270.png b/imgs/icons/1270@1x.png
similarity index 100%
rename from imgs/icons/1270.png
rename to imgs/icons/1270@1x.png
diff --git a/imgs/icons/1270@2x.png b/imgs/icons/1270@2x.png
new file mode 100644
index 000000000..6afc26277
Binary files /dev/null and b/imgs/icons/1270@2x.png differ
diff --git a/imgs/icons/1271.png b/imgs/icons/1271@1x.png
similarity index 100%
rename from imgs/icons/1271.png
rename to imgs/icons/1271@1x.png
diff --git a/imgs/icons/1271@2x.png b/imgs/icons/1271@2x.png
new file mode 100644
index 000000000..fbb074d61
Binary files /dev/null and b/imgs/icons/1271@2x.png differ
diff --git a/imgs/icons/1272.png b/imgs/icons/1272@1x.png
similarity index 100%
rename from imgs/icons/1272.png
rename to imgs/icons/1272@1x.png
diff --git a/imgs/icons/1272@2x.png b/imgs/icons/1272@2x.png
new file mode 100644
index 000000000..4eef6a554
Binary files /dev/null and b/imgs/icons/1272@2x.png differ
diff --git a/imgs/icons/1273.png b/imgs/icons/1273@1x.png
similarity index 100%
rename from imgs/icons/1273.png
rename to imgs/icons/1273@1x.png
diff --git a/imgs/icons/1273@2x.png b/imgs/icons/1273@2x.png
new file mode 100644
index 000000000..fcffe31c4
Binary files /dev/null and b/imgs/icons/1273@2x.png differ
diff --git a/imgs/icons/1274.png b/imgs/icons/1274@1x.png
similarity index 100%
rename from imgs/icons/1274.png
rename to imgs/icons/1274@1x.png
diff --git a/imgs/icons/1274@2x.png b/imgs/icons/1274@2x.png
new file mode 100644
index 000000000..fe5c4f3f5
Binary files /dev/null and b/imgs/icons/1274@2x.png differ
diff --git a/imgs/icons/1275.png b/imgs/icons/1275@1x.png
similarity index 100%
rename from imgs/icons/1275.png
rename to imgs/icons/1275@1x.png
diff --git a/imgs/icons/1275@2x.png b/imgs/icons/1275@2x.png
new file mode 100644
index 000000000..adcba881b
Binary files /dev/null and b/imgs/icons/1275@2x.png differ
diff --git a/imgs/icons/1277.png b/imgs/icons/1277@1x.png
similarity index 100%
rename from imgs/icons/1277.png
rename to imgs/icons/1277@1x.png
diff --git a/imgs/icons/1277@2x.png b/imgs/icons/1277@2x.png
new file mode 100644
index 000000000..6629a3891
Binary files /dev/null and b/imgs/icons/1277@2x.png differ
diff --git a/imgs/icons/1279.png b/imgs/icons/1279@1x.png
similarity index 100%
rename from imgs/icons/1279.png
rename to imgs/icons/1279@1x.png
diff --git a/imgs/icons/1279@2x.png b/imgs/icons/1279@2x.png
new file mode 100644
index 000000000..254ebc3a6
Binary files /dev/null and b/imgs/icons/1279@2x.png differ
diff --git a/imgs/icons/1282.png b/imgs/icons/1282@1x.png
similarity index 100%
rename from imgs/icons/1282.png
rename to imgs/icons/1282@1x.png
diff --git a/imgs/icons/1282@2x.png b/imgs/icons/1282@2x.png
new file mode 100644
index 000000000..560d09fa2
Binary files /dev/null and b/imgs/icons/1282@2x.png differ
diff --git a/imgs/icons/1283.png b/imgs/icons/1283@1x.png
similarity index 100%
rename from imgs/icons/1283.png
rename to imgs/icons/1283@1x.png
diff --git a/imgs/icons/1283@2x.png b/imgs/icons/1283@2x.png
new file mode 100644
index 000000000..77b839b1f
Binary files /dev/null and b/imgs/icons/1283@2x.png differ
diff --git a/imgs/icons/1284.png b/imgs/icons/1284@1x.png
similarity index 100%
rename from imgs/icons/1284.png
rename to imgs/icons/1284@1x.png
diff --git a/imgs/icons/1284@2x.png b/imgs/icons/1284@2x.png
new file mode 100644
index 000000000..4760bc115
Binary files /dev/null and b/imgs/icons/1284@2x.png differ
diff --git a/imgs/icons/1285.png b/imgs/icons/1285@1x.png
similarity index 100%
rename from imgs/icons/1285.png
rename to imgs/icons/1285@1x.png
diff --git a/imgs/icons/1285@2x.png b/imgs/icons/1285@2x.png
new file mode 100644
index 000000000..a4e7729c5
Binary files /dev/null and b/imgs/icons/1285@2x.png differ
diff --git a/imgs/icons/1286.png b/imgs/icons/1286@1x.png
similarity index 100%
rename from imgs/icons/1286.png
rename to imgs/icons/1286@1x.png
diff --git a/imgs/icons/1286@2x.png b/imgs/icons/1286@2x.png
new file mode 100644
index 000000000..440e4feca
Binary files /dev/null and b/imgs/icons/1286@2x.png differ
diff --git a/imgs/icons/1287.png b/imgs/icons/1287@1x.png
similarity index 100%
rename from imgs/icons/1287.png
rename to imgs/icons/1287@1x.png
diff --git a/imgs/icons/1287@2x.png b/imgs/icons/1287@2x.png
new file mode 100644
index 000000000..7091e19d3
Binary files /dev/null and b/imgs/icons/1287@2x.png differ
diff --git a/imgs/icons/1288.png b/imgs/icons/1288@1x.png
similarity index 100%
rename from imgs/icons/1288.png
rename to imgs/icons/1288@1x.png
diff --git a/imgs/icons/1288@2x.png b/imgs/icons/1288@2x.png
new file mode 100644
index 000000000..c461b50e3
Binary files /dev/null and b/imgs/icons/1288@2x.png differ
diff --git a/imgs/icons/1289.png b/imgs/icons/1289@1x.png
similarity index 100%
rename from imgs/icons/1289.png
rename to imgs/icons/1289@1x.png
diff --git a/imgs/icons/1289@2x.png b/imgs/icons/1289@2x.png
new file mode 100644
index 000000000..4343dc591
Binary files /dev/null and b/imgs/icons/1289@2x.png differ
diff --git a/imgs/icons/1290.png b/imgs/icons/1290@1x.png
similarity index 100%
rename from imgs/icons/1290.png
rename to imgs/icons/1290@1x.png
diff --git a/imgs/icons/1290@2x.png b/imgs/icons/1290@2x.png
new file mode 100644
index 000000000..457788439
Binary files /dev/null and b/imgs/icons/1290@2x.png differ
diff --git a/imgs/icons/1291.png b/imgs/icons/1291@1x.png
similarity index 100%
rename from imgs/icons/1291.png
rename to imgs/icons/1291@1x.png
diff --git a/imgs/icons/1291@2x.png b/imgs/icons/1291@2x.png
new file mode 100644
index 000000000..564c1e94d
Binary files /dev/null and b/imgs/icons/1291@2x.png differ
diff --git a/imgs/icons/1292.png b/imgs/icons/1292@1x.png
similarity index 100%
rename from imgs/icons/1292.png
rename to imgs/icons/1292@1x.png
diff --git a/imgs/icons/1292@2x.png b/imgs/icons/1292@2x.png
new file mode 100644
index 000000000..51fa71cf0
Binary files /dev/null and b/imgs/icons/1292@2x.png differ
diff --git a/imgs/icons/1293.png b/imgs/icons/1293@1x.png
similarity index 100%
rename from imgs/icons/1293.png
rename to imgs/icons/1293@1x.png
diff --git a/imgs/icons/1293@2x.png b/imgs/icons/1293@2x.png
new file mode 100644
index 000000000..187ce277d
Binary files /dev/null and b/imgs/icons/1293@2x.png differ
diff --git a/imgs/icons/1294.png b/imgs/icons/1294@1x.png
similarity index 100%
rename from imgs/icons/1294.png
rename to imgs/icons/1294@1x.png
diff --git a/imgs/icons/1294@2x.png b/imgs/icons/1294@2x.png
new file mode 100644
index 000000000..b5a09a336
Binary files /dev/null and b/imgs/icons/1294@2x.png differ
diff --git a/imgs/icons/1295.png b/imgs/icons/1295@1x.png
similarity index 100%
rename from imgs/icons/1295.png
rename to imgs/icons/1295@1x.png
diff --git a/imgs/icons/1295@2x.png b/imgs/icons/1295@2x.png
new file mode 100644
index 000000000..fac5b8d14
Binary files /dev/null and b/imgs/icons/1295@2x.png differ
diff --git a/imgs/icons/1296.png b/imgs/icons/1296@1x.png
similarity index 100%
rename from imgs/icons/1296.png
rename to imgs/icons/1296@1x.png
diff --git a/imgs/icons/1296@2x.png b/imgs/icons/1296@2x.png
new file mode 100644
index 000000000..91683a7d9
Binary files /dev/null and b/imgs/icons/1296@2x.png differ
diff --git a/imgs/icons/1297.png b/imgs/icons/1297@1x.png
similarity index 100%
rename from imgs/icons/1297.png
rename to imgs/icons/1297@1x.png
diff --git a/imgs/icons/1297@2x.png b/imgs/icons/1297@2x.png
new file mode 100644
index 000000000..246937371
Binary files /dev/null and b/imgs/icons/1297@2x.png differ
diff --git a/imgs/icons/1298.png b/imgs/icons/1298@1x.png
similarity index 100%
rename from imgs/icons/1298.png
rename to imgs/icons/1298@1x.png
diff --git a/imgs/icons/1298@2x.png b/imgs/icons/1298@2x.png
new file mode 100644
index 000000000..19deb5ea3
Binary files /dev/null and b/imgs/icons/1298@2x.png differ
diff --git a/imgs/icons/1299.png b/imgs/icons/1299@1x.png
similarity index 100%
rename from imgs/icons/1299.png
rename to imgs/icons/1299@1x.png
diff --git a/imgs/icons/1299@2x.png b/imgs/icons/1299@2x.png
new file mode 100644
index 000000000..9fd27c6b7
Binary files /dev/null and b/imgs/icons/1299@2x.png differ
diff --git a/imgs/icons/1300.png b/imgs/icons/1300@1x.png
similarity index 100%
rename from imgs/icons/1300.png
rename to imgs/icons/1300@1x.png
diff --git a/imgs/icons/1300@2x.png b/imgs/icons/1300@2x.png
new file mode 100644
index 000000000..f9ab8a108
Binary files /dev/null and b/imgs/icons/1300@2x.png differ
diff --git a/imgs/icons/1301.png b/imgs/icons/1301@1x.png
similarity index 100%
rename from imgs/icons/1301.png
rename to imgs/icons/1301@1x.png
diff --git a/imgs/icons/1301@2x.png b/imgs/icons/1301@2x.png
new file mode 100644
index 000000000..23259bc3a
Binary files /dev/null and b/imgs/icons/1301@2x.png differ
diff --git a/imgs/icons/1302.png b/imgs/icons/1302@1x.png
similarity index 100%
rename from imgs/icons/1302.png
rename to imgs/icons/1302@1x.png
diff --git a/imgs/icons/1302@2x.png b/imgs/icons/1302@2x.png
new file mode 100644
index 000000000..2e77952df
Binary files /dev/null and b/imgs/icons/1302@2x.png differ
diff --git a/imgs/icons/1303.png b/imgs/icons/1303@1x.png
similarity index 100%
rename from imgs/icons/1303.png
rename to imgs/icons/1303@1x.png
diff --git a/imgs/icons/1303@2x.png b/imgs/icons/1303@2x.png
new file mode 100644
index 000000000..bab55c8af
Binary files /dev/null and b/imgs/icons/1303@2x.png differ
diff --git a/imgs/icons/1304.png b/imgs/icons/1304@1x.png
similarity index 100%
rename from imgs/icons/1304.png
rename to imgs/icons/1304@1x.png
diff --git a/imgs/icons/1304@2x.png b/imgs/icons/1304@2x.png
new file mode 100644
index 000000000..de023e234
Binary files /dev/null and b/imgs/icons/1304@2x.png differ
diff --git a/imgs/icons/1305.png b/imgs/icons/1305@1x.png
similarity index 100%
rename from imgs/icons/1305.png
rename to imgs/icons/1305@1x.png
diff --git a/imgs/icons/1305@2x.png b/imgs/icons/1305@2x.png
new file mode 100644
index 000000000..e598b4fab
Binary files /dev/null and b/imgs/icons/1305@2x.png differ
diff --git a/imgs/icons/1306.png b/imgs/icons/1306@1x.png
similarity index 100%
rename from imgs/icons/1306.png
rename to imgs/icons/1306@1x.png
diff --git a/imgs/icons/1306@2x.png b/imgs/icons/1306@2x.png
new file mode 100644
index 000000000..009bd8594
Binary files /dev/null and b/imgs/icons/1306@2x.png differ
diff --git a/imgs/icons/1307.png b/imgs/icons/1307@1x.png
similarity index 100%
rename from imgs/icons/1307.png
rename to imgs/icons/1307@1x.png
diff --git a/imgs/icons/1307@2x.png b/imgs/icons/1307@2x.png
new file mode 100644
index 000000000..2e02b93a8
Binary files /dev/null and b/imgs/icons/1307@2x.png differ
diff --git a/imgs/icons/1310.png b/imgs/icons/1310@1x.png
similarity index 100%
rename from imgs/icons/1310.png
rename to imgs/icons/1310@1x.png
diff --git a/imgs/icons/1310@2x.png b/imgs/icons/1310@2x.png
new file mode 100644
index 000000000..1967871c0
Binary files /dev/null and b/imgs/icons/1310@2x.png differ
diff --git a/imgs/icons/1311.png b/imgs/icons/1311@1x.png
similarity index 100%
rename from imgs/icons/1311.png
rename to imgs/icons/1311@1x.png
diff --git a/imgs/icons/1311@2x.png b/imgs/icons/1311@2x.png
new file mode 100644
index 000000000..c8a3b2fd9
Binary files /dev/null and b/imgs/icons/1311@2x.png differ
diff --git a/imgs/icons/1312.png b/imgs/icons/1312@1x.png
similarity index 100%
rename from imgs/icons/1312.png
rename to imgs/icons/1312@1x.png
diff --git a/imgs/icons/1312@2x.png b/imgs/icons/1312@2x.png
new file mode 100644
index 000000000..82e42be47
Binary files /dev/null and b/imgs/icons/1312@2x.png differ
diff --git a/imgs/icons/1313.png b/imgs/icons/1313@1x.png
similarity index 100%
rename from imgs/icons/1313.png
rename to imgs/icons/1313@1x.png
diff --git a/imgs/icons/1313@2x.png b/imgs/icons/1313@2x.png
new file mode 100644
index 000000000..64a4a9caa
Binary files /dev/null and b/imgs/icons/1313@2x.png differ
diff --git a/imgs/icons/1314.png b/imgs/icons/1314@1x.png
similarity index 100%
rename from imgs/icons/1314.png
rename to imgs/icons/1314@1x.png
diff --git a/imgs/icons/1314@2x.png b/imgs/icons/1314@2x.png
new file mode 100644
index 000000000..f307579bb
Binary files /dev/null and b/imgs/icons/1314@2x.png differ
diff --git a/imgs/icons/1315.png b/imgs/icons/1315@1x.png
similarity index 100%
rename from imgs/icons/1315.png
rename to imgs/icons/1315@1x.png
diff --git a/imgs/icons/1315@2x.png b/imgs/icons/1315@2x.png
new file mode 100644
index 000000000..afe1700db
Binary files /dev/null and b/imgs/icons/1315@2x.png differ
diff --git a/imgs/icons/1316.png b/imgs/icons/1316@1x.png
similarity index 100%
rename from imgs/icons/1316.png
rename to imgs/icons/1316@1x.png
diff --git a/imgs/icons/1316@2x.png b/imgs/icons/1316@2x.png
new file mode 100644
index 000000000..c966fff00
Binary files /dev/null and b/imgs/icons/1316@2x.png differ
diff --git a/imgs/icons/1317.png b/imgs/icons/1317@1x.png
similarity index 100%
rename from imgs/icons/1317.png
rename to imgs/icons/1317@1x.png
diff --git a/imgs/icons/1317@2x.png b/imgs/icons/1317@2x.png
new file mode 100644
index 000000000..bccab5976
Binary files /dev/null and b/imgs/icons/1317@2x.png differ
diff --git a/imgs/icons/1318.png b/imgs/icons/1318@1x.png
similarity index 100%
rename from imgs/icons/1318.png
rename to imgs/icons/1318@1x.png
diff --git a/imgs/icons/1318@2x.png b/imgs/icons/1318@2x.png
new file mode 100644
index 000000000..9c0bdd1a1
Binary files /dev/null and b/imgs/icons/1318@2x.png differ
diff --git a/imgs/icons/1319.png b/imgs/icons/1319@1x.png
similarity index 100%
rename from imgs/icons/1319.png
rename to imgs/icons/1319@1x.png
diff --git a/imgs/icons/1319@2x.png b/imgs/icons/1319@2x.png
new file mode 100644
index 000000000..e5f2d7fb8
Binary files /dev/null and b/imgs/icons/1319@2x.png differ
diff --git a/imgs/icons/1320.png b/imgs/icons/1320@1x.png
similarity index 100%
rename from imgs/icons/1320.png
rename to imgs/icons/1320@1x.png
diff --git a/imgs/icons/1320@2x.png b/imgs/icons/1320@2x.png
new file mode 100644
index 000000000..cc17b072b
Binary files /dev/null and b/imgs/icons/1320@2x.png differ
diff --git a/imgs/icons/1321.png b/imgs/icons/1321@1x.png
similarity index 100%
rename from imgs/icons/1321.png
rename to imgs/icons/1321@1x.png
diff --git a/imgs/icons/1321@2x.png b/imgs/icons/1321@2x.png
new file mode 100644
index 000000000..a9c68783d
Binary files /dev/null and b/imgs/icons/1321@2x.png differ
diff --git a/imgs/icons/1322.png b/imgs/icons/1322@1x.png
similarity index 100%
rename from imgs/icons/1322.png
rename to imgs/icons/1322@1x.png
diff --git a/imgs/icons/1322@2x.png b/imgs/icons/1322@2x.png
new file mode 100644
index 000000000..e96e1d965
Binary files /dev/null and b/imgs/icons/1322@2x.png differ
diff --git a/imgs/icons/1323.png b/imgs/icons/1323@1x.png
similarity index 100%
rename from imgs/icons/1323.png
rename to imgs/icons/1323@1x.png
diff --git a/imgs/icons/1323@2x.png b/imgs/icons/1323@2x.png
new file mode 100644
index 000000000..c551b7c2e
Binary files /dev/null and b/imgs/icons/1323@2x.png differ
diff --git a/imgs/icons/1324.png b/imgs/icons/1324@1x.png
similarity index 100%
rename from imgs/icons/1324.png
rename to imgs/icons/1324@1x.png
diff --git a/imgs/icons/1324@2x.png b/imgs/icons/1324@2x.png
new file mode 100644
index 000000000..746ed3b8f
Binary files /dev/null and b/imgs/icons/1324@2x.png differ
diff --git a/imgs/icons/1325.png b/imgs/icons/1325@1x.png
similarity index 100%
rename from imgs/icons/1325.png
rename to imgs/icons/1325@1x.png
diff --git a/imgs/icons/1325@2x.png b/imgs/icons/1325@2x.png
new file mode 100644
index 000000000..b0bf429e8
Binary files /dev/null and b/imgs/icons/1325@2x.png differ
diff --git a/imgs/icons/1326.png b/imgs/icons/1326@1x.png
similarity index 100%
rename from imgs/icons/1326.png
rename to imgs/icons/1326@1x.png
diff --git a/imgs/icons/1326@2x.png b/imgs/icons/1326@2x.png
new file mode 100644
index 000000000..1f62c987b
Binary files /dev/null and b/imgs/icons/1326@2x.png differ
diff --git a/imgs/icons/1327.png b/imgs/icons/1327@1x.png
similarity index 100%
rename from imgs/icons/1327.png
rename to imgs/icons/1327@1x.png
diff --git a/imgs/icons/1327@2x.png b/imgs/icons/1327@2x.png
new file mode 100644
index 000000000..3aa5b755d
Binary files /dev/null and b/imgs/icons/1327@2x.png differ
diff --git a/imgs/icons/1328.png b/imgs/icons/1328@1x.png
similarity index 100%
rename from imgs/icons/1328.png
rename to imgs/icons/1328@1x.png
diff --git a/imgs/icons/1328@2x.png b/imgs/icons/1328@2x.png
new file mode 100644
index 000000000..e38fd2771
Binary files /dev/null and b/imgs/icons/1328@2x.png differ
diff --git a/imgs/icons/1329.png b/imgs/icons/1329@1x.png
similarity index 100%
rename from imgs/icons/1329.png
rename to imgs/icons/1329@1x.png
diff --git a/imgs/icons/1329@2x.png b/imgs/icons/1329@2x.png
new file mode 100644
index 000000000..304caaae7
Binary files /dev/null and b/imgs/icons/1329@2x.png differ
diff --git a/imgs/icons/1330.png b/imgs/icons/1330@1x.png
similarity index 100%
rename from imgs/icons/1330.png
rename to imgs/icons/1330@1x.png
diff --git a/imgs/icons/1330@2x.png b/imgs/icons/1330@2x.png
new file mode 100644
index 000000000..faff09e6d
Binary files /dev/null and b/imgs/icons/1330@2x.png differ
diff --git a/imgs/icons/1331.png b/imgs/icons/1331@1x.png
similarity index 100%
rename from imgs/icons/1331.png
rename to imgs/icons/1331@1x.png
diff --git a/imgs/icons/1331@2x.png b/imgs/icons/1331@2x.png
new file mode 100644
index 000000000..3b46c0085
Binary files /dev/null and b/imgs/icons/1331@2x.png differ
diff --git a/imgs/icons/1332.png b/imgs/icons/1332@1x.png
similarity index 100%
rename from imgs/icons/1332.png
rename to imgs/icons/1332@1x.png
diff --git a/imgs/icons/1332@2x.png b/imgs/icons/1332@2x.png
new file mode 100644
index 000000000..9bc39cc13
Binary files /dev/null and b/imgs/icons/1332@2x.png differ
diff --git a/imgs/icons/1333.png b/imgs/icons/1333@1x.png
similarity index 100%
rename from imgs/icons/1333.png
rename to imgs/icons/1333@1x.png
diff --git a/imgs/icons/1333@2x.png b/imgs/icons/1333@2x.png
new file mode 100644
index 000000000..25dbd3cb1
Binary files /dev/null and b/imgs/icons/1333@2x.png differ
diff --git a/imgs/icons/1334.png b/imgs/icons/1334@1x.png
similarity index 100%
rename from imgs/icons/1334.png
rename to imgs/icons/1334@1x.png
diff --git a/imgs/icons/1334@2x.png b/imgs/icons/1334@2x.png
new file mode 100644
index 000000000..2a6b1eec8
Binary files /dev/null and b/imgs/icons/1334@2x.png differ
diff --git a/imgs/icons/1335.png b/imgs/icons/1335@1x.png
similarity index 100%
rename from imgs/icons/1335.png
rename to imgs/icons/1335@1x.png
diff --git a/imgs/icons/1335@2x.png b/imgs/icons/1335@2x.png
new file mode 100644
index 000000000..8169c4121
Binary files /dev/null and b/imgs/icons/1335@2x.png differ
diff --git a/imgs/icons/1336.png b/imgs/icons/1336@1x.png
similarity index 100%
rename from imgs/icons/1336.png
rename to imgs/icons/1336@1x.png
diff --git a/imgs/icons/1336@2x.png b/imgs/icons/1336@2x.png
new file mode 100644
index 000000000..fae7f1971
Binary files /dev/null and b/imgs/icons/1336@2x.png differ
diff --git a/imgs/icons/1337.png b/imgs/icons/1337@1x.png
similarity index 100%
rename from imgs/icons/1337.png
rename to imgs/icons/1337@1x.png
diff --git a/imgs/icons/1337@2x.png b/imgs/icons/1337@2x.png
new file mode 100644
index 000000000..1097972bd
Binary files /dev/null and b/imgs/icons/1337@2x.png differ
diff --git a/imgs/icons/1338.png b/imgs/icons/1338@1x.png
similarity index 100%
rename from imgs/icons/1338.png
rename to imgs/icons/1338@1x.png
diff --git a/imgs/icons/1338@2x.png b/imgs/icons/1338@2x.png
new file mode 100644
index 000000000..0227e983f
Binary files /dev/null and b/imgs/icons/1338@2x.png differ
diff --git a/imgs/icons/1339.png b/imgs/icons/1339@1x.png
similarity index 100%
rename from imgs/icons/1339.png
rename to imgs/icons/1339@1x.png
diff --git a/imgs/icons/1339@2x.png b/imgs/icons/1339@2x.png
new file mode 100644
index 000000000..363f925f0
Binary files /dev/null and b/imgs/icons/1339@2x.png differ
diff --git a/imgs/icons/1340.png b/imgs/icons/1340@1x.png
similarity index 100%
rename from imgs/icons/1340.png
rename to imgs/icons/1340@1x.png
diff --git a/imgs/icons/1340@2x.png b/imgs/icons/1340@2x.png
new file mode 100644
index 000000000..a66950fbb
Binary files /dev/null and b/imgs/icons/1340@2x.png differ
diff --git a/imgs/icons/1341.png b/imgs/icons/1341@1x.png
similarity index 100%
rename from imgs/icons/1341.png
rename to imgs/icons/1341@1x.png
diff --git a/imgs/icons/1341@2x.png b/imgs/icons/1341@2x.png
new file mode 100644
index 000000000..afac0b02c
Binary files /dev/null and b/imgs/icons/1341@2x.png differ
diff --git a/imgs/icons/1342.png b/imgs/icons/1342@1x.png
similarity index 100%
rename from imgs/icons/1342.png
rename to imgs/icons/1342@1x.png
diff --git a/imgs/icons/1342@2x.png b/imgs/icons/1342@2x.png
new file mode 100644
index 000000000..9adc3059a
Binary files /dev/null and b/imgs/icons/1342@2x.png differ
diff --git a/imgs/icons/1343.png b/imgs/icons/1343@1x.png
similarity index 100%
rename from imgs/icons/1343.png
rename to imgs/icons/1343@1x.png
diff --git a/imgs/icons/1343@2x.png b/imgs/icons/1343@2x.png
new file mode 100644
index 000000000..fa7698400
Binary files /dev/null and b/imgs/icons/1343@2x.png differ
diff --git a/imgs/icons/1344.png b/imgs/icons/1344@1x.png
similarity index 100%
rename from imgs/icons/1344.png
rename to imgs/icons/1344@1x.png
diff --git a/imgs/icons/1344@2x.png b/imgs/icons/1344@2x.png
new file mode 100644
index 000000000..b98e98eef
Binary files /dev/null and b/imgs/icons/1344@2x.png differ
diff --git a/imgs/icons/1345.png b/imgs/icons/1345@1x.png
similarity index 100%
rename from imgs/icons/1345.png
rename to imgs/icons/1345@1x.png
diff --git a/imgs/icons/1345@2x.png b/imgs/icons/1345@2x.png
new file mode 100644
index 000000000..7020f688d
Binary files /dev/null and b/imgs/icons/1345@2x.png differ
diff --git a/imgs/icons/1346.png b/imgs/icons/1346@1x.png
similarity index 100%
rename from imgs/icons/1346.png
rename to imgs/icons/1346@1x.png
diff --git a/imgs/icons/1346@2x.png b/imgs/icons/1346@2x.png
new file mode 100644
index 000000000..f42467f19
Binary files /dev/null and b/imgs/icons/1346@2x.png differ
diff --git a/imgs/icons/1347.png b/imgs/icons/1347@1x.png
similarity index 100%
rename from imgs/icons/1347.png
rename to imgs/icons/1347@1x.png
diff --git a/imgs/icons/1347@2x.png b/imgs/icons/1347@2x.png
new file mode 100644
index 000000000..2e01c3ed0
Binary files /dev/null and b/imgs/icons/1347@2x.png differ
diff --git a/imgs/icons/1348.png b/imgs/icons/1348@1x.png
similarity index 100%
rename from imgs/icons/1348.png
rename to imgs/icons/1348@1x.png
diff --git a/imgs/icons/1348@2x.png b/imgs/icons/1348@2x.png
new file mode 100644
index 000000000..c6f2e5c1f
Binary files /dev/null and b/imgs/icons/1348@2x.png differ
diff --git a/imgs/icons/1349.png b/imgs/icons/1349@1x.png
similarity index 100%
rename from imgs/icons/1349.png
rename to imgs/icons/1349@1x.png
diff --git a/imgs/icons/1349@2x.png b/imgs/icons/1349@2x.png
new file mode 100644
index 000000000..cbd354bfb
Binary files /dev/null and b/imgs/icons/1349@2x.png differ
diff --git a/imgs/icons/1350.png b/imgs/icons/1350@1x.png
similarity index 100%
rename from imgs/icons/1350.png
rename to imgs/icons/1350@1x.png
diff --git a/imgs/icons/1350@2x.png b/imgs/icons/1350@2x.png
new file mode 100644
index 000000000..1a3d3d067
Binary files /dev/null and b/imgs/icons/1350@2x.png differ
diff --git a/imgs/icons/1351.png b/imgs/icons/1351@1x.png
similarity index 100%
rename from imgs/icons/1351.png
rename to imgs/icons/1351@1x.png
diff --git a/imgs/icons/1351@2x.png b/imgs/icons/1351@2x.png
new file mode 100644
index 000000000..ef0f91fcc
Binary files /dev/null and b/imgs/icons/1351@2x.png differ
diff --git a/imgs/icons/1352.png b/imgs/icons/1352@1x.png
similarity index 100%
rename from imgs/icons/1352.png
rename to imgs/icons/1352@1x.png
diff --git a/imgs/icons/1352@2x.png b/imgs/icons/1352@2x.png
new file mode 100644
index 000000000..94f6496bf
Binary files /dev/null and b/imgs/icons/1352@2x.png differ
diff --git a/imgs/icons/1353.png b/imgs/icons/1353@1x.png
similarity index 100%
rename from imgs/icons/1353.png
rename to imgs/icons/1353@1x.png
diff --git a/imgs/icons/1353@2x.png b/imgs/icons/1353@2x.png
new file mode 100644
index 000000000..90f4599b1
Binary files /dev/null and b/imgs/icons/1353@2x.png differ
diff --git a/imgs/icons/1356.png b/imgs/icons/1356@1x.png
similarity index 100%
rename from imgs/icons/1356.png
rename to imgs/icons/1356@1x.png
diff --git a/imgs/icons/1356@2x.png b/imgs/icons/1356@2x.png
new file mode 100644
index 000000000..ec6f5a426
Binary files /dev/null and b/imgs/icons/1356@2x.png differ
diff --git a/imgs/icons/1357.png b/imgs/icons/1357@1x.png
similarity index 100%
rename from imgs/icons/1357.png
rename to imgs/icons/1357@1x.png
diff --git a/imgs/icons/1357@2x.png b/imgs/icons/1357@2x.png
new file mode 100644
index 000000000..c843be241
Binary files /dev/null and b/imgs/icons/1357@2x.png differ
diff --git a/imgs/icons/1358.png b/imgs/icons/1358@1x.png
similarity index 100%
rename from imgs/icons/1358.png
rename to imgs/icons/1358@1x.png
diff --git a/imgs/icons/1358@2x.png b/imgs/icons/1358@2x.png
new file mode 100644
index 000000000..1c08d659a
Binary files /dev/null and b/imgs/icons/1358@2x.png differ
diff --git a/imgs/icons/1359.png b/imgs/icons/1359@1x.png
similarity index 100%
rename from imgs/icons/1359.png
rename to imgs/icons/1359@1x.png
diff --git a/imgs/icons/1359@2x.png b/imgs/icons/1359@2x.png
new file mode 100644
index 000000000..72c6ba1aa
Binary files /dev/null and b/imgs/icons/1359@2x.png differ
diff --git a/imgs/icons/1360.png b/imgs/icons/1360@1x.png
similarity index 100%
rename from imgs/icons/1360.png
rename to imgs/icons/1360@1x.png
diff --git a/imgs/icons/1360@2x.png b/imgs/icons/1360@2x.png
new file mode 100644
index 000000000..d98510bd9
Binary files /dev/null and b/imgs/icons/1360@2x.png differ
diff --git a/imgs/icons/1361.png b/imgs/icons/1361@1x.png
similarity index 100%
rename from imgs/icons/1361.png
rename to imgs/icons/1361@1x.png
diff --git a/imgs/icons/1361@2x.png b/imgs/icons/1361@2x.png
new file mode 100644
index 000000000..0c7d711cd
Binary files /dev/null and b/imgs/icons/1361@2x.png differ
diff --git a/imgs/icons/1362.png b/imgs/icons/1362@1x.png
similarity index 100%
rename from imgs/icons/1362.png
rename to imgs/icons/1362@1x.png
diff --git a/imgs/icons/1362@2x.png b/imgs/icons/1362@2x.png
new file mode 100644
index 000000000..3516b8e88
Binary files /dev/null and b/imgs/icons/1362@2x.png differ
diff --git a/imgs/icons/1363.png b/imgs/icons/1363@1x.png
similarity index 100%
rename from imgs/icons/1363.png
rename to imgs/icons/1363@1x.png
diff --git a/imgs/icons/1363@2x.png b/imgs/icons/1363@2x.png
new file mode 100644
index 000000000..1a13cab32
Binary files /dev/null and b/imgs/icons/1363@2x.png differ
diff --git a/imgs/icons/1364.png b/imgs/icons/1364@1x.png
similarity index 100%
rename from imgs/icons/1364.png
rename to imgs/icons/1364@1x.png
diff --git a/imgs/icons/1364@2x.png b/imgs/icons/1364@2x.png
new file mode 100644
index 000000000..8d57561cc
Binary files /dev/null and b/imgs/icons/1364@2x.png differ
diff --git a/imgs/icons/1365.png b/imgs/icons/1365@1x.png
similarity index 100%
rename from imgs/icons/1365.png
rename to imgs/icons/1365@1x.png
diff --git a/imgs/icons/1365@2x.png b/imgs/icons/1365@2x.png
new file mode 100644
index 000000000..fd34582ba
Binary files /dev/null and b/imgs/icons/1365@2x.png differ
diff --git a/imgs/icons/1366.png b/imgs/icons/1366@1x.png
similarity index 100%
rename from imgs/icons/1366.png
rename to imgs/icons/1366@1x.png
diff --git a/imgs/icons/1366@2x.png b/imgs/icons/1366@2x.png
new file mode 100644
index 000000000..095226965
Binary files /dev/null and b/imgs/icons/1366@2x.png differ
diff --git a/imgs/icons/1367.png b/imgs/icons/1367@1x.png
similarity index 100%
rename from imgs/icons/1367.png
rename to imgs/icons/1367@1x.png
diff --git a/imgs/icons/1367@2x.png b/imgs/icons/1367@2x.png
new file mode 100644
index 000000000..c22ed5307
Binary files /dev/null and b/imgs/icons/1367@2x.png differ
diff --git a/imgs/icons/1368.png b/imgs/icons/1368@1x.png
similarity index 100%
rename from imgs/icons/1368.png
rename to imgs/icons/1368@1x.png
diff --git a/imgs/icons/1368@2x.png b/imgs/icons/1368@2x.png
new file mode 100644
index 000000000..9968ee00e
Binary files /dev/null and b/imgs/icons/1368@2x.png differ
diff --git a/imgs/icons/1369.png b/imgs/icons/1369@1x.png
similarity index 100%
rename from imgs/icons/1369.png
rename to imgs/icons/1369@1x.png
diff --git a/imgs/icons/1369@2x.png b/imgs/icons/1369@2x.png
new file mode 100644
index 000000000..d493ed617
Binary files /dev/null and b/imgs/icons/1369@2x.png differ
diff --git a/imgs/icons/1370.png b/imgs/icons/1370@1x.png
similarity index 100%
rename from imgs/icons/1370.png
rename to imgs/icons/1370@1x.png
diff --git a/imgs/icons/1370@2x.png b/imgs/icons/1370@2x.png
new file mode 100644
index 000000000..900aff1c6
Binary files /dev/null and b/imgs/icons/1370@2x.png differ
diff --git a/imgs/icons/1377.png b/imgs/icons/1377@1x.png
similarity index 100%
rename from imgs/icons/1377.png
rename to imgs/icons/1377@1x.png
diff --git a/imgs/icons/1377@2x.png b/imgs/icons/1377@2x.png
new file mode 100644
index 000000000..00f5db624
Binary files /dev/null and b/imgs/icons/1377@2x.png differ
diff --git a/imgs/icons/1378.png b/imgs/icons/1378@1x.png
similarity index 100%
rename from imgs/icons/1378.png
rename to imgs/icons/1378@1x.png
diff --git a/imgs/icons/1378@2x.png b/imgs/icons/1378@2x.png
new file mode 100644
index 000000000..4426717e7
Binary files /dev/null and b/imgs/icons/1378@2x.png differ
diff --git a/imgs/icons/1379.png b/imgs/icons/1379@1x.png
similarity index 100%
rename from imgs/icons/1379.png
rename to imgs/icons/1379@1x.png
diff --git a/imgs/icons/1379@2x.png b/imgs/icons/1379@2x.png
new file mode 100644
index 000000000..a1a42fa99
Binary files /dev/null and b/imgs/icons/1379@2x.png differ
diff --git a/imgs/icons/1380.png b/imgs/icons/1380@1x.png
similarity index 100%
rename from imgs/icons/1380.png
rename to imgs/icons/1380@1x.png
diff --git a/imgs/icons/1380@2x.png b/imgs/icons/1380@2x.png
new file mode 100644
index 000000000..5f5090da3
Binary files /dev/null and b/imgs/icons/1380@2x.png differ
diff --git a/imgs/icons/1381.png b/imgs/icons/1381@1x.png
similarity index 100%
rename from imgs/icons/1381.png
rename to imgs/icons/1381@1x.png
diff --git a/imgs/icons/1381@2x.png b/imgs/icons/1381@2x.png
new file mode 100644
index 000000000..b8b21bdd5
Binary files /dev/null and b/imgs/icons/1381@2x.png differ
diff --git a/imgs/icons/1382.png b/imgs/icons/1382@1x.png
similarity index 100%
rename from imgs/icons/1382.png
rename to imgs/icons/1382@1x.png
diff --git a/imgs/icons/1382@2x.png b/imgs/icons/1382@2x.png
new file mode 100644
index 000000000..abaa8d53b
Binary files /dev/null and b/imgs/icons/1382@2x.png differ
diff --git a/imgs/icons/1383.png b/imgs/icons/1383@1x.png
similarity index 100%
rename from imgs/icons/1383.png
rename to imgs/icons/1383@1x.png
diff --git a/imgs/icons/1383@2x.png b/imgs/icons/1383@2x.png
new file mode 100644
index 000000000..2ff8fe33d
Binary files /dev/null and b/imgs/icons/1383@2x.png differ
diff --git a/imgs/icons/1384.png b/imgs/icons/1384@1x.png
similarity index 100%
rename from imgs/icons/1384.png
rename to imgs/icons/1384@1x.png
diff --git a/imgs/icons/1384@2x.png b/imgs/icons/1384@2x.png
new file mode 100644
index 000000000..f41b263d7
Binary files /dev/null and b/imgs/icons/1384@2x.png differ
diff --git a/imgs/icons/1385.png b/imgs/icons/1385@1x.png
similarity index 100%
rename from imgs/icons/1385.png
rename to imgs/icons/1385@1x.png
diff --git a/imgs/icons/1385@2x.png b/imgs/icons/1385@2x.png
new file mode 100644
index 000000000..fd6554067
Binary files /dev/null and b/imgs/icons/1385@2x.png differ
diff --git a/imgs/icons/1386.png b/imgs/icons/1386@1x.png
similarity index 100%
rename from imgs/icons/1386.png
rename to imgs/icons/1386@1x.png
diff --git a/imgs/icons/1386@2x.png b/imgs/icons/1386@2x.png
new file mode 100644
index 000000000..8bbb88a37
Binary files /dev/null and b/imgs/icons/1386@2x.png differ
diff --git a/imgs/icons/1387.png b/imgs/icons/1387@1x.png
similarity index 100%
rename from imgs/icons/1387.png
rename to imgs/icons/1387@1x.png
diff --git a/imgs/icons/1387@2x.png b/imgs/icons/1387@2x.png
new file mode 100644
index 000000000..97d3a0d06
Binary files /dev/null and b/imgs/icons/1387@2x.png differ
diff --git a/imgs/icons/1388.png b/imgs/icons/1388@1x.png
similarity index 100%
rename from imgs/icons/1388.png
rename to imgs/icons/1388@1x.png
diff --git a/imgs/icons/1388@2x.png b/imgs/icons/1388@2x.png
new file mode 100644
index 000000000..b0601dfa3
Binary files /dev/null and b/imgs/icons/1388@2x.png differ
diff --git a/imgs/icons/1389.png b/imgs/icons/1389@1x.png
similarity index 100%
rename from imgs/icons/1389.png
rename to imgs/icons/1389@1x.png
diff --git a/imgs/icons/1389@2x.png b/imgs/icons/1389@2x.png
new file mode 100644
index 000000000..af2a9fe6c
Binary files /dev/null and b/imgs/icons/1389@2x.png differ
diff --git a/imgs/icons/138.png b/imgs/icons/138@1x.png
similarity index 100%
rename from imgs/icons/138.png
rename to imgs/icons/138@1x.png
diff --git a/imgs/icons/138@2x.png b/imgs/icons/138@2x.png
new file mode 100644
index 000000000..c2b6ec2e3
Binary files /dev/null and b/imgs/icons/138@2x.png differ
diff --git a/imgs/icons/1390.png b/imgs/icons/1390@1x.png
similarity index 100%
rename from imgs/icons/1390.png
rename to imgs/icons/1390@1x.png
diff --git a/imgs/icons/1390@2x.png b/imgs/icons/1390@2x.png
new file mode 100644
index 000000000..1657a252e
Binary files /dev/null and b/imgs/icons/1390@2x.png differ
diff --git a/imgs/icons/1391.png b/imgs/icons/1391@1x.png
similarity index 100%
rename from imgs/icons/1391.png
rename to imgs/icons/1391@1x.png
diff --git a/imgs/icons/1391@2x.png b/imgs/icons/1391@2x.png
new file mode 100644
index 000000000..658614134
Binary files /dev/null and b/imgs/icons/1391@2x.png differ
diff --git a/imgs/icons/1392.png b/imgs/icons/1392@1x.png
similarity index 100%
rename from imgs/icons/1392.png
rename to imgs/icons/1392@1x.png
diff --git a/imgs/icons/1392@2x.png b/imgs/icons/1392@2x.png
new file mode 100644
index 000000000..7e541febb
Binary files /dev/null and b/imgs/icons/1392@2x.png differ
diff --git a/imgs/icons/1393.png b/imgs/icons/1393@1x.png
similarity index 100%
rename from imgs/icons/1393.png
rename to imgs/icons/1393@1x.png
diff --git a/imgs/icons/1393@2x.png b/imgs/icons/1393@2x.png
new file mode 100644
index 000000000..80e195664
Binary files /dev/null and b/imgs/icons/1393@2x.png differ
diff --git a/imgs/icons/1394.png b/imgs/icons/1394@1x.png
similarity index 100%
rename from imgs/icons/1394.png
rename to imgs/icons/1394@1x.png
diff --git a/imgs/icons/1394@2x.png b/imgs/icons/1394@2x.png
new file mode 100644
index 000000000..ca0edaee1
Binary files /dev/null and b/imgs/icons/1394@2x.png differ
diff --git a/imgs/icons/1395.png b/imgs/icons/1395@1x.png
similarity index 100%
rename from imgs/icons/1395.png
rename to imgs/icons/1395@1x.png
diff --git a/imgs/icons/1395@2x.png b/imgs/icons/1395@2x.png
new file mode 100644
index 000000000..4cf928a31
Binary files /dev/null and b/imgs/icons/1395@2x.png differ
diff --git a/imgs/icons/1396.png b/imgs/icons/1396@1x.png
similarity index 100%
rename from imgs/icons/1396.png
rename to imgs/icons/1396@1x.png
diff --git a/imgs/icons/1396@2x.png b/imgs/icons/1396@2x.png
new file mode 100644
index 000000000..b43ac152a
Binary files /dev/null and b/imgs/icons/1396@2x.png differ
diff --git a/imgs/icons/1397.png b/imgs/icons/1397@1x.png
similarity index 100%
rename from imgs/icons/1397.png
rename to imgs/icons/1397@1x.png
diff --git a/imgs/icons/1397@2x.png b/imgs/icons/1397@2x.png
new file mode 100644
index 000000000..52073cc56
Binary files /dev/null and b/imgs/icons/1397@2x.png differ
diff --git a/imgs/icons/1398.png b/imgs/icons/1398@1x.png
similarity index 100%
rename from imgs/icons/1398.png
rename to imgs/icons/1398@1x.png
diff --git a/imgs/icons/1398@2x.png b/imgs/icons/1398@2x.png
new file mode 100644
index 000000000..443c8b6f5
Binary files /dev/null and b/imgs/icons/1398@2x.png differ
diff --git a/imgs/icons/1399.png b/imgs/icons/1399@1x.png
similarity index 100%
rename from imgs/icons/1399.png
rename to imgs/icons/1399@1x.png
diff --git a/imgs/icons/1399@2x.png b/imgs/icons/1399@2x.png
new file mode 100644
index 000000000..2e7c3acf0
Binary files /dev/null and b/imgs/icons/1399@2x.png differ
diff --git a/imgs/icons/1400.png b/imgs/icons/1400@1x.png
similarity index 100%
rename from imgs/icons/1400.png
rename to imgs/icons/1400@1x.png
diff --git a/imgs/icons/1400@2x.png b/imgs/icons/1400@2x.png
new file mode 100644
index 000000000..96a869b05
Binary files /dev/null and b/imgs/icons/1400@2x.png differ
diff --git a/imgs/icons/1401.png b/imgs/icons/1401@1x.png
similarity index 100%
rename from imgs/icons/1401.png
rename to imgs/icons/1401@1x.png
diff --git a/imgs/icons/1401@2x.png b/imgs/icons/1401@2x.png
new file mode 100644
index 000000000..93fd0784d
Binary files /dev/null and b/imgs/icons/1401@2x.png differ
diff --git a/imgs/icons/1405.png b/imgs/icons/1405@1x.png
similarity index 100%
rename from imgs/icons/1405.png
rename to imgs/icons/1405@1x.png
diff --git a/imgs/icons/1405@2x.png b/imgs/icons/1405@2x.png
new file mode 100644
index 000000000..cbcce5914
Binary files /dev/null and b/imgs/icons/1405@2x.png differ
diff --git a/imgs/icons/1406.png b/imgs/icons/1406@1x.png
similarity index 100%
rename from imgs/icons/1406.png
rename to imgs/icons/1406@1x.png
diff --git a/imgs/icons/1406@2x.png b/imgs/icons/1406@2x.png
new file mode 100644
index 000000000..271236871
Binary files /dev/null and b/imgs/icons/1406@2x.png differ
diff --git a/imgs/icons/1432.png b/imgs/icons/1432@1x.png
similarity index 100%
rename from imgs/icons/1432.png
rename to imgs/icons/1432@1x.png
diff --git a/imgs/icons/1432@2x.png b/imgs/icons/1432@2x.png
new file mode 100644
index 000000000..8a3813330
Binary files /dev/null and b/imgs/icons/1432@2x.png differ
diff --git a/imgs/icons/1435.png b/imgs/icons/1435@1x.png
similarity index 100%
rename from imgs/icons/1435.png
rename to imgs/icons/1435@1x.png
diff --git a/imgs/icons/1435@2x.png b/imgs/icons/1435@2x.png
new file mode 100644
index 000000000..c059e83c1
Binary files /dev/null and b/imgs/icons/1435@2x.png differ
diff --git a/imgs/icons/1436.png b/imgs/icons/1436@1x.png
similarity index 100%
rename from imgs/icons/1436.png
rename to imgs/icons/1436@1x.png
diff --git a/imgs/icons/1436@2x.png b/imgs/icons/1436@2x.png
new file mode 100644
index 000000000..57d99c0ae
Binary files /dev/null and b/imgs/icons/1436@2x.png differ
diff --git a/imgs/icons/1443.png b/imgs/icons/1443@1x.png
similarity index 100%
rename from imgs/icons/1443.png
rename to imgs/icons/1443@1x.png
diff --git a/imgs/icons/1443@2x.png b/imgs/icons/1443@2x.png
new file mode 100644
index 000000000..2727ec3ca
Binary files /dev/null and b/imgs/icons/1443@2x.png differ
diff --git a/imgs/icons/1444.png b/imgs/icons/1444@1x.png
similarity index 100%
rename from imgs/icons/1444.png
rename to imgs/icons/1444@1x.png
diff --git a/imgs/icons/1444@2x.png b/imgs/icons/1444@2x.png
new file mode 100644
index 000000000..98be32ea0
Binary files /dev/null and b/imgs/icons/1444@2x.png differ
diff --git a/imgs/icons/1446.png b/imgs/icons/1446@1x.png
similarity index 100%
rename from imgs/icons/1446.png
rename to imgs/icons/1446@1x.png
diff --git a/imgs/icons/1446@2x.png b/imgs/icons/1446@2x.png
new file mode 100644
index 000000000..815f1bf8a
Binary files /dev/null and b/imgs/icons/1446@2x.png differ
diff --git a/imgs/icons/15.png b/imgs/icons/15@1x.png
similarity index 100%
rename from imgs/icons/15.png
rename to imgs/icons/15@1x.png
diff --git a/imgs/icons/15@2x.png b/imgs/icons/15@2x.png
new file mode 100644
index 000000000..041ae66b0
Binary files /dev/null and b/imgs/icons/15@2x.png differ
diff --git a/imgs/icons/1639.png b/imgs/icons/1639@1x.png
similarity index 100%
rename from imgs/icons/1639.png
rename to imgs/icons/1639@1x.png
diff --git a/imgs/icons/1639@2x.png b/imgs/icons/1639@2x.png
new file mode 100644
index 000000000..22feeb323
Binary files /dev/null and b/imgs/icons/1639@2x.png differ
diff --git a/imgs/icons/1640.png b/imgs/icons/1640@1x.png
similarity index 100%
rename from imgs/icons/1640.png
rename to imgs/icons/1640@1x.png
diff --git a/imgs/icons/1640@2x.png b/imgs/icons/1640@2x.png
new file mode 100644
index 000000000..88c37b967
Binary files /dev/null and b/imgs/icons/1640@2x.png differ
diff --git a/imgs/icons/1641.png b/imgs/icons/1641@1x.png
similarity index 100%
rename from imgs/icons/1641.png
rename to imgs/icons/1641@1x.png
diff --git a/imgs/icons/1641@2x.png b/imgs/icons/1641@2x.png
new file mode 100644
index 000000000..dae55e8cc
Binary files /dev/null and b/imgs/icons/1641@2x.png differ
diff --git a/imgs/icons/1645.png b/imgs/icons/1645@1x.png
similarity index 100%
rename from imgs/icons/1645.png
rename to imgs/icons/1645@1x.png
diff --git a/imgs/icons/1645@2x.png b/imgs/icons/1645@2x.png
new file mode 100644
index 000000000..30910a04b
Binary files /dev/null and b/imgs/icons/1645@2x.png differ
diff --git a/imgs/icons/1656.png b/imgs/icons/1656@1x.png
similarity index 100%
rename from imgs/icons/1656.png
rename to imgs/icons/1656@1x.png
diff --git a/imgs/icons/1656@2x.png b/imgs/icons/1656@2x.png
new file mode 100644
index 000000000..c4e8accf7
Binary files /dev/null and b/imgs/icons/1656@2x.png differ
diff --git a/imgs/icons/1666.png b/imgs/icons/1666@1x.png
similarity index 100%
rename from imgs/icons/1666.png
rename to imgs/icons/1666@1x.png
diff --git a/imgs/icons/1666@2x.png b/imgs/icons/1666@2x.png
new file mode 100644
index 000000000..d36c8fd76
Binary files /dev/null and b/imgs/icons/1666@2x.png differ
diff --git a/imgs/icons/1668.png b/imgs/icons/1668@1x.png
similarity index 100%
rename from imgs/icons/1668.png
rename to imgs/icons/1668@1x.png
diff --git a/imgs/icons/1668@2x.png b/imgs/icons/1668@2x.png
new file mode 100644
index 000000000..e4be30a61
Binary files /dev/null and b/imgs/icons/1668@2x.png differ
diff --git a/imgs/icons/168.png b/imgs/icons/168@1x.png
similarity index 100%
rename from imgs/icons/168.png
rename to imgs/icons/168@1x.png
diff --git a/imgs/icons/168@2x.png b/imgs/icons/168@2x.png
new file mode 100644
index 000000000..bb26f1ffe
Binary files /dev/null and b/imgs/icons/168@2x.png differ
diff --git a/imgs/icons/169.png b/imgs/icons/169@1x.png
similarity index 100%
rename from imgs/icons/169.png
rename to imgs/icons/169@1x.png
diff --git a/imgs/icons/169@2x.png b/imgs/icons/169@2x.png
new file mode 100644
index 000000000..9130a1639
Binary files /dev/null and b/imgs/icons/169@2x.png differ
diff --git a/imgs/icons/16.png b/imgs/icons/16@1x.png
similarity index 100%
rename from imgs/icons/16.png
rename to imgs/icons/16@1x.png
diff --git a/imgs/icons/16@2x.png b/imgs/icons/16@2x.png
new file mode 100644
index 000000000..793b27329
Binary files /dev/null and b/imgs/icons/16@2x.png differ
diff --git a/imgs/icons/170.png b/imgs/icons/170@1x.png
similarity index 100%
rename from imgs/icons/170.png
rename to imgs/icons/170@1x.png
diff --git a/imgs/icons/170@2x.png b/imgs/icons/170@2x.png
new file mode 100644
index 000000000..e994f1d96
Binary files /dev/null and b/imgs/icons/170@2x.png differ
diff --git a/imgs/icons/1721.png b/imgs/icons/1721@1x.png
similarity index 100%
rename from imgs/icons/1721.png
rename to imgs/icons/1721@1x.png
diff --git a/imgs/icons/1721@2x.png b/imgs/icons/1721@2x.png
new file mode 100644
index 000000000..f15746d88
Binary files /dev/null and b/imgs/icons/1721@2x.png differ
diff --git a/imgs/icons/1722.png b/imgs/icons/1722@1x.png
similarity index 100%
rename from imgs/icons/1722.png
rename to imgs/icons/1722@1x.png
diff --git a/imgs/icons/1722@2x.png b/imgs/icons/1722@2x.png
new file mode 100644
index 000000000..cc8e84b1e
Binary files /dev/null and b/imgs/icons/1722@2x.png differ
diff --git a/imgs/icons/1723.png b/imgs/icons/1723@1x.png
similarity index 100%
rename from imgs/icons/1723.png
rename to imgs/icons/1723@1x.png
diff --git a/imgs/icons/1723@2x.png b/imgs/icons/1723@2x.png
new file mode 100644
index 000000000..af0db3caa
Binary files /dev/null and b/imgs/icons/1723@2x.png differ
diff --git a/imgs/icons/182.png b/imgs/icons/182@1x.png
similarity index 100%
rename from imgs/icons/182.png
rename to imgs/icons/182@1x.png
diff --git a/imgs/icons/182@2x.png b/imgs/icons/182@2x.png
new file mode 100644
index 000000000..8d5243fe6
Binary files /dev/null and b/imgs/icons/182@2x.png differ
diff --git a/imgs/icons/183.png b/imgs/icons/183@1x.png
similarity index 100%
rename from imgs/icons/183.png
rename to imgs/icons/183@1x.png
diff --git a/imgs/icons/183@2x.png b/imgs/icons/183@2x.png
new file mode 100644
index 000000000..721a165f1
Binary files /dev/null and b/imgs/icons/183@2x.png differ
diff --git a/imgs/icons/184.png b/imgs/icons/184@1x.png
similarity index 100%
rename from imgs/icons/184.png
rename to imgs/icons/184@1x.png
diff --git a/imgs/icons/184@2x.png b/imgs/icons/184@2x.png
new file mode 100644
index 000000000..2897858bb
Binary files /dev/null and b/imgs/icons/184@2x.png differ
diff --git a/imgs/icons/185.png b/imgs/icons/185@1x.png
similarity index 100%
rename from imgs/icons/185.png
rename to imgs/icons/185@1x.png
diff --git a/imgs/icons/185@2x.png b/imgs/icons/185@2x.png
new file mode 100644
index 000000000..ff541bf0d
Binary files /dev/null and b/imgs/icons/185@2x.png differ
diff --git a/imgs/icons/186.png b/imgs/icons/186@1x.png
similarity index 100%
rename from imgs/icons/186.png
rename to imgs/icons/186@1x.png
diff --git a/imgs/icons/186@2x.png b/imgs/icons/186@2x.png
new file mode 100644
index 000000000..588f90496
Binary files /dev/null and b/imgs/icons/186@2x.png differ
diff --git a/imgs/icons/187.png b/imgs/icons/187@1x.png
similarity index 100%
rename from imgs/icons/187.png
rename to imgs/icons/187@1x.png
diff --git a/imgs/icons/187@2x.png b/imgs/icons/187@2x.png
new file mode 100644
index 000000000..497f90ab9
Binary files /dev/null and b/imgs/icons/187@2x.png differ
diff --git a/imgs/icons/188.png b/imgs/icons/188@1x.png
similarity index 100%
rename from imgs/icons/188.png
rename to imgs/icons/188@1x.png
diff --git a/imgs/icons/188@2x.png b/imgs/icons/188@2x.png
new file mode 100644
index 000000000..97e08a1c4
Binary files /dev/null and b/imgs/icons/188@2x.png differ
diff --git a/imgs/icons/189.png b/imgs/icons/189@1x.png
similarity index 100%
rename from imgs/icons/189.png
rename to imgs/icons/189@1x.png
diff --git a/imgs/icons/189@2x.png b/imgs/icons/189@2x.png
new file mode 100644
index 000000000..2b385052c
Binary files /dev/null and b/imgs/icons/189@2x.png differ
diff --git a/imgs/icons/190.png b/imgs/icons/190@1x.png
similarity index 100%
rename from imgs/icons/190.png
rename to imgs/icons/190@1x.png
diff --git a/imgs/icons/190@2x.png b/imgs/icons/190@2x.png
new file mode 100644
index 000000000..07a5f1621
Binary files /dev/null and b/imgs/icons/190@2x.png differ
diff --git a/imgs/icons/191.png b/imgs/icons/191@1x.png
similarity index 100%
rename from imgs/icons/191.png
rename to imgs/icons/191@1x.png
diff --git a/imgs/icons/191@2x.png b/imgs/icons/191@2x.png
new file mode 100644
index 000000000..073f465b9
Binary files /dev/null and b/imgs/icons/191@2x.png differ
diff --git a/imgs/icons/192.png b/imgs/icons/192@1x.png
similarity index 100%
rename from imgs/icons/192.png
rename to imgs/icons/192@1x.png
diff --git a/imgs/icons/192@2x.png b/imgs/icons/192@2x.png
new file mode 100644
index 000000000..11b33b6dc
Binary files /dev/null and b/imgs/icons/192@2x.png differ
diff --git a/imgs/icons/193.png b/imgs/icons/193@1x.png
similarity index 100%
rename from imgs/icons/193.png
rename to imgs/icons/193@1x.png
diff --git a/imgs/icons/193@2x.png b/imgs/icons/193@2x.png
new file mode 100644
index 000000000..67ba8d092
Binary files /dev/null and b/imgs/icons/193@2x.png differ
diff --git a/imgs/icons/2028.png b/imgs/icons/2028@1x.png
similarity index 100%
rename from imgs/icons/2028.png
rename to imgs/icons/2028@1x.png
diff --git a/imgs/icons/2028@2x.png b/imgs/icons/2028@2x.png
new file mode 100644
index 000000000..974742856
Binary files /dev/null and b/imgs/icons/2028@2x.png differ
diff --git a/imgs/icons/2029.png b/imgs/icons/2029@1x.png
similarity index 100%
rename from imgs/icons/2029.png
rename to imgs/icons/2029@1x.png
diff --git a/imgs/icons/2029@2x.png b/imgs/icons/2029@2x.png
new file mode 100644
index 000000000..5ac6d9bb9
Binary files /dev/null and b/imgs/icons/2029@2x.png differ
diff --git a/imgs/icons/2030.png b/imgs/icons/2030@1x.png
similarity index 100%
rename from imgs/icons/2030.png
rename to imgs/icons/2030@1x.png
diff --git a/imgs/icons/2030@2x.png b/imgs/icons/2030@2x.png
new file mode 100644
index 000000000..3c63bf863
Binary files /dev/null and b/imgs/icons/2030@2x.png differ
diff --git a/imgs/icons/2031.png b/imgs/icons/2031@1x.png
similarity index 100%
rename from imgs/icons/2031.png
rename to imgs/icons/2031@1x.png
diff --git a/imgs/icons/2031@2x.png b/imgs/icons/2031@2x.png
new file mode 100644
index 000000000..6fde7c443
Binary files /dev/null and b/imgs/icons/2031@2x.png differ
diff --git a/imgs/icons/2037.png b/imgs/icons/2037@1x.png
similarity index 100%
rename from imgs/icons/2037.png
rename to imgs/icons/2037@1x.png
diff --git a/imgs/icons/2037@2x.png b/imgs/icons/2037@2x.png
new file mode 100644
index 000000000..65c7301fc
Binary files /dev/null and b/imgs/icons/2037@2x.png differ
diff --git a/imgs/icons/2038.png b/imgs/icons/2038@1x.png
similarity index 100%
rename from imgs/icons/2038.png
rename to imgs/icons/2038@1x.png
diff --git a/imgs/icons/2038@2x.png b/imgs/icons/2038@2x.png
new file mode 100644
index 000000000..293fc5625
Binary files /dev/null and b/imgs/icons/2038@2x.png differ
diff --git a/imgs/icons/2039.png b/imgs/icons/2039@1x.png
similarity index 100%
rename from imgs/icons/2039.png
rename to imgs/icons/2039@1x.png
diff --git a/imgs/icons/2039@2x.png b/imgs/icons/2039@2x.png
new file mode 100644
index 000000000..3ce715cd5
Binary files /dev/null and b/imgs/icons/2039@2x.png differ
diff --git a/imgs/icons/2040.png b/imgs/icons/2040@1x.png
similarity index 100%
rename from imgs/icons/2040.png
rename to imgs/icons/2040@1x.png
diff --git a/imgs/icons/2040@2x.png b/imgs/icons/2040@2x.png
new file mode 100644
index 000000000..eb532b2b1
Binary files /dev/null and b/imgs/icons/2040@2x.png differ
diff --git a/imgs/icons/2041.png b/imgs/icons/2041@1x.png
similarity index 100%
rename from imgs/icons/2041.png
rename to imgs/icons/2041@1x.png
diff --git a/imgs/icons/2041@2x.png b/imgs/icons/2041@2x.png
new file mode 100644
index 000000000..ce4186845
Binary files /dev/null and b/imgs/icons/2041@2x.png differ
diff --git a/imgs/icons/2042.png b/imgs/icons/2042@1x.png
similarity index 100%
rename from imgs/icons/2042.png
rename to imgs/icons/2042@1x.png
diff --git a/imgs/icons/2042@2x.png b/imgs/icons/2042@2x.png
new file mode 100644
index 000000000..95dfb3662
Binary files /dev/null and b/imgs/icons/2042@2x.png differ
diff --git a/imgs/icons/2053.png b/imgs/icons/2053@1x.png
similarity index 100%
rename from imgs/icons/2053.png
rename to imgs/icons/2053@1x.png
diff --git a/imgs/icons/2053@2x.png b/imgs/icons/2053@2x.png
new file mode 100644
index 000000000..36b788edf
Binary files /dev/null and b/imgs/icons/2053@2x.png differ
diff --git a/imgs/icons/2054.png b/imgs/icons/2054@1x.png
similarity index 100%
rename from imgs/icons/2054.png
rename to imgs/icons/2054@1x.png
diff --git a/imgs/icons/2054@2x.png b/imgs/icons/2054@2x.png
new file mode 100644
index 000000000..eeb4fa0d0
Binary files /dev/null and b/imgs/icons/2054@2x.png differ
diff --git a/imgs/icons/2060.png b/imgs/icons/2060@1x.png
similarity index 100%
rename from imgs/icons/2060.png
rename to imgs/icons/2060@1x.png
diff --git a/imgs/icons/2060@2x.png b/imgs/icons/2060@2x.png
new file mode 100644
index 000000000..f91807576
Binary files /dev/null and b/imgs/icons/2060@2x.png differ
diff --git a/imgs/icons/2061.png b/imgs/icons/2061@1x.png
similarity index 100%
rename from imgs/icons/2061.png
rename to imgs/icons/2061@1x.png
diff --git a/imgs/icons/2061@2x.png b/imgs/icons/2061@2x.png
new file mode 100644
index 000000000..f7bf80255
Binary files /dev/null and b/imgs/icons/2061@2x.png differ
diff --git a/imgs/icons/2062.png b/imgs/icons/2062@1x.png
similarity index 100%
rename from imgs/icons/2062.png
rename to imgs/icons/2062@1x.png
diff --git a/imgs/icons/2062@2x.png b/imgs/icons/2062@2x.png
new file mode 100644
index 000000000..74b76e2e9
Binary files /dev/null and b/imgs/icons/2062@2x.png differ
diff --git a/imgs/icons/2066.png b/imgs/icons/2066@1x.png
similarity index 100%
rename from imgs/icons/2066.png
rename to imgs/icons/2066@1x.png
diff --git a/imgs/icons/2066@2x.png b/imgs/icons/2066@2x.png
new file mode 100644
index 000000000..6bfa11e23
Binary files /dev/null and b/imgs/icons/2066@2x.png differ
diff --git a/imgs/icons/20939.png b/imgs/icons/20939@1x.png
similarity index 100%
rename from imgs/icons/20939.png
rename to imgs/icons/20939@1x.png
diff --git a/imgs/icons/20939@2x.png b/imgs/icons/20939@2x.png
new file mode 100644
index 000000000..597acc3fc
Binary files /dev/null and b/imgs/icons/20939@2x.png differ
diff --git a/imgs/icons/2093.png b/imgs/icons/2093@1x.png
similarity index 100%
rename from imgs/icons/2093.png
rename to imgs/icons/2093@1x.png
diff --git a/imgs/icons/2093@2x.png b/imgs/icons/2093@2x.png
new file mode 100644
index 000000000..263fce8f1
Binary files /dev/null and b/imgs/icons/2093@2x.png differ
diff --git a/imgs/icons/20940.png b/imgs/icons/20940@1x.png
similarity index 100%
rename from imgs/icons/20940.png
rename to imgs/icons/20940@1x.png
diff --git a/imgs/icons/20940@2x.png b/imgs/icons/20940@2x.png
new file mode 100644
index 000000000..7172b32ee
Binary files /dev/null and b/imgs/icons/20940@2x.png differ
diff --git a/imgs/icons/20941.png b/imgs/icons/20941@1x.png
similarity index 100%
rename from imgs/icons/20941.png
rename to imgs/icons/20941@1x.png
diff --git a/imgs/icons/20941@2x.png b/imgs/icons/20941@2x.png
new file mode 100644
index 000000000..7c2d570f5
Binary files /dev/null and b/imgs/icons/20941@2x.png differ
diff --git a/imgs/icons/20942.png b/imgs/icons/20942@1x.png
similarity index 100%
rename from imgs/icons/20942.png
rename to imgs/icons/20942@1x.png
diff --git a/imgs/icons/20942@2x.png b/imgs/icons/20942@2x.png
new file mode 100644
index 000000000..08582f4c5
Binary files /dev/null and b/imgs/icons/20942@2x.png differ
diff --git a/imgs/icons/20943.png b/imgs/icons/20943@1x.png
similarity index 100%
rename from imgs/icons/20943.png
rename to imgs/icons/20943@1x.png
diff --git a/imgs/icons/20943@2x.png b/imgs/icons/20943@2x.png
new file mode 100644
index 000000000..c66a89d13
Binary files /dev/null and b/imgs/icons/20943@2x.png differ
diff --git a/imgs/icons/20944.png b/imgs/icons/20944@1x.png
similarity index 100%
rename from imgs/icons/20944.png
rename to imgs/icons/20944@1x.png
diff --git a/imgs/icons/20944@2x.png b/imgs/icons/20944@2x.png
new file mode 100644
index 000000000..70daf8465
Binary files /dev/null and b/imgs/icons/20944@2x.png differ
diff --git a/imgs/icons/20945.png b/imgs/icons/20945@1x.png
similarity index 100%
rename from imgs/icons/20945.png
rename to imgs/icons/20945@1x.png
diff --git a/imgs/icons/20945@2x.png b/imgs/icons/20945@2x.png
new file mode 100644
index 000000000..af0e0e1d5
Binary files /dev/null and b/imgs/icons/20945@2x.png differ
diff --git a/imgs/icons/20946.png b/imgs/icons/20946@1x.png
similarity index 100%
rename from imgs/icons/20946.png
rename to imgs/icons/20946@1x.png
diff --git a/imgs/icons/20946@2x.png b/imgs/icons/20946@2x.png
new file mode 100644
index 000000000..eaaa7d1f2
Binary files /dev/null and b/imgs/icons/20946@2x.png differ
diff --git a/imgs/icons/20947.png b/imgs/icons/20947@1x.png
similarity index 100%
rename from imgs/icons/20947.png
rename to imgs/icons/20947@1x.png
diff --git a/imgs/icons/20947@2x.png b/imgs/icons/20947@2x.png
new file mode 100644
index 000000000..47a0a5f0c
Binary files /dev/null and b/imgs/icons/20947@2x.png differ
diff --git a/imgs/icons/20948.png b/imgs/icons/20948@1x.png
similarity index 100%
rename from imgs/icons/20948.png
rename to imgs/icons/20948@1x.png
diff --git a/imgs/icons/20948@2x.png b/imgs/icons/20948@2x.png
new file mode 100644
index 000000000..1c9f273e4
Binary files /dev/null and b/imgs/icons/20948@2x.png differ
diff --git a/imgs/icons/20949.png b/imgs/icons/20949@1x.png
similarity index 100%
rename from imgs/icons/20949.png
rename to imgs/icons/20949@1x.png
diff --git a/imgs/icons/20949@2x.png b/imgs/icons/20949@2x.png
new file mode 100644
index 000000000..4658330aa
Binary files /dev/null and b/imgs/icons/20949@2x.png differ
diff --git a/imgs/icons/2094.png b/imgs/icons/2094@1x.png
similarity index 100%
rename from imgs/icons/2094.png
rename to imgs/icons/2094@1x.png
diff --git a/imgs/icons/2094@2x.png b/imgs/icons/2094@2x.png
new file mode 100644
index 000000000..53fd9db83
Binary files /dev/null and b/imgs/icons/2094@2x.png differ
diff --git a/imgs/icons/20950.png b/imgs/icons/20950@1x.png
similarity index 100%
rename from imgs/icons/20950.png
rename to imgs/icons/20950@1x.png
diff --git a/imgs/icons/20950@2x.png b/imgs/icons/20950@2x.png
new file mode 100644
index 000000000..a8bbf3d1c
Binary files /dev/null and b/imgs/icons/20950@2x.png differ
diff --git a/imgs/icons/20951.png b/imgs/icons/20951@1x.png
similarity index 100%
rename from imgs/icons/20951.png
rename to imgs/icons/20951@1x.png
diff --git a/imgs/icons/20951@2x.png b/imgs/icons/20951@2x.png
new file mode 100644
index 000000000..31709660f
Binary files /dev/null and b/imgs/icons/20951@2x.png differ
diff --git a/imgs/icons/20952.png b/imgs/icons/20952@1x.png
similarity index 100%
rename from imgs/icons/20952.png
rename to imgs/icons/20952@1x.png
diff --git a/imgs/icons/20952@2x.png b/imgs/icons/20952@2x.png
new file mode 100644
index 000000000..292dd1b67
Binary files /dev/null and b/imgs/icons/20952@2x.png differ
diff --git a/imgs/icons/20953.png b/imgs/icons/20953@1x.png
similarity index 100%
rename from imgs/icons/20953.png
rename to imgs/icons/20953@1x.png
diff --git a/imgs/icons/20953@2x.png b/imgs/icons/20953@2x.png
new file mode 100644
index 000000000..cbd0bdb5e
Binary files /dev/null and b/imgs/icons/20953@2x.png differ
diff --git a/imgs/icons/20954.png b/imgs/icons/20954@1x.png
similarity index 100%
rename from imgs/icons/20954.png
rename to imgs/icons/20954@1x.png
diff --git a/imgs/icons/20954@2x.png b/imgs/icons/20954@2x.png
new file mode 100644
index 000000000..348422d6c
Binary files /dev/null and b/imgs/icons/20954@2x.png differ
diff --git a/imgs/icons/20955.png b/imgs/icons/20955@1x.png
similarity index 100%
rename from imgs/icons/20955.png
rename to imgs/icons/20955@1x.png
diff --git a/imgs/icons/20955@2x.png b/imgs/icons/20955@2x.png
new file mode 100644
index 000000000..a09459ab4
Binary files /dev/null and b/imgs/icons/20955@2x.png differ
diff --git a/imgs/icons/20956.png b/imgs/icons/20956@1x.png
similarity index 100%
rename from imgs/icons/20956.png
rename to imgs/icons/20956@1x.png
diff --git a/imgs/icons/20956@2x.png b/imgs/icons/20956@2x.png
new file mode 100644
index 000000000..67087edb4
Binary files /dev/null and b/imgs/icons/20956@2x.png differ
diff --git a/imgs/icons/20957.png b/imgs/icons/20957@1x.png
similarity index 100%
rename from imgs/icons/20957.png
rename to imgs/icons/20957@1x.png
diff --git a/imgs/icons/20957@2x.png b/imgs/icons/20957@2x.png
new file mode 100644
index 000000000..644c5f335
Binary files /dev/null and b/imgs/icons/20957@2x.png differ
diff --git a/imgs/icons/20958.png b/imgs/icons/20958@1x.png
similarity index 100%
rename from imgs/icons/20958.png
rename to imgs/icons/20958@1x.png
diff --git a/imgs/icons/20958@2x.png b/imgs/icons/20958@2x.png
new file mode 100644
index 000000000..7e4954ecb
Binary files /dev/null and b/imgs/icons/20958@2x.png differ
diff --git a/imgs/icons/20959.png b/imgs/icons/20959@1x.png
similarity index 100%
rename from imgs/icons/20959.png
rename to imgs/icons/20959@1x.png
diff --git a/imgs/icons/20959@2x.png b/imgs/icons/20959@2x.png
new file mode 100644
index 000000000..fdb721f65
Binary files /dev/null and b/imgs/icons/20959@2x.png differ
diff --git a/imgs/icons/2095.png b/imgs/icons/2095@1x.png
similarity index 100%
rename from imgs/icons/2095.png
rename to imgs/icons/2095@1x.png
diff --git a/imgs/icons/2095@2x.png b/imgs/icons/2095@2x.png
new file mode 100644
index 000000000..08ffcf398
Binary files /dev/null and b/imgs/icons/2095@2x.png differ
diff --git a/imgs/icons/20966.png b/imgs/icons/20966@1x.png
similarity index 100%
rename from imgs/icons/20966.png
rename to imgs/icons/20966@1x.png
diff --git a/imgs/icons/20966@2x.png b/imgs/icons/20966@2x.png
new file mode 100644
index 000000000..edd49286e
Binary files /dev/null and b/imgs/icons/20966@2x.png differ
diff --git a/imgs/icons/20967.png b/imgs/icons/20967@1x.png
similarity index 100%
rename from imgs/icons/20967.png
rename to imgs/icons/20967@1x.png
diff --git a/imgs/icons/20967@2x.png b/imgs/icons/20967@2x.png
new file mode 100644
index 000000000..4039ba05c
Binary files /dev/null and b/imgs/icons/20967@2x.png differ
diff --git a/imgs/icons/20968.png b/imgs/icons/20968@1x.png
similarity index 100%
rename from imgs/icons/20968.png
rename to imgs/icons/20968@1x.png
diff --git a/imgs/icons/20968@2x.png b/imgs/icons/20968@2x.png
new file mode 100644
index 000000000..dba4a2726
Binary files /dev/null and b/imgs/icons/20968@2x.png differ
diff --git a/imgs/icons/20969.png b/imgs/icons/20969@1x.png
similarity index 100%
rename from imgs/icons/20969.png
rename to imgs/icons/20969@1x.png
diff --git a/imgs/icons/20969@2x.png b/imgs/icons/20969@2x.png
new file mode 100644
index 000000000..50dcf8f11
Binary files /dev/null and b/imgs/icons/20969@2x.png differ
diff --git a/imgs/icons/2096.png b/imgs/icons/2096@1x.png
similarity index 100%
rename from imgs/icons/2096.png
rename to imgs/icons/2096@1x.png
diff --git a/imgs/icons/2096@2x.png b/imgs/icons/2096@2x.png
new file mode 100644
index 000000000..626d0d99e
Binary files /dev/null and b/imgs/icons/2096@2x.png differ
diff --git a/imgs/icons/20970.png b/imgs/icons/20970@1x.png
similarity index 100%
rename from imgs/icons/20970.png
rename to imgs/icons/20970@1x.png
diff --git a/imgs/icons/20970@2x.png b/imgs/icons/20970@2x.png
new file mode 100644
index 000000000..3342c01cc
Binary files /dev/null and b/imgs/icons/20970@2x.png differ
diff --git a/imgs/icons/20971.png b/imgs/icons/20971@1x.png
similarity index 100%
rename from imgs/icons/20971.png
rename to imgs/icons/20971@1x.png
diff --git a/imgs/icons/20971@2x.png b/imgs/icons/20971@2x.png
new file mode 100644
index 000000000..8f026e603
Binary files /dev/null and b/imgs/icons/20971@2x.png differ
diff --git a/imgs/icons/20973.png b/imgs/icons/20973@1x.png
similarity index 100%
rename from imgs/icons/20973.png
rename to imgs/icons/20973@1x.png
diff --git a/imgs/icons/20973@2x.png b/imgs/icons/20973@2x.png
new file mode 100644
index 000000000..22abcac85
Binary files /dev/null and b/imgs/icons/20973@2x.png differ
diff --git a/imgs/icons/20974.png b/imgs/icons/20974@1x.png
similarity index 100%
rename from imgs/icons/20974.png
rename to imgs/icons/20974@1x.png
diff --git a/imgs/icons/20974@2x.png b/imgs/icons/20974@2x.png
new file mode 100644
index 000000000..820f20506
Binary files /dev/null and b/imgs/icons/20974@2x.png differ
diff --git a/imgs/icons/20976.png b/imgs/icons/20976@1x.png
similarity index 100%
rename from imgs/icons/20976.png
rename to imgs/icons/20976@1x.png
diff --git a/imgs/icons/20976@2x.png b/imgs/icons/20976@2x.png
new file mode 100644
index 000000000..8383a39ee
Binary files /dev/null and b/imgs/icons/20976@2x.png differ
diff --git a/imgs/icons/20977.png b/imgs/icons/20977@1x.png
similarity index 100%
rename from imgs/icons/20977.png
rename to imgs/icons/20977@1x.png
diff --git a/imgs/icons/20977@2x.png b/imgs/icons/20977@2x.png
new file mode 100644
index 000000000..8e2752920
Binary files /dev/null and b/imgs/icons/20977@2x.png differ
diff --git a/imgs/icons/21000.png b/imgs/icons/21000@1x.png
similarity index 100%
rename from imgs/icons/21000.png
rename to imgs/icons/21000@1x.png
diff --git a/imgs/icons/21000@2x.png b/imgs/icons/21000@2x.png
new file mode 100644
index 000000000..a7718ac5a
Binary files /dev/null and b/imgs/icons/21000@2x.png differ
diff --git a/imgs/icons/2100.png b/imgs/icons/2100@1x.png
similarity index 100%
rename from imgs/icons/2100.png
rename to imgs/icons/2100@1x.png
diff --git a/imgs/icons/2100@2x.png b/imgs/icons/2100@2x.png
new file mode 100644
index 000000000..b56b494c3
Binary files /dev/null and b/imgs/icons/2100@2x.png differ
diff --git a/imgs/icons/2101.png b/imgs/icons/2101@1x.png
similarity index 100%
rename from imgs/icons/2101.png
rename to imgs/icons/2101@1x.png
diff --git a/imgs/icons/2101@2x.png b/imgs/icons/2101@2x.png
new file mode 100644
index 000000000..c09d3e35c
Binary files /dev/null and b/imgs/icons/2101@2x.png differ
diff --git a/imgs/icons/21025.png b/imgs/icons/21025@1x.png
similarity index 100%
rename from imgs/icons/21025.png
rename to imgs/icons/21025@1x.png
diff --git a/imgs/icons/21025@2x.png b/imgs/icons/21025@2x.png
new file mode 100644
index 000000000..c032184e3
Binary files /dev/null and b/imgs/icons/21025@2x.png differ
diff --git a/imgs/icons/21026.png b/imgs/icons/21026@1x.png
similarity index 100%
rename from imgs/icons/21026.png
rename to imgs/icons/21026@1x.png
diff --git a/imgs/icons/21026@2x.png b/imgs/icons/21026@2x.png
new file mode 100644
index 000000000..3b8d62700
Binary files /dev/null and b/imgs/icons/21026@2x.png differ
diff --git a/imgs/icons/21027.png b/imgs/icons/21027@1x.png
similarity index 100%
rename from imgs/icons/21027.png
rename to imgs/icons/21027@1x.png
diff --git a/imgs/icons/21027@2x.png b/imgs/icons/21027@2x.png
new file mode 100644
index 000000000..12866c58e
Binary files /dev/null and b/imgs/icons/21027@2x.png differ
diff --git a/imgs/icons/21028.png b/imgs/icons/21028@1x.png
similarity index 100%
rename from imgs/icons/21028.png
rename to imgs/icons/21028@1x.png
diff --git a/imgs/icons/21028@2x.png b/imgs/icons/21028@2x.png
new file mode 100644
index 000000000..1c431b30b
Binary files /dev/null and b/imgs/icons/21028@2x.png differ
diff --git a/imgs/icons/21029.png b/imgs/icons/21029@1x.png
similarity index 100%
rename from imgs/icons/21029.png
rename to imgs/icons/21029@1x.png
diff --git a/imgs/icons/21029@2x.png b/imgs/icons/21029@2x.png
new file mode 100644
index 000000000..9231ccec9
Binary files /dev/null and b/imgs/icons/21029@2x.png differ
diff --git a/imgs/icons/2102.png b/imgs/icons/2102@1x.png
similarity index 100%
rename from imgs/icons/2102.png
rename to imgs/icons/2102@1x.png
diff --git a/imgs/icons/2102@2x.png b/imgs/icons/2102@2x.png
new file mode 100644
index 000000000..263ab408e
Binary files /dev/null and b/imgs/icons/2102@2x.png differ
diff --git a/imgs/icons/21030.png b/imgs/icons/21030@1x.png
similarity index 100%
rename from imgs/icons/21030.png
rename to imgs/icons/21030@1x.png
diff --git a/imgs/icons/21030@2x.png b/imgs/icons/21030@2x.png
new file mode 100644
index 000000000..441c0af47
Binary files /dev/null and b/imgs/icons/21030@2x.png differ
diff --git a/imgs/icons/21032.png b/imgs/icons/21032@1x.png
similarity index 100%
rename from imgs/icons/21032.png
rename to imgs/icons/21032@1x.png
diff --git a/imgs/icons/21032@2x.png b/imgs/icons/21032@2x.png
new file mode 100644
index 000000000..519e87754
Binary files /dev/null and b/imgs/icons/21032@2x.png differ
diff --git a/imgs/icons/2103.png b/imgs/icons/2103@1x.png
similarity index 100%
rename from imgs/icons/2103.png
rename to imgs/icons/2103@1x.png
diff --git a/imgs/icons/2103@2x.png b/imgs/icons/2103@2x.png
new file mode 100644
index 000000000..a975ebe1b
Binary files /dev/null and b/imgs/icons/2103@2x.png differ
diff --git a/imgs/icons/21047.png b/imgs/icons/21047@1x.png
similarity index 100%
rename from imgs/icons/21047.png
rename to imgs/icons/21047@1x.png
diff --git a/imgs/icons/21047@2x.png b/imgs/icons/21047@2x.png
new file mode 100644
index 000000000..b63f47625
Binary files /dev/null and b/imgs/icons/21047@2x.png differ
diff --git a/imgs/icons/21048.png b/imgs/icons/21048@1x.png
similarity index 100%
rename from imgs/icons/21048.png
rename to imgs/icons/21048@1x.png
diff --git a/imgs/icons/21048@2x.png b/imgs/icons/21048@2x.png
new file mode 100644
index 000000000..5378b211e
Binary files /dev/null and b/imgs/icons/21048@2x.png differ
diff --git a/imgs/icons/2104.png b/imgs/icons/2104@1x.png
similarity index 100%
rename from imgs/icons/2104.png
rename to imgs/icons/2104@1x.png
diff --git a/imgs/icons/2104@2x.png b/imgs/icons/2104@2x.png
new file mode 100644
index 000000000..28cddc2e7
Binary files /dev/null and b/imgs/icons/2104@2x.png differ
diff --git a/imgs/icons/21057.png b/imgs/icons/21057@1x.png
similarity index 100%
rename from imgs/icons/21057.png
rename to imgs/icons/21057@1x.png
diff --git a/imgs/icons/21057@2x.png b/imgs/icons/21057@2x.png
new file mode 100644
index 000000000..574b82518
Binary files /dev/null and b/imgs/icons/21057@2x.png differ
diff --git a/imgs/icons/21058.png b/imgs/icons/21058@1x.png
similarity index 100%
rename from imgs/icons/21058.png
rename to imgs/icons/21058@1x.png
diff --git a/imgs/icons/21058@2x.png b/imgs/icons/21058@2x.png
new file mode 100644
index 000000000..e899f4b30
Binary files /dev/null and b/imgs/icons/21058@2x.png differ
diff --git a/imgs/icons/21059.png b/imgs/icons/21059@1x.png
similarity index 100%
rename from imgs/icons/21059.png
rename to imgs/icons/21059@1x.png
diff --git a/imgs/icons/21059@2x.png b/imgs/icons/21059@2x.png
new file mode 100644
index 000000000..8ecdf93de
Binary files /dev/null and b/imgs/icons/21059@2x.png differ
diff --git a/imgs/icons/2105.png b/imgs/icons/2105@1x.png
similarity index 100%
rename from imgs/icons/2105.png
rename to imgs/icons/2105@1x.png
diff --git a/imgs/icons/2105@2x.png b/imgs/icons/2105@2x.png
new file mode 100644
index 000000000..c7efd5230
Binary files /dev/null and b/imgs/icons/2105@2x.png differ
diff --git a/imgs/icons/21060.png b/imgs/icons/21060@1x.png
similarity index 100%
rename from imgs/icons/21060.png
rename to imgs/icons/21060@1x.png
diff --git a/imgs/icons/21060@2x.png b/imgs/icons/21060@2x.png
new file mode 100644
index 000000000..80caaa94a
Binary files /dev/null and b/imgs/icons/21060@2x.png differ
diff --git a/imgs/icons/21061.png b/imgs/icons/21061@1x.png
similarity index 100%
rename from imgs/icons/21061.png
rename to imgs/icons/21061@1x.png
diff --git a/imgs/icons/21061@2x.png b/imgs/icons/21061@2x.png
new file mode 100644
index 000000000..c89a1b72a
Binary files /dev/null and b/imgs/icons/21061@2x.png differ
diff --git a/imgs/icons/21062.png b/imgs/icons/21062@1x.png
similarity index 100%
rename from imgs/icons/21062.png
rename to imgs/icons/21062@1x.png
diff --git a/imgs/icons/21062@2x.png b/imgs/icons/21062@2x.png
new file mode 100644
index 000000000..eefcda285
Binary files /dev/null and b/imgs/icons/21062@2x.png differ
diff --git a/imgs/icons/21063.png b/imgs/icons/21063@1x.png
similarity index 100%
rename from imgs/icons/21063.png
rename to imgs/icons/21063@1x.png
diff --git a/imgs/icons/21063@2x.png b/imgs/icons/21063@2x.png
new file mode 100644
index 000000000..896e5ac97
Binary files /dev/null and b/imgs/icons/21063@2x.png differ
diff --git a/imgs/icons/21064.png b/imgs/icons/21064@1x.png
similarity index 100%
rename from imgs/icons/21064.png
rename to imgs/icons/21064@1x.png
diff --git a/imgs/icons/21064@2x.png b/imgs/icons/21064@2x.png
new file mode 100644
index 000000000..c602834d0
Binary files /dev/null and b/imgs/icons/21064@2x.png differ
diff --git a/imgs/icons/21065.png b/imgs/icons/21065@1x.png
similarity index 100%
rename from imgs/icons/21065.png
rename to imgs/icons/21065@1x.png
diff --git a/imgs/icons/21065@2x.png b/imgs/icons/21065@2x.png
new file mode 100644
index 000000000..0145eb4b6
Binary files /dev/null and b/imgs/icons/21065@2x.png differ
diff --git a/imgs/icons/21066.png b/imgs/icons/21066@1x.png
similarity index 100%
rename from imgs/icons/21066.png
rename to imgs/icons/21066@1x.png
diff --git a/imgs/icons/21066@2x.png b/imgs/icons/21066@2x.png
new file mode 100644
index 000000000..e0a416cd7
Binary files /dev/null and b/imgs/icons/21066@2x.png differ
diff --git a/imgs/icons/2106.png b/imgs/icons/2106@1x.png
similarity index 100%
rename from imgs/icons/2106.png
rename to imgs/icons/2106@1x.png
diff --git a/imgs/icons/2106@2x.png b/imgs/icons/2106@2x.png
new file mode 100644
index 000000000..1e1b2ef1a
Binary files /dev/null and b/imgs/icons/2106@2x.png differ
diff --git a/imgs/icons/21074.png b/imgs/icons/21074@1x.png
similarity index 100%
rename from imgs/icons/21074.png
rename to imgs/icons/21074@1x.png
diff --git a/imgs/icons/21074@2x.png b/imgs/icons/21074@2x.png
new file mode 100644
index 000000000..bd450c94a
Binary files /dev/null and b/imgs/icons/21074@2x.png differ
diff --git a/imgs/icons/21075.png b/imgs/icons/21075@1x.png
similarity index 100%
rename from imgs/icons/21075.png
rename to imgs/icons/21075@1x.png
diff --git a/imgs/icons/21075@2x.png b/imgs/icons/21075@2x.png
new file mode 100644
index 000000000..fa2cb2535
Binary files /dev/null and b/imgs/icons/21075@2x.png differ
diff --git a/imgs/icons/21078.png b/imgs/icons/21078@1x.png
similarity index 100%
rename from imgs/icons/21078.png
rename to imgs/icons/21078@1x.png
diff --git a/imgs/icons/21078@2x.png b/imgs/icons/21078@2x.png
new file mode 100644
index 000000000..17f5ec26c
Binary files /dev/null and b/imgs/icons/21078@2x.png differ
diff --git a/imgs/icons/21084.png b/imgs/icons/21084@1x.png
similarity index 100%
rename from imgs/icons/21084.png
rename to imgs/icons/21084@1x.png
diff --git a/imgs/icons/21084@2x.png b/imgs/icons/21084@2x.png
new file mode 100644
index 000000000..329934ae9
Binary files /dev/null and b/imgs/icons/21084@2x.png differ
diff --git a/imgs/icons/21085.png b/imgs/icons/21085@1x.png
similarity index 100%
rename from imgs/icons/21085.png
rename to imgs/icons/21085@1x.png
diff --git a/imgs/icons/21085@2x.png b/imgs/icons/21085@2x.png
new file mode 100644
index 000000000..321fed349
Binary files /dev/null and b/imgs/icons/21085@2x.png differ
diff --git a/imgs/icons/21086.png b/imgs/icons/21086@1x.png
similarity index 100%
rename from imgs/icons/21086.png
rename to imgs/icons/21086@1x.png
diff --git a/imgs/icons/21086@2x.png b/imgs/icons/21086@2x.png
new file mode 100644
index 000000000..981c48be1
Binary files /dev/null and b/imgs/icons/21086@2x.png differ
diff --git a/imgs/icons/21095.png b/imgs/icons/21095@1x.png
similarity index 100%
rename from imgs/icons/21095.png
rename to imgs/icons/21095@1x.png
diff --git a/imgs/icons/21095@2x.png b/imgs/icons/21095@2x.png
new file mode 100644
index 000000000..7af1f7907
Binary files /dev/null and b/imgs/icons/21095@2x.png differ
diff --git a/imgs/icons/21096.png b/imgs/icons/21096@1x.png
similarity index 100%
rename from imgs/icons/21096.png
rename to imgs/icons/21096@1x.png
diff --git a/imgs/icons/21096@2x.png b/imgs/icons/21096@2x.png
new file mode 100644
index 000000000..140dac469
Binary files /dev/null and b/imgs/icons/21096@2x.png differ
diff --git a/imgs/icons/21097.png b/imgs/icons/21097@1x.png
similarity index 100%
rename from imgs/icons/21097.png
rename to imgs/icons/21097@1x.png
diff --git a/imgs/icons/21097@2x.png b/imgs/icons/21097@2x.png
new file mode 100644
index 000000000..ee863ef33
Binary files /dev/null and b/imgs/icons/21097@2x.png differ
diff --git a/imgs/icons/21098.png b/imgs/icons/21098@1x.png
similarity index 100%
rename from imgs/icons/21098.png
rename to imgs/icons/21098@1x.png
diff --git a/imgs/icons/21098@2x.png b/imgs/icons/21098@2x.png
new file mode 100644
index 000000000..2532984e4
Binary files /dev/null and b/imgs/icons/21098@2x.png differ
diff --git a/imgs/icons/21170.png b/imgs/icons/21170@1x.png
similarity index 100%
rename from imgs/icons/21170.png
rename to imgs/icons/21170@1x.png
diff --git a/imgs/icons/21170@2x.png b/imgs/icons/21170@2x.png
new file mode 100644
index 000000000..099667302
Binary files /dev/null and b/imgs/icons/21170@2x.png differ
diff --git a/imgs/icons/21186.png b/imgs/icons/21186@1x.png
similarity index 100%
rename from imgs/icons/21186.png
rename to imgs/icons/21186@1x.png
diff --git a/imgs/icons/21186@2x.png b/imgs/icons/21186@2x.png
new file mode 100644
index 000000000..2afca7482
Binary files /dev/null and b/imgs/icons/21186@2x.png differ
diff --git a/imgs/icons/21204.png b/imgs/icons/21204@1x.png
similarity index 100%
rename from imgs/icons/21204.png
rename to imgs/icons/21204@1x.png
diff --git a/imgs/icons/21204@2x.png b/imgs/icons/21204@2x.png
new file mode 100644
index 000000000..4045fd8c1
Binary files /dev/null and b/imgs/icons/21204@2x.png differ
diff --git a/imgs/icons/21275.png b/imgs/icons/21275@1x.png
similarity index 100%
rename from imgs/icons/21275.png
rename to imgs/icons/21275@1x.png
diff --git a/imgs/icons/21275@2x.png b/imgs/icons/21275@2x.png
new file mode 100644
index 000000000..7b0914957
Binary files /dev/null and b/imgs/icons/21275@2x.png differ
diff --git a/imgs/icons/21335.png b/imgs/icons/21335@1x.png
similarity index 100%
rename from imgs/icons/21335.png
rename to imgs/icons/21335@1x.png
diff --git a/imgs/icons/21335@2x.png b/imgs/icons/21335@2x.png
new file mode 100644
index 000000000..64589d1ba
Binary files /dev/null and b/imgs/icons/21335@2x.png differ
diff --git a/imgs/icons/21336.png b/imgs/icons/21336@1x.png
similarity index 100%
rename from imgs/icons/21336.png
rename to imgs/icons/21336@1x.png
diff --git a/imgs/icons/21336@2x.png b/imgs/icons/21336@2x.png
new file mode 100644
index 000000000..9de0dbaa7
Binary files /dev/null and b/imgs/icons/21336@2x.png differ
diff --git a/imgs/icons/21378.png b/imgs/icons/21378@1x.png
similarity index 100%
rename from imgs/icons/21378.png
rename to imgs/icons/21378@1x.png
diff --git a/imgs/icons/21378@2x.png b/imgs/icons/21378@2x.png
new file mode 100644
index 000000000..b0f7295bd
Binary files /dev/null and b/imgs/icons/21378@2x.png differ
diff --git a/imgs/icons/21379.png b/imgs/icons/21379@1x.png
similarity index 100%
rename from imgs/icons/21379.png
rename to imgs/icons/21379@1x.png
diff --git a/imgs/icons/21379@2x.png b/imgs/icons/21379@2x.png
new file mode 100644
index 000000000..fb780b7e8
Binary files /dev/null and b/imgs/icons/21379@2x.png differ
diff --git a/imgs/icons/21380.png b/imgs/icons/21380@1x.png
similarity index 100%
rename from imgs/icons/21380.png
rename to imgs/icons/21380@1x.png
diff --git a/imgs/icons/21380@2x.png b/imgs/icons/21380@2x.png
new file mode 100644
index 000000000..688b42242
Binary files /dev/null and b/imgs/icons/21380@2x.png differ
diff --git a/imgs/icons/21381.png b/imgs/icons/21381@1x.png
similarity index 100%
rename from imgs/icons/21381.png
rename to imgs/icons/21381@1x.png
diff --git a/imgs/icons/21381@2x.png b/imgs/icons/21381@2x.png
new file mode 100644
index 000000000..4ac619d85
Binary files /dev/null and b/imgs/icons/21381@2x.png differ
diff --git a/imgs/icons/21382.png b/imgs/icons/21382@1x.png
similarity index 100%
rename from imgs/icons/21382.png
rename to imgs/icons/21382@1x.png
diff --git a/imgs/icons/21382@2x.png b/imgs/icons/21382@2x.png
new file mode 100644
index 000000000..979328b7f
Binary files /dev/null and b/imgs/icons/21382@2x.png differ
diff --git a/imgs/icons/21383.png b/imgs/icons/21383@1x.png
similarity index 100%
rename from imgs/icons/21383.png
rename to imgs/icons/21383@1x.png
diff --git a/imgs/icons/21383@2x.png b/imgs/icons/21383@2x.png
new file mode 100644
index 000000000..d42cfdfc9
Binary files /dev/null and b/imgs/icons/21383@2x.png differ
diff --git a/imgs/icons/21408.png b/imgs/icons/21408@1x.png
similarity index 100%
rename from imgs/icons/21408.png
rename to imgs/icons/21408@1x.png
diff --git a/imgs/icons/21408@2x.png b/imgs/icons/21408@2x.png
new file mode 100644
index 000000000..85989da45
Binary files /dev/null and b/imgs/icons/21408@2x.png differ
diff --git a/imgs/icons/21409.png b/imgs/icons/21409@1x.png
similarity index 100%
rename from imgs/icons/21409.png
rename to imgs/icons/21409@1x.png
diff --git a/imgs/icons/21409@2x.png b/imgs/icons/21409@2x.png
new file mode 100644
index 000000000..480cc16fd
Binary files /dev/null and b/imgs/icons/21409@2x.png differ
diff --git a/imgs/icons/21417.png b/imgs/icons/21417@1x.png
similarity index 100%
rename from imgs/icons/21417.png
rename to imgs/icons/21417@1x.png
diff --git a/imgs/icons/21417@2x.png b/imgs/icons/21417@2x.png
new file mode 100644
index 000000000..16d435ada
Binary files /dev/null and b/imgs/icons/21417@2x.png differ
diff --git a/imgs/icons/21418.png b/imgs/icons/21418@1x.png
similarity index 100%
rename from imgs/icons/21418.png
rename to imgs/icons/21418@1x.png
diff --git a/imgs/icons/21418@2x.png b/imgs/icons/21418@2x.png
new file mode 100644
index 000000000..8b3b9d678
Binary files /dev/null and b/imgs/icons/21418@2x.png differ
diff --git a/imgs/icons/21419.png b/imgs/icons/21419@1x.png
similarity index 100%
rename from imgs/icons/21419.png
rename to imgs/icons/21419@1x.png
diff --git a/imgs/icons/21419@2x.png b/imgs/icons/21419@2x.png
new file mode 100644
index 000000000..fe5af5900
Binary files /dev/null and b/imgs/icons/21419@2x.png differ
diff --git a/imgs/icons/21420.png b/imgs/icons/21420@1x.png
similarity index 100%
rename from imgs/icons/21420.png
rename to imgs/icons/21420@1x.png
diff --git a/imgs/icons/21420@2x.png b/imgs/icons/21420@2x.png
new file mode 100644
index 000000000..fc02b120b
Binary files /dev/null and b/imgs/icons/21420@2x.png differ
diff --git a/imgs/icons/21421.png b/imgs/icons/21421@1x.png
similarity index 100%
rename from imgs/icons/21421.png
rename to imgs/icons/21421@1x.png
diff --git a/imgs/icons/21421@2x.png b/imgs/icons/21421@2x.png
new file mode 100644
index 000000000..cbc693694
Binary files /dev/null and b/imgs/icons/21421@2x.png differ
diff --git a/imgs/icons/21426.png b/imgs/icons/21426@1x.png
similarity index 100%
rename from imgs/icons/21426.png
rename to imgs/icons/21426@1x.png
diff --git a/imgs/icons/21426@2x.png b/imgs/icons/21426@2x.png
new file mode 100644
index 000000000..f3cbb2a8a
Binary files /dev/null and b/imgs/icons/21426@2x.png differ
diff --git a/imgs/icons/21428.png b/imgs/icons/21428@1x.png
similarity index 100%
rename from imgs/icons/21428.png
rename to imgs/icons/21428@1x.png
diff --git a/imgs/icons/21428@2x.png b/imgs/icons/21428@2x.png
new file mode 100644
index 000000000..805a5635f
Binary files /dev/null and b/imgs/icons/21428@2x.png differ
diff --git a/imgs/icons/21437.png b/imgs/icons/21437@1x.png
similarity index 100%
rename from imgs/icons/21437.png
rename to imgs/icons/21437@1x.png
diff --git a/imgs/icons/21437@2x.png b/imgs/icons/21437@2x.png
new file mode 100644
index 000000000..457900490
Binary files /dev/null and b/imgs/icons/21437@2x.png differ
diff --git a/imgs/icons/21439.png b/imgs/icons/21439@1x.png
similarity index 100%
rename from imgs/icons/21439.png
rename to imgs/icons/21439@1x.png
diff --git a/imgs/icons/21439@2x.png b/imgs/icons/21439@2x.png
new file mode 100644
index 000000000..4051dba69
Binary files /dev/null and b/imgs/icons/21439@2x.png differ
diff --git a/imgs/icons/21440.png b/imgs/icons/21440@1x.png
similarity index 100%
rename from imgs/icons/21440.png
rename to imgs/icons/21440@1x.png
diff --git a/imgs/icons/21440@2x.png b/imgs/icons/21440@2x.png
new file mode 100644
index 000000000..4f21cb686
Binary files /dev/null and b/imgs/icons/21440@2x.png differ
diff --git a/imgs/icons/21441.png b/imgs/icons/21441@1x.png
similarity index 100%
rename from imgs/icons/21441.png
rename to imgs/icons/21441@1x.png
diff --git a/imgs/icons/21441@2x.png b/imgs/icons/21441@2x.png
new file mode 100644
index 000000000..76bf8604d
Binary files /dev/null and b/imgs/icons/21441@2x.png differ
diff --git a/imgs/icons/21442.png b/imgs/icons/21442@1x.png
similarity index 100%
rename from imgs/icons/21442.png
rename to imgs/icons/21442@1x.png
diff --git a/imgs/icons/21442@2x.png b/imgs/icons/21442@2x.png
new file mode 100644
index 000000000..c3bb991a1
Binary files /dev/null and b/imgs/icons/21442@2x.png differ
diff --git a/imgs/icons/21481.png b/imgs/icons/21481@1x.png
similarity index 100%
rename from imgs/icons/21481.png
rename to imgs/icons/21481@1x.png
diff --git a/imgs/icons/21481@2x.png b/imgs/icons/21481@2x.png
new file mode 100644
index 000000000..2b06aa81d
Binary files /dev/null and b/imgs/icons/21481@2x.png differ
diff --git a/imgs/icons/21482.png b/imgs/icons/21482@1x.png
similarity index 100%
rename from imgs/icons/21482.png
rename to imgs/icons/21482@1x.png
diff --git a/imgs/icons/21482@2x.png b/imgs/icons/21482@2x.png
new file mode 100644
index 000000000..5b80d4c0e
Binary files /dev/null and b/imgs/icons/21482@2x.png differ
diff --git a/imgs/icons/21483.png b/imgs/icons/21483@1x.png
similarity index 100%
rename from imgs/icons/21483.png
rename to imgs/icons/21483@1x.png
diff --git a/imgs/icons/21483@2x.png b/imgs/icons/21483@2x.png
new file mode 100644
index 000000000..e1e840852
Binary files /dev/null and b/imgs/icons/21483@2x.png differ
diff --git a/imgs/icons/21484.png b/imgs/icons/21484@1x.png
similarity index 100%
rename from imgs/icons/21484.png
rename to imgs/icons/21484@1x.png
diff --git a/imgs/icons/21484@2x.png b/imgs/icons/21484@2x.png
new file mode 100644
index 000000000..8fd179006
Binary files /dev/null and b/imgs/icons/21484@2x.png differ
diff --git a/imgs/icons/21485.png b/imgs/icons/21485@1x.png
similarity index 100%
rename from imgs/icons/21485.png
rename to imgs/icons/21485@1x.png
diff --git a/imgs/icons/21485@2x.png b/imgs/icons/21485@2x.png
new file mode 100644
index 000000000..9ed416483
Binary files /dev/null and b/imgs/icons/21485@2x.png differ
diff --git a/imgs/icons/21486.png b/imgs/icons/21486@1x.png
similarity index 100%
rename from imgs/icons/21486.png
rename to imgs/icons/21486@1x.png
diff --git a/imgs/icons/21486@2x.png b/imgs/icons/21486@2x.png
new file mode 100644
index 000000000..68105d19f
Binary files /dev/null and b/imgs/icons/21486@2x.png differ
diff --git a/imgs/icons/21487.png b/imgs/icons/21487@1x.png
similarity index 100%
rename from imgs/icons/21487.png
rename to imgs/icons/21487@1x.png
diff --git a/imgs/icons/21487@2x.png b/imgs/icons/21487@2x.png
new file mode 100644
index 000000000..4d04e8513
Binary files /dev/null and b/imgs/icons/21487@2x.png differ
diff --git a/imgs/icons/21489.png b/imgs/icons/21489@1x.png
similarity index 100%
rename from imgs/icons/21489.png
rename to imgs/icons/21489@1x.png
diff --git a/imgs/icons/21489@2x.png b/imgs/icons/21489@2x.png
new file mode 100644
index 000000000..c147ebb3e
Binary files /dev/null and b/imgs/icons/21489@2x.png differ
diff --git a/imgs/icons/21513.png b/imgs/icons/21513@1x.png
similarity index 100%
rename from imgs/icons/21513.png
rename to imgs/icons/21513@1x.png
diff --git a/imgs/icons/21513@2x.png b/imgs/icons/21513@2x.png
new file mode 100644
index 000000000..48eba04f8
Binary files /dev/null and b/imgs/icons/21513@2x.png differ
diff --git a/imgs/icons/21530.png b/imgs/icons/21530@1x.png
similarity index 100%
rename from imgs/icons/21530.png
rename to imgs/icons/21530@1x.png
diff --git a/imgs/icons/21530@2x.png b/imgs/icons/21530@2x.png
new file mode 100644
index 000000000..eb0563da8
Binary files /dev/null and b/imgs/icons/21530@2x.png differ
diff --git a/imgs/icons/21531.png b/imgs/icons/21531@1x.png
similarity index 100%
rename from imgs/icons/21531.png
rename to imgs/icons/21531@1x.png
diff --git a/imgs/icons/21531@2x.png b/imgs/icons/21531@2x.png
new file mode 100644
index 000000000..8084bd72e
Binary files /dev/null and b/imgs/icons/21531@2x.png differ
diff --git a/imgs/icons/21532.png b/imgs/icons/21532@1x.png
similarity index 100%
rename from imgs/icons/21532.png
rename to imgs/icons/21532@1x.png
diff --git a/imgs/icons/21532@2x.png b/imgs/icons/21532@2x.png
new file mode 100644
index 000000000..bf57d2b17
Binary files /dev/null and b/imgs/icons/21532@2x.png differ
diff --git a/imgs/icons/21533.png b/imgs/icons/21533@1x.png
similarity index 100%
rename from imgs/icons/21533.png
rename to imgs/icons/21533@1x.png
diff --git a/imgs/icons/21533@2x.png b/imgs/icons/21533@2x.png
new file mode 100644
index 000000000..bc0538328
Binary files /dev/null and b/imgs/icons/21533@2x.png differ
diff --git a/imgs/icons/21534.png b/imgs/icons/21534@1x.png
similarity index 100%
rename from imgs/icons/21534.png
rename to imgs/icons/21534@1x.png
diff --git a/imgs/icons/21534@2x.png b/imgs/icons/21534@2x.png
new file mode 100644
index 000000000..55d2806ca
Binary files /dev/null and b/imgs/icons/21534@2x.png differ
diff --git a/imgs/icons/21561.png b/imgs/icons/21561@1x.png
similarity index 100%
rename from imgs/icons/21561.png
rename to imgs/icons/21561@1x.png
diff --git a/imgs/icons/21561@2x.png b/imgs/icons/21561@2x.png
new file mode 100644
index 000000000..8261c50c3
Binary files /dev/null and b/imgs/icons/21561@2x.png differ
diff --git a/imgs/icons/21564.png b/imgs/icons/21564@1x.png
similarity index 100%
rename from imgs/icons/21564.png
rename to imgs/icons/21564@1x.png
diff --git a/imgs/icons/21564@2x.png b/imgs/icons/21564@2x.png
new file mode 100644
index 000000000..3a31e1a8f
Binary files /dev/null and b/imgs/icons/21564@2x.png differ
diff --git a/imgs/icons/21565.png b/imgs/icons/21565@1x.png
similarity index 100%
rename from imgs/icons/21565.png
rename to imgs/icons/21565@1x.png
diff --git a/imgs/icons/21565@2x.png b/imgs/icons/21565@2x.png
new file mode 100644
index 000000000..0c6e981d1
Binary files /dev/null and b/imgs/icons/21565@2x.png differ
diff --git a/imgs/icons/21566.png b/imgs/icons/21566@1x.png
similarity index 100%
rename from imgs/icons/21566.png
rename to imgs/icons/21566@1x.png
diff --git a/imgs/icons/21566@2x.png b/imgs/icons/21566@2x.png
new file mode 100644
index 000000000..b7fd4a445
Binary files /dev/null and b/imgs/icons/21566@2x.png differ
diff --git a/imgs/icons/21567.png b/imgs/icons/21567@1x.png
similarity index 100%
rename from imgs/icons/21567.png
rename to imgs/icons/21567@1x.png
diff --git a/imgs/icons/21567@2x.png b/imgs/icons/21567@2x.png
new file mode 100644
index 000000000..22ec69068
Binary files /dev/null and b/imgs/icons/21567@2x.png differ
diff --git a/imgs/icons/21568.png b/imgs/icons/21568@1x.png
similarity index 100%
rename from imgs/icons/21568.png
rename to imgs/icons/21568@1x.png
diff --git a/imgs/icons/21568@2x.png b/imgs/icons/21568@2x.png
new file mode 100644
index 000000000..b99c74786
Binary files /dev/null and b/imgs/icons/21568@2x.png differ
diff --git a/imgs/icons/21569.png b/imgs/icons/21569@1x.png
similarity index 100%
rename from imgs/icons/21569.png
rename to imgs/icons/21569@1x.png
diff --git a/imgs/icons/21569@2x.png b/imgs/icons/21569@2x.png
new file mode 100644
index 000000000..9655d3a21
Binary files /dev/null and b/imgs/icons/21569@2x.png differ
diff --git a/imgs/icons/21570.png b/imgs/icons/21570@1x.png
similarity index 100%
rename from imgs/icons/21570.png
rename to imgs/icons/21570@1x.png
diff --git a/imgs/icons/21570@2x.png b/imgs/icons/21570@2x.png
new file mode 100644
index 000000000..a73a8ca4f
Binary files /dev/null and b/imgs/icons/21570@2x.png differ
diff --git a/imgs/icons/21571.png b/imgs/icons/21571@1x.png
similarity index 100%
rename from imgs/icons/21571.png
rename to imgs/icons/21571@1x.png
diff --git a/imgs/icons/21571@2x.png b/imgs/icons/21571@2x.png
new file mode 100644
index 000000000..f9c7a6e99
Binary files /dev/null and b/imgs/icons/21571@2x.png differ
diff --git a/imgs/icons/21574.png b/imgs/icons/21574@1x.png
similarity index 100%
rename from imgs/icons/21574.png
rename to imgs/icons/21574@1x.png
diff --git a/imgs/icons/21574@2x.png b/imgs/icons/21574@2x.png
new file mode 100644
index 000000000..97a91fce6
Binary files /dev/null and b/imgs/icons/21574@2x.png differ
diff --git a/imgs/icons/21575.png b/imgs/icons/21575@1x.png
similarity index 100%
rename from imgs/icons/21575.png
rename to imgs/icons/21575@1x.png
diff --git a/imgs/icons/21575@2x.png b/imgs/icons/21575@2x.png
new file mode 100644
index 000000000..07bc128e3
Binary files /dev/null and b/imgs/icons/21575@2x.png differ
diff --git a/imgs/icons/21581.png b/imgs/icons/21581@1x.png
similarity index 100%
rename from imgs/icons/21581.png
rename to imgs/icons/21581@1x.png
diff --git a/imgs/icons/21581@2x.png b/imgs/icons/21581@2x.png
new file mode 100644
index 000000000..eab9b034f
Binary files /dev/null and b/imgs/icons/21581@2x.png differ
diff --git a/imgs/icons/21593.png b/imgs/icons/21593@1x.png
similarity index 100%
rename from imgs/icons/21593.png
rename to imgs/icons/21593@1x.png
diff --git a/imgs/icons/21593@2x.png b/imgs/icons/21593@2x.png
new file mode 100644
index 000000000..c6f4d833f
Binary files /dev/null and b/imgs/icons/21593@2x.png differ
diff --git a/imgs/icons/21594.png b/imgs/icons/21594@1x.png
similarity index 100%
rename from imgs/icons/21594.png
rename to imgs/icons/21594@1x.png
diff --git a/imgs/icons/21594@2x.png b/imgs/icons/21594@2x.png
new file mode 100644
index 000000000..5d31ef653
Binary files /dev/null and b/imgs/icons/21594@2x.png differ
diff --git a/imgs/icons/21595.png b/imgs/icons/21595@1x.png
similarity index 100%
rename from imgs/icons/21595.png
rename to imgs/icons/21595@1x.png
diff --git a/imgs/icons/21595@2x.png b/imgs/icons/21595@2x.png
new file mode 100644
index 000000000..8837d5131
Binary files /dev/null and b/imgs/icons/21595@2x.png differ
diff --git a/imgs/icons/21596.png b/imgs/icons/21596@1x.png
similarity index 100%
rename from imgs/icons/21596.png
rename to imgs/icons/21596@1x.png
diff --git a/imgs/icons/21596@2x.png b/imgs/icons/21596@2x.png
new file mode 100644
index 000000000..70f8c75be
Binary files /dev/null and b/imgs/icons/21596@2x.png differ
diff --git a/imgs/icons/21597.png b/imgs/icons/21597@1x.png
similarity index 100%
rename from imgs/icons/21597.png
rename to imgs/icons/21597@1x.png
diff --git a/imgs/icons/21597@2x.png b/imgs/icons/21597@2x.png
new file mode 100644
index 000000000..34b4f0d60
Binary files /dev/null and b/imgs/icons/21597@2x.png differ
diff --git a/imgs/icons/21598.png b/imgs/icons/21598@1x.png
similarity index 100%
rename from imgs/icons/21598.png
rename to imgs/icons/21598@1x.png
diff --git a/imgs/icons/21598@2x.png b/imgs/icons/21598@2x.png
new file mode 100644
index 000000000..c369921d5
Binary files /dev/null and b/imgs/icons/21598@2x.png differ
diff --git a/imgs/icons/21599.png b/imgs/icons/21599@1x.png
similarity index 100%
rename from imgs/icons/21599.png
rename to imgs/icons/21599@1x.png
diff --git a/imgs/icons/21599@2x.png b/imgs/icons/21599@2x.png
new file mode 100644
index 000000000..b102472b6
Binary files /dev/null and b/imgs/icons/21599@2x.png differ
diff --git a/imgs/icons/21601.png b/imgs/icons/21601@1x.png
similarity index 100%
rename from imgs/icons/21601.png
rename to imgs/icons/21601@1x.png
diff --git a/imgs/icons/21601@2x.png b/imgs/icons/21601@2x.png
new file mode 100644
index 000000000..5ad8bb9eb
Binary files /dev/null and b/imgs/icons/21601@2x.png differ
diff --git a/imgs/icons/21602.png b/imgs/icons/21602@1x.png
similarity index 100%
rename from imgs/icons/21602.png
rename to imgs/icons/21602@1x.png
diff --git a/imgs/icons/21602@2x.png b/imgs/icons/21602@2x.png
new file mode 100644
index 000000000..e8d897700
Binary files /dev/null and b/imgs/icons/21602@2x.png differ
diff --git a/imgs/icons/21603.png b/imgs/icons/21603@1x.png
similarity index 100%
rename from imgs/icons/21603.png
rename to imgs/icons/21603@1x.png
diff --git a/imgs/icons/21603@2x.png b/imgs/icons/21603@2x.png
new file mode 100644
index 000000000..b1612f9eb
Binary files /dev/null and b/imgs/icons/21603@2x.png differ
diff --git a/imgs/icons/21604.png b/imgs/icons/21604@1x.png
similarity index 100%
rename from imgs/icons/21604.png
rename to imgs/icons/21604@1x.png
diff --git a/imgs/icons/21604@2x.png b/imgs/icons/21604@2x.png
new file mode 100644
index 000000000..af4e48683
Binary files /dev/null and b/imgs/icons/21604@2x.png differ
diff --git a/imgs/icons/21605.png b/imgs/icons/21605@1x.png
similarity index 100%
rename from imgs/icons/21605.png
rename to imgs/icons/21605@1x.png
diff --git a/imgs/icons/21605@2x.png b/imgs/icons/21605@2x.png
new file mode 100644
index 000000000..c9a98118c
Binary files /dev/null and b/imgs/icons/21605@2x.png differ
diff --git a/imgs/icons/21607.png b/imgs/icons/21607@1x.png
similarity index 100%
rename from imgs/icons/21607.png
rename to imgs/icons/21607@1x.png
diff --git a/imgs/icons/21607@2x.png b/imgs/icons/21607@2x.png
new file mode 100644
index 000000000..cc9401071
Binary files /dev/null and b/imgs/icons/21607@2x.png differ
diff --git a/imgs/icons/21608.png b/imgs/icons/21608@1x.png
similarity index 100%
rename from imgs/icons/21608.png
rename to imgs/icons/21608@1x.png
diff --git a/imgs/icons/21608@2x.png b/imgs/icons/21608@2x.png
new file mode 100644
index 000000000..3bb3d7b6e
Binary files /dev/null and b/imgs/icons/21608@2x.png differ
diff --git a/imgs/icons/21609.png b/imgs/icons/21609@1x.png
similarity index 100%
rename from imgs/icons/21609.png
rename to imgs/icons/21609@1x.png
diff --git a/imgs/icons/21609@2x.png b/imgs/icons/21609@2x.png
new file mode 100644
index 000000000..555a806b7
Binary files /dev/null and b/imgs/icons/21609@2x.png differ
diff --git a/imgs/icons/21610.png b/imgs/icons/21610@1x.png
similarity index 100%
rename from imgs/icons/21610.png
rename to imgs/icons/21610@1x.png
diff --git a/imgs/icons/21610@2x.png b/imgs/icons/21610@2x.png
new file mode 100644
index 000000000..2d1c2bd9a
Binary files /dev/null and b/imgs/icons/21610@2x.png differ
diff --git a/imgs/icons/21611.png b/imgs/icons/21611@1x.png
similarity index 100%
rename from imgs/icons/21611.png
rename to imgs/icons/21611@1x.png
diff --git a/imgs/icons/21611@2x.png b/imgs/icons/21611@2x.png
new file mode 100644
index 000000000..8774e7488
Binary files /dev/null and b/imgs/icons/21611@2x.png differ
diff --git a/imgs/icons/21618.png b/imgs/icons/21618@1x.png
similarity index 100%
rename from imgs/icons/21618.png
rename to imgs/icons/21618@1x.png
diff --git a/imgs/icons/21618@2x.png b/imgs/icons/21618@2x.png
new file mode 100644
index 000000000..bde9d90b1
Binary files /dev/null and b/imgs/icons/21618@2x.png differ
diff --git a/imgs/icons/21620.png b/imgs/icons/21620@1x.png
similarity index 100%
rename from imgs/icons/21620.png
rename to imgs/icons/21620@1x.png
diff --git a/imgs/icons/21620@2x.png b/imgs/icons/21620@2x.png
new file mode 100644
index 000000000..ec52cca80
Binary files /dev/null and b/imgs/icons/21620@2x.png differ
diff --git a/imgs/icons/21621.png b/imgs/icons/21621@1x.png
similarity index 100%
rename from imgs/icons/21621.png
rename to imgs/icons/21621@1x.png
diff --git a/imgs/icons/21621@2x.png b/imgs/icons/21621@2x.png
new file mode 100644
index 000000000..eda2a57aa
Binary files /dev/null and b/imgs/icons/21621@2x.png differ
diff --git a/imgs/icons/21622.png b/imgs/icons/21622@1x.png
similarity index 100%
rename from imgs/icons/21622.png
rename to imgs/icons/21622@1x.png
diff --git a/imgs/icons/21622@2x.png b/imgs/icons/21622@2x.png
new file mode 100644
index 000000000..1e7cc4a75
Binary files /dev/null and b/imgs/icons/21622@2x.png differ
diff --git a/imgs/icons/21683.png b/imgs/icons/21683@1x.png
similarity index 100%
rename from imgs/icons/21683.png
rename to imgs/icons/21683@1x.png
diff --git a/imgs/icons/21683@2x.png b/imgs/icons/21683@2x.png
new file mode 100644
index 000000000..231f706c5
Binary files /dev/null and b/imgs/icons/21683@2x.png differ
diff --git a/imgs/icons/21684.png b/imgs/icons/21684@1x.png
similarity index 100%
rename from imgs/icons/21684.png
rename to imgs/icons/21684@1x.png
diff --git a/imgs/icons/21684@2x.png b/imgs/icons/21684@2x.png
new file mode 100644
index 000000000..65f7f6c70
Binary files /dev/null and b/imgs/icons/21684@2x.png differ
diff --git a/imgs/icons/21685.png b/imgs/icons/21685@1x.png
similarity index 100%
rename from imgs/icons/21685.png
rename to imgs/icons/21685@1x.png
diff --git a/imgs/icons/21685@2x.png b/imgs/icons/21685@2x.png
new file mode 100644
index 000000000..ad87d2a3e
Binary files /dev/null and b/imgs/icons/21685@2x.png differ
diff --git a/imgs/icons/21686.png b/imgs/icons/21686@1x.png
similarity index 100%
rename from imgs/icons/21686.png
rename to imgs/icons/21686@1x.png
diff --git a/imgs/icons/21686@2x.png b/imgs/icons/21686@2x.png
new file mode 100644
index 000000000..01d0eef24
Binary files /dev/null and b/imgs/icons/21686@2x.png differ
diff --git a/imgs/icons/21687.png b/imgs/icons/21687@1x.png
similarity index 100%
rename from imgs/icons/21687.png
rename to imgs/icons/21687@1x.png
diff --git a/imgs/icons/21687@2x.png b/imgs/icons/21687@2x.png
new file mode 100644
index 000000000..3f1d2be1b
Binary files /dev/null and b/imgs/icons/21687@2x.png differ
diff --git a/imgs/icons/21688.png b/imgs/icons/21688@1x.png
similarity index 100%
rename from imgs/icons/21688.png
rename to imgs/icons/21688@1x.png
diff --git a/imgs/icons/21688@2x.png b/imgs/icons/21688@2x.png
new file mode 100644
index 000000000..f59a720ba
Binary files /dev/null and b/imgs/icons/21688@2x.png differ
diff --git a/imgs/icons/21689.png b/imgs/icons/21689@1x.png
similarity index 100%
rename from imgs/icons/21689.png
rename to imgs/icons/21689@1x.png
diff --git a/imgs/icons/21689@2x.png b/imgs/icons/21689@2x.png
new file mode 100644
index 000000000..0764240fb
Binary files /dev/null and b/imgs/icons/21689@2x.png differ
diff --git a/imgs/icons/21690.png b/imgs/icons/21690@1x.png
similarity index 100%
rename from imgs/icons/21690.png
rename to imgs/icons/21690@1x.png
diff --git a/imgs/icons/21690@2x.png b/imgs/icons/21690@2x.png
new file mode 100644
index 000000000..ce17647a8
Binary files /dev/null and b/imgs/icons/21690@2x.png differ
diff --git a/imgs/icons/21691.png b/imgs/icons/21691@1x.png
similarity index 100%
rename from imgs/icons/21691.png
rename to imgs/icons/21691@1x.png
diff --git a/imgs/icons/21691@2x.png b/imgs/icons/21691@2x.png
new file mode 100644
index 000000000..ab65c6da9
Binary files /dev/null and b/imgs/icons/21691@2x.png differ
diff --git a/imgs/icons/21692.png b/imgs/icons/21692@1x.png
similarity index 100%
rename from imgs/icons/21692.png
rename to imgs/icons/21692@1x.png
diff --git a/imgs/icons/21692@2x.png b/imgs/icons/21692@2x.png
new file mode 100644
index 000000000..0991ffb3d
Binary files /dev/null and b/imgs/icons/21692@2x.png differ
diff --git a/imgs/icons/21693.png b/imgs/icons/21693@1x.png
similarity index 100%
rename from imgs/icons/21693.png
rename to imgs/icons/21693@1x.png
diff --git a/imgs/icons/21693@2x.png b/imgs/icons/21693@2x.png
new file mode 100644
index 000000000..22731abf0
Binary files /dev/null and b/imgs/icons/21693@2x.png differ
diff --git a/imgs/icons/21694.png b/imgs/icons/21694@1x.png
similarity index 100%
rename from imgs/icons/21694.png
rename to imgs/icons/21694@1x.png
diff --git a/imgs/icons/21694@2x.png b/imgs/icons/21694@2x.png
new file mode 100644
index 000000000..b8fb292d1
Binary files /dev/null and b/imgs/icons/21694@2x.png differ
diff --git a/imgs/icons/21695.png b/imgs/icons/21695@1x.png
similarity index 100%
rename from imgs/icons/21695.png
rename to imgs/icons/21695@1x.png
diff --git a/imgs/icons/21695@2x.png b/imgs/icons/21695@2x.png
new file mode 100644
index 000000000..17e376a40
Binary files /dev/null and b/imgs/icons/21695@2x.png differ
diff --git a/imgs/icons/21696.png b/imgs/icons/21696@1x.png
similarity index 100%
rename from imgs/icons/21696.png
rename to imgs/icons/21696@1x.png
diff --git a/imgs/icons/21696@2x.png b/imgs/icons/21696@2x.png
new file mode 100644
index 000000000..fbd62f9f9
Binary files /dev/null and b/imgs/icons/21696@2x.png differ
diff --git a/imgs/icons/21698.png b/imgs/icons/21698@1x.png
similarity index 100%
rename from imgs/icons/21698.png
rename to imgs/icons/21698@1x.png
diff --git a/imgs/icons/21698@2x.png b/imgs/icons/21698@2x.png
new file mode 100644
index 000000000..6a7aa40dd
Binary files /dev/null and b/imgs/icons/21698@2x.png differ
diff --git a/imgs/icons/21699.png b/imgs/icons/21699@1x.png
similarity index 100%
rename from imgs/icons/21699.png
rename to imgs/icons/21699@1x.png
diff --git a/imgs/icons/21699@2x.png b/imgs/icons/21699@2x.png
new file mode 100644
index 000000000..0132046da
Binary files /dev/null and b/imgs/icons/21699@2x.png differ
diff --git a/imgs/icons/21700.png b/imgs/icons/21700@1x.png
similarity index 100%
rename from imgs/icons/21700.png
rename to imgs/icons/21700@1x.png
diff --git a/imgs/icons/21700@2x.png b/imgs/icons/21700@2x.png
new file mode 100644
index 000000000..d3983ae61
Binary files /dev/null and b/imgs/icons/21700@2x.png differ
diff --git a/imgs/icons/21701.png b/imgs/icons/21701@1x.png
similarity index 100%
rename from imgs/icons/21701.png
rename to imgs/icons/21701@1x.png
diff --git a/imgs/icons/21701@2x.png b/imgs/icons/21701@2x.png
new file mode 100644
index 000000000..e2bf99ef2
Binary files /dev/null and b/imgs/icons/21701@2x.png differ
diff --git a/imgs/icons/21702.png b/imgs/icons/21702@1x.png
similarity index 100%
rename from imgs/icons/21702.png
rename to imgs/icons/21702@1x.png
diff --git a/imgs/icons/21702@2x.png b/imgs/icons/21702@2x.png
new file mode 100644
index 000000000..22b4e3403
Binary files /dev/null and b/imgs/icons/21702@2x.png differ
diff --git a/imgs/icons/21703.png b/imgs/icons/21703@1x.png
similarity index 100%
rename from imgs/icons/21703.png
rename to imgs/icons/21703@1x.png
diff --git a/imgs/icons/21703@2x.png b/imgs/icons/21703@2x.png
new file mode 100644
index 000000000..5c72c7cb9
Binary files /dev/null and b/imgs/icons/21703@2x.png differ
diff --git a/imgs/icons/21704.png b/imgs/icons/21704@1x.png
similarity index 100%
rename from imgs/icons/21704.png
rename to imgs/icons/21704@1x.png
diff --git a/imgs/icons/21704@2x.png b/imgs/icons/21704@2x.png
new file mode 100644
index 000000000..50040526c
Binary files /dev/null and b/imgs/icons/21704@2x.png differ
diff --git a/imgs/icons/21705.png b/imgs/icons/21705@1x.png
similarity index 100%
rename from imgs/icons/21705.png
rename to imgs/icons/21705@1x.png
diff --git a/imgs/icons/21705@2x.png b/imgs/icons/21705@2x.png
new file mode 100644
index 000000000..13e8e114b
Binary files /dev/null and b/imgs/icons/21705@2x.png differ
diff --git a/imgs/icons/21706.png b/imgs/icons/21706@1x.png
similarity index 100%
rename from imgs/icons/21706.png
rename to imgs/icons/21706@1x.png
diff --git a/imgs/icons/21706@2x.png b/imgs/icons/21706@2x.png
new file mode 100644
index 000000000..3c41f499c
Binary files /dev/null and b/imgs/icons/21706@2x.png differ
diff --git a/imgs/icons/21707.png b/imgs/icons/21707@1x.png
similarity index 100%
rename from imgs/icons/21707.png
rename to imgs/icons/21707@1x.png
diff --git a/imgs/icons/21707@2x.png b/imgs/icons/21707@2x.png
new file mode 100644
index 000000000..5b799b3c0
Binary files /dev/null and b/imgs/icons/21707@2x.png differ
diff --git a/imgs/icons/21725.png b/imgs/icons/21725@1x.png
similarity index 100%
rename from imgs/icons/21725.png
rename to imgs/icons/21725@1x.png
diff --git a/imgs/icons/21725@2x.png b/imgs/icons/21725@2x.png
new file mode 100644
index 000000000..561d624bd
Binary files /dev/null and b/imgs/icons/21725@2x.png differ
diff --git a/imgs/icons/21729.png b/imgs/icons/21729@1x.png
similarity index 100%
rename from imgs/icons/21729.png
rename to imgs/icons/21729@1x.png
diff --git a/imgs/icons/21729@2x.png b/imgs/icons/21729@2x.png
new file mode 100644
index 000000000..ebc095ad4
Binary files /dev/null and b/imgs/icons/21729@2x.png differ
diff --git a/imgs/icons/21730.png b/imgs/icons/21730@1x.png
similarity index 100%
rename from imgs/icons/21730.png
rename to imgs/icons/21730@1x.png
diff --git a/imgs/icons/21730@2x.png b/imgs/icons/21730@2x.png
new file mode 100644
index 000000000..25c474351
Binary files /dev/null and b/imgs/icons/21730@2x.png differ
diff --git a/imgs/icons/21731.png b/imgs/icons/21731@1x.png
similarity index 100%
rename from imgs/icons/21731.png
rename to imgs/icons/21731@1x.png
diff --git a/imgs/icons/21731@2x.png b/imgs/icons/21731@2x.png
new file mode 100644
index 000000000..52412dff7
Binary files /dev/null and b/imgs/icons/21731@2x.png differ
diff --git a/imgs/icons/21741.png b/imgs/icons/21741@1x.png
similarity index 100%
rename from imgs/icons/21741.png
rename to imgs/icons/21741@1x.png
diff --git a/imgs/icons/21741@2x.png b/imgs/icons/21741@2x.png
new file mode 100644
index 000000000..9a4673c0b
Binary files /dev/null and b/imgs/icons/21741@2x.png differ
diff --git a/imgs/icons/21742.png b/imgs/icons/21742@1x.png
similarity index 100%
rename from imgs/icons/21742.png
rename to imgs/icons/21742@1x.png
diff --git a/imgs/icons/21742@2x.png b/imgs/icons/21742@2x.png
new file mode 100644
index 000000000..3ff89a8de
Binary files /dev/null and b/imgs/icons/21742@2x.png differ
diff --git a/imgs/icons/21743.png b/imgs/icons/21743@1x.png
similarity index 100%
rename from imgs/icons/21743.png
rename to imgs/icons/21743@1x.png
diff --git a/imgs/icons/21743@2x.png b/imgs/icons/21743@2x.png
new file mode 100644
index 000000000..284bc3b24
Binary files /dev/null and b/imgs/icons/21743@2x.png differ
diff --git a/imgs/icons/2176.png b/imgs/icons/2176@1x.png
similarity index 100%
rename from imgs/icons/2176.png
rename to imgs/icons/2176@1x.png
diff --git a/imgs/icons/2176@2x.png b/imgs/icons/2176@2x.png
new file mode 100644
index 000000000..9bc2613e6
Binary files /dev/null and b/imgs/icons/2176@2x.png differ
diff --git a/imgs/icons/21774.png b/imgs/icons/21774@1x.png
similarity index 100%
rename from imgs/icons/21774.png
rename to imgs/icons/21774@1x.png
diff --git a/imgs/icons/21774@2x.png b/imgs/icons/21774@2x.png
new file mode 100644
index 000000000..4d04b58ca
Binary files /dev/null and b/imgs/icons/21774@2x.png differ
diff --git a/imgs/icons/2177.png b/imgs/icons/2177@1x.png
similarity index 100%
rename from imgs/icons/2177.png
rename to imgs/icons/2177@1x.png
diff --git a/imgs/icons/2177@2x.png b/imgs/icons/2177@2x.png
new file mode 100644
index 000000000..89eefa0af
Binary files /dev/null and b/imgs/icons/2177@2x.png differ
diff --git a/imgs/icons/21783.png b/imgs/icons/21783@1x.png
similarity index 100%
rename from imgs/icons/21783.png
rename to imgs/icons/21783@1x.png
diff --git a/imgs/icons/21783@2x.png b/imgs/icons/21783@2x.png
new file mode 100644
index 000000000..4effb6456
Binary files /dev/null and b/imgs/icons/21783@2x.png differ
diff --git a/imgs/icons/21784.png b/imgs/icons/21784@1x.png
similarity index 100%
rename from imgs/icons/21784.png
rename to imgs/icons/21784@1x.png
diff --git a/imgs/icons/21784@2x.png b/imgs/icons/21784@2x.png
new file mode 100644
index 000000000..ac8ac72a6
Binary files /dev/null and b/imgs/icons/21784@2x.png differ
diff --git a/imgs/icons/21785.png b/imgs/icons/21785@1x.png
similarity index 100%
rename from imgs/icons/21785.png
rename to imgs/icons/21785@1x.png
diff --git a/imgs/icons/21785@2x.png b/imgs/icons/21785@2x.png
new file mode 100644
index 000000000..5100c4ea0
Binary files /dev/null and b/imgs/icons/21785@2x.png differ
diff --git a/imgs/icons/21787.png b/imgs/icons/21787@1x.png
similarity index 100%
rename from imgs/icons/21787.png
rename to imgs/icons/21787@1x.png
diff --git a/imgs/icons/21787@2x.png b/imgs/icons/21787@2x.png
new file mode 100644
index 000000000..c4675ec92
Binary files /dev/null and b/imgs/icons/21787@2x.png differ
diff --git a/imgs/icons/21788.png b/imgs/icons/21788@1x.png
similarity index 100%
rename from imgs/icons/21788.png
rename to imgs/icons/21788@1x.png
diff --git a/imgs/icons/21788@2x.png b/imgs/icons/21788@2x.png
new file mode 100644
index 000000000..af775c221
Binary files /dev/null and b/imgs/icons/21788@2x.png differ
diff --git a/imgs/icons/21789.png b/imgs/icons/21789@1x.png
similarity index 100%
rename from imgs/icons/21789.png
rename to imgs/icons/21789@1x.png
diff --git a/imgs/icons/21789@2x.png b/imgs/icons/21789@2x.png
new file mode 100644
index 000000000..53add03e1
Binary files /dev/null and b/imgs/icons/21789@2x.png differ
diff --git a/imgs/icons/2178.png b/imgs/icons/2178@1x.png
similarity index 100%
rename from imgs/icons/2178.png
rename to imgs/icons/2178@1x.png
diff --git a/imgs/icons/2178@2x.png b/imgs/icons/2178@2x.png
new file mode 100644
index 000000000..462ca711e
Binary files /dev/null and b/imgs/icons/2178@2x.png differ
diff --git a/imgs/icons/21790.png b/imgs/icons/21790@1x.png
similarity index 100%
rename from imgs/icons/21790.png
rename to imgs/icons/21790@1x.png
diff --git a/imgs/icons/21790@2x.png b/imgs/icons/21790@2x.png
new file mode 100644
index 000000000..22d8eec87
Binary files /dev/null and b/imgs/icons/21790@2x.png differ
diff --git a/imgs/icons/21791.png b/imgs/icons/21791@1x.png
similarity index 100%
rename from imgs/icons/21791.png
rename to imgs/icons/21791@1x.png
diff --git a/imgs/icons/21791@2x.png b/imgs/icons/21791@2x.png
new file mode 100644
index 000000000..03c7cb852
Binary files /dev/null and b/imgs/icons/21791@2x.png differ
diff --git a/imgs/icons/21792.png b/imgs/icons/21792@1x.png
similarity index 100%
rename from imgs/icons/21792.png
rename to imgs/icons/21792@1x.png
diff --git a/imgs/icons/21792@2x.png b/imgs/icons/21792@2x.png
new file mode 100644
index 000000000..67e983ea5
Binary files /dev/null and b/imgs/icons/21792@2x.png differ
diff --git a/imgs/icons/21793.png b/imgs/icons/21793@1x.png
similarity index 100%
rename from imgs/icons/21793.png
rename to imgs/icons/21793@1x.png
diff --git a/imgs/icons/21793@2x.png b/imgs/icons/21793@2x.png
new file mode 100644
index 000000000..4b15b8921
Binary files /dev/null and b/imgs/icons/21793@2x.png differ
diff --git a/imgs/icons/21794.png b/imgs/icons/21794@1x.png
similarity index 100%
rename from imgs/icons/21794.png
rename to imgs/icons/21794@1x.png
diff --git a/imgs/icons/21794@2x.png b/imgs/icons/21794@2x.png
new file mode 100644
index 000000000..23d8eb88f
Binary files /dev/null and b/imgs/icons/21794@2x.png differ
diff --git a/imgs/icons/21795.png b/imgs/icons/21795@1x.png
similarity index 100%
rename from imgs/icons/21795.png
rename to imgs/icons/21795@1x.png
diff --git a/imgs/icons/21795@2x.png b/imgs/icons/21795@2x.png
new file mode 100644
index 000000000..5bfa12b69
Binary files /dev/null and b/imgs/icons/21795@2x.png differ
diff --git a/imgs/icons/21796.png b/imgs/icons/21796@1x.png
similarity index 100%
rename from imgs/icons/21796.png
rename to imgs/icons/21796@1x.png
diff --git a/imgs/icons/21796@2x.png b/imgs/icons/21796@2x.png
new file mode 100644
index 000000000..40a100a5b
Binary files /dev/null and b/imgs/icons/21796@2x.png differ
diff --git a/imgs/icons/21797.png b/imgs/icons/21797@1x.png
similarity index 100%
rename from imgs/icons/21797.png
rename to imgs/icons/21797@1x.png
diff --git a/imgs/icons/21797@2x.png b/imgs/icons/21797@2x.png
new file mode 100644
index 000000000..c2e9de34b
Binary files /dev/null and b/imgs/icons/21797@2x.png differ
diff --git a/imgs/icons/21798.png b/imgs/icons/21798@1x.png
similarity index 100%
rename from imgs/icons/21798.png
rename to imgs/icons/21798@1x.png
diff --git a/imgs/icons/21798@2x.png b/imgs/icons/21798@2x.png
new file mode 100644
index 000000000..010a8d427
Binary files /dev/null and b/imgs/icons/21798@2x.png differ
diff --git a/imgs/icons/21799.png b/imgs/icons/21799@1x.png
similarity index 100%
rename from imgs/icons/21799.png
rename to imgs/icons/21799@1x.png
diff --git a/imgs/icons/21799@2x.png b/imgs/icons/21799@2x.png
new file mode 100644
index 000000000..6fa0729e1
Binary files /dev/null and b/imgs/icons/21799@2x.png differ
diff --git a/imgs/icons/2179.png b/imgs/icons/2179@1x.png
similarity index 100%
rename from imgs/icons/2179.png
rename to imgs/icons/2179@1x.png
diff --git a/imgs/icons/2179@2x.png b/imgs/icons/2179@2x.png
new file mode 100644
index 000000000..2ef08ef29
Binary files /dev/null and b/imgs/icons/2179@2x.png differ
diff --git a/imgs/icons/21800.png b/imgs/icons/21800@1x.png
similarity index 100%
rename from imgs/icons/21800.png
rename to imgs/icons/21800@1x.png
diff --git a/imgs/icons/21800@2x.png b/imgs/icons/21800@2x.png
new file mode 100644
index 000000000..bd0820c2f
Binary files /dev/null and b/imgs/icons/21800@2x.png differ
diff --git a/imgs/icons/21801.png b/imgs/icons/21801@1x.png
similarity index 100%
rename from imgs/icons/21801.png
rename to imgs/icons/21801@1x.png
diff --git a/imgs/icons/21801@2x.png b/imgs/icons/21801@2x.png
new file mode 100644
index 000000000..72fb5d888
Binary files /dev/null and b/imgs/icons/21801@2x.png differ
diff --git a/imgs/icons/2180.png b/imgs/icons/2180@1x.png
similarity index 100%
rename from imgs/icons/2180.png
rename to imgs/icons/2180@1x.png
diff --git a/imgs/icons/2180@2x.png b/imgs/icons/2180@2x.png
new file mode 100644
index 000000000..1e500dc55
Binary files /dev/null and b/imgs/icons/2180@2x.png differ
diff --git a/imgs/icons/2181.png b/imgs/icons/2181@1x.png
similarity index 100%
rename from imgs/icons/2181.png
rename to imgs/icons/2181@1x.png
diff --git a/imgs/icons/2181@2x.png b/imgs/icons/2181@2x.png
new file mode 100644
index 000000000..942e56eb6
Binary files /dev/null and b/imgs/icons/2181@2x.png differ
diff --git a/imgs/icons/21823@1x.png b/imgs/icons/21823@1x.png
new file mode 100644
index 000000000..d509a5dd4
Binary files /dev/null and b/imgs/icons/21823@1x.png differ
diff --git a/imgs/icons/21823@2x.png b/imgs/icons/21823@2x.png
new file mode 100644
index 000000000..b0ddef23c
Binary files /dev/null and b/imgs/icons/21823@2x.png differ
diff --git a/imgs/icons/21829.png b/imgs/icons/21829@1x.png
similarity index 100%
rename from imgs/icons/21829.png
rename to imgs/icons/21829@1x.png
diff --git a/imgs/icons/21829@2x.png b/imgs/icons/21829@2x.png
new file mode 100644
index 000000000..c0f973206
Binary files /dev/null and b/imgs/icons/21829@2x.png differ
diff --git a/imgs/icons/2182.png b/imgs/icons/2182@1x.png
similarity index 100%
rename from imgs/icons/2182.png
rename to imgs/icons/2182@1x.png
diff --git a/imgs/icons/2182@2x.png b/imgs/icons/2182@2x.png
new file mode 100644
index 000000000..d0a429bb2
Binary files /dev/null and b/imgs/icons/2182@2x.png differ
diff --git a/imgs/icons/21832.png b/imgs/icons/21832@1x.png
similarity index 100%
rename from imgs/icons/21832.png
rename to imgs/icons/21832@1x.png
diff --git a/imgs/icons/21832@2x.png b/imgs/icons/21832@2x.png
new file mode 100644
index 000000000..274d5e94a
Binary files /dev/null and b/imgs/icons/21832@2x.png differ
diff --git a/imgs/icons/21833.png b/imgs/icons/21833@1x.png
similarity index 100%
rename from imgs/icons/21833.png
rename to imgs/icons/21833@1x.png
diff --git a/imgs/icons/21833@2x.png b/imgs/icons/21833@2x.png
new file mode 100644
index 000000000..b81ac8bdb
Binary files /dev/null and b/imgs/icons/21833@2x.png differ
diff --git a/imgs/icons/21835.png b/imgs/icons/21835@1x.png
similarity index 100%
rename from imgs/icons/21835.png
rename to imgs/icons/21835@1x.png
diff --git a/imgs/icons/21835@2x.png b/imgs/icons/21835@2x.png
new file mode 100644
index 000000000..d46d6d3f0
Binary files /dev/null and b/imgs/icons/21835@2x.png differ
diff --git a/imgs/icons/21839.png b/imgs/icons/21839@1x.png
similarity index 100%
rename from imgs/icons/21839.png
rename to imgs/icons/21839@1x.png
diff --git a/imgs/icons/21839@2x.png b/imgs/icons/21839@2x.png
new file mode 100644
index 000000000..31851c612
Binary files /dev/null and b/imgs/icons/21839@2x.png differ
diff --git a/imgs/icons/2183.png b/imgs/icons/2183@1x.png
similarity index 100%
rename from imgs/icons/2183.png
rename to imgs/icons/2183@1x.png
diff --git a/imgs/icons/2183@2x.png b/imgs/icons/2183@2x.png
new file mode 100644
index 000000000..6bf037439
Binary files /dev/null and b/imgs/icons/2183@2x.png differ
diff --git a/imgs/icons/21840.png b/imgs/icons/21840@1x.png
similarity index 100%
rename from imgs/icons/21840.png
rename to imgs/icons/21840@1x.png
diff --git a/imgs/icons/21840@2x.png b/imgs/icons/21840@2x.png
new file mode 100644
index 000000000..a0e0b7cc3
Binary files /dev/null and b/imgs/icons/21840@2x.png differ
diff --git a/imgs/icons/21841.png b/imgs/icons/21841@1x.png
similarity index 100%
rename from imgs/icons/21841.png
rename to imgs/icons/21841@1x.png
diff --git a/imgs/icons/21841@2x.png b/imgs/icons/21841@2x.png
new file mode 100644
index 000000000..98f7d0698
Binary files /dev/null and b/imgs/icons/21841@2x.png differ
diff --git a/imgs/icons/21843.png b/imgs/icons/21843@1x.png
similarity index 100%
rename from imgs/icons/21843.png
rename to imgs/icons/21843@1x.png
diff --git a/imgs/icons/21843@2x.png b/imgs/icons/21843@2x.png
new file mode 100644
index 000000000..1a5d43017
Binary files /dev/null and b/imgs/icons/21843@2x.png differ
diff --git a/imgs/icons/21844.png b/imgs/icons/21844@1x.png
similarity index 100%
rename from imgs/icons/21844.png
rename to imgs/icons/21844@1x.png
diff --git a/imgs/icons/21844@2x.png b/imgs/icons/21844@2x.png
new file mode 100644
index 000000000..23c983409
Binary files /dev/null and b/imgs/icons/21844@2x.png differ
diff --git a/imgs/icons/2184.png b/imgs/icons/2184@1x.png
similarity index 100%
rename from imgs/icons/2184.png
rename to imgs/icons/2184@1x.png
diff --git a/imgs/icons/2184@2x.png b/imgs/icons/2184@2x.png
new file mode 100644
index 000000000..fadbfd9d2
Binary files /dev/null and b/imgs/icons/2184@2x.png differ
diff --git a/imgs/icons/2185.png b/imgs/icons/2185@1x.png
similarity index 100%
rename from imgs/icons/2185.png
rename to imgs/icons/2185@1x.png
diff --git a/imgs/icons/2185@2x.png b/imgs/icons/2185@2x.png
new file mode 100644
index 000000000..9ade13799
Binary files /dev/null and b/imgs/icons/2185@2x.png differ
diff --git a/imgs/icons/21860.png b/imgs/icons/21860@1x.png
similarity index 100%
rename from imgs/icons/21860.png
rename to imgs/icons/21860@1x.png
diff --git a/imgs/icons/21860@2x.png b/imgs/icons/21860@2x.png
new file mode 100644
index 000000000..ffc67de76
Binary files /dev/null and b/imgs/icons/21860@2x.png differ
diff --git a/imgs/icons/2186.png b/imgs/icons/2186@1x.png
similarity index 100%
rename from imgs/icons/2186.png
rename to imgs/icons/2186@1x.png
diff --git a/imgs/icons/2186@2x.png b/imgs/icons/2186@2x.png
new file mode 100644
index 000000000..7fb2ea35c
Binary files /dev/null and b/imgs/icons/2186@2x.png differ
diff --git a/imgs/icons/2187.png b/imgs/icons/2187@1x.png
similarity index 100%
rename from imgs/icons/2187.png
rename to imgs/icons/2187@1x.png
diff --git a/imgs/icons/2187@2x.png b/imgs/icons/2187@2x.png
new file mode 100644
index 000000000..956de61e2
Binary files /dev/null and b/imgs/icons/2187@2x.png differ
diff --git a/imgs/icons/2188.png b/imgs/icons/2188@1x.png
similarity index 100%
rename from imgs/icons/2188.png
rename to imgs/icons/2188@1x.png
diff --git a/imgs/icons/2188@2x.png b/imgs/icons/2188@2x.png
new file mode 100644
index 000000000..70eb7aed5
Binary files /dev/null and b/imgs/icons/2188@2x.png differ
diff --git a/imgs/icons/21891.png b/imgs/icons/21891@1x.png
similarity index 100%
rename from imgs/icons/21891.png
rename to imgs/icons/21891@1x.png
diff --git a/imgs/icons/21891@2x.png b/imgs/icons/21891@2x.png
new file mode 100644
index 000000000..efd63779d
Binary files /dev/null and b/imgs/icons/21891@2x.png differ
diff --git a/imgs/icons/21898.png b/imgs/icons/21898@1x.png
similarity index 100%
rename from imgs/icons/21898.png
rename to imgs/icons/21898@1x.png
diff --git a/imgs/icons/21898@2x.png b/imgs/icons/21898@2x.png
new file mode 100644
index 000000000..faaa3fdd0
Binary files /dev/null and b/imgs/icons/21898@2x.png differ
diff --git a/imgs/icons/2189.png b/imgs/icons/2189@1x.png
similarity index 100%
rename from imgs/icons/2189.png
rename to imgs/icons/2189@1x.png
diff --git a/imgs/icons/2189@2x.png b/imgs/icons/2189@2x.png
new file mode 100644
index 000000000..0670973e9
Binary files /dev/null and b/imgs/icons/2189@2x.png differ
diff --git a/imgs/icons/21900@1x.png b/imgs/icons/21900@1x.png
new file mode 100644
index 000000000..ba00005fa
Binary files /dev/null and b/imgs/icons/21900@1x.png differ
diff --git a/imgs/icons/21900@2x.png b/imgs/icons/21900@2x.png
new file mode 100644
index 000000000..757655b6d
Binary files /dev/null and b/imgs/icons/21900@2x.png differ
diff --git a/imgs/icons/21903.png b/imgs/icons/21903@1x.png
similarity index 100%
rename from imgs/icons/21903.png
rename to imgs/icons/21903@1x.png
diff --git a/imgs/icons/21903@2x.png b/imgs/icons/21903@2x.png
new file mode 100644
index 000000000..4cc4b7bb2
Binary files /dev/null and b/imgs/icons/21903@2x.png differ
diff --git a/imgs/icons/21904.png b/imgs/icons/21904@1x.png
similarity index 100%
rename from imgs/icons/21904.png
rename to imgs/icons/21904@1x.png
diff --git a/imgs/icons/21904@2x.png b/imgs/icons/21904@2x.png
new file mode 100644
index 000000000..68e342ad8
Binary files /dev/null and b/imgs/icons/21904@2x.png differ
diff --git a/imgs/icons/21905.png b/imgs/icons/21905@1x.png
similarity index 100%
rename from imgs/icons/21905.png
rename to imgs/icons/21905@1x.png
diff --git a/imgs/icons/21905@2x.png b/imgs/icons/21905@2x.png
new file mode 100644
index 000000000..00b67efd2
Binary files /dev/null and b/imgs/icons/21905@2x.png differ
diff --git a/imgs/icons/21906.png b/imgs/icons/21906@1x.png
similarity index 100%
rename from imgs/icons/21906.png
rename to imgs/icons/21906@1x.png
diff --git a/imgs/icons/21906@2x.png b/imgs/icons/21906@2x.png
new file mode 100644
index 000000000..763ec8d4d
Binary files /dev/null and b/imgs/icons/21906@2x.png differ
diff --git a/imgs/icons/21907.png b/imgs/icons/21907@1x.png
similarity index 100%
rename from imgs/icons/21907.png
rename to imgs/icons/21907@1x.png
diff --git a/imgs/icons/21907@2x.png b/imgs/icons/21907@2x.png
new file mode 100644
index 000000000..7ecde9caf
Binary files /dev/null and b/imgs/icons/21907@2x.png differ
diff --git a/imgs/icons/2190.png b/imgs/icons/2190@1x.png
similarity index 100%
rename from imgs/icons/2190.png
rename to imgs/icons/2190@1x.png
diff --git a/imgs/icons/2190@2x.png b/imgs/icons/2190@2x.png
new file mode 100644
index 000000000..dbb44332b
Binary files /dev/null and b/imgs/icons/2190@2x.png differ
diff --git a/imgs/icons/21916.png b/imgs/icons/21916@1x.png
similarity index 100%
rename from imgs/icons/21916.png
rename to imgs/icons/21916@1x.png
diff --git a/imgs/icons/21916@2x.png b/imgs/icons/21916@2x.png
new file mode 100644
index 000000000..94f6a4dac
Binary files /dev/null and b/imgs/icons/21916@2x.png differ
diff --git a/imgs/icons/21917.png b/imgs/icons/21917@1x.png
similarity index 100%
rename from imgs/icons/21917.png
rename to imgs/icons/21917@1x.png
diff --git a/imgs/icons/21917@2x.png b/imgs/icons/21917@2x.png
new file mode 100644
index 000000000..c2516c6e9
Binary files /dev/null and b/imgs/icons/21917@2x.png differ
diff --git a/imgs/icons/21918.png b/imgs/icons/21918@1x.png
similarity index 100%
rename from imgs/icons/21918.png
rename to imgs/icons/21918@1x.png
diff --git a/imgs/icons/21918@2x.png b/imgs/icons/21918@2x.png
new file mode 100644
index 000000000..940ceedec
Binary files /dev/null and b/imgs/icons/21918@2x.png differ
diff --git a/imgs/icons/21919.png b/imgs/icons/21919@1x.png
similarity index 100%
rename from imgs/icons/21919.png
rename to imgs/icons/21919@1x.png
diff --git a/imgs/icons/21919@2x.png b/imgs/icons/21919@2x.png
new file mode 100644
index 000000000..3b1e8bec7
Binary files /dev/null and b/imgs/icons/21919@2x.png differ
diff --git a/imgs/icons/2191.png b/imgs/icons/2191@1x.png
similarity index 100%
rename from imgs/icons/2191.png
rename to imgs/icons/2191@1x.png
diff --git a/imgs/icons/2191@2x.png b/imgs/icons/2191@2x.png
new file mode 100644
index 000000000..65d127efb
Binary files /dev/null and b/imgs/icons/2191@2x.png differ
diff --git a/imgs/icons/21920.png b/imgs/icons/21920@1x.png
similarity index 100%
rename from imgs/icons/21920.png
rename to imgs/icons/21920@1x.png
diff --git a/imgs/icons/21920@2x.png b/imgs/icons/21920@2x.png
new file mode 100644
index 000000000..fd54daba0
Binary files /dev/null and b/imgs/icons/21920@2x.png differ
diff --git a/imgs/icons/21921.png b/imgs/icons/21921@1x.png
similarity index 100%
rename from imgs/icons/21921.png
rename to imgs/icons/21921@1x.png
diff --git a/imgs/icons/21921@2x.png b/imgs/icons/21921@2x.png
new file mode 100644
index 000000000..2300b0e42
Binary files /dev/null and b/imgs/icons/21921@2x.png differ
diff --git a/imgs/icons/21922.png b/imgs/icons/21922@1x.png
similarity index 100%
rename from imgs/icons/21922.png
rename to imgs/icons/21922@1x.png
diff --git a/imgs/icons/21922@2x.png b/imgs/icons/21922@2x.png
new file mode 100644
index 000000000..84007e3df
Binary files /dev/null and b/imgs/icons/21922@2x.png differ
diff --git a/imgs/icons/21923.png b/imgs/icons/21923@1x.png
similarity index 100%
rename from imgs/icons/21923.png
rename to imgs/icons/21923@1x.png
diff --git a/imgs/icons/21923@2x.png b/imgs/icons/21923@2x.png
new file mode 100644
index 000000000..681147642
Binary files /dev/null and b/imgs/icons/21923@2x.png differ
diff --git a/imgs/icons/21924.png b/imgs/icons/21924@1x.png
similarity index 100%
rename from imgs/icons/21924.png
rename to imgs/icons/21924@1x.png
diff --git a/imgs/icons/21924@2x.png b/imgs/icons/21924@2x.png
new file mode 100644
index 000000000..2af14f3a6
Binary files /dev/null and b/imgs/icons/21924@2x.png differ
diff --git a/imgs/icons/21925.png b/imgs/icons/21925@1x.png
similarity index 100%
rename from imgs/icons/21925.png
rename to imgs/icons/21925@1x.png
diff --git a/imgs/icons/21925@2x.png b/imgs/icons/21925@2x.png
new file mode 100644
index 000000000..c6794a61a
Binary files /dev/null and b/imgs/icons/21925@2x.png differ
diff --git a/imgs/icons/21926.png b/imgs/icons/21926@1x.png
similarity index 100%
rename from imgs/icons/21926.png
rename to imgs/icons/21926@1x.png
diff --git a/imgs/icons/21926@2x.png b/imgs/icons/21926@2x.png
new file mode 100644
index 000000000..26f3fbab8
Binary files /dev/null and b/imgs/icons/21926@2x.png differ
diff --git a/imgs/icons/21927.png b/imgs/icons/21927@1x.png
similarity index 100%
rename from imgs/icons/21927.png
rename to imgs/icons/21927@1x.png
diff --git a/imgs/icons/21927@2x.png b/imgs/icons/21927@2x.png
new file mode 100644
index 000000000..b5405a677
Binary files /dev/null and b/imgs/icons/21927@2x.png differ
diff --git a/imgs/icons/21928.png b/imgs/icons/21928@1x.png
similarity index 100%
rename from imgs/icons/21928.png
rename to imgs/icons/21928@1x.png
diff --git a/imgs/icons/21928@2x.png b/imgs/icons/21928@2x.png
new file mode 100644
index 000000000..4b212bf85
Binary files /dev/null and b/imgs/icons/21928@2x.png differ
diff --git a/imgs/icons/2192.png b/imgs/icons/2192@1x.png
similarity index 100%
rename from imgs/icons/2192.png
rename to imgs/icons/2192@1x.png
diff --git a/imgs/icons/2192@2x.png b/imgs/icons/2192@2x.png
new file mode 100644
index 000000000..cba536e36
Binary files /dev/null and b/imgs/icons/2192@2x.png differ
diff --git a/imgs/icons/2193.png b/imgs/icons/2193@1x.png
similarity index 100%
rename from imgs/icons/2193.png
rename to imgs/icons/2193@1x.png
diff --git a/imgs/icons/2193@2x.png b/imgs/icons/2193@2x.png
new file mode 100644
index 000000000..c4936828d
Binary files /dev/null and b/imgs/icons/2193@2x.png differ
diff --git a/imgs/icons/2194.png b/imgs/icons/2194@1x.png
similarity index 100%
rename from imgs/icons/2194.png
rename to imgs/icons/2194@1x.png
diff --git a/imgs/icons/2194@2x.png b/imgs/icons/2194@2x.png
new file mode 100644
index 000000000..384e03eb2
Binary files /dev/null and b/imgs/icons/2194@2x.png differ
diff --git a/imgs/icons/2195.png b/imgs/icons/2195@1x.png
similarity index 100%
rename from imgs/icons/2195.png
rename to imgs/icons/2195@1x.png
diff --git a/imgs/icons/2195@2x.png b/imgs/icons/2195@2x.png
new file mode 100644
index 000000000..9635c5ef6
Binary files /dev/null and b/imgs/icons/2195@2x.png differ
diff --git a/imgs/icons/2196.png b/imgs/icons/2196@1x.png
similarity index 100%
rename from imgs/icons/2196.png
rename to imgs/icons/2196@1x.png
diff --git a/imgs/icons/2196@2x.png b/imgs/icons/2196@2x.png
new file mode 100644
index 000000000..f24ebae3d
Binary files /dev/null and b/imgs/icons/2196@2x.png differ
diff --git a/imgs/icons/2197.png b/imgs/icons/2197@1x.png
similarity index 100%
rename from imgs/icons/2197.png
rename to imgs/icons/2197@1x.png
diff --git a/imgs/icons/2197@2x.png b/imgs/icons/2197@2x.png
new file mode 100644
index 000000000..759c19577
Binary files /dev/null and b/imgs/icons/2197@2x.png differ
diff --git a/imgs/icons/21980.png b/imgs/icons/21980@1x.png
similarity index 100%
rename from imgs/icons/21980.png
rename to imgs/icons/21980@1x.png
diff --git a/imgs/icons/21980@2x.png b/imgs/icons/21980@2x.png
new file mode 100644
index 000000000..17da8e0af
Binary files /dev/null and b/imgs/icons/21980@2x.png differ
diff --git a/imgs/icons/21981.png b/imgs/icons/21981.png
deleted file mode 100644
index 38ba32ef5..000000000
Binary files a/imgs/icons/21981.png and /dev/null differ
diff --git a/imgs/icons/21982.png b/imgs/icons/21982@1x.png
similarity index 100%
rename from imgs/icons/21982.png
rename to imgs/icons/21982@1x.png
diff --git a/imgs/icons/21982@2x.png b/imgs/icons/21982@2x.png
new file mode 100644
index 000000000..23b340135
Binary files /dev/null and b/imgs/icons/21982@2x.png differ
diff --git a/imgs/icons/21983.png b/imgs/icons/21983@1x.png
similarity index 100%
rename from imgs/icons/21983.png
rename to imgs/icons/21983@1x.png
diff --git a/imgs/icons/21983@2x.png b/imgs/icons/21983@2x.png
new file mode 100644
index 000000000..611df3a45
Binary files /dev/null and b/imgs/icons/21983@2x.png differ
diff --git a/imgs/icons/21984.png b/imgs/icons/21984@1x.png
similarity index 100%
rename from imgs/icons/21984.png
rename to imgs/icons/21984@1x.png
diff --git a/imgs/icons/21984@2x.png b/imgs/icons/21984@2x.png
new file mode 100644
index 000000000..4bb9b90c9
Binary files /dev/null and b/imgs/icons/21984@2x.png differ
diff --git a/imgs/icons/21985.png b/imgs/icons/21985@1x.png
similarity index 100%
rename from imgs/icons/21985.png
rename to imgs/icons/21985@1x.png
diff --git a/imgs/icons/21985@2x.png b/imgs/icons/21985@2x.png
new file mode 100644
index 000000000..f5d7e0b58
Binary files /dev/null and b/imgs/icons/21985@2x.png differ
diff --git a/imgs/icons/21986.png b/imgs/icons/21986@1x.png
similarity index 100%
rename from imgs/icons/21986.png
rename to imgs/icons/21986@1x.png
diff --git a/imgs/icons/21986@2x.png b/imgs/icons/21986@2x.png
new file mode 100644
index 000000000..a17a8a1a3
Binary files /dev/null and b/imgs/icons/21986@2x.png differ
diff --git a/imgs/icons/21987.png b/imgs/icons/21987@1x.png
similarity index 100%
rename from imgs/icons/21987.png
rename to imgs/icons/21987@1x.png
diff --git a/imgs/icons/21987@2x.png b/imgs/icons/21987@2x.png
new file mode 100644
index 000000000..43424af20
Binary files /dev/null and b/imgs/icons/21987@2x.png differ
diff --git a/imgs/icons/21988.png b/imgs/icons/21988@1x.png
similarity index 100%
rename from imgs/icons/21988.png
rename to imgs/icons/21988@1x.png
diff --git a/imgs/icons/21988@2x.png b/imgs/icons/21988@2x.png
new file mode 100644
index 000000000..7cc1dcc1e
Binary files /dev/null and b/imgs/icons/21988@2x.png differ
diff --git a/imgs/icons/21989.png b/imgs/icons/21989@1x.png
similarity index 100%
rename from imgs/icons/21989.png
rename to imgs/icons/21989@1x.png
diff --git a/imgs/icons/21989@2x.png b/imgs/icons/21989@2x.png
new file mode 100644
index 000000000..d32f8a525
Binary files /dev/null and b/imgs/icons/21989@2x.png differ
diff --git a/imgs/icons/2198.png b/imgs/icons/2198@1x.png
similarity index 100%
rename from imgs/icons/2198.png
rename to imgs/icons/2198@1x.png
diff --git a/imgs/icons/2198@2x.png b/imgs/icons/2198@2x.png
new file mode 100644
index 000000000..c78ced1d0
Binary files /dev/null and b/imgs/icons/2198@2x.png differ
diff --git a/imgs/icons/21990.png b/imgs/icons/21990@1x.png
similarity index 100%
rename from imgs/icons/21990.png
rename to imgs/icons/21990@1x.png
diff --git a/imgs/icons/21990@2x.png b/imgs/icons/21990@2x.png
new file mode 100644
index 000000000..a5b931bf3
Binary files /dev/null and b/imgs/icons/21990@2x.png differ
diff --git a/imgs/icons/21991.png b/imgs/icons/21991@1x.png
similarity index 100%
rename from imgs/icons/21991.png
rename to imgs/icons/21991@1x.png
diff --git a/imgs/icons/21991@2x.png b/imgs/icons/21991@2x.png
new file mode 100644
index 000000000..15b9534e3
Binary files /dev/null and b/imgs/icons/21991@2x.png differ
diff --git a/imgs/icons/21992.png b/imgs/icons/21992@1x.png
similarity index 100%
rename from imgs/icons/21992.png
rename to imgs/icons/21992@1x.png
diff --git a/imgs/icons/21992@2x.png b/imgs/icons/21992@2x.png
new file mode 100644
index 000000000..624b12787
Binary files /dev/null and b/imgs/icons/21992@2x.png differ
diff --git a/imgs/icons/21993.png b/imgs/icons/21993@1x.png
similarity index 100%
rename from imgs/icons/21993.png
rename to imgs/icons/21993@1x.png
diff --git a/imgs/icons/21993@2x.png b/imgs/icons/21993@2x.png
new file mode 100644
index 000000000..f0c4e5d3c
Binary files /dev/null and b/imgs/icons/21993@2x.png differ
diff --git a/imgs/icons/21994.png b/imgs/icons/21994@1x.png
similarity index 100%
rename from imgs/icons/21994.png
rename to imgs/icons/21994@1x.png
diff --git a/imgs/icons/21994@2x.png b/imgs/icons/21994@2x.png
new file mode 100644
index 000000000..6630a8336
Binary files /dev/null and b/imgs/icons/21994@2x.png differ
diff --git a/imgs/icons/21995.png b/imgs/icons/21995@1x.png
similarity index 100%
rename from imgs/icons/21995.png
rename to imgs/icons/21995@1x.png
diff --git a/imgs/icons/21995@2x.png b/imgs/icons/21995@2x.png
new file mode 100644
index 000000000..7741b6f5b
Binary files /dev/null and b/imgs/icons/21995@2x.png differ
diff --git a/imgs/icons/21996.png b/imgs/icons/21996@1x.png
similarity index 100%
rename from imgs/icons/21996.png
rename to imgs/icons/21996@1x.png
diff --git a/imgs/icons/21996@2x.png b/imgs/icons/21996@2x.png
new file mode 100644
index 000000000..2071018b4
Binary files /dev/null and b/imgs/icons/21996@2x.png differ
diff --git a/imgs/icons/21997.png b/imgs/icons/21997@1x.png
similarity index 100%
rename from imgs/icons/21997.png
rename to imgs/icons/21997@1x.png
diff --git a/imgs/icons/21997@2x.png b/imgs/icons/21997@2x.png
new file mode 100644
index 000000000..f5909109d
Binary files /dev/null and b/imgs/icons/21997@2x.png differ
diff --git a/imgs/icons/21998.png b/imgs/icons/21998@1x.png
similarity index 100%
rename from imgs/icons/21998.png
rename to imgs/icons/21998@1x.png
diff --git a/imgs/icons/21998@2x.png b/imgs/icons/21998@2x.png
new file mode 100644
index 000000000..c65e6834c
Binary files /dev/null and b/imgs/icons/21998@2x.png differ
diff --git a/imgs/icons/21999.png b/imgs/icons/21999@1x.png
similarity index 100%
rename from imgs/icons/21999.png
rename to imgs/icons/21999@1x.png
diff --git a/imgs/icons/21999@2x.png b/imgs/icons/21999@2x.png
new file mode 100644
index 000000000..6df3d72ee
Binary files /dev/null and b/imgs/icons/21999@2x.png differ
diff --git a/imgs/icons/2199.png b/imgs/icons/2199@1x.png
similarity index 100%
rename from imgs/icons/2199.png
rename to imgs/icons/2199@1x.png
diff --git a/imgs/icons/2199@2x.png b/imgs/icons/2199@2x.png
new file mode 100644
index 000000000..b9afd8efc
Binary files /dev/null and b/imgs/icons/2199@2x.png differ
diff --git a/imgs/icons/21.png b/imgs/icons/21@1x.png
similarity index 100%
rename from imgs/icons/21.png
rename to imgs/icons/21@1x.png
diff --git a/imgs/icons/21@2x.png b/imgs/icons/21@2x.png
new file mode 100644
index 000000000..dc6604e18
Binary files /dev/null and b/imgs/icons/21@2x.png differ
diff --git a/imgs/icons/22000.png b/imgs/icons/22000@1x.png
similarity index 100%
rename from imgs/icons/22000.png
rename to imgs/icons/22000@1x.png
diff --git a/imgs/icons/22000@2x.png b/imgs/icons/22000@2x.png
new file mode 100644
index 000000000..9d593fca7
Binary files /dev/null and b/imgs/icons/22000@2x.png differ
diff --git a/imgs/icons/22001.png b/imgs/icons/22001@1x.png
similarity index 100%
rename from imgs/icons/22001.png
rename to imgs/icons/22001@1x.png
diff --git a/imgs/icons/22001@2x.png b/imgs/icons/22001@2x.png
new file mode 100644
index 000000000..4494a863b
Binary files /dev/null and b/imgs/icons/22001@2x.png differ
diff --git a/imgs/icons/22002.png b/imgs/icons/22002@1x.png
similarity index 100%
rename from imgs/icons/22002.png
rename to imgs/icons/22002@1x.png
diff --git a/imgs/icons/22002@2x.png b/imgs/icons/22002@2x.png
new file mode 100644
index 000000000..a034ee452
Binary files /dev/null and b/imgs/icons/22002@2x.png differ
diff --git a/imgs/icons/22003.png b/imgs/icons/22003@1x.png
similarity index 100%
rename from imgs/icons/22003.png
rename to imgs/icons/22003@1x.png
diff --git a/imgs/icons/22003@2x.png b/imgs/icons/22003@2x.png
new file mode 100644
index 000000000..159446718
Binary files /dev/null and b/imgs/icons/22003@2x.png differ
diff --git a/imgs/icons/22004.png b/imgs/icons/22004@1x.png
similarity index 100%
rename from imgs/icons/22004.png
rename to imgs/icons/22004@1x.png
diff --git a/imgs/icons/22004@2x.png b/imgs/icons/22004@2x.png
new file mode 100644
index 000000000..6b778a200
Binary files /dev/null and b/imgs/icons/22004@2x.png differ
diff --git a/imgs/icons/22005.png b/imgs/icons/22005@1x.png
similarity index 100%
rename from imgs/icons/22005.png
rename to imgs/icons/22005@1x.png
diff --git a/imgs/icons/22005@2x.png b/imgs/icons/22005@2x.png
new file mode 100644
index 000000000..5774f6441
Binary files /dev/null and b/imgs/icons/22005@2x.png differ
diff --git a/imgs/icons/22006.png b/imgs/icons/22006@1x.png
similarity index 100%
rename from imgs/icons/22006.png
rename to imgs/icons/22006@1x.png
diff --git a/imgs/icons/22006@2x.png b/imgs/icons/22006@2x.png
new file mode 100644
index 000000000..45d5ddac4
Binary files /dev/null and b/imgs/icons/22006@2x.png differ
diff --git a/imgs/icons/22007.png b/imgs/icons/22007@1x.png
similarity index 100%
rename from imgs/icons/22007.png
rename to imgs/icons/22007@1x.png
diff --git a/imgs/icons/22007@2x.png b/imgs/icons/22007@2x.png
new file mode 100644
index 000000000..7cbd3326f
Binary files /dev/null and b/imgs/icons/22007@2x.png differ
diff --git a/imgs/icons/22008.png b/imgs/icons/22008@1x.png
similarity index 100%
rename from imgs/icons/22008.png
rename to imgs/icons/22008@1x.png
diff --git a/imgs/icons/22008@2x.png b/imgs/icons/22008@2x.png
new file mode 100644
index 000000000..0756cfd8a
Binary files /dev/null and b/imgs/icons/22008@2x.png differ
diff --git a/imgs/icons/22009.png b/imgs/icons/22009@1x.png
similarity index 100%
rename from imgs/icons/22009.png
rename to imgs/icons/22009@1x.png
diff --git a/imgs/icons/22009@2x.png b/imgs/icons/22009@2x.png
new file mode 100644
index 000000000..74b922c92
Binary files /dev/null and b/imgs/icons/22009@2x.png differ
diff --git a/imgs/icons/2200.png b/imgs/icons/2200@1x.png
similarity index 100%
rename from imgs/icons/2200.png
rename to imgs/icons/2200@1x.png
diff --git a/imgs/icons/2200@2x.png b/imgs/icons/2200@2x.png
new file mode 100644
index 000000000..ab8a1f5df
Binary files /dev/null and b/imgs/icons/2200@2x.png differ
diff --git a/imgs/icons/22010.png b/imgs/icons/22010@1x.png
similarity index 100%
rename from imgs/icons/22010.png
rename to imgs/icons/22010@1x.png
diff --git a/imgs/icons/22010@2x.png b/imgs/icons/22010@2x.png
new file mode 100644
index 000000000..1b2fca47c
Binary files /dev/null and b/imgs/icons/22010@2x.png differ
diff --git a/imgs/icons/22011.png b/imgs/icons/22011@1x.png
similarity index 100%
rename from imgs/icons/22011.png
rename to imgs/icons/22011@1x.png
diff --git a/imgs/icons/22011@2x.png b/imgs/icons/22011@2x.png
new file mode 100644
index 000000000..52632b451
Binary files /dev/null and b/imgs/icons/22011@2x.png differ
diff --git a/imgs/icons/22012.png b/imgs/icons/22012@1x.png
similarity index 100%
rename from imgs/icons/22012.png
rename to imgs/icons/22012@1x.png
diff --git a/imgs/icons/22012@2x.png b/imgs/icons/22012@2x.png
new file mode 100644
index 000000000..af5cd048d
Binary files /dev/null and b/imgs/icons/22012@2x.png differ
diff --git a/imgs/icons/22013.png b/imgs/icons/22013@1x.png
similarity index 100%
rename from imgs/icons/22013.png
rename to imgs/icons/22013@1x.png
diff --git a/imgs/icons/22013@2x.png b/imgs/icons/22013@2x.png
new file mode 100644
index 000000000..40401ea54
Binary files /dev/null and b/imgs/icons/22013@2x.png differ
diff --git a/imgs/icons/22014.png b/imgs/icons/22014@1x.png
similarity index 100%
rename from imgs/icons/22014.png
rename to imgs/icons/22014@1x.png
diff --git a/imgs/icons/22014@2x.png b/imgs/icons/22014@2x.png
new file mode 100644
index 000000000..57a33673c
Binary files /dev/null and b/imgs/icons/22014@2x.png differ
diff --git a/imgs/icons/22016.png b/imgs/icons/22016@1x.png
similarity index 100%
rename from imgs/icons/22016.png
rename to imgs/icons/22016@1x.png
diff --git a/imgs/icons/22016@2x.png b/imgs/icons/22016@2x.png
new file mode 100644
index 000000000..115bbfdb4
Binary files /dev/null and b/imgs/icons/22016@2x.png differ
diff --git a/imgs/icons/22018.png b/imgs/icons/22018@1x.png
similarity index 100%
rename from imgs/icons/22018.png
rename to imgs/icons/22018@1x.png
diff --git a/imgs/icons/22018@2x.png b/imgs/icons/22018@2x.png
new file mode 100644
index 000000000..51f73a70b
Binary files /dev/null and b/imgs/icons/22018@2x.png differ
diff --git a/imgs/icons/2201.png b/imgs/icons/2201@1x.png
similarity index 100%
rename from imgs/icons/2201.png
rename to imgs/icons/2201@1x.png
diff --git a/imgs/icons/2201@2x.png b/imgs/icons/2201@2x.png
new file mode 100644
index 000000000..4aaade759
Binary files /dev/null and b/imgs/icons/2201@2x.png differ
diff --git a/imgs/icons/22020.png b/imgs/icons/22020@1x.png
similarity index 100%
rename from imgs/icons/22020.png
rename to imgs/icons/22020@1x.png
diff --git a/imgs/icons/22020@2x.png b/imgs/icons/22020@2x.png
new file mode 100644
index 000000000..821aa2c0f
Binary files /dev/null and b/imgs/icons/22020@2x.png differ
diff --git a/imgs/icons/22029.png b/imgs/icons/22029@1x.png
similarity index 100%
rename from imgs/icons/22029.png
rename to imgs/icons/22029@1x.png
diff --git a/imgs/icons/22029@2x.png b/imgs/icons/22029@2x.png
new file mode 100644
index 000000000..e76577620
Binary files /dev/null and b/imgs/icons/22029@2x.png differ
diff --git a/imgs/icons/2202.png b/imgs/icons/2202@1x.png
similarity index 100%
rename from imgs/icons/2202.png
rename to imgs/icons/2202@1x.png
diff --git a/imgs/icons/2202@2x.png b/imgs/icons/2202@2x.png
new file mode 100644
index 000000000..e9ce2adde
Binary files /dev/null and b/imgs/icons/2202@2x.png differ
diff --git a/imgs/icons/22030.png b/imgs/icons/22030@1x.png
similarity index 100%
rename from imgs/icons/22030.png
rename to imgs/icons/22030@1x.png
diff --git a/imgs/icons/22030@2x.png b/imgs/icons/22030@2x.png
new file mode 100644
index 000000000..524af532a
Binary files /dev/null and b/imgs/icons/22030@2x.png differ
diff --git a/imgs/icons/22031.png b/imgs/icons/22031@1x.png
similarity index 100%
rename from imgs/icons/22031.png
rename to imgs/icons/22031@1x.png
diff --git a/imgs/icons/22031@2x.png b/imgs/icons/22031@2x.png
new file mode 100644
index 000000000..5e575a485
Binary files /dev/null and b/imgs/icons/22031@2x.png differ
diff --git a/imgs/icons/22034.png b/imgs/icons/22034@1x.png
similarity index 100%
rename from imgs/icons/22034.png
rename to imgs/icons/22034@1x.png
diff --git a/imgs/icons/22034@2x.png b/imgs/icons/22034@2x.png
new file mode 100644
index 000000000..d16a766e7
Binary files /dev/null and b/imgs/icons/22034@2x.png differ
diff --git a/imgs/icons/22036.png b/imgs/icons/22036@1x.png
similarity index 100%
rename from imgs/icons/22036.png
rename to imgs/icons/22036@1x.png
diff --git a/imgs/icons/22036@2x.png b/imgs/icons/22036@2x.png
new file mode 100644
index 000000000..fb995e92c
Binary files /dev/null and b/imgs/icons/22036@2x.png differ
diff --git a/imgs/icons/2203.png b/imgs/icons/2203@1x.png
similarity index 100%
rename from imgs/icons/2203.png
rename to imgs/icons/2203@1x.png
diff --git a/imgs/icons/2203@2x.png b/imgs/icons/2203@2x.png
new file mode 100644
index 000000000..d43d5da5b
Binary files /dev/null and b/imgs/icons/2203@2x.png differ
diff --git a/imgs/icons/22041.png b/imgs/icons/22041@1x.png
similarity index 100%
rename from imgs/icons/22041.png
rename to imgs/icons/22041@1x.png
diff --git a/imgs/icons/22041@2x.png b/imgs/icons/22041@2x.png
new file mode 100644
index 000000000..1ba6d39b4
Binary files /dev/null and b/imgs/icons/22041@2x.png differ
diff --git a/imgs/icons/22042@1x.png b/imgs/icons/22042@1x.png
new file mode 100644
index 000000000..ec2b2dd8e
Binary files /dev/null and b/imgs/icons/22042@1x.png differ
diff --git a/imgs/icons/22042@2x.png b/imgs/icons/22042@2x.png
new file mode 100644
index 000000000..064a09a3d
Binary files /dev/null and b/imgs/icons/22042@2x.png differ
diff --git a/imgs/icons/2204.png b/imgs/icons/2204@1x.png
similarity index 100%
rename from imgs/icons/2204.png
rename to imgs/icons/2204@1x.png
diff --git a/imgs/icons/2204@2x.png b/imgs/icons/2204@2x.png
new file mode 100644
index 000000000..d7d89a5f4
Binary files /dev/null and b/imgs/icons/2204@2x.png differ
diff --git a/imgs/icons/2206.png b/imgs/icons/2206@1x.png
similarity index 100%
rename from imgs/icons/2206.png
rename to imgs/icons/2206@1x.png
diff --git a/imgs/icons/2206@2x.png b/imgs/icons/2206@2x.png
new file mode 100644
index 000000000..dc8a55277
Binary files /dev/null and b/imgs/icons/2206@2x.png differ
diff --git a/imgs/icons/2209.png b/imgs/icons/2209@1x.png
similarity index 100%
rename from imgs/icons/2209.png
rename to imgs/icons/2209@1x.png
diff --git a/imgs/icons/2209@2x.png b/imgs/icons/2209@2x.png
new file mode 100644
index 000000000..a985047a6
Binary files /dev/null and b/imgs/icons/2209@2x.png differ
diff --git a/imgs/icons/2210.png b/imgs/icons/2210@1x.png
similarity index 100%
rename from imgs/icons/2210.png
rename to imgs/icons/2210@1x.png
diff --git a/imgs/icons/2210@2x.png b/imgs/icons/2210@2x.png
new file mode 100644
index 000000000..7641e4eea
Binary files /dev/null and b/imgs/icons/2210@2x.png differ
diff --git a/imgs/icons/2211.png b/imgs/icons/2211@1x.png
similarity index 100%
rename from imgs/icons/2211.png
rename to imgs/icons/2211@1x.png
diff --git a/imgs/icons/2211@2x.png b/imgs/icons/2211@2x.png
new file mode 100644
index 000000000..fb82c9dc9
Binary files /dev/null and b/imgs/icons/2211@2x.png differ
diff --git a/imgs/icons/2212.png b/imgs/icons/2212@1x.png
similarity index 100%
rename from imgs/icons/2212.png
rename to imgs/icons/2212@1x.png
diff --git a/imgs/icons/2212@2x.png b/imgs/icons/2212@2x.png
new file mode 100644
index 000000000..c53ba1fec
Binary files /dev/null and b/imgs/icons/2212@2x.png differ
diff --git a/imgs/icons/2213.png b/imgs/icons/2213@1x.png
similarity index 100%
rename from imgs/icons/2213.png
rename to imgs/icons/2213@1x.png
diff --git a/imgs/icons/2213@2x.png b/imgs/icons/2213@2x.png
new file mode 100644
index 000000000..fd217f7f1
Binary files /dev/null and b/imgs/icons/2213@2x.png differ
diff --git a/imgs/icons/2214.png b/imgs/icons/2214@1x.png
similarity index 100%
rename from imgs/icons/2214.png
rename to imgs/icons/2214@1x.png
diff --git a/imgs/icons/2214@2x.png b/imgs/icons/2214@2x.png
new file mode 100644
index 000000000..438595b7e
Binary files /dev/null and b/imgs/icons/2214@2x.png differ
diff --git a/imgs/icons/2215.png b/imgs/icons/2215@1x.png
similarity index 100%
rename from imgs/icons/2215.png
rename to imgs/icons/2215@1x.png
diff --git a/imgs/icons/2215@2x.png b/imgs/icons/2215@2x.png
new file mode 100644
index 000000000..7d07c5ea3
Binary files /dev/null and b/imgs/icons/2215@2x.png differ
diff --git a/imgs/icons/2216.png b/imgs/icons/2216@1x.png
similarity index 100%
rename from imgs/icons/2216.png
rename to imgs/icons/2216@1x.png
diff --git a/imgs/icons/2216@2x.png b/imgs/icons/2216@2x.png
new file mode 100644
index 000000000..3f3e98215
Binary files /dev/null and b/imgs/icons/2216@2x.png differ
diff --git a/imgs/icons/2217.png b/imgs/icons/2217@1x.png
similarity index 100%
rename from imgs/icons/2217.png
rename to imgs/icons/2217@1x.png
diff --git a/imgs/icons/2217@2x.png b/imgs/icons/2217@2x.png
new file mode 100644
index 000000000..129d830ca
Binary files /dev/null and b/imgs/icons/2217@2x.png differ
diff --git a/imgs/icons/2218.png b/imgs/icons/2218@1x.png
similarity index 100%
rename from imgs/icons/2218.png
rename to imgs/icons/2218@1x.png
diff --git a/imgs/icons/2218@2x.png b/imgs/icons/2218@2x.png
new file mode 100644
index 000000000..0b7818583
Binary files /dev/null and b/imgs/icons/2218@2x.png differ
diff --git a/imgs/icons/2219.png b/imgs/icons/2219@1x.png
similarity index 100%
rename from imgs/icons/2219.png
rename to imgs/icons/2219@1x.png
diff --git a/imgs/icons/2219@2x.png b/imgs/icons/2219@2x.png
new file mode 100644
index 000000000..cff111ec4
Binary files /dev/null and b/imgs/icons/2219@2x.png differ
diff --git a/imgs/icons/2220.png b/imgs/icons/2220@1x.png
similarity index 100%
rename from imgs/icons/2220.png
rename to imgs/icons/2220@1x.png
diff --git a/imgs/icons/2220@2x.png b/imgs/icons/2220@2x.png
new file mode 100644
index 000000000..1702aa0ad
Binary files /dev/null and b/imgs/icons/2220@2x.png differ
diff --git a/imgs/icons/2221.png b/imgs/icons/2221@1x.png
similarity index 100%
rename from imgs/icons/2221.png
rename to imgs/icons/2221@1x.png
diff --git a/imgs/icons/2221@2x.png b/imgs/icons/2221@2x.png
new file mode 100644
index 000000000..1cfe40c8e
Binary files /dev/null and b/imgs/icons/2221@2x.png differ
diff --git a/imgs/icons/2222.png b/imgs/icons/2222@1x.png
similarity index 100%
rename from imgs/icons/2222.png
rename to imgs/icons/2222@1x.png
diff --git a/imgs/icons/2222@2x.png b/imgs/icons/2222@2x.png
new file mode 100644
index 000000000..65b715fba
Binary files /dev/null and b/imgs/icons/2222@2x.png differ
diff --git a/imgs/icons/2224.png b/imgs/icons/2224@1x.png
similarity index 100%
rename from imgs/icons/2224.png
rename to imgs/icons/2224@1x.png
diff --git a/imgs/icons/2224@2x.png b/imgs/icons/2224@2x.png
new file mode 100644
index 000000000..dc61aa2f3
Binary files /dev/null and b/imgs/icons/2224@2x.png differ
diff --git a/imgs/icons/2225.png b/imgs/icons/2225@1x.png
similarity index 100%
rename from imgs/icons/2225.png
rename to imgs/icons/2225@1x.png
diff --git a/imgs/icons/2225@2x.png b/imgs/icons/2225@2x.png
new file mode 100644
index 000000000..4ca8a895d
Binary files /dev/null and b/imgs/icons/2225@2x.png differ
diff --git a/imgs/icons/2226.png b/imgs/icons/2226@1x.png
similarity index 100%
rename from imgs/icons/2226.png
rename to imgs/icons/2226@1x.png
diff --git a/imgs/icons/2226@2x.png b/imgs/icons/2226@2x.png
new file mode 100644
index 000000000..2598ffbc3
Binary files /dev/null and b/imgs/icons/2226@2x.png differ
diff --git a/imgs/icons/2227.png b/imgs/icons/2227@1x.png
similarity index 100%
rename from imgs/icons/2227.png
rename to imgs/icons/2227@1x.png
diff --git a/imgs/icons/2227@2x.png b/imgs/icons/2227@2x.png
new file mode 100644
index 000000000..f14629ca9
Binary files /dev/null and b/imgs/icons/2227@2x.png differ
diff --git a/imgs/icons/2228.png b/imgs/icons/2228@1x.png
similarity index 100%
rename from imgs/icons/2228.png
rename to imgs/icons/2228@1x.png
diff --git a/imgs/icons/2228@2x.png b/imgs/icons/2228@2x.png
new file mode 100644
index 000000000..7fbcf8a5c
Binary files /dev/null and b/imgs/icons/2228@2x.png differ
diff --git a/imgs/icons/2229.png b/imgs/icons/2229@1x.png
similarity index 100%
rename from imgs/icons/2229.png
rename to imgs/icons/2229@1x.png
diff --git a/imgs/icons/2229@2x.png b/imgs/icons/2229@2x.png
new file mode 100644
index 000000000..145d68749
Binary files /dev/null and b/imgs/icons/2229@2x.png differ
diff --git a/imgs/icons/2230.png b/imgs/icons/2230@1x.png
similarity index 100%
rename from imgs/icons/2230.png
rename to imgs/icons/2230@1x.png
diff --git a/imgs/icons/2230@2x.png b/imgs/icons/2230@2x.png
new file mode 100644
index 000000000..9cdf9057a
Binary files /dev/null and b/imgs/icons/2230@2x.png differ
diff --git a/imgs/icons/2231.png b/imgs/icons/2231@1x.png
similarity index 100%
rename from imgs/icons/2231.png
rename to imgs/icons/2231@1x.png
diff --git a/imgs/icons/2231@2x.png b/imgs/icons/2231@2x.png
new file mode 100644
index 000000000..e9db31b66
Binary files /dev/null and b/imgs/icons/2231@2x.png differ
diff --git a/imgs/icons/2232.png b/imgs/icons/2232@1x.png
similarity index 100%
rename from imgs/icons/2232.png
rename to imgs/icons/2232@1x.png
diff --git a/imgs/icons/2232@2x.png b/imgs/icons/2232@2x.png
new file mode 100644
index 000000000..478c602d9
Binary files /dev/null and b/imgs/icons/2232@2x.png differ
diff --git a/imgs/icons/2233.png b/imgs/icons/2233@1x.png
similarity index 100%
rename from imgs/icons/2233.png
rename to imgs/icons/2233@1x.png
diff --git a/imgs/icons/2233@2x.png b/imgs/icons/2233@2x.png
new file mode 100644
index 000000000..3899b4a74
Binary files /dev/null and b/imgs/icons/2233@2x.png differ
diff --git a/imgs/icons/2234.png b/imgs/icons/2234@1x.png
similarity index 100%
rename from imgs/icons/2234.png
rename to imgs/icons/2234@1x.png
diff --git a/imgs/icons/2234@2x.png b/imgs/icons/2234@2x.png
new file mode 100644
index 000000000..54d9b125c
Binary files /dev/null and b/imgs/icons/2234@2x.png differ
diff --git a/imgs/icons/2244.png b/imgs/icons/2244@1x.png
similarity index 100%
rename from imgs/icons/2244.png
rename to imgs/icons/2244@1x.png
diff --git a/imgs/icons/2244@2x.png b/imgs/icons/2244@2x.png
new file mode 100644
index 000000000..bca49745a
Binary files /dev/null and b/imgs/icons/2244@2x.png differ
diff --git a/imgs/icons/22.png b/imgs/icons/22@1x.png
similarity index 100%
rename from imgs/icons/22.png
rename to imgs/icons/22@1x.png
diff --git a/imgs/icons/22@2x.png b/imgs/icons/22@2x.png
new file mode 100644
index 000000000..df9eb1347
Binary files /dev/null and b/imgs/icons/22@2x.png differ
diff --git a/imgs/icons/2302.png b/imgs/icons/2302@1x.png
similarity index 100%
rename from imgs/icons/2302.png
rename to imgs/icons/2302@1x.png
diff --git a/imgs/icons/2302@2x.png b/imgs/icons/2302@2x.png
new file mode 100644
index 000000000..b2cf13ea1
Binary files /dev/null and b/imgs/icons/2302@2x.png differ
diff --git a/imgs/icons/2304.png b/imgs/icons/2304@1x.png
similarity index 100%
rename from imgs/icons/2304.png
rename to imgs/icons/2304@1x.png
diff --git a/imgs/icons/2304@2x.png b/imgs/icons/2304@2x.png
new file mode 100644
index 000000000..fcfe9c015
Binary files /dev/null and b/imgs/icons/2304@2x.png differ
diff --git a/imgs/icons/2309.png b/imgs/icons/2309@1x.png
similarity index 100%
rename from imgs/icons/2309.png
rename to imgs/icons/2309@1x.png
diff --git a/imgs/icons/2309@2x.png b/imgs/icons/2309@2x.png
new file mode 100644
index 000000000..d8aa17318
Binary files /dev/null and b/imgs/icons/2309@2x.png differ
diff --git a/imgs/icons/230.png b/imgs/icons/230@1x.png
similarity index 100%
rename from imgs/icons/230.png
rename to imgs/icons/230@1x.png
diff --git a/imgs/icons/230@2x.png b/imgs/icons/230@2x.png
new file mode 100644
index 000000000..95a3ee52a
Binary files /dev/null and b/imgs/icons/230@2x.png differ
diff --git a/imgs/icons/2310.png b/imgs/icons/2310@1x.png
similarity index 100%
rename from imgs/icons/2310.png
rename to imgs/icons/2310@1x.png
diff --git a/imgs/icons/2310@2x.png b/imgs/icons/2310@2x.png
new file mode 100644
index 000000000..76e17d689
Binary files /dev/null and b/imgs/icons/2310@2x.png differ
diff --git a/imgs/icons/2311.png b/imgs/icons/2311@1x.png
similarity index 100%
rename from imgs/icons/2311.png
rename to imgs/icons/2311@1x.png
diff --git a/imgs/icons/2311@2x.png b/imgs/icons/2311@2x.png
new file mode 100644
index 000000000..eabdefb96
Binary files /dev/null and b/imgs/icons/2311@2x.png differ
diff --git a/imgs/icons/2312.png b/imgs/icons/2312@1x.png
similarity index 100%
rename from imgs/icons/2312.png
rename to imgs/icons/2312@1x.png
diff --git a/imgs/icons/2312@2x.png b/imgs/icons/2312@2x.png
new file mode 100644
index 000000000..4c6e68af6
Binary files /dev/null and b/imgs/icons/2312@2x.png differ
diff --git a/imgs/icons/2313.png b/imgs/icons/2313@1x.png
similarity index 100%
rename from imgs/icons/2313.png
rename to imgs/icons/2313@1x.png
diff --git a/imgs/icons/2313@2x.png b/imgs/icons/2313@2x.png
new file mode 100644
index 000000000..6c91961f4
Binary files /dev/null and b/imgs/icons/2313@2x.png differ
diff --git a/imgs/icons/2314.png b/imgs/icons/2314@1x.png
similarity index 100%
rename from imgs/icons/2314.png
rename to imgs/icons/2314@1x.png
diff --git a/imgs/icons/2314@2x.png b/imgs/icons/2314@2x.png
new file mode 100644
index 000000000..e71c229b4
Binary files /dev/null and b/imgs/icons/2314@2x.png differ
diff --git a/imgs/icons/2315.png b/imgs/icons/2315@1x.png
similarity index 100%
rename from imgs/icons/2315.png
rename to imgs/icons/2315@1x.png
diff --git a/imgs/icons/2315@2x.png b/imgs/icons/2315@2x.png
new file mode 100644
index 000000000..7df852adf
Binary files /dev/null and b/imgs/icons/2315@2x.png differ
diff --git a/imgs/icons/2316.png b/imgs/icons/2316@1x.png
similarity index 100%
rename from imgs/icons/2316.png
rename to imgs/icons/2316@1x.png
diff --git a/imgs/icons/2316@2x.png b/imgs/icons/2316@2x.png
new file mode 100644
index 000000000..50163e61d
Binary files /dev/null and b/imgs/icons/2316@2x.png differ
diff --git a/imgs/icons/2317.png b/imgs/icons/2317@1x.png
similarity index 100%
rename from imgs/icons/2317.png
rename to imgs/icons/2317@1x.png
diff --git a/imgs/icons/2317@2x.png b/imgs/icons/2317@2x.png
new file mode 100644
index 000000000..05637990f
Binary files /dev/null and b/imgs/icons/2317@2x.png differ
diff --git a/imgs/icons/2318.png b/imgs/icons/2318@1x.png
similarity index 100%
rename from imgs/icons/2318.png
rename to imgs/icons/2318@1x.png
diff --git a/imgs/icons/2318@2x.png b/imgs/icons/2318@2x.png
new file mode 100644
index 000000000..84d434796
Binary files /dev/null and b/imgs/icons/2318@2x.png differ
diff --git a/imgs/icons/2319.png b/imgs/icons/2319@1x.png
similarity index 100%
rename from imgs/icons/2319.png
rename to imgs/icons/2319@1x.png
diff --git a/imgs/icons/2319@2x.png b/imgs/icons/2319@2x.png
new file mode 100644
index 000000000..60ddfc7c6
Binary files /dev/null and b/imgs/icons/2319@2x.png differ
diff --git a/imgs/icons/231.png b/imgs/icons/231@1x.png
similarity index 100%
rename from imgs/icons/231.png
rename to imgs/icons/231@1x.png
diff --git a/imgs/icons/231@2x.png b/imgs/icons/231@2x.png
new file mode 100644
index 000000000..594f85677
Binary files /dev/null and b/imgs/icons/231@2x.png differ
diff --git a/imgs/icons/2320.png b/imgs/icons/2320@1x.png
similarity index 100%
rename from imgs/icons/2320.png
rename to imgs/icons/2320@1x.png
diff --git a/imgs/icons/2320@2x.png b/imgs/icons/2320@2x.png
new file mode 100644
index 000000000..caee6a41a
Binary files /dev/null and b/imgs/icons/2320@2x.png differ
diff --git a/imgs/icons/2321.png b/imgs/icons/2321@1x.png
similarity index 100%
rename from imgs/icons/2321.png
rename to imgs/icons/2321@1x.png
diff --git a/imgs/icons/2321@2x.png b/imgs/icons/2321@2x.png
new file mode 100644
index 000000000..f973a4e16
Binary files /dev/null and b/imgs/icons/2321@2x.png differ
diff --git a/imgs/icons/2322.png b/imgs/icons/2322@1x.png
similarity index 100%
rename from imgs/icons/2322.png
rename to imgs/icons/2322@1x.png
diff --git a/imgs/icons/2322@2x.png b/imgs/icons/2322@2x.png
new file mode 100644
index 000000000..2f3caddfb
Binary files /dev/null and b/imgs/icons/2322@2x.png differ
diff --git a/imgs/icons/2323.png b/imgs/icons/2323@1x.png
similarity index 100%
rename from imgs/icons/2323.png
rename to imgs/icons/2323@1x.png
diff --git a/imgs/icons/2323@2x.png b/imgs/icons/2323@2x.png
new file mode 100644
index 000000000..dda28d18d
Binary files /dev/null and b/imgs/icons/2323@2x.png differ
diff --git a/imgs/icons/2324.png b/imgs/icons/2324@1x.png
similarity index 100%
rename from imgs/icons/2324.png
rename to imgs/icons/2324@1x.png
diff --git a/imgs/icons/2324@2x.png b/imgs/icons/2324@2x.png
new file mode 100644
index 000000000..435529ede
Binary files /dev/null and b/imgs/icons/2324@2x.png differ
diff --git a/imgs/icons/2325.png b/imgs/icons/2325@1x.png
similarity index 100%
rename from imgs/icons/2325.png
rename to imgs/icons/2325@1x.png
diff --git a/imgs/icons/2325@2x.png b/imgs/icons/2325@2x.png
new file mode 100644
index 000000000..f7f3df55a
Binary files /dev/null and b/imgs/icons/2325@2x.png differ
diff --git a/imgs/icons/2326.png b/imgs/icons/2326@1x.png
similarity index 100%
rename from imgs/icons/2326.png
rename to imgs/icons/2326@1x.png
diff --git a/imgs/icons/2326@2x.png b/imgs/icons/2326@2x.png
new file mode 100644
index 000000000..a0bac727b
Binary files /dev/null and b/imgs/icons/2326@2x.png differ
diff --git a/imgs/icons/2327.png b/imgs/icons/2327@1x.png
similarity index 100%
rename from imgs/icons/2327.png
rename to imgs/icons/2327@1x.png
diff --git a/imgs/icons/2327@2x.png b/imgs/icons/2327@2x.png
new file mode 100644
index 000000000..f3bc777d1
Binary files /dev/null and b/imgs/icons/2327@2x.png differ
diff --git a/imgs/icons/2328.png b/imgs/icons/2328@1x.png
similarity index 100%
rename from imgs/icons/2328.png
rename to imgs/icons/2328@1x.png
diff --git a/imgs/icons/2328@2x.png b/imgs/icons/2328@2x.png
new file mode 100644
index 000000000..5026a07d5
Binary files /dev/null and b/imgs/icons/2328@2x.png differ
diff --git a/imgs/icons/2329.png b/imgs/icons/2329@1x.png
similarity index 100%
rename from imgs/icons/2329.png
rename to imgs/icons/2329@1x.png
diff --git a/imgs/icons/2329@2x.png b/imgs/icons/2329@2x.png
new file mode 100644
index 000000000..be9a1a91b
Binary files /dev/null and b/imgs/icons/2329@2x.png differ
diff --git a/imgs/icons/232.png b/imgs/icons/232@1x.png
similarity index 100%
rename from imgs/icons/232.png
rename to imgs/icons/232@1x.png
diff --git a/imgs/icons/232@2x.png b/imgs/icons/232@2x.png
new file mode 100644
index 000000000..35ae3985e
Binary files /dev/null and b/imgs/icons/232@2x.png differ
diff --git a/imgs/icons/2330.png b/imgs/icons/2330@1x.png
similarity index 100%
rename from imgs/icons/2330.png
rename to imgs/icons/2330@1x.png
diff --git a/imgs/icons/2330@2x.png b/imgs/icons/2330@2x.png
new file mode 100644
index 000000000..54110d33c
Binary files /dev/null and b/imgs/icons/2330@2x.png differ
diff --git a/imgs/icons/2331.png b/imgs/icons/2331@1x.png
similarity index 100%
rename from imgs/icons/2331.png
rename to imgs/icons/2331@1x.png
diff --git a/imgs/icons/2331@2x.png b/imgs/icons/2331@2x.png
new file mode 100644
index 000000000..12052f74b
Binary files /dev/null and b/imgs/icons/2331@2x.png differ
diff --git a/imgs/icons/2332.png b/imgs/icons/2332@1x.png
similarity index 100%
rename from imgs/icons/2332.png
rename to imgs/icons/2332@1x.png
diff --git a/imgs/icons/2332@2x.png b/imgs/icons/2332@2x.png
new file mode 100644
index 000000000..aef3a094f
Binary files /dev/null and b/imgs/icons/2332@2x.png differ
diff --git a/imgs/icons/2333.png b/imgs/icons/2333@1x.png
similarity index 100%
rename from imgs/icons/2333.png
rename to imgs/icons/2333@1x.png
diff --git a/imgs/icons/2333@2x.png b/imgs/icons/2333@2x.png
new file mode 100644
index 000000000..281f573d2
Binary files /dev/null and b/imgs/icons/2333@2x.png differ
diff --git a/imgs/icons/2334.png b/imgs/icons/2334@1x.png
similarity index 100%
rename from imgs/icons/2334.png
rename to imgs/icons/2334@1x.png
diff --git a/imgs/icons/2334@2x.png b/imgs/icons/2334@2x.png
new file mode 100644
index 000000000..b48d025f8
Binary files /dev/null and b/imgs/icons/2334@2x.png differ
diff --git a/imgs/icons/2338.png b/imgs/icons/2338@1x.png
similarity index 100%
rename from imgs/icons/2338.png
rename to imgs/icons/2338@1x.png
diff --git a/imgs/icons/2338@2x.png b/imgs/icons/2338@2x.png
new file mode 100644
index 000000000..ba5b5170d
Binary files /dev/null and b/imgs/icons/2338@2x.png differ
diff --git a/imgs/icons/2340.png b/imgs/icons/2340@1x.png
similarity index 100%
rename from imgs/icons/2340.png
rename to imgs/icons/2340@1x.png
diff --git a/imgs/icons/2340@2x.png b/imgs/icons/2340@2x.png
new file mode 100644
index 000000000..d36d107be
Binary files /dev/null and b/imgs/icons/2340@2x.png differ
diff --git a/imgs/icons/2355.png b/imgs/icons/2355@1x.png
similarity index 100%
rename from imgs/icons/2355.png
rename to imgs/icons/2355@1x.png
diff --git a/imgs/icons/2355@2x.png b/imgs/icons/2355@2x.png
new file mode 100644
index 000000000..b7a310028
Binary files /dev/null and b/imgs/icons/2355@2x.png differ
diff --git a/imgs/icons/2512.png b/imgs/icons/2512@1x.png
similarity index 100%
rename from imgs/icons/2512.png
rename to imgs/icons/2512@1x.png
diff --git a/imgs/icons/2512@2x.png b/imgs/icons/2512@2x.png
new file mode 100644
index 000000000..c26c451bb
Binary files /dev/null and b/imgs/icons/2512@2x.png differ
diff --git a/imgs/icons/2526.png b/imgs/icons/2526@1x.png
similarity index 100%
rename from imgs/icons/2526.png
rename to imgs/icons/2526@1x.png
diff --git a/imgs/icons/2526@2x.png b/imgs/icons/2526@2x.png
new file mode 100644
index 000000000..8a463fd14
Binary files /dev/null and b/imgs/icons/2526@2x.png differ
diff --git a/imgs/icons/2527.png b/imgs/icons/2527@1x.png
similarity index 100%
rename from imgs/icons/2527.png
rename to imgs/icons/2527@1x.png
diff --git a/imgs/icons/2527@2x.png b/imgs/icons/2527@2x.png
new file mode 100644
index 000000000..5f0f58074
Binary files /dev/null and b/imgs/icons/2527@2x.png differ
diff --git a/imgs/icons/2528.png b/imgs/icons/2528@1x.png
similarity index 100%
rename from imgs/icons/2528.png
rename to imgs/icons/2528@1x.png
diff --git a/imgs/icons/2528@2x.png b/imgs/icons/2528@2x.png
new file mode 100644
index 000000000..436fc5990
Binary files /dev/null and b/imgs/icons/2528@2x.png differ
diff --git a/imgs/icons/2529.png b/imgs/icons/2529@1x.png
similarity index 100%
rename from imgs/icons/2529.png
rename to imgs/icons/2529@1x.png
diff --git a/imgs/icons/2529@2x.png b/imgs/icons/2529@2x.png
new file mode 100644
index 000000000..d67ea94d2
Binary files /dev/null and b/imgs/icons/2529@2x.png differ
diff --git a/imgs/icons/2530.png b/imgs/icons/2530@1x.png
similarity index 100%
rename from imgs/icons/2530.png
rename to imgs/icons/2530@1x.png
diff --git a/imgs/icons/2530@2x.png b/imgs/icons/2530@2x.png
new file mode 100644
index 000000000..b136984fc
Binary files /dev/null and b/imgs/icons/2530@2x.png differ
diff --git a/imgs/icons/2531.png b/imgs/icons/2531@1x.png
similarity index 100%
rename from imgs/icons/2531.png
rename to imgs/icons/2531@1x.png
diff --git a/imgs/icons/2531@2x.png b/imgs/icons/2531@2x.png
new file mode 100644
index 000000000..e5c399c27
Binary files /dev/null and b/imgs/icons/2531@2x.png differ
diff --git a/imgs/icons/2532.png b/imgs/icons/2532@1x.png
similarity index 100%
rename from imgs/icons/2532.png
rename to imgs/icons/2532@1x.png
diff --git a/imgs/icons/2532@2x.png b/imgs/icons/2532@2x.png
new file mode 100644
index 000000000..538dc7cdc
Binary files /dev/null and b/imgs/icons/2532@2x.png differ
diff --git a/imgs/icons/2536.png b/imgs/icons/2536@1x.png
similarity index 100%
rename from imgs/icons/2536.png
rename to imgs/icons/2536@1x.png
diff --git a/imgs/icons/2536@2x.png b/imgs/icons/2536@2x.png
new file mode 100644
index 000000000..f93da8cd6
Binary files /dev/null and b/imgs/icons/2536@2x.png differ
diff --git a/imgs/icons/2537.png b/imgs/icons/2537@1x.png
similarity index 100%
rename from imgs/icons/2537.png
rename to imgs/icons/2537@1x.png
diff --git a/imgs/icons/2537@2x.png b/imgs/icons/2537@2x.png
new file mode 100644
index 000000000..95677bd59
Binary files /dev/null and b/imgs/icons/2537@2x.png differ
diff --git a/imgs/icons/2538.png b/imgs/icons/2538@1x.png
similarity index 100%
rename from imgs/icons/2538.png
rename to imgs/icons/2538@1x.png
diff --git a/imgs/icons/2538@2x.png b/imgs/icons/2538@2x.png
new file mode 100644
index 000000000..8838454fe
Binary files /dev/null and b/imgs/icons/2538@2x.png differ
diff --git a/imgs/icons/2539.png b/imgs/icons/2539@1x.png
similarity index 100%
rename from imgs/icons/2539.png
rename to imgs/icons/2539@1x.png
diff --git a/imgs/icons/2539@2x.png b/imgs/icons/2539@2x.png
new file mode 100644
index 000000000..972004cc1
Binary files /dev/null and b/imgs/icons/2539@2x.png differ
diff --git a/imgs/icons/2540.png b/imgs/icons/2540@1x.png
similarity index 100%
rename from imgs/icons/2540.png
rename to imgs/icons/2540@1x.png
diff --git a/imgs/icons/2540@2x.png b/imgs/icons/2540@2x.png
new file mode 100644
index 000000000..ae459602c
Binary files /dev/null and b/imgs/icons/2540@2x.png differ
diff --git a/imgs/icons/2541.png b/imgs/icons/2541@1x.png
similarity index 100%
rename from imgs/icons/2541.png
rename to imgs/icons/2541@1x.png
diff --git a/imgs/icons/2541@2x.png b/imgs/icons/2541@2x.png
new file mode 100644
index 000000000..9779498bb
Binary files /dev/null and b/imgs/icons/2541@2x.png differ
diff --git a/imgs/icons/2542.png b/imgs/icons/2542@1x.png
similarity index 100%
rename from imgs/icons/2542.png
rename to imgs/icons/2542@1x.png
diff --git a/imgs/icons/2542@2x.png b/imgs/icons/2542@2x.png
new file mode 100644
index 000000000..0a0e01119
Binary files /dev/null and b/imgs/icons/2542@2x.png differ
diff --git a/imgs/icons/2543.png b/imgs/icons/2543@1x.png
similarity index 100%
rename from imgs/icons/2543.png
rename to imgs/icons/2543@1x.png
diff --git a/imgs/icons/2543@2x.png b/imgs/icons/2543@2x.png
new file mode 100644
index 000000000..8f4ea4474
Binary files /dev/null and b/imgs/icons/2543@2x.png differ
diff --git a/imgs/icons/2544.png b/imgs/icons/2544@1x.png
similarity index 100%
rename from imgs/icons/2544.png
rename to imgs/icons/2544@1x.png
diff --git a/imgs/icons/2544@2x.png b/imgs/icons/2544@2x.png
new file mode 100644
index 000000000..92e51dc76
Binary files /dev/null and b/imgs/icons/2544@2x.png differ
diff --git a/imgs/icons/2545.png b/imgs/icons/2545@1x.png
similarity index 100%
rename from imgs/icons/2545.png
rename to imgs/icons/2545@1x.png
diff --git a/imgs/icons/2545@2x.png b/imgs/icons/2545@2x.png
new file mode 100644
index 000000000..e9c6b41ca
Binary files /dev/null and b/imgs/icons/2545@2x.png differ
diff --git a/imgs/icons/2546.png b/imgs/icons/2546@1x.png
similarity index 100%
rename from imgs/icons/2546.png
rename to imgs/icons/2546@1x.png
diff --git a/imgs/icons/2546@2x.png b/imgs/icons/2546@2x.png
new file mode 100644
index 000000000..0e3ae6495
Binary files /dev/null and b/imgs/icons/2546@2x.png differ
diff --git a/imgs/icons/2547.png b/imgs/icons/2547@1x.png
similarity index 100%
rename from imgs/icons/2547.png
rename to imgs/icons/2547@1x.png
diff --git a/imgs/icons/2547@2x.png b/imgs/icons/2547@2x.png
new file mode 100644
index 000000000..080f71204
Binary files /dev/null and b/imgs/icons/2547@2x.png differ
diff --git a/imgs/icons/2548.png b/imgs/icons/2548@1x.png
similarity index 100%
rename from imgs/icons/2548.png
rename to imgs/icons/2548@1x.png
diff --git a/imgs/icons/2548@2x.png b/imgs/icons/2548@2x.png
new file mode 100644
index 000000000..d475bc921
Binary files /dev/null and b/imgs/icons/2548@2x.png differ
diff --git a/imgs/icons/2549.png b/imgs/icons/2549@1x.png
similarity index 100%
rename from imgs/icons/2549.png
rename to imgs/icons/2549@1x.png
diff --git a/imgs/icons/2549@2x.png b/imgs/icons/2549@2x.png
new file mode 100644
index 000000000..95f6c991d
Binary files /dev/null and b/imgs/icons/2549@2x.png differ
diff --git a/imgs/icons/2550.png b/imgs/icons/2550@1x.png
similarity index 100%
rename from imgs/icons/2550.png
rename to imgs/icons/2550@1x.png
diff --git a/imgs/icons/2550@2x.png b/imgs/icons/2550@2x.png
new file mode 100644
index 000000000..3e5e65ab3
Binary files /dev/null and b/imgs/icons/2550@2x.png differ
diff --git a/imgs/icons/2551.png b/imgs/icons/2551@1x.png
similarity index 100%
rename from imgs/icons/2551.png
rename to imgs/icons/2551@1x.png
diff --git a/imgs/icons/2551@2x.png b/imgs/icons/2551@2x.png
new file mode 100644
index 000000000..28dac8195
Binary files /dev/null and b/imgs/icons/2551@2x.png differ
diff --git a/imgs/icons/2552.png b/imgs/icons/2552@1x.png
similarity index 100%
rename from imgs/icons/2552.png
rename to imgs/icons/2552@1x.png
diff --git a/imgs/icons/2552@2x.png b/imgs/icons/2552@2x.png
new file mode 100644
index 000000000..6243292df
Binary files /dev/null and b/imgs/icons/2552@2x.png differ
diff --git a/imgs/icons/2553.png b/imgs/icons/2553@1x.png
similarity index 100%
rename from imgs/icons/2553.png
rename to imgs/icons/2553@1x.png
diff --git a/imgs/icons/2553@2x.png b/imgs/icons/2553@2x.png
new file mode 100644
index 000000000..3b76ae376
Binary files /dev/null and b/imgs/icons/2553@2x.png differ
diff --git a/imgs/icons/2554.png b/imgs/icons/2554@1x.png
similarity index 100%
rename from imgs/icons/2554.png
rename to imgs/icons/2554@1x.png
diff --git a/imgs/icons/2554@2x.png b/imgs/icons/2554@2x.png
new file mode 100644
index 000000000..a963b53c1
Binary files /dev/null and b/imgs/icons/2554@2x.png differ
diff --git a/imgs/icons/2555.png b/imgs/icons/2555@1x.png
similarity index 100%
rename from imgs/icons/2555.png
rename to imgs/icons/2555@1x.png
diff --git a/imgs/icons/2555@2x.png b/imgs/icons/2555@2x.png
new file mode 100644
index 000000000..5770f3225
Binary files /dev/null and b/imgs/icons/2555@2x.png differ
diff --git a/imgs/icons/2556.png b/imgs/icons/2556@1x.png
similarity index 100%
rename from imgs/icons/2556.png
rename to imgs/icons/2556@1x.png
diff --git a/imgs/icons/2556@2x.png b/imgs/icons/2556@2x.png
new file mode 100644
index 000000000..351c0c86b
Binary files /dev/null and b/imgs/icons/2556@2x.png differ
diff --git a/imgs/icons/2557.png b/imgs/icons/2557@1x.png
similarity index 100%
rename from imgs/icons/2557.png
rename to imgs/icons/2557@1x.png
diff --git a/imgs/icons/2557@2x.png b/imgs/icons/2557@2x.png
new file mode 100644
index 000000000..a876a42f7
Binary files /dev/null and b/imgs/icons/2557@2x.png differ
diff --git a/imgs/icons/2558.png b/imgs/icons/2558@1x.png
similarity index 100%
rename from imgs/icons/2558.png
rename to imgs/icons/2558@1x.png
diff --git a/imgs/icons/2558@2x.png b/imgs/icons/2558@2x.png
new file mode 100644
index 000000000..c90b51c24
Binary files /dev/null and b/imgs/icons/2558@2x.png differ
diff --git a/imgs/icons/2559.png b/imgs/icons/2559@1x.png
similarity index 100%
rename from imgs/icons/2559.png
rename to imgs/icons/2559@1x.png
diff --git a/imgs/icons/2559@2x.png b/imgs/icons/2559@2x.png
new file mode 100644
index 000000000..c0fce0999
Binary files /dev/null and b/imgs/icons/2559@2x.png differ
diff --git a/imgs/icons/2560.png b/imgs/icons/2560@1x.png
similarity index 100%
rename from imgs/icons/2560.png
rename to imgs/icons/2560@1x.png
diff --git a/imgs/icons/2560@2x.png b/imgs/icons/2560@2x.png
new file mode 100644
index 000000000..47a151d62
Binary files /dev/null and b/imgs/icons/2560@2x.png differ
diff --git a/imgs/icons/2561.png b/imgs/icons/2561@1x.png
similarity index 100%
rename from imgs/icons/2561.png
rename to imgs/icons/2561@1x.png
diff --git a/imgs/icons/2561@2x.png b/imgs/icons/2561@2x.png
new file mode 100644
index 000000000..fe4926272
Binary files /dev/null and b/imgs/icons/2561@2x.png differ
diff --git a/imgs/icons/2563.png b/imgs/icons/2563@1x.png
similarity index 100%
rename from imgs/icons/2563.png
rename to imgs/icons/2563@1x.png
diff --git a/imgs/icons/2563@2x.png b/imgs/icons/2563@2x.png
new file mode 100644
index 000000000..3d612f426
Binary files /dev/null and b/imgs/icons/2563@2x.png differ
diff --git a/imgs/icons/2567.png b/imgs/icons/2567@1x.png
similarity index 100%
rename from imgs/icons/2567.png
rename to imgs/icons/2567@1x.png
diff --git a/imgs/icons/2567@2x.png b/imgs/icons/2567@2x.png
new file mode 100644
index 000000000..81531168d
Binary files /dev/null and b/imgs/icons/2567@2x.png differ
diff --git a/imgs/icons/2568.png b/imgs/icons/2568@1x.png
similarity index 100%
rename from imgs/icons/2568.png
rename to imgs/icons/2568@1x.png
diff --git a/imgs/icons/2568@2x.png b/imgs/icons/2568@2x.png
new file mode 100644
index 000000000..e162bea87
Binary files /dev/null and b/imgs/icons/2568@2x.png differ
diff --git a/imgs/icons/2569.png b/imgs/icons/2569@1x.png
similarity index 100%
rename from imgs/icons/2569.png
rename to imgs/icons/2569@1x.png
diff --git a/imgs/icons/2569@2x.png b/imgs/icons/2569@2x.png
new file mode 100644
index 000000000..ef6ae669b
Binary files /dev/null and b/imgs/icons/2569@2x.png differ
diff --git a/imgs/icons/2570.png b/imgs/icons/2570@1x.png
similarity index 100%
rename from imgs/icons/2570.png
rename to imgs/icons/2570@1x.png
diff --git a/imgs/icons/2570@2x.png b/imgs/icons/2570@2x.png
new file mode 100644
index 000000000..0f78f470f
Binary files /dev/null and b/imgs/icons/2570@2x.png differ
diff --git a/imgs/icons/2571.png b/imgs/icons/2571@1x.png
similarity index 100%
rename from imgs/icons/2571.png
rename to imgs/icons/2571@1x.png
diff --git a/imgs/icons/2571@2x.png b/imgs/icons/2571@2x.png
new file mode 100644
index 000000000..fad560c2b
Binary files /dev/null and b/imgs/icons/2571@2x.png differ
diff --git a/imgs/icons/2572.png b/imgs/icons/2572@1x.png
similarity index 100%
rename from imgs/icons/2572.png
rename to imgs/icons/2572@1x.png
diff --git a/imgs/icons/2572@2x.png b/imgs/icons/2572@2x.png
new file mode 100644
index 000000000..369e95430
Binary files /dev/null and b/imgs/icons/2572@2x.png differ
diff --git a/imgs/icons/2573.png b/imgs/icons/2573@1x.png
similarity index 100%
rename from imgs/icons/2573.png
rename to imgs/icons/2573@1x.png
diff --git a/imgs/icons/2573@2x.png b/imgs/icons/2573@2x.png
new file mode 100644
index 000000000..0a91c6345
Binary files /dev/null and b/imgs/icons/2573@2x.png differ
diff --git a/imgs/icons/2574.png b/imgs/icons/2574@1x.png
similarity index 100%
rename from imgs/icons/2574.png
rename to imgs/icons/2574@1x.png
diff --git a/imgs/icons/2574@2x.png b/imgs/icons/2574@2x.png
new file mode 100644
index 000000000..85037e521
Binary files /dev/null and b/imgs/icons/2574@2x.png differ
diff --git a/imgs/icons/2575.png b/imgs/icons/2575@1x.png
similarity index 100%
rename from imgs/icons/2575.png
rename to imgs/icons/2575@1x.png
diff --git a/imgs/icons/2575@2x.png b/imgs/icons/2575@2x.png
new file mode 100644
index 000000000..5dd0a7815
Binary files /dev/null and b/imgs/icons/2575@2x.png differ
diff --git a/imgs/icons/2576.png b/imgs/icons/2576@1x.png
similarity index 100%
rename from imgs/icons/2576.png
rename to imgs/icons/2576@1x.png
diff --git a/imgs/icons/2576@2x.png b/imgs/icons/2576@2x.png
new file mode 100644
index 000000000..429ce8fb5
Binary files /dev/null and b/imgs/icons/2576@2x.png differ
diff --git a/imgs/icons/2577.png b/imgs/icons/2577@1x.png
similarity index 100%
rename from imgs/icons/2577.png
rename to imgs/icons/2577@1x.png
diff --git a/imgs/icons/2577@2x.png b/imgs/icons/2577@2x.png
new file mode 100644
index 000000000..bb029e1a0
Binary files /dev/null and b/imgs/icons/2577@2x.png differ
diff --git a/imgs/icons/2578.png b/imgs/icons/2578@1x.png
similarity index 100%
rename from imgs/icons/2578.png
rename to imgs/icons/2578@1x.png
diff --git a/imgs/icons/2578@2x.png b/imgs/icons/2578@2x.png
new file mode 100644
index 000000000..2556b2bde
Binary files /dev/null and b/imgs/icons/2578@2x.png differ
diff --git a/imgs/icons/2579.png b/imgs/icons/2579@1x.png
similarity index 100%
rename from imgs/icons/2579.png
rename to imgs/icons/2579@1x.png
diff --git a/imgs/icons/2579@2x.png b/imgs/icons/2579@2x.png
new file mode 100644
index 000000000..316fb058a
Binary files /dev/null and b/imgs/icons/2579@2x.png differ
diff --git a/imgs/icons/2580.png b/imgs/icons/2580@1x.png
similarity index 100%
rename from imgs/icons/2580.png
rename to imgs/icons/2580@1x.png
diff --git a/imgs/icons/2580@2x.png b/imgs/icons/2580@2x.png
new file mode 100644
index 000000000..abb502b87
Binary files /dev/null and b/imgs/icons/2580@2x.png differ
diff --git a/imgs/icons/2581.png b/imgs/icons/2581@1x.png
similarity index 100%
rename from imgs/icons/2581.png
rename to imgs/icons/2581@1x.png
diff --git a/imgs/icons/2581@2x.png b/imgs/icons/2581@2x.png
new file mode 100644
index 000000000..919d962f2
Binary files /dev/null and b/imgs/icons/2581@2x.png differ
diff --git a/imgs/icons/2582.png b/imgs/icons/2582@1x.png
similarity index 100%
rename from imgs/icons/2582.png
rename to imgs/icons/2582@1x.png
diff --git a/imgs/icons/2582@2x.png b/imgs/icons/2582@2x.png
new file mode 100644
index 000000000..a046ca541
Binary files /dev/null and b/imgs/icons/2582@2x.png differ
diff --git a/imgs/icons/2645.png b/imgs/icons/2645@1x.png
similarity index 100%
rename from imgs/icons/2645.png
rename to imgs/icons/2645@1x.png
diff --git a/imgs/icons/2645@2x.png b/imgs/icons/2645@2x.png
new file mode 100644
index 000000000..ee0afea5a
Binary files /dev/null and b/imgs/icons/2645@2x.png differ
diff --git a/imgs/icons/2646.png b/imgs/icons/2646@1x.png
similarity index 100%
rename from imgs/icons/2646.png
rename to imgs/icons/2646@1x.png
diff --git a/imgs/icons/2646@2x.png b/imgs/icons/2646@2x.png
new file mode 100644
index 000000000..446e13fae
Binary files /dev/null and b/imgs/icons/2646@2x.png differ
diff --git a/imgs/icons/2647.png b/imgs/icons/2647@1x.png
similarity index 100%
rename from imgs/icons/2647.png
rename to imgs/icons/2647@1x.png
diff --git a/imgs/icons/2647@2x.png b/imgs/icons/2647@2x.png
new file mode 100644
index 000000000..9ca09c00e
Binary files /dev/null and b/imgs/icons/2647@2x.png differ
diff --git a/imgs/icons/2648.png b/imgs/icons/2648@1x.png
similarity index 100%
rename from imgs/icons/2648.png
rename to imgs/icons/2648@1x.png
diff --git a/imgs/icons/2648@2x.png b/imgs/icons/2648@2x.png
new file mode 100644
index 000000000..2e16b63c8
Binary files /dev/null and b/imgs/icons/2648@2x.png differ
diff --git a/imgs/icons/2649.png b/imgs/icons/2649@1x.png
similarity index 100%
rename from imgs/icons/2649.png
rename to imgs/icons/2649@1x.png
diff --git a/imgs/icons/2649@2x.png b/imgs/icons/2649@2x.png
new file mode 100644
index 000000000..5f3bea144
Binary files /dev/null and b/imgs/icons/2649@2x.png differ
diff --git a/imgs/icons/2650.png b/imgs/icons/2650@1x.png
similarity index 100%
rename from imgs/icons/2650.png
rename to imgs/icons/2650@1x.png
diff --git a/imgs/icons/2650@2x.png b/imgs/icons/2650@2x.png
new file mode 100644
index 000000000..d63f0891c
Binary files /dev/null and b/imgs/icons/2650@2x.png differ
diff --git a/imgs/icons/2651.png b/imgs/icons/2651@1x.png
similarity index 100%
rename from imgs/icons/2651.png
rename to imgs/icons/2651@1x.png
diff --git a/imgs/icons/2651@2x.png b/imgs/icons/2651@2x.png
new file mode 100644
index 000000000..9b9307b21
Binary files /dev/null and b/imgs/icons/2651@2x.png differ
diff --git a/imgs/icons/2652.png b/imgs/icons/2652@1x.png
similarity index 100%
rename from imgs/icons/2652.png
rename to imgs/icons/2652@1x.png
diff --git a/imgs/icons/2652@2x.png b/imgs/icons/2652@2x.png
new file mode 100644
index 000000000..5c948bd4e
Binary files /dev/null and b/imgs/icons/2652@2x.png differ
diff --git a/imgs/icons/2653.png b/imgs/icons/2653@1x.png
similarity index 100%
rename from imgs/icons/2653.png
rename to imgs/icons/2653@1x.png
diff --git a/imgs/icons/2653@2x.png b/imgs/icons/2653@2x.png
new file mode 100644
index 000000000..786395c79
Binary files /dev/null and b/imgs/icons/2653@2x.png differ
diff --git a/imgs/icons/2654.png b/imgs/icons/2654@1x.png
similarity index 100%
rename from imgs/icons/2654.png
rename to imgs/icons/2654@1x.png
diff --git a/imgs/icons/2654@2x.png b/imgs/icons/2654@2x.png
new file mode 100644
index 000000000..486503233
Binary files /dev/null and b/imgs/icons/2654@2x.png differ
diff --git a/imgs/icons/2655.png b/imgs/icons/2655@1x.png
similarity index 100%
rename from imgs/icons/2655.png
rename to imgs/icons/2655@1x.png
diff --git a/imgs/icons/2655@2x.png b/imgs/icons/2655@2x.png
new file mode 100644
index 000000000..01697cce4
Binary files /dev/null and b/imgs/icons/2655@2x.png differ
diff --git a/imgs/icons/2656.png b/imgs/icons/2656@1x.png
similarity index 100%
rename from imgs/icons/2656.png
rename to imgs/icons/2656@1x.png
diff --git a/imgs/icons/2656@2x.png b/imgs/icons/2656@2x.png
new file mode 100644
index 000000000..3e1d433d5
Binary files /dev/null and b/imgs/icons/2656@2x.png differ
diff --git a/imgs/icons/2657.png b/imgs/icons/2657@1x.png
similarity index 100%
rename from imgs/icons/2657.png
rename to imgs/icons/2657@1x.png
diff --git a/imgs/icons/2657@2x.png b/imgs/icons/2657@2x.png
new file mode 100644
index 000000000..401eff704
Binary files /dev/null and b/imgs/icons/2657@2x.png differ
diff --git a/imgs/icons/2658.png b/imgs/icons/2658@1x.png
similarity index 100%
rename from imgs/icons/2658.png
rename to imgs/icons/2658@1x.png
diff --git a/imgs/icons/2658@2x.png b/imgs/icons/2658@2x.png
new file mode 100644
index 000000000..0b3836272
Binary files /dev/null and b/imgs/icons/2658@2x.png differ
diff --git a/imgs/icons/2659.png b/imgs/icons/2659@1x.png
similarity index 100%
rename from imgs/icons/2659.png
rename to imgs/icons/2659@1x.png
diff --git a/imgs/icons/2659@2x.png b/imgs/icons/2659@2x.png
new file mode 100644
index 000000000..920bdd4f3
Binary files /dev/null and b/imgs/icons/2659@2x.png differ
diff --git a/imgs/icons/2660.png b/imgs/icons/2660@1x.png
similarity index 100%
rename from imgs/icons/2660.png
rename to imgs/icons/2660@1x.png
diff --git a/imgs/icons/2660@2x.png b/imgs/icons/2660@2x.png
new file mode 100644
index 000000000..f4831166e
Binary files /dev/null and b/imgs/icons/2660@2x.png differ
diff --git a/imgs/icons/2661.png b/imgs/icons/2661@1x.png
similarity index 100%
rename from imgs/icons/2661.png
rename to imgs/icons/2661@1x.png
diff --git a/imgs/icons/2661@2x.png b/imgs/icons/2661@2x.png
new file mode 100644
index 000000000..2d1a4a321
Binary files /dev/null and b/imgs/icons/2661@2x.png differ
diff --git a/imgs/icons/2662.png b/imgs/icons/2662@1x.png
similarity index 100%
rename from imgs/icons/2662.png
rename to imgs/icons/2662@1x.png
diff --git a/imgs/icons/2662@2x.png b/imgs/icons/2662@2x.png
new file mode 100644
index 000000000..58c90c68f
Binary files /dev/null and b/imgs/icons/2662@2x.png differ
diff --git a/imgs/icons/2663.png b/imgs/icons/2663@1x.png
similarity index 100%
rename from imgs/icons/2663.png
rename to imgs/icons/2663@1x.png
diff --git a/imgs/icons/2663@2x.png b/imgs/icons/2663@2x.png
new file mode 100644
index 000000000..4270c3668
Binary files /dev/null and b/imgs/icons/2663@2x.png differ
diff --git a/imgs/icons/2664.png b/imgs/icons/2664@1x.png
similarity index 100%
rename from imgs/icons/2664.png
rename to imgs/icons/2664@1x.png
diff --git a/imgs/icons/2664@2x.png b/imgs/icons/2664@2x.png
new file mode 100644
index 000000000..f2f737287
Binary files /dev/null and b/imgs/icons/2664@2x.png differ
diff --git a/imgs/icons/2665.png b/imgs/icons/2665@1x.png
similarity index 100%
rename from imgs/icons/2665.png
rename to imgs/icons/2665@1x.png
diff --git a/imgs/icons/2665@2x.png b/imgs/icons/2665@2x.png
new file mode 100644
index 000000000..0952bd0d7
Binary files /dev/null and b/imgs/icons/2665@2x.png differ
diff --git a/imgs/icons/2666.png b/imgs/icons/2666@1x.png
similarity index 100%
rename from imgs/icons/2666.png
rename to imgs/icons/2666@1x.png
diff --git a/imgs/icons/2666@2x.png b/imgs/icons/2666@2x.png
new file mode 100644
index 000000000..3d0a6e3ee
Binary files /dev/null and b/imgs/icons/2666@2x.png differ
diff --git a/imgs/icons/2667.png b/imgs/icons/2667@1x.png
similarity index 100%
rename from imgs/icons/2667.png
rename to imgs/icons/2667@1x.png
diff --git a/imgs/icons/2667@2x.png b/imgs/icons/2667@2x.png
new file mode 100644
index 000000000..ead868c5c
Binary files /dev/null and b/imgs/icons/2667@2x.png differ
diff --git a/imgs/icons/2668.png b/imgs/icons/2668@1x.png
similarity index 100%
rename from imgs/icons/2668.png
rename to imgs/icons/2668@1x.png
diff --git a/imgs/icons/2668@2x.png b/imgs/icons/2668@2x.png
new file mode 100644
index 000000000..64a31a939
Binary files /dev/null and b/imgs/icons/2668@2x.png differ
diff --git a/imgs/icons/2669.png b/imgs/icons/2669@1x.png
similarity index 100%
rename from imgs/icons/2669.png
rename to imgs/icons/2669@1x.png
diff --git a/imgs/icons/2669@2x.png b/imgs/icons/2669@2x.png
new file mode 100644
index 000000000..afe622492
Binary files /dev/null and b/imgs/icons/2669@2x.png differ
diff --git a/imgs/icons/2670.png b/imgs/icons/2670@1x.png
similarity index 100%
rename from imgs/icons/2670.png
rename to imgs/icons/2670@1x.png
diff --git a/imgs/icons/2670@2x.png b/imgs/icons/2670@2x.png
new file mode 100644
index 000000000..625e98621
Binary files /dev/null and b/imgs/icons/2670@2x.png differ
diff --git a/imgs/icons/2674.png b/imgs/icons/2674@1x.png
similarity index 100%
rename from imgs/icons/2674.png
rename to imgs/icons/2674@1x.png
diff --git a/imgs/icons/2674@2x.png b/imgs/icons/2674@2x.png
new file mode 100644
index 000000000..8c19459f4
Binary files /dev/null and b/imgs/icons/2674@2x.png differ
diff --git a/imgs/icons/2677.png b/imgs/icons/2677@1x.png
similarity index 100%
rename from imgs/icons/2677.png
rename to imgs/icons/2677@1x.png
diff --git a/imgs/icons/2677@2x.png b/imgs/icons/2677@2x.png
new file mode 100644
index 000000000..de42f4b6d
Binary files /dev/null and b/imgs/icons/2677@2x.png differ
diff --git a/imgs/icons/2678.png b/imgs/icons/2678@1x.png
similarity index 100%
rename from imgs/icons/2678.png
rename to imgs/icons/2678@1x.png
diff --git a/imgs/icons/2678@2x.png b/imgs/icons/2678@2x.png
new file mode 100644
index 000000000..b448300dc
Binary files /dev/null and b/imgs/icons/2678@2x.png differ
diff --git a/imgs/icons/2679.png b/imgs/icons/2679@1x.png
similarity index 100%
rename from imgs/icons/2679.png
rename to imgs/icons/2679@1x.png
diff --git a/imgs/icons/2679@2x.png b/imgs/icons/2679@2x.png
new file mode 100644
index 000000000..1d808d3f7
Binary files /dev/null and b/imgs/icons/2679@2x.png differ
diff --git a/imgs/icons/2680.png b/imgs/icons/2680@1x.png
similarity index 100%
rename from imgs/icons/2680.png
rename to imgs/icons/2680@1x.png
diff --git a/imgs/icons/2680@2x.png b/imgs/icons/2680@2x.png
new file mode 100644
index 000000000..95978d6ec
Binary files /dev/null and b/imgs/icons/2680@2x.png differ
diff --git a/imgs/icons/2681.png b/imgs/icons/2681@1x.png
similarity index 100%
rename from imgs/icons/2681.png
rename to imgs/icons/2681@1x.png
diff --git a/imgs/icons/2681@2x.png b/imgs/icons/2681@2x.png
new file mode 100644
index 000000000..8ccd0fb4d
Binary files /dev/null and b/imgs/icons/2681@2x.png differ
diff --git a/imgs/icons/2682.png b/imgs/icons/2682@1x.png
similarity index 100%
rename from imgs/icons/2682.png
rename to imgs/icons/2682@1x.png
diff --git a/imgs/icons/2682@2x.png b/imgs/icons/2682@2x.png
new file mode 100644
index 000000000..7c882479f
Binary files /dev/null and b/imgs/icons/2682@2x.png differ
diff --git a/imgs/icons/2683.png b/imgs/icons/2683@1x.png
similarity index 100%
rename from imgs/icons/2683.png
rename to imgs/icons/2683@1x.png
diff --git a/imgs/icons/2683@2x.png b/imgs/icons/2683@2x.png
new file mode 100644
index 000000000..e655fa953
Binary files /dev/null and b/imgs/icons/2683@2x.png differ
diff --git a/imgs/icons/2684.png b/imgs/icons/2684@1x.png
similarity index 100%
rename from imgs/icons/2684.png
rename to imgs/icons/2684@1x.png
diff --git a/imgs/icons/2684@2x.png b/imgs/icons/2684@2x.png
new file mode 100644
index 000000000..dcc8a0909
Binary files /dev/null and b/imgs/icons/2684@2x.png differ
diff --git a/imgs/icons/2685.png b/imgs/icons/2685@1x.png
similarity index 100%
rename from imgs/icons/2685.png
rename to imgs/icons/2685@1x.png
diff --git a/imgs/icons/2685@2x.png b/imgs/icons/2685@2x.png
new file mode 100644
index 000000000..a57cd1afd
Binary files /dev/null and b/imgs/icons/2685@2x.png differ
diff --git a/imgs/icons/2686.png b/imgs/icons/2686@1x.png
similarity index 100%
rename from imgs/icons/2686.png
rename to imgs/icons/2686@1x.png
diff --git a/imgs/icons/2686@2x.png b/imgs/icons/2686@2x.png
new file mode 100644
index 000000000..e705d3dd6
Binary files /dev/null and b/imgs/icons/2686@2x.png differ
diff --git a/imgs/icons/2696.png b/imgs/icons/2696@1x.png
similarity index 100%
rename from imgs/icons/2696.png
rename to imgs/icons/2696@1x.png
diff --git a/imgs/icons/2696@2x.png b/imgs/icons/2696@2x.png
new file mode 100644
index 000000000..304944c73
Binary files /dev/null and b/imgs/icons/2696@2x.png differ
diff --git a/imgs/icons/2697.png b/imgs/icons/2697@1x.png
similarity index 100%
rename from imgs/icons/2697.png
rename to imgs/icons/2697@1x.png
diff --git a/imgs/icons/2697@2x.png b/imgs/icons/2697@2x.png
new file mode 100644
index 000000000..134845e12
Binary files /dev/null and b/imgs/icons/2697@2x.png differ
diff --git a/imgs/icons/2698.png b/imgs/icons/2698@1x.png
similarity index 100%
rename from imgs/icons/2698.png
rename to imgs/icons/2698@1x.png
diff --git a/imgs/icons/2698@2x.png b/imgs/icons/2698@2x.png
new file mode 100644
index 000000000..5fce96d42
Binary files /dev/null and b/imgs/icons/2698@2x.png differ
diff --git a/imgs/icons/2699.png b/imgs/icons/2699@1x.png
similarity index 100%
rename from imgs/icons/2699.png
rename to imgs/icons/2699@1x.png
diff --git a/imgs/icons/2699@2x.png b/imgs/icons/2699@2x.png
new file mode 100644
index 000000000..5b1cab18f
Binary files /dev/null and b/imgs/icons/2699@2x.png differ
diff --git a/imgs/icons/26.png b/imgs/icons/26@1x.png
similarity index 100%
rename from imgs/icons/26.png
rename to imgs/icons/26@1x.png
diff --git a/imgs/icons/26@2x.png b/imgs/icons/26@2x.png
new file mode 100644
index 000000000..d06ca5748
Binary files /dev/null and b/imgs/icons/26@2x.png differ
diff --git a/imgs/icons/2700.png b/imgs/icons/2700@1x.png
similarity index 100%
rename from imgs/icons/2700.png
rename to imgs/icons/2700@1x.png
diff --git a/imgs/icons/2700@2x.png b/imgs/icons/2700@2x.png
new file mode 100644
index 000000000..8fd053d11
Binary files /dev/null and b/imgs/icons/2700@2x.png differ
diff --git a/imgs/icons/2701.png b/imgs/icons/2701@1x.png
similarity index 100%
rename from imgs/icons/2701.png
rename to imgs/icons/2701@1x.png
diff --git a/imgs/icons/2701@2x.png b/imgs/icons/2701@2x.png
new file mode 100644
index 000000000..bb878b1dc
Binary files /dev/null and b/imgs/icons/2701@2x.png differ
diff --git a/imgs/icons/2702.png b/imgs/icons/2702@1x.png
similarity index 100%
rename from imgs/icons/2702.png
rename to imgs/icons/2702@1x.png
diff --git a/imgs/icons/2702@2x.png b/imgs/icons/2702@2x.png
new file mode 100644
index 000000000..11879a70a
Binary files /dev/null and b/imgs/icons/2702@2x.png differ
diff --git a/imgs/icons/2703.png b/imgs/icons/2703@1x.png
similarity index 100%
rename from imgs/icons/2703.png
rename to imgs/icons/2703@1x.png
diff --git a/imgs/icons/2703@2x.png b/imgs/icons/2703@2x.png
new file mode 100644
index 000000000..779466c39
Binary files /dev/null and b/imgs/icons/2703@2x.png differ
diff --git a/imgs/icons/2705.png b/imgs/icons/2705@1x.png
similarity index 100%
rename from imgs/icons/2705.png
rename to imgs/icons/2705@1x.png
diff --git a/imgs/icons/2705@2x.png b/imgs/icons/2705@2x.png
new file mode 100644
index 000000000..25d69fc23
Binary files /dev/null and b/imgs/icons/2705@2x.png differ
diff --git a/imgs/icons/2732.png b/imgs/icons/2732@1x.png
similarity index 100%
rename from imgs/icons/2732.png
rename to imgs/icons/2732@1x.png
diff --git a/imgs/icons/2732@2x.png b/imgs/icons/2732@2x.png
new file mode 100644
index 000000000..5a9dc51f7
Binary files /dev/null and b/imgs/icons/2732@2x.png differ
diff --git a/imgs/icons/2754.png b/imgs/icons/2754@1x.png
similarity index 100%
rename from imgs/icons/2754.png
rename to imgs/icons/2754@1x.png
diff --git a/imgs/icons/2754@2x.png b/imgs/icons/2754@2x.png
new file mode 100644
index 000000000..f0ca4678f
Binary files /dev/null and b/imgs/icons/2754@2x.png differ
diff --git a/imgs/icons/27.png b/imgs/icons/27@1x.png
similarity index 100%
rename from imgs/icons/27.png
rename to imgs/icons/27@1x.png
diff --git a/imgs/icons/27@2x.png b/imgs/icons/27@2x.png
new file mode 100644
index 000000000..96265daf8
Binary files /dev/null and b/imgs/icons/27@2x.png differ
diff --git a/imgs/icons/2827.png b/imgs/icons/2827@1x.png
similarity index 100%
rename from imgs/icons/2827.png
rename to imgs/icons/2827@1x.png
diff --git a/imgs/icons/2827@2x.png b/imgs/icons/2827@2x.png
new file mode 100644
index 000000000..cf74dc86c
Binary files /dev/null and b/imgs/icons/2827@2x.png differ
diff --git a/imgs/icons/2828.png b/imgs/icons/2828@1x.png
similarity index 100%
rename from imgs/icons/2828.png
rename to imgs/icons/2828@1x.png
diff --git a/imgs/icons/2828@2x.png b/imgs/icons/2828@2x.png
new file mode 100644
index 000000000..c26f96fd9
Binary files /dev/null and b/imgs/icons/2828@2x.png differ
diff --git a/imgs/icons/2829.png b/imgs/icons/2829@1x.png
similarity index 100%
rename from imgs/icons/2829.png
rename to imgs/icons/2829@1x.png
diff --git a/imgs/icons/2829@2x.png b/imgs/icons/2829@2x.png
new file mode 100644
index 000000000..1ff22ee51
Binary files /dev/null and b/imgs/icons/2829@2x.png differ
diff --git a/imgs/icons/2830.png b/imgs/icons/2830@1x.png
similarity index 100%
rename from imgs/icons/2830.png
rename to imgs/icons/2830@1x.png
diff --git a/imgs/icons/2830@2x.png b/imgs/icons/2830@2x.png
new file mode 100644
index 000000000..58c4ede4e
Binary files /dev/null and b/imgs/icons/2830@2x.png differ
diff --git a/imgs/icons/2831.png b/imgs/icons/2831@1x.png
similarity index 100%
rename from imgs/icons/2831.png
rename to imgs/icons/2831@1x.png
diff --git a/imgs/icons/2831@2x.png b/imgs/icons/2831@2x.png
new file mode 100644
index 000000000..fba1c6ff8
Binary files /dev/null and b/imgs/icons/2831@2x.png differ
diff --git a/imgs/icons/2832.png b/imgs/icons/2832@1x.png
similarity index 100%
rename from imgs/icons/2832.png
rename to imgs/icons/2832@1x.png
diff --git a/imgs/icons/2832@2x.png b/imgs/icons/2832@2x.png
new file mode 100644
index 000000000..0e3b008f4
Binary files /dev/null and b/imgs/icons/2832@2x.png differ
diff --git a/imgs/icons/2833.png b/imgs/icons/2833@1x.png
similarity index 100%
rename from imgs/icons/2833.png
rename to imgs/icons/2833@1x.png
diff --git a/imgs/icons/2833@2x.png b/imgs/icons/2833@2x.png
new file mode 100644
index 000000000..dfc8a65e7
Binary files /dev/null and b/imgs/icons/2833@2x.png differ
diff --git a/imgs/icons/2834.png b/imgs/icons/2834@1x.png
similarity index 100%
rename from imgs/icons/2834.png
rename to imgs/icons/2834@1x.png
diff --git a/imgs/icons/2834@2x.png b/imgs/icons/2834@2x.png
new file mode 100644
index 000000000..9cd4b5ac8
Binary files /dev/null and b/imgs/icons/2834@2x.png differ
diff --git a/imgs/icons/2836.png b/imgs/icons/2836@1x.png
similarity index 100%
rename from imgs/icons/2836.png
rename to imgs/icons/2836@1x.png
diff --git a/imgs/icons/2836@2x.png b/imgs/icons/2836@2x.png
new file mode 100644
index 000000000..a735749be
Binary files /dev/null and b/imgs/icons/2836@2x.png differ
diff --git a/imgs/icons/2837.png b/imgs/icons/2837@1x.png
similarity index 100%
rename from imgs/icons/2837.png
rename to imgs/icons/2837@1x.png
diff --git a/imgs/icons/2837@2x.png b/imgs/icons/2837@2x.png
new file mode 100644
index 000000000..c60d843fe
Binary files /dev/null and b/imgs/icons/2837@2x.png differ
diff --git a/imgs/icons/2838.png b/imgs/icons/2838@1x.png
similarity index 100%
rename from imgs/icons/2838.png
rename to imgs/icons/2838@1x.png
diff --git a/imgs/icons/2838@2x.png b/imgs/icons/2838@2x.png
new file mode 100644
index 000000000..72cdc2582
Binary files /dev/null and b/imgs/icons/2838@2x.png differ
diff --git a/imgs/icons/2839.png b/imgs/icons/2839@1x.png
similarity index 100%
rename from imgs/icons/2839.png
rename to imgs/icons/2839@1x.png
diff --git a/imgs/icons/2839@2x.png b/imgs/icons/2839@2x.png
new file mode 100644
index 000000000..686028ca2
Binary files /dev/null and b/imgs/icons/2839@2x.png differ
diff --git a/imgs/icons/2840.png b/imgs/icons/2840@1x.png
similarity index 100%
rename from imgs/icons/2840.png
rename to imgs/icons/2840@1x.png
diff --git a/imgs/icons/2840@2x.png b/imgs/icons/2840@2x.png
new file mode 100644
index 000000000..9dd6aeed5
Binary files /dev/null and b/imgs/icons/2840@2x.png differ
diff --git a/imgs/icons/2841.png b/imgs/icons/2841@1x.png
similarity index 100%
rename from imgs/icons/2841.png
rename to imgs/icons/2841@1x.png
diff --git a/imgs/icons/2841@2x.png b/imgs/icons/2841@2x.png
new file mode 100644
index 000000000..a4d440041
Binary files /dev/null and b/imgs/icons/2841@2x.png differ
diff --git a/imgs/icons/2842.png b/imgs/icons/2842@1x.png
similarity index 100%
rename from imgs/icons/2842.png
rename to imgs/icons/2842@1x.png
diff --git a/imgs/icons/2842@2x.png b/imgs/icons/2842@2x.png
new file mode 100644
index 000000000..3522c037e
Binary files /dev/null and b/imgs/icons/2842@2x.png differ
diff --git a/imgs/icons/2843.png b/imgs/icons/2843@1x.png
similarity index 100%
rename from imgs/icons/2843.png
rename to imgs/icons/2843@1x.png
diff --git a/imgs/icons/2843@2x.png b/imgs/icons/2843@2x.png
new file mode 100644
index 000000000..333ffe46b
Binary files /dev/null and b/imgs/icons/2843@2x.png differ
diff --git a/imgs/icons/2844.png b/imgs/icons/2844@1x.png
similarity index 100%
rename from imgs/icons/2844.png
rename to imgs/icons/2844@1x.png
diff --git a/imgs/icons/2844@2x.png b/imgs/icons/2844@2x.png
new file mode 100644
index 000000000..5182f8092
Binary files /dev/null and b/imgs/icons/2844@2x.png differ
diff --git a/imgs/icons/2845.png b/imgs/icons/2845@1x.png
similarity index 100%
rename from imgs/icons/2845.png
rename to imgs/icons/2845@1x.png
diff --git a/imgs/icons/2845@2x.png b/imgs/icons/2845@2x.png
new file mode 100644
index 000000000..1eac60862
Binary files /dev/null and b/imgs/icons/2845@2x.png differ
diff --git a/imgs/icons/2846.png b/imgs/icons/2846@1x.png
similarity index 100%
rename from imgs/icons/2846.png
rename to imgs/icons/2846@1x.png
diff --git a/imgs/icons/2846@2x.png b/imgs/icons/2846@2x.png
new file mode 100644
index 000000000..051039330
Binary files /dev/null and b/imgs/icons/2846@2x.png differ
diff --git a/imgs/icons/2847.png b/imgs/icons/2847@1x.png
similarity index 100%
rename from imgs/icons/2847.png
rename to imgs/icons/2847@1x.png
diff --git a/imgs/icons/2847@2x.png b/imgs/icons/2847@2x.png
new file mode 100644
index 000000000..99b940616
Binary files /dev/null and b/imgs/icons/2847@2x.png differ
diff --git a/imgs/icons/2848.png b/imgs/icons/2848@1x.png
similarity index 100%
rename from imgs/icons/2848.png
rename to imgs/icons/2848@1x.png
diff --git a/imgs/icons/2848@2x.png b/imgs/icons/2848@2x.png
new file mode 100644
index 000000000..d3aa1f7e3
Binary files /dev/null and b/imgs/icons/2848@2x.png differ
diff --git a/imgs/icons/2849.png b/imgs/icons/2849@1x.png
similarity index 100%
rename from imgs/icons/2849.png
rename to imgs/icons/2849@1x.png
diff --git a/imgs/icons/2849@2x.png b/imgs/icons/2849@2x.png
new file mode 100644
index 000000000..cfe2ebfcc
Binary files /dev/null and b/imgs/icons/2849@2x.png differ
diff --git a/imgs/icons/2850.png b/imgs/icons/2850@1x.png
similarity index 100%
rename from imgs/icons/2850.png
rename to imgs/icons/2850@1x.png
diff --git a/imgs/icons/2850@2x.png b/imgs/icons/2850@2x.png
new file mode 100644
index 000000000..9e7dcb949
Binary files /dev/null and b/imgs/icons/2850@2x.png differ
diff --git a/imgs/icons/2851.png b/imgs/icons/2851@1x.png
similarity index 100%
rename from imgs/icons/2851.png
rename to imgs/icons/2851@1x.png
diff --git a/imgs/icons/2851@2x.png b/imgs/icons/2851@2x.png
new file mode 100644
index 000000000..4d6279fc7
Binary files /dev/null and b/imgs/icons/2851@2x.png differ
diff --git a/imgs/icons/2852.png b/imgs/icons/2852@1x.png
similarity index 100%
rename from imgs/icons/2852.png
rename to imgs/icons/2852@1x.png
diff --git a/imgs/icons/2852@2x.png b/imgs/icons/2852@2x.png
new file mode 100644
index 000000000..e0e4c518d
Binary files /dev/null and b/imgs/icons/2852@2x.png differ
diff --git a/imgs/icons/2853.png b/imgs/icons/2853@1x.png
similarity index 100%
rename from imgs/icons/2853.png
rename to imgs/icons/2853@1x.png
diff --git a/imgs/icons/2853@2x.png b/imgs/icons/2853@2x.png
new file mode 100644
index 000000000..d9221df98
Binary files /dev/null and b/imgs/icons/2853@2x.png differ
diff --git a/imgs/icons/2854.png b/imgs/icons/2854@1x.png
similarity index 100%
rename from imgs/icons/2854.png
rename to imgs/icons/2854@1x.png
diff --git a/imgs/icons/2854@2x.png b/imgs/icons/2854@2x.png
new file mode 100644
index 000000000..ba58e58f8
Binary files /dev/null and b/imgs/icons/2854@2x.png differ
diff --git a/imgs/icons/2855.png b/imgs/icons/2855@1x.png
similarity index 100%
rename from imgs/icons/2855.png
rename to imgs/icons/2855@1x.png
diff --git a/imgs/icons/2855@2x.png b/imgs/icons/2855@2x.png
new file mode 100644
index 000000000..83fce2feb
Binary files /dev/null and b/imgs/icons/2855@2x.png differ
diff --git a/imgs/icons/2856.png b/imgs/icons/2856@1x.png
similarity index 100%
rename from imgs/icons/2856.png
rename to imgs/icons/2856@1x.png
diff --git a/imgs/icons/2856@2x.png b/imgs/icons/2856@2x.png
new file mode 100644
index 000000000..56e6606a9
Binary files /dev/null and b/imgs/icons/2856@2x.png differ
diff --git a/imgs/icons/2857.png b/imgs/icons/2857@1x.png
similarity index 100%
rename from imgs/icons/2857.png
rename to imgs/icons/2857@1x.png
diff --git a/imgs/icons/2857@2x.png b/imgs/icons/2857@2x.png
new file mode 100644
index 000000000..9b603ba88
Binary files /dev/null and b/imgs/icons/2857@2x.png differ
diff --git a/imgs/icons/2858.png b/imgs/icons/2858@1x.png
similarity index 100%
rename from imgs/icons/2858.png
rename to imgs/icons/2858@1x.png
diff --git a/imgs/icons/2858@2x.png b/imgs/icons/2858@2x.png
new file mode 100644
index 000000000..3342c01cc
Binary files /dev/null and b/imgs/icons/2858@2x.png differ
diff --git a/imgs/icons/2859.png b/imgs/icons/2859@1x.png
similarity index 100%
rename from imgs/icons/2859.png
rename to imgs/icons/2859@1x.png
diff --git a/imgs/icons/2859@2x.png b/imgs/icons/2859@2x.png
new file mode 100644
index 000000000..0d8ca4560
Binary files /dev/null and b/imgs/icons/2859@2x.png differ
diff --git a/imgs/icons/2860.png b/imgs/icons/2860@1x.png
similarity index 100%
rename from imgs/icons/2860.png
rename to imgs/icons/2860@1x.png
diff --git a/imgs/icons/2860@2x.png b/imgs/icons/2860@2x.png
new file mode 100644
index 000000000..0f03fb110
Binary files /dev/null and b/imgs/icons/2860@2x.png differ
diff --git a/imgs/icons/2861.png b/imgs/icons/2861@1x.png
similarity index 100%
rename from imgs/icons/2861.png
rename to imgs/icons/2861@1x.png
diff --git a/imgs/icons/2861@2x.png b/imgs/icons/2861@2x.png
new file mode 100644
index 000000000..e0fb41c8f
Binary files /dev/null and b/imgs/icons/2861@2x.png differ
diff --git a/imgs/icons/2862.png b/imgs/icons/2862@1x.png
similarity index 100%
rename from imgs/icons/2862.png
rename to imgs/icons/2862@1x.png
diff --git a/imgs/icons/2862@2x.png b/imgs/icons/2862@2x.png
new file mode 100644
index 000000000..d45b4f9cf
Binary files /dev/null and b/imgs/icons/2862@2x.png differ
diff --git a/imgs/icons/2863.png b/imgs/icons/2863@1x.png
similarity index 100%
rename from imgs/icons/2863.png
rename to imgs/icons/2863@1x.png
diff --git a/imgs/icons/2863@2x.png b/imgs/icons/2863@2x.png
new file mode 100644
index 000000000..f0a73e27f
Binary files /dev/null and b/imgs/icons/2863@2x.png differ
diff --git a/imgs/icons/2864.png b/imgs/icons/2864@1x.png
similarity index 100%
rename from imgs/icons/2864.png
rename to imgs/icons/2864@1x.png
diff --git a/imgs/icons/2864@2x.png b/imgs/icons/2864@2x.png
new file mode 100644
index 000000000..5b119ec43
Binary files /dev/null and b/imgs/icons/2864@2x.png differ
diff --git a/imgs/icons/2865.png b/imgs/icons/2865@1x.png
similarity index 100%
rename from imgs/icons/2865.png
rename to imgs/icons/2865@1x.png
diff --git a/imgs/icons/2865@2x.png b/imgs/icons/2865@2x.png
new file mode 100644
index 000000000..ecf2ef777
Binary files /dev/null and b/imgs/icons/2865@2x.png differ
diff --git a/imgs/icons/2866.png b/imgs/icons/2866@1x.png
similarity index 100%
rename from imgs/icons/2866.png
rename to imgs/icons/2866@1x.png
diff --git a/imgs/icons/2866@2x.png b/imgs/icons/2866@2x.png
new file mode 100644
index 000000000..6d5684728
Binary files /dev/null and b/imgs/icons/2866@2x.png differ
diff --git a/imgs/icons/2867.png b/imgs/icons/2867@1x.png
similarity index 100%
rename from imgs/icons/2867.png
rename to imgs/icons/2867@1x.png
diff --git a/imgs/icons/2867@2x.png b/imgs/icons/2867@2x.png
new file mode 100644
index 000000000..ab30aab95
Binary files /dev/null and b/imgs/icons/2867@2x.png differ
diff --git a/imgs/icons/2868.png b/imgs/icons/2868@1x.png
similarity index 100%
rename from imgs/icons/2868.png
rename to imgs/icons/2868@1x.png
diff --git a/imgs/icons/2868@2x.png b/imgs/icons/2868@2x.png
new file mode 100644
index 000000000..cbb8802c9
Binary files /dev/null and b/imgs/icons/2868@2x.png differ
diff --git a/imgs/icons/2869.png b/imgs/icons/2869@1x.png
similarity index 100%
rename from imgs/icons/2869.png
rename to imgs/icons/2869@1x.png
diff --git a/imgs/icons/2869@2x.png b/imgs/icons/2869@2x.png
new file mode 100644
index 000000000..9299e268c
Binary files /dev/null and b/imgs/icons/2869@2x.png differ
diff --git a/imgs/icons/2870.png b/imgs/icons/2870@1x.png
similarity index 100%
rename from imgs/icons/2870.png
rename to imgs/icons/2870@1x.png
diff --git a/imgs/icons/2870@2x.png b/imgs/icons/2870@2x.png
new file mode 100644
index 000000000..2be6d9bb0
Binary files /dev/null and b/imgs/icons/2870@2x.png differ
diff --git a/imgs/icons/2871.png b/imgs/icons/2871@1x.png
similarity index 100%
rename from imgs/icons/2871.png
rename to imgs/icons/2871@1x.png
diff --git a/imgs/icons/2871@2x.png b/imgs/icons/2871@2x.png
new file mode 100644
index 000000000..432643a7f
Binary files /dev/null and b/imgs/icons/2871@2x.png differ
diff --git a/imgs/icons/2872.png b/imgs/icons/2872@1x.png
similarity index 100%
rename from imgs/icons/2872.png
rename to imgs/icons/2872@1x.png
diff --git a/imgs/icons/2872@2x.png b/imgs/icons/2872@2x.png
new file mode 100644
index 000000000..4631b4b8e
Binary files /dev/null and b/imgs/icons/2872@2x.png differ
diff --git a/imgs/icons/2873.png b/imgs/icons/2873@1x.png
similarity index 100%
rename from imgs/icons/2873.png
rename to imgs/icons/2873@1x.png
diff --git a/imgs/icons/2873@2x.png b/imgs/icons/2873@2x.png
new file mode 100644
index 000000000..497926906
Binary files /dev/null and b/imgs/icons/2873@2x.png differ
diff --git a/imgs/icons/2874.png b/imgs/icons/2874@1x.png
similarity index 100%
rename from imgs/icons/2874.png
rename to imgs/icons/2874@1x.png
diff --git a/imgs/icons/2874@2x.png b/imgs/icons/2874@2x.png
new file mode 100644
index 000000000..b1af674b7
Binary files /dev/null and b/imgs/icons/2874@2x.png differ
diff --git a/imgs/icons/2875.png b/imgs/icons/2875@1x.png
similarity index 100%
rename from imgs/icons/2875.png
rename to imgs/icons/2875@1x.png
diff --git a/imgs/icons/2875@2x.png b/imgs/icons/2875@2x.png
new file mode 100644
index 000000000..ba8d882ed
Binary files /dev/null and b/imgs/icons/2875@2x.png differ
diff --git a/imgs/icons/2876.png b/imgs/icons/2876@1x.png
similarity index 100%
rename from imgs/icons/2876.png
rename to imgs/icons/2876@1x.png
diff --git a/imgs/icons/2876@2x.png b/imgs/icons/2876@2x.png
new file mode 100644
index 000000000..d7a4854e8
Binary files /dev/null and b/imgs/icons/2876@2x.png differ
diff --git a/imgs/icons/2877.png b/imgs/icons/2877@1x.png
similarity index 100%
rename from imgs/icons/2877.png
rename to imgs/icons/2877@1x.png
diff --git a/imgs/icons/2877@2x.png b/imgs/icons/2877@2x.png
new file mode 100644
index 000000000..5255ebae8
Binary files /dev/null and b/imgs/icons/2877@2x.png differ
diff --git a/imgs/icons/2878.png b/imgs/icons/2878@1x.png
similarity index 100%
rename from imgs/icons/2878.png
rename to imgs/icons/2878@1x.png
diff --git a/imgs/icons/2878@2x.png b/imgs/icons/2878@2x.png
new file mode 100644
index 000000000..4fd6f537b
Binary files /dev/null and b/imgs/icons/2878@2x.png differ
diff --git a/imgs/icons/2879.png b/imgs/icons/2879@1x.png
similarity index 100%
rename from imgs/icons/2879.png
rename to imgs/icons/2879@1x.png
diff --git a/imgs/icons/2879@2x.png b/imgs/icons/2879@2x.png
new file mode 100644
index 000000000..7f22855d0
Binary files /dev/null and b/imgs/icons/2879@2x.png differ
diff --git a/imgs/icons/2880.png b/imgs/icons/2880@1x.png
similarity index 100%
rename from imgs/icons/2880.png
rename to imgs/icons/2880@1x.png
diff --git a/imgs/icons/2880@2x.png b/imgs/icons/2880@2x.png
new file mode 100644
index 000000000..acf3590a1
Binary files /dev/null and b/imgs/icons/2880@2x.png differ
diff --git a/imgs/icons/2881.png b/imgs/icons/2881@1x.png
similarity index 100%
rename from imgs/icons/2881.png
rename to imgs/icons/2881@1x.png
diff --git a/imgs/icons/2881@2x.png b/imgs/icons/2881@2x.png
new file mode 100644
index 000000000..fd36694f7
Binary files /dev/null and b/imgs/icons/2881@2x.png differ
diff --git a/imgs/icons/2882.png b/imgs/icons/2882@1x.png
similarity index 100%
rename from imgs/icons/2882.png
rename to imgs/icons/2882@1x.png
diff --git a/imgs/icons/2882@2x.png b/imgs/icons/2882@2x.png
new file mode 100644
index 000000000..84f0f8a0f
Binary files /dev/null and b/imgs/icons/2882@2x.png differ
diff --git a/imgs/icons/2883.png b/imgs/icons/2883@1x.png
similarity index 100%
rename from imgs/icons/2883.png
rename to imgs/icons/2883@1x.png
diff --git a/imgs/icons/2883@2x.png b/imgs/icons/2883@2x.png
new file mode 100644
index 000000000..7032fe735
Binary files /dev/null and b/imgs/icons/2883@2x.png differ
diff --git a/imgs/icons/2884.png b/imgs/icons/2884@1x.png
similarity index 100%
rename from imgs/icons/2884.png
rename to imgs/icons/2884@1x.png
diff --git a/imgs/icons/2884@2x.png b/imgs/icons/2884@2x.png
new file mode 100644
index 000000000..6af605930
Binary files /dev/null and b/imgs/icons/2884@2x.png differ
diff --git a/imgs/icons/2885.png b/imgs/icons/2885@1x.png
similarity index 100%
rename from imgs/icons/2885.png
rename to imgs/icons/2885@1x.png
diff --git a/imgs/icons/2885@2x.png b/imgs/icons/2885@2x.png
new file mode 100644
index 000000000..5a99cdd01
Binary files /dev/null and b/imgs/icons/2885@2x.png differ
diff --git a/imgs/icons/2886.png b/imgs/icons/2886@1x.png
similarity index 100%
rename from imgs/icons/2886.png
rename to imgs/icons/2886@1x.png
diff --git a/imgs/icons/2886@2x.png b/imgs/icons/2886@2x.png
new file mode 100644
index 000000000..cbb815732
Binary files /dev/null and b/imgs/icons/2886@2x.png differ
diff --git a/imgs/icons/2887.png b/imgs/icons/2887@1x.png
similarity index 100%
rename from imgs/icons/2887.png
rename to imgs/icons/2887@1x.png
diff --git a/imgs/icons/2887@2x.png b/imgs/icons/2887@2x.png
new file mode 100644
index 000000000..832fea9c9
Binary files /dev/null and b/imgs/icons/2887@2x.png differ
diff --git a/imgs/icons/2888.png b/imgs/icons/2888@1x.png
similarity index 100%
rename from imgs/icons/2888.png
rename to imgs/icons/2888@1x.png
diff --git a/imgs/icons/2888@2x.png b/imgs/icons/2888@2x.png
new file mode 100644
index 000000000..75470d1f7
Binary files /dev/null and b/imgs/icons/2888@2x.png differ
diff --git a/imgs/icons/2889.png b/imgs/icons/2889@1x.png
similarity index 100%
rename from imgs/icons/2889.png
rename to imgs/icons/2889@1x.png
diff --git a/imgs/icons/2889@2x.png b/imgs/icons/2889@2x.png
new file mode 100644
index 000000000..0125f2843
Binary files /dev/null and b/imgs/icons/2889@2x.png differ
diff --git a/imgs/icons/2890.png b/imgs/icons/2890@1x.png
similarity index 100%
rename from imgs/icons/2890.png
rename to imgs/icons/2890@1x.png
diff --git a/imgs/icons/2890@2x.png b/imgs/icons/2890@2x.png
new file mode 100644
index 000000000..52b8fcdba
Binary files /dev/null and b/imgs/icons/2890@2x.png differ
diff --git a/imgs/icons/2891.png b/imgs/icons/2891@1x.png
similarity index 100%
rename from imgs/icons/2891.png
rename to imgs/icons/2891@1x.png
diff --git a/imgs/icons/2891@2x.png b/imgs/icons/2891@2x.png
new file mode 100644
index 000000000..7cf2ec22b
Binary files /dev/null and b/imgs/icons/2891@2x.png differ
diff --git a/imgs/icons/2893.png b/imgs/icons/2893@1x.png
similarity index 100%
rename from imgs/icons/2893.png
rename to imgs/icons/2893@1x.png
diff --git a/imgs/icons/2893@2x.png b/imgs/icons/2893@2x.png
new file mode 100644
index 000000000..ccd422d57
Binary files /dev/null and b/imgs/icons/2893@2x.png differ
diff --git a/imgs/icons/28.png b/imgs/icons/28@1x.png
similarity index 100%
rename from imgs/icons/28.png
rename to imgs/icons/28@1x.png
diff --git a/imgs/icons/28@2x.png b/imgs/icons/28@2x.png
new file mode 100644
index 000000000..62e81003a
Binary files /dev/null and b/imgs/icons/28@2x.png differ
diff --git a/imgs/icons/2908.png b/imgs/icons/2908@1x.png
similarity index 100%
rename from imgs/icons/2908.png
rename to imgs/icons/2908@1x.png
diff --git a/imgs/icons/2908@2x.png b/imgs/icons/2908@2x.png
new file mode 100644
index 000000000..4309c2e2d
Binary files /dev/null and b/imgs/icons/2908@2x.png differ
diff --git a/imgs/icons/2934.png b/imgs/icons/2934@1x.png
similarity index 100%
rename from imgs/icons/2934.png
rename to imgs/icons/2934@1x.png
diff --git a/imgs/icons/2934@2x.png b/imgs/icons/2934@2x.png
new file mode 100644
index 000000000..b87ff9025
Binary files /dev/null and b/imgs/icons/2934@2x.png differ
diff --git a/imgs/icons/293.png b/imgs/icons/293@1x.png
similarity index 100%
rename from imgs/icons/293.png
rename to imgs/icons/293@1x.png
diff --git a/imgs/icons/293@2x.png b/imgs/icons/293@2x.png
new file mode 100644
index 000000000..83da1e521
Binary files /dev/null and b/imgs/icons/293@2x.png differ
diff --git a/imgs/icons/2943.png b/imgs/icons/2943@1x.png
similarity index 100%
rename from imgs/icons/2943.png
rename to imgs/icons/2943@1x.png
diff --git a/imgs/icons/2943@2x.png b/imgs/icons/2943@2x.png
new file mode 100644
index 000000000..276536d3c
Binary files /dev/null and b/imgs/icons/2943@2x.png differ
diff --git a/imgs/icons/294.png b/imgs/icons/294@1x.png
similarity index 100%
rename from imgs/icons/294.png
rename to imgs/icons/294@1x.png
diff --git a/imgs/icons/294@2x.png b/imgs/icons/294@2x.png
new file mode 100644
index 000000000..510f1e4a8
Binary files /dev/null and b/imgs/icons/294@2x.png differ
diff --git a/imgs/icons/295.png b/imgs/icons/295@1x.png
similarity index 100%
rename from imgs/icons/295.png
rename to imgs/icons/295@1x.png
diff --git a/imgs/icons/295@2x.png b/imgs/icons/295@2x.png
new file mode 100644
index 000000000..142568c04
Binary files /dev/null and b/imgs/icons/295@2x.png differ
diff --git a/imgs/icons/2983.png b/imgs/icons/2983@1x.png
similarity index 100%
rename from imgs/icons/2983.png
rename to imgs/icons/2983@1x.png
diff --git a/imgs/icons/2983@2x.png b/imgs/icons/2983@2x.png
new file mode 100644
index 000000000..62de63038
Binary files /dev/null and b/imgs/icons/2983@2x.png differ
diff --git a/imgs/icons/2985.png b/imgs/icons/2985@1x.png
similarity index 100%
rename from imgs/icons/2985.png
rename to imgs/icons/2985@1x.png
diff --git a/imgs/icons/2985@2x.png b/imgs/icons/2985@2x.png
new file mode 100644
index 000000000..186c7bff6
Binary files /dev/null and b/imgs/icons/2985@2x.png differ
diff --git a/imgs/icons/2986.png b/imgs/icons/2986@1x.png
similarity index 100%
rename from imgs/icons/2986.png
rename to imgs/icons/2986@1x.png
diff --git a/imgs/icons/2986@2x.png b/imgs/icons/2986@2x.png
new file mode 100644
index 000000000..7f43bcaf4
Binary files /dev/null and b/imgs/icons/2986@2x.png differ
diff --git a/imgs/icons/2987.png b/imgs/icons/2987@1x.png
similarity index 100%
rename from imgs/icons/2987.png
rename to imgs/icons/2987@1x.png
diff --git a/imgs/icons/2987@2x.png b/imgs/icons/2987@2x.png
new file mode 100644
index 000000000..535777b52
Binary files /dev/null and b/imgs/icons/2987@2x.png differ
diff --git a/imgs/icons/2988.png b/imgs/icons/2988@1x.png
similarity index 100%
rename from imgs/icons/2988.png
rename to imgs/icons/2988@1x.png
diff --git a/imgs/icons/2988@2x.png b/imgs/icons/2988@2x.png
new file mode 100644
index 000000000..501095a06
Binary files /dev/null and b/imgs/icons/2988@2x.png differ
diff --git a/imgs/icons/2989.png b/imgs/icons/2989@1x.png
similarity index 100%
rename from imgs/icons/2989.png
rename to imgs/icons/2989@1x.png
diff --git a/imgs/icons/2989@2x.png b/imgs/icons/2989@2x.png
new file mode 100644
index 000000000..121fdbf21
Binary files /dev/null and b/imgs/icons/2989@2x.png differ
diff --git a/imgs/icons/2990.png b/imgs/icons/2990@1x.png
similarity index 100%
rename from imgs/icons/2990.png
rename to imgs/icons/2990@1x.png
diff --git a/imgs/icons/2990@2x.png b/imgs/icons/2990@2x.png
new file mode 100644
index 000000000..8f7c272a4
Binary files /dev/null and b/imgs/icons/2990@2x.png differ
diff --git a/imgs/icons/2991.png b/imgs/icons/2991@1x.png
similarity index 100%
rename from imgs/icons/2991.png
rename to imgs/icons/2991@1x.png
diff --git a/imgs/icons/2991@2x.png b/imgs/icons/2991@2x.png
new file mode 100644
index 000000000..fd6402846
Binary files /dev/null and b/imgs/icons/2991@2x.png differ
diff --git a/imgs/icons/2992.png b/imgs/icons/2992@1x.png
similarity index 100%
rename from imgs/icons/2992.png
rename to imgs/icons/2992@1x.png
diff --git a/imgs/icons/2992@2x.png b/imgs/icons/2992@2x.png
new file mode 100644
index 000000000..dca479df3
Binary files /dev/null and b/imgs/icons/2992@2x.png differ
diff --git a/imgs/icons/2994.png b/imgs/icons/2994@1x.png
similarity index 100%
rename from imgs/icons/2994.png
rename to imgs/icons/2994@1x.png
diff --git a/imgs/icons/2994@2x.png b/imgs/icons/2994@2x.png
new file mode 100644
index 000000000..fbba06c0c
Binary files /dev/null and b/imgs/icons/2994@2x.png differ
diff --git a/imgs/icons/29.png b/imgs/icons/29@1x.png
similarity index 100%
rename from imgs/icons/29.png
rename to imgs/icons/29@1x.png
diff --git a/imgs/icons/29@2x.png b/imgs/icons/29@2x.png
new file mode 100644
index 000000000..47ea3ded8
Binary files /dev/null and b/imgs/icons/29@2x.png differ
diff --git a/imgs/icons/3000.png b/imgs/icons/3000@1x.png
similarity index 100%
rename from imgs/icons/3000.png
rename to imgs/icons/3000@1x.png
diff --git a/imgs/icons/3000@2x.png b/imgs/icons/3000@2x.png
new file mode 100644
index 000000000..63679897b
Binary files /dev/null and b/imgs/icons/3000@2x.png differ
diff --git a/imgs/icons/3001.png b/imgs/icons/3001@1x.png
similarity index 100%
rename from imgs/icons/3001.png
rename to imgs/icons/3001@1x.png
diff --git a/imgs/icons/3001@2x.png b/imgs/icons/3001@2x.png
new file mode 100644
index 000000000..858245cb5
Binary files /dev/null and b/imgs/icons/3001@2x.png differ
diff --git a/imgs/icons/3006.png b/imgs/icons/3006@1x.png
similarity index 100%
rename from imgs/icons/3006.png
rename to imgs/icons/3006@1x.png
diff --git a/imgs/icons/3006@2x.png b/imgs/icons/3006@2x.png
new file mode 100644
index 000000000..47682bcc9
Binary files /dev/null and b/imgs/icons/3006@2x.png differ
diff --git a/imgs/icons/3007.png b/imgs/icons/3007@1x.png
similarity index 100%
rename from imgs/icons/3007.png
rename to imgs/icons/3007@1x.png
diff --git a/imgs/icons/3007@2x.png b/imgs/icons/3007@2x.png
new file mode 100644
index 000000000..bca938285
Binary files /dev/null and b/imgs/icons/3007@2x.png differ
diff --git a/imgs/icons/3010.png b/imgs/icons/3010@1x.png
similarity index 100%
rename from imgs/icons/3010.png
rename to imgs/icons/3010@1x.png
diff --git a/imgs/icons/3010@2x.png b/imgs/icons/3010@2x.png
new file mode 100644
index 000000000..0078a55fb
Binary files /dev/null and b/imgs/icons/3010@2x.png differ
diff --git a/imgs/icons/3012.png b/imgs/icons/3012@1x.png
similarity index 100%
rename from imgs/icons/3012.png
rename to imgs/icons/3012@1x.png
diff --git a/imgs/icons/3012@2x.png b/imgs/icons/3012@2x.png
new file mode 100644
index 000000000..a5aa7e5bc
Binary files /dev/null and b/imgs/icons/3012@2x.png differ
diff --git a/imgs/icons/3013.png b/imgs/icons/3013@1x.png
similarity index 100%
rename from imgs/icons/3013.png
rename to imgs/icons/3013@1x.png
diff --git a/imgs/icons/3013@2x.png b/imgs/icons/3013@2x.png
new file mode 100644
index 000000000..e3239262e
Binary files /dev/null and b/imgs/icons/3013@2x.png differ
diff --git a/imgs/icons/3019.png b/imgs/icons/3019@1x.png
similarity index 100%
rename from imgs/icons/3019.png
rename to imgs/icons/3019@1x.png
diff --git a/imgs/icons/3019@2x.png b/imgs/icons/3019@2x.png
new file mode 100644
index 000000000..1fb124229
Binary files /dev/null and b/imgs/icons/3019@2x.png differ
diff --git a/imgs/icons/3025.png b/imgs/icons/3025@1x.png
similarity index 100%
rename from imgs/icons/3025.png
rename to imgs/icons/3025@1x.png
diff --git a/imgs/icons/3025@2x.png b/imgs/icons/3025@2x.png
new file mode 100644
index 000000000..828166088
Binary files /dev/null and b/imgs/icons/3025@2x.png differ
diff --git a/imgs/icons/3036.png b/imgs/icons/3036@1x.png
similarity index 100%
rename from imgs/icons/3036.png
rename to imgs/icons/3036@1x.png
diff --git a/imgs/icons/3036@2x.png b/imgs/icons/3036@2x.png
new file mode 100644
index 000000000..66cfe33b4
Binary files /dev/null and b/imgs/icons/3036@2x.png differ
diff --git a/imgs/icons/3074.png b/imgs/icons/3074@1x.png
similarity index 100%
rename from imgs/icons/3074.png
rename to imgs/icons/3074@1x.png
diff --git a/imgs/icons/3074@2x.png b/imgs/icons/3074@2x.png
new file mode 100644
index 000000000..e62704106
Binary files /dev/null and b/imgs/icons/3074@2x.png differ
diff --git a/imgs/icons/30.png b/imgs/icons/30@1x.png
similarity index 100%
rename from imgs/icons/30.png
rename to imgs/icons/30@1x.png
diff --git a/imgs/icons/30@2x.png b/imgs/icons/30@2x.png
new file mode 100644
index 000000000..f13ed6279
Binary files /dev/null and b/imgs/icons/30@2x.png differ
diff --git a/imgs/icons/3181.png b/imgs/icons/3181@1x.png
similarity index 100%
rename from imgs/icons/3181.png
rename to imgs/icons/3181@1x.png
diff --git a/imgs/icons/3181@2x.png b/imgs/icons/3181@2x.png
new file mode 100644
index 000000000..8e0f60ba6
Binary files /dev/null and b/imgs/icons/3181@2x.png differ
diff --git a/imgs/icons/3182.png b/imgs/icons/3182@1x.png
similarity index 100%
rename from imgs/icons/3182.png
rename to imgs/icons/3182@1x.png
diff --git a/imgs/icons/3182@2x.png b/imgs/icons/3182@2x.png
new file mode 100644
index 000000000..0b5443ca8
Binary files /dev/null and b/imgs/icons/3182@2x.png differ
diff --git a/imgs/icons/3183.png b/imgs/icons/3183@1x.png
similarity index 100%
rename from imgs/icons/3183.png
rename to imgs/icons/3183@1x.png
diff --git a/imgs/icons/3183@2x.png b/imgs/icons/3183@2x.png
new file mode 100644
index 000000000..685e27b5b
Binary files /dev/null and b/imgs/icons/3183@2x.png differ
diff --git a/imgs/icons/3184.png b/imgs/icons/3184@1x.png
similarity index 100%
rename from imgs/icons/3184.png
rename to imgs/icons/3184@1x.png
diff --git a/imgs/icons/3184@2x.png b/imgs/icons/3184@2x.png
new file mode 100644
index 000000000..7bf256351
Binary files /dev/null and b/imgs/icons/3184@2x.png differ
diff --git a/imgs/icons/3185.png b/imgs/icons/3185@1x.png
similarity index 100%
rename from imgs/icons/3185.png
rename to imgs/icons/3185@1x.png
diff --git a/imgs/icons/3185@2x.png b/imgs/icons/3185@2x.png
new file mode 100644
index 000000000..96bf68d82
Binary files /dev/null and b/imgs/icons/3185@2x.png differ
diff --git a/imgs/icons/3186.png b/imgs/icons/3186@1x.png
similarity index 100%
rename from imgs/icons/3186.png
rename to imgs/icons/3186@1x.png
diff --git a/imgs/icons/3186@2x.png b/imgs/icons/3186@2x.png
new file mode 100644
index 000000000..2cf3d5a1a
Binary files /dev/null and b/imgs/icons/3186@2x.png differ
diff --git a/imgs/icons/3187.png b/imgs/icons/3187@1x.png
similarity index 100%
rename from imgs/icons/3187.png
rename to imgs/icons/3187@1x.png
diff --git a/imgs/icons/3187@2x.png b/imgs/icons/3187@2x.png
new file mode 100644
index 000000000..227ab19f8
Binary files /dev/null and b/imgs/icons/3187@2x.png differ
diff --git a/imgs/icons/3188.png b/imgs/icons/3188@1x.png
similarity index 100%
rename from imgs/icons/3188.png
rename to imgs/icons/3188@1x.png
diff --git a/imgs/icons/3188@2x.png b/imgs/icons/3188@2x.png
new file mode 100644
index 000000000..f7d069d45
Binary files /dev/null and b/imgs/icons/3188@2x.png differ
diff --git a/imgs/icons/3189.png b/imgs/icons/3189@1x.png
similarity index 100%
rename from imgs/icons/3189.png
rename to imgs/icons/3189@1x.png
diff --git a/imgs/icons/3189@2x.png b/imgs/icons/3189@2x.png
new file mode 100644
index 000000000..99946eb01
Binary files /dev/null and b/imgs/icons/3189@2x.png differ
diff --git a/imgs/icons/3190.png b/imgs/icons/3190@1x.png
similarity index 100%
rename from imgs/icons/3190.png
rename to imgs/icons/3190@1x.png
diff --git a/imgs/icons/3190@2x.png b/imgs/icons/3190@2x.png
new file mode 100644
index 000000000..f8207ec59
Binary files /dev/null and b/imgs/icons/3190@2x.png differ
diff --git a/imgs/icons/3191.png b/imgs/icons/3191@1x.png
similarity index 100%
rename from imgs/icons/3191.png
rename to imgs/icons/3191@1x.png
diff --git a/imgs/icons/3191@2x.png b/imgs/icons/3191@2x.png
new file mode 100644
index 000000000..7bda23b9f
Binary files /dev/null and b/imgs/icons/3191@2x.png differ
diff --git a/imgs/icons/3192.png b/imgs/icons/3192@1x.png
similarity index 100%
rename from imgs/icons/3192.png
rename to imgs/icons/3192@1x.png
diff --git a/imgs/icons/3192@2x.png b/imgs/icons/3192@2x.png
new file mode 100644
index 000000000..bce9c99f0
Binary files /dev/null and b/imgs/icons/3192@2x.png differ
diff --git a/imgs/icons/3193.png b/imgs/icons/3193@1x.png
similarity index 100%
rename from imgs/icons/3193.png
rename to imgs/icons/3193@1x.png
diff --git a/imgs/icons/3193@2x.png b/imgs/icons/3193@2x.png
new file mode 100644
index 000000000..d990a9818
Binary files /dev/null and b/imgs/icons/3193@2x.png differ
diff --git a/imgs/icons/3194.png b/imgs/icons/3194@1x.png
similarity index 100%
rename from imgs/icons/3194.png
rename to imgs/icons/3194@1x.png
diff --git a/imgs/icons/3194@2x.png b/imgs/icons/3194@2x.png
new file mode 100644
index 000000000..8116f3eef
Binary files /dev/null and b/imgs/icons/3194@2x.png differ
diff --git a/imgs/icons/3195.png b/imgs/icons/3195@1x.png
similarity index 100%
rename from imgs/icons/3195.png
rename to imgs/icons/3195@1x.png
diff --git a/imgs/icons/3195@2x.png b/imgs/icons/3195@2x.png
new file mode 100644
index 000000000..9bf6c173f
Binary files /dev/null and b/imgs/icons/3195@2x.png differ
diff --git a/imgs/icons/3196.png b/imgs/icons/3196@1x.png
similarity index 100%
rename from imgs/icons/3196.png
rename to imgs/icons/3196@1x.png
diff --git a/imgs/icons/3196@2x.png b/imgs/icons/3196@2x.png
new file mode 100644
index 000000000..12733776d
Binary files /dev/null and b/imgs/icons/3196@2x.png differ
diff --git a/imgs/icons/3197.png b/imgs/icons/3197@1x.png
similarity index 100%
rename from imgs/icons/3197.png
rename to imgs/icons/3197@1x.png
diff --git a/imgs/icons/3197@2x.png b/imgs/icons/3197@2x.png
new file mode 100644
index 000000000..79f86331f
Binary files /dev/null and b/imgs/icons/3197@2x.png differ
diff --git a/imgs/icons/3198.png b/imgs/icons/3198@1x.png
similarity index 100%
rename from imgs/icons/3198.png
rename to imgs/icons/3198@1x.png
diff --git a/imgs/icons/3198@2x.png b/imgs/icons/3198@2x.png
new file mode 100644
index 000000000..6c1303ee5
Binary files /dev/null and b/imgs/icons/3198@2x.png differ
diff --git a/imgs/icons/3199.png b/imgs/icons/3199@1x.png
similarity index 100%
rename from imgs/icons/3199.png
rename to imgs/icons/3199@1x.png
diff --git a/imgs/icons/3199@2x.png b/imgs/icons/3199@2x.png
new file mode 100644
index 000000000..56ab5f3be
Binary files /dev/null and b/imgs/icons/3199@2x.png differ
diff --git a/imgs/icons/31.png b/imgs/icons/31@1x.png
similarity index 100%
rename from imgs/icons/31.png
rename to imgs/icons/31@1x.png
diff --git a/imgs/icons/31@2x.png b/imgs/icons/31@2x.png
new file mode 100644
index 000000000..4511390fa
Binary files /dev/null and b/imgs/icons/31@2x.png differ
diff --git a/imgs/icons/3200.png b/imgs/icons/3200@1x.png
similarity index 100%
rename from imgs/icons/3200.png
rename to imgs/icons/3200@1x.png
diff --git a/imgs/icons/3200@2x.png b/imgs/icons/3200@2x.png
new file mode 100644
index 000000000..0edc96522
Binary files /dev/null and b/imgs/icons/3200@2x.png differ
diff --git a/imgs/icons/3201.png b/imgs/icons/3201@1x.png
similarity index 100%
rename from imgs/icons/3201.png
rename to imgs/icons/3201@1x.png
diff --git a/imgs/icons/3201@2x.png b/imgs/icons/3201@2x.png
new file mode 100644
index 000000000..10a5ac8e4
Binary files /dev/null and b/imgs/icons/3201@2x.png differ
diff --git a/imgs/icons/3202.png b/imgs/icons/3202@1x.png
similarity index 100%
rename from imgs/icons/3202.png
rename to imgs/icons/3202@1x.png
diff --git a/imgs/icons/3202@2x.png b/imgs/icons/3202@2x.png
new file mode 100644
index 000000000..8ee56e1fd
Binary files /dev/null and b/imgs/icons/3202@2x.png differ
diff --git a/imgs/icons/3203.png b/imgs/icons/3203@1x.png
similarity index 100%
rename from imgs/icons/3203.png
rename to imgs/icons/3203@1x.png
diff --git a/imgs/icons/3203@2x.png b/imgs/icons/3203@2x.png
new file mode 100644
index 000000000..413ead440
Binary files /dev/null and b/imgs/icons/3203@2x.png differ
diff --git a/imgs/icons/3210.png b/imgs/icons/3210@1x.png
similarity index 100%
rename from imgs/icons/3210.png
rename to imgs/icons/3210@1x.png
diff --git a/imgs/icons/3210@2x.png b/imgs/icons/3210@2x.png
new file mode 100644
index 000000000..4dd8690e2
Binary files /dev/null and b/imgs/icons/3210@2x.png differ
diff --git a/imgs/icons/3211.png b/imgs/icons/3211@1x.png
similarity index 100%
rename from imgs/icons/3211.png
rename to imgs/icons/3211@1x.png
diff --git a/imgs/icons/3211@2x.png b/imgs/icons/3211@2x.png
new file mode 100644
index 000000000..8712477fd
Binary files /dev/null and b/imgs/icons/3211@2x.png differ
diff --git a/imgs/icons/3212.png b/imgs/icons/3212@1x.png
similarity index 100%
rename from imgs/icons/3212.png
rename to imgs/icons/3212@1x.png
diff --git a/imgs/icons/3212@2x.png b/imgs/icons/3212@2x.png
new file mode 100644
index 000000000..eb3a32f86
Binary files /dev/null and b/imgs/icons/3212@2x.png differ
diff --git a/imgs/icons/3213.png b/imgs/icons/3213@1x.png
similarity index 100%
rename from imgs/icons/3213.png
rename to imgs/icons/3213@1x.png
diff --git a/imgs/icons/3213@2x.png b/imgs/icons/3213@2x.png
new file mode 100644
index 000000000..23183ffbc
Binary files /dev/null and b/imgs/icons/3213@2x.png differ
diff --git a/imgs/icons/3214.png b/imgs/icons/3214@1x.png
similarity index 100%
rename from imgs/icons/3214.png
rename to imgs/icons/3214@1x.png
diff --git a/imgs/icons/3214@2x.png b/imgs/icons/3214@2x.png
new file mode 100644
index 000000000..bc5eef6ad
Binary files /dev/null and b/imgs/icons/3214@2x.png differ
diff --git a/imgs/icons/3215.png b/imgs/icons/3215@1x.png
similarity index 100%
rename from imgs/icons/3215.png
rename to imgs/icons/3215@1x.png
diff --git a/imgs/icons/3215@2x.png b/imgs/icons/3215@2x.png
new file mode 100644
index 000000000..2310737e4
Binary files /dev/null and b/imgs/icons/3215@2x.png differ
diff --git a/imgs/icons/3216.png b/imgs/icons/3216@1x.png
similarity index 100%
rename from imgs/icons/3216.png
rename to imgs/icons/3216@1x.png
diff --git a/imgs/icons/3216@2x.png b/imgs/icons/3216@2x.png
new file mode 100644
index 000000000..c87f9eaba
Binary files /dev/null and b/imgs/icons/3216@2x.png differ
diff --git a/imgs/icons/3217.png b/imgs/icons/3217@1x.png
similarity index 100%
rename from imgs/icons/3217.png
rename to imgs/icons/3217@1x.png
diff --git a/imgs/icons/3217@2x.png b/imgs/icons/3217@2x.png
new file mode 100644
index 000000000..7ffab845d
Binary files /dev/null and b/imgs/icons/3217@2x.png differ
diff --git a/imgs/icons/3218.png b/imgs/icons/3218@1x.png
similarity index 100%
rename from imgs/icons/3218.png
rename to imgs/icons/3218@1x.png
diff --git a/imgs/icons/3218@2x.png b/imgs/icons/3218@2x.png
new file mode 100644
index 000000000..528329e2d
Binary files /dev/null and b/imgs/icons/3218@2x.png differ
diff --git a/imgs/icons/3219.png b/imgs/icons/3219@1x.png
similarity index 100%
rename from imgs/icons/3219.png
rename to imgs/icons/3219@1x.png
diff --git a/imgs/icons/3219@2x.png b/imgs/icons/3219@2x.png
new file mode 100644
index 000000000..d404fef43
Binary files /dev/null and b/imgs/icons/3219@2x.png differ
diff --git a/imgs/icons/3220.png b/imgs/icons/3220@1x.png
similarity index 100%
rename from imgs/icons/3220.png
rename to imgs/icons/3220@1x.png
diff --git a/imgs/icons/3220@2x.png b/imgs/icons/3220@2x.png
new file mode 100644
index 000000000..f209636b0
Binary files /dev/null and b/imgs/icons/3220@2x.png differ
diff --git a/imgs/icons/3221.png b/imgs/icons/3221@1x.png
similarity index 100%
rename from imgs/icons/3221.png
rename to imgs/icons/3221@1x.png
diff --git a/imgs/icons/3221@2x.png b/imgs/icons/3221@2x.png
new file mode 100644
index 000000000..3c4191750
Binary files /dev/null and b/imgs/icons/3221@2x.png differ
diff --git a/imgs/icons/3222.png b/imgs/icons/3222@1x.png
similarity index 100%
rename from imgs/icons/3222.png
rename to imgs/icons/3222@1x.png
diff --git a/imgs/icons/3222@2x.png b/imgs/icons/3222@2x.png
new file mode 100644
index 000000000..f7636130b
Binary files /dev/null and b/imgs/icons/3222@2x.png differ
diff --git a/imgs/icons/3223.png b/imgs/icons/3223@1x.png
similarity index 100%
rename from imgs/icons/3223.png
rename to imgs/icons/3223@1x.png
diff --git a/imgs/icons/3223@2x.png b/imgs/icons/3223@2x.png
new file mode 100644
index 000000000..82f8955d6
Binary files /dev/null and b/imgs/icons/3223@2x.png differ
diff --git a/imgs/icons/3224.png b/imgs/icons/3224@1x.png
similarity index 100%
rename from imgs/icons/3224.png
rename to imgs/icons/3224@1x.png
diff --git a/imgs/icons/3224@2x.png b/imgs/icons/3224@2x.png
new file mode 100644
index 000000000..8a327948f
Binary files /dev/null and b/imgs/icons/3224@2x.png differ
diff --git a/imgs/icons/3225.png b/imgs/icons/3225@1x.png
similarity index 100%
rename from imgs/icons/3225.png
rename to imgs/icons/3225@1x.png
diff --git a/imgs/icons/3225@2x.png b/imgs/icons/3225@2x.png
new file mode 100644
index 000000000..e167d789b
Binary files /dev/null and b/imgs/icons/3225@2x.png differ
diff --git a/imgs/icons/3226.png b/imgs/icons/3226@1x.png
similarity index 100%
rename from imgs/icons/3226.png
rename to imgs/icons/3226@1x.png
diff --git a/imgs/icons/3226@2x.png b/imgs/icons/3226@2x.png
new file mode 100644
index 000000000..30ed0b9e5
Binary files /dev/null and b/imgs/icons/3226@2x.png differ
diff --git a/imgs/icons/3227.png b/imgs/icons/3227@1x.png
similarity index 100%
rename from imgs/icons/3227.png
rename to imgs/icons/3227@1x.png
diff --git a/imgs/icons/3227@2x.png b/imgs/icons/3227@2x.png
new file mode 100644
index 000000000..6a688bfc0
Binary files /dev/null and b/imgs/icons/3227@2x.png differ
diff --git a/imgs/icons/3228.png b/imgs/icons/3228@1x.png
similarity index 100%
rename from imgs/icons/3228.png
rename to imgs/icons/3228@1x.png
diff --git a/imgs/icons/3228@2x.png b/imgs/icons/3228@2x.png
new file mode 100644
index 000000000..eae74a9f3
Binary files /dev/null and b/imgs/icons/3228@2x.png differ
diff --git a/imgs/icons/3229.png b/imgs/icons/3229@1x.png
similarity index 100%
rename from imgs/icons/3229.png
rename to imgs/icons/3229@1x.png
diff --git a/imgs/icons/3229@2x.png b/imgs/icons/3229@2x.png
new file mode 100644
index 000000000..86d9d668b
Binary files /dev/null and b/imgs/icons/3229@2x.png differ
diff --git a/imgs/icons/3230.png b/imgs/icons/3230@1x.png
similarity index 100%
rename from imgs/icons/3230.png
rename to imgs/icons/3230@1x.png
diff --git a/imgs/icons/3230@2x.png b/imgs/icons/3230@2x.png
new file mode 100644
index 000000000..caffdf9f2
Binary files /dev/null and b/imgs/icons/3230@2x.png differ
diff --git a/imgs/icons/3231.png b/imgs/icons/3231@1x.png
similarity index 100%
rename from imgs/icons/3231.png
rename to imgs/icons/3231@1x.png
diff --git a/imgs/icons/3231@2x.png b/imgs/icons/3231@2x.png
new file mode 100644
index 000000000..dd6f02787
Binary files /dev/null and b/imgs/icons/3231@2x.png differ
diff --git a/imgs/icons/3232.png b/imgs/icons/3232@1x.png
similarity index 100%
rename from imgs/icons/3232.png
rename to imgs/icons/3232@1x.png
diff --git a/imgs/icons/3232@2x.png b/imgs/icons/3232@2x.png
new file mode 100644
index 000000000..9a604a190
Binary files /dev/null and b/imgs/icons/3232@2x.png differ
diff --git a/imgs/icons/3233.png b/imgs/icons/3233@1x.png
similarity index 100%
rename from imgs/icons/3233.png
rename to imgs/icons/3233@1x.png
diff --git a/imgs/icons/3233@2x.png b/imgs/icons/3233@2x.png
new file mode 100644
index 000000000..076fc1689
Binary files /dev/null and b/imgs/icons/3233@2x.png differ
diff --git a/imgs/icons/3234.png b/imgs/icons/3234@1x.png
similarity index 100%
rename from imgs/icons/3234.png
rename to imgs/icons/3234@1x.png
diff --git a/imgs/icons/3234@2x.png b/imgs/icons/3234@2x.png
new file mode 100644
index 000000000..833729894
Binary files /dev/null and b/imgs/icons/3234@2x.png differ
diff --git a/imgs/icons/3235.png b/imgs/icons/3235@1x.png
similarity index 100%
rename from imgs/icons/3235.png
rename to imgs/icons/3235@1x.png
diff --git a/imgs/icons/3235@2x.png b/imgs/icons/3235@2x.png
new file mode 100644
index 000000000..6886705b2
Binary files /dev/null and b/imgs/icons/3235@2x.png differ
diff --git a/imgs/icons/3236.png b/imgs/icons/3236@1x.png
similarity index 100%
rename from imgs/icons/3236.png
rename to imgs/icons/3236@1x.png
diff --git a/imgs/icons/3236@2x.png b/imgs/icons/3236@2x.png
new file mode 100644
index 000000000..da998da6f
Binary files /dev/null and b/imgs/icons/3236@2x.png differ
diff --git a/imgs/icons/3237.png b/imgs/icons/3237@1x.png
similarity index 100%
rename from imgs/icons/3237.png
rename to imgs/icons/3237@1x.png
diff --git a/imgs/icons/3237@2x.png b/imgs/icons/3237@2x.png
new file mode 100644
index 000000000..b47b713aa
Binary files /dev/null and b/imgs/icons/3237@2x.png differ
diff --git a/imgs/icons/3240.png b/imgs/icons/3240@1x.png
similarity index 100%
rename from imgs/icons/3240.png
rename to imgs/icons/3240@1x.png
diff --git a/imgs/icons/3240@2x.png b/imgs/icons/3240@2x.png
new file mode 100644
index 000000000..7dc860536
Binary files /dev/null and b/imgs/icons/3240@2x.png differ
diff --git a/imgs/icons/3241.png b/imgs/icons/3241@1x.png
similarity index 100%
rename from imgs/icons/3241.png
rename to imgs/icons/3241@1x.png
diff --git a/imgs/icons/3241@2x.png b/imgs/icons/3241@2x.png
new file mode 100644
index 000000000..abc973ec8
Binary files /dev/null and b/imgs/icons/3241@2x.png differ
diff --git a/imgs/icons/3246.png b/imgs/icons/3246@1x.png
similarity index 100%
rename from imgs/icons/3246.png
rename to imgs/icons/3246@1x.png
diff --git a/imgs/icons/3246@2x.png b/imgs/icons/3246@2x.png
new file mode 100644
index 000000000..d99648f96
Binary files /dev/null and b/imgs/icons/3246@2x.png differ
diff --git a/imgs/icons/3247.png b/imgs/icons/3247@1x.png
similarity index 100%
rename from imgs/icons/3247.png
rename to imgs/icons/3247@1x.png
diff --git a/imgs/icons/3247@2x.png b/imgs/icons/3247@2x.png
new file mode 100644
index 000000000..089a9b6ba
Binary files /dev/null and b/imgs/icons/3247@2x.png differ
diff --git a/imgs/icons/3248.png b/imgs/icons/3248@1x.png
similarity index 100%
rename from imgs/icons/3248.png
rename to imgs/icons/3248@1x.png
diff --git a/imgs/icons/3248@2x.png b/imgs/icons/3248@2x.png
new file mode 100644
index 000000000..a6342b870
Binary files /dev/null and b/imgs/icons/3248@2x.png differ
diff --git a/imgs/icons/3249.png b/imgs/icons/3249@1x.png
similarity index 100%
rename from imgs/icons/3249.png
rename to imgs/icons/3249@1x.png
diff --git a/imgs/icons/3249@2x.png b/imgs/icons/3249@2x.png
new file mode 100644
index 000000000..4d7323c27
Binary files /dev/null and b/imgs/icons/3249@2x.png differ
diff --git a/imgs/icons/3250.png b/imgs/icons/3250@1x.png
similarity index 100%
rename from imgs/icons/3250.png
rename to imgs/icons/3250@1x.png
diff --git a/imgs/icons/3250@2x.png b/imgs/icons/3250@2x.png
new file mode 100644
index 000000000..d4cbe0a69
Binary files /dev/null and b/imgs/icons/3250@2x.png differ
diff --git a/imgs/icons/3251.png b/imgs/icons/3251@1x.png
similarity index 100%
rename from imgs/icons/3251.png
rename to imgs/icons/3251@1x.png
diff --git a/imgs/icons/3251@2x.png b/imgs/icons/3251@2x.png
new file mode 100644
index 000000000..a716fa33f
Binary files /dev/null and b/imgs/icons/3251@2x.png differ
diff --git a/imgs/icons/3252.png b/imgs/icons/3252@1x.png
similarity index 100%
rename from imgs/icons/3252.png
rename to imgs/icons/3252@1x.png
diff --git a/imgs/icons/3252@2x.png b/imgs/icons/3252@2x.png
new file mode 100644
index 000000000..0110c3b6c
Binary files /dev/null and b/imgs/icons/3252@2x.png differ
diff --git a/imgs/icons/3253.png b/imgs/icons/3253@1x.png
similarity index 100%
rename from imgs/icons/3253.png
rename to imgs/icons/3253@1x.png
diff --git a/imgs/icons/3253@2x.png b/imgs/icons/3253@2x.png
new file mode 100644
index 000000000..235812359
Binary files /dev/null and b/imgs/icons/3253@2x.png differ
diff --git a/imgs/icons/3254.png b/imgs/icons/3254@1x.png
similarity index 100%
rename from imgs/icons/3254.png
rename to imgs/icons/3254@1x.png
diff --git a/imgs/icons/3254@2x.png b/imgs/icons/3254@2x.png
new file mode 100644
index 000000000..1cc0d45f9
Binary files /dev/null and b/imgs/icons/3254@2x.png differ
diff --git a/imgs/icons/3255.png b/imgs/icons/3255@1x.png
similarity index 100%
rename from imgs/icons/3255.png
rename to imgs/icons/3255@1x.png
diff --git a/imgs/icons/3255@2x.png b/imgs/icons/3255@2x.png
new file mode 100644
index 000000000..5d55f72f5
Binary files /dev/null and b/imgs/icons/3255@2x.png differ
diff --git a/imgs/icons/3256.png b/imgs/icons/3256@1x.png
similarity index 100%
rename from imgs/icons/3256.png
rename to imgs/icons/3256@1x.png
diff --git a/imgs/icons/3256@2x.png b/imgs/icons/3256@2x.png
new file mode 100644
index 000000000..6f489695c
Binary files /dev/null and b/imgs/icons/3256@2x.png differ
diff --git a/imgs/icons/3257.png b/imgs/icons/3257@1x.png
similarity index 100%
rename from imgs/icons/3257.png
rename to imgs/icons/3257@1x.png
diff --git a/imgs/icons/3257@2x.png b/imgs/icons/3257@2x.png
new file mode 100644
index 000000000..cb69ddaea
Binary files /dev/null and b/imgs/icons/3257@2x.png differ
diff --git a/imgs/icons/3258.png b/imgs/icons/3258@1x.png
similarity index 100%
rename from imgs/icons/3258.png
rename to imgs/icons/3258@1x.png
diff --git a/imgs/icons/3258@2x.png b/imgs/icons/3258@2x.png
new file mode 100644
index 000000000..6a52836de
Binary files /dev/null and b/imgs/icons/3258@2x.png differ
diff --git a/imgs/icons/3259.png b/imgs/icons/3259@1x.png
similarity index 100%
rename from imgs/icons/3259.png
rename to imgs/icons/3259@1x.png
diff --git a/imgs/icons/3259@2x.png b/imgs/icons/3259@2x.png
new file mode 100644
index 000000000..73fa8c7d5
Binary files /dev/null and b/imgs/icons/3259@2x.png differ
diff --git a/imgs/icons/3260.png b/imgs/icons/3260@1x.png
similarity index 100%
rename from imgs/icons/3260.png
rename to imgs/icons/3260@1x.png
diff --git a/imgs/icons/3260@2x.png b/imgs/icons/3260@2x.png
new file mode 100644
index 000000000..d140d37a0
Binary files /dev/null and b/imgs/icons/3260@2x.png differ
diff --git a/imgs/icons/3261.png b/imgs/icons/3261@1x.png
similarity index 100%
rename from imgs/icons/3261.png
rename to imgs/icons/3261@1x.png
diff --git a/imgs/icons/3261@2x.png b/imgs/icons/3261@2x.png
new file mode 100644
index 000000000..8531f716a
Binary files /dev/null and b/imgs/icons/3261@2x.png differ
diff --git a/imgs/icons/3262.png b/imgs/icons/3262@1x.png
similarity index 100%
rename from imgs/icons/3262.png
rename to imgs/icons/3262@1x.png
diff --git a/imgs/icons/3262@2x.png b/imgs/icons/3262@2x.png
new file mode 100644
index 000000000..3e765ceaa
Binary files /dev/null and b/imgs/icons/3262@2x.png differ
diff --git a/imgs/icons/3263.png b/imgs/icons/3263@1x.png
similarity index 100%
rename from imgs/icons/3263.png
rename to imgs/icons/3263@1x.png
diff --git a/imgs/icons/3263@2x.png b/imgs/icons/3263@2x.png
new file mode 100644
index 000000000..c50eaf87b
Binary files /dev/null and b/imgs/icons/3263@2x.png differ
diff --git a/imgs/icons/3264.png b/imgs/icons/3264@1x.png
similarity index 100%
rename from imgs/icons/3264.png
rename to imgs/icons/3264@1x.png
diff --git a/imgs/icons/3264@2x.png b/imgs/icons/3264@2x.png
new file mode 100644
index 000000000..0ce57b880
Binary files /dev/null and b/imgs/icons/3264@2x.png differ
diff --git a/imgs/icons/3265.png b/imgs/icons/3265@1x.png
similarity index 100%
rename from imgs/icons/3265.png
rename to imgs/icons/3265@1x.png
diff --git a/imgs/icons/3265@2x.png b/imgs/icons/3265@2x.png
new file mode 100644
index 000000000..08b33c663
Binary files /dev/null and b/imgs/icons/3265@2x.png differ
diff --git a/imgs/icons/3266.png b/imgs/icons/3266@1x.png
similarity index 100%
rename from imgs/icons/3266.png
rename to imgs/icons/3266@1x.png
diff --git a/imgs/icons/3266@2x.png b/imgs/icons/3266@2x.png
new file mode 100644
index 000000000..782ef5bff
Binary files /dev/null and b/imgs/icons/3266@2x.png differ
diff --git a/imgs/icons/3278.png b/imgs/icons/3278@1x.png
similarity index 100%
rename from imgs/icons/3278.png
rename to imgs/icons/3278@1x.png
diff --git a/imgs/icons/3278@2x.png b/imgs/icons/3278@2x.png
new file mode 100644
index 000000000..e2423a510
Binary files /dev/null and b/imgs/icons/3278@2x.png differ
diff --git a/imgs/icons/3279.png b/imgs/icons/3279@1x.png
similarity index 100%
rename from imgs/icons/3279.png
rename to imgs/icons/3279@1x.png
diff --git a/imgs/icons/3279@2x.png b/imgs/icons/3279@2x.png
new file mode 100644
index 000000000..7fc15d6a1
Binary files /dev/null and b/imgs/icons/3279@2x.png differ
diff --git a/imgs/icons/3280.png b/imgs/icons/3280@1x.png
similarity index 100%
rename from imgs/icons/3280.png
rename to imgs/icons/3280@1x.png
diff --git a/imgs/icons/3280@2x.png b/imgs/icons/3280@2x.png
new file mode 100644
index 000000000..6f097a9a1
Binary files /dev/null and b/imgs/icons/3280@2x.png differ
diff --git a/imgs/icons/3281.png b/imgs/icons/3281@1x.png
similarity index 100%
rename from imgs/icons/3281.png
rename to imgs/icons/3281@1x.png
diff --git a/imgs/icons/3281@2x.png b/imgs/icons/3281@2x.png
new file mode 100644
index 000000000..55bf517d7
Binary files /dev/null and b/imgs/icons/3281@2x.png differ
diff --git a/imgs/icons/3282.png b/imgs/icons/3282@1x.png
similarity index 100%
rename from imgs/icons/3282.png
rename to imgs/icons/3282@1x.png
diff --git a/imgs/icons/3282@2x.png b/imgs/icons/3282@2x.png
new file mode 100644
index 000000000..458601c60
Binary files /dev/null and b/imgs/icons/3282@2x.png differ
diff --git a/imgs/icons/3283.png b/imgs/icons/3283@1x.png
similarity index 100%
rename from imgs/icons/3283.png
rename to imgs/icons/3283@1x.png
diff --git a/imgs/icons/3283@2x.png b/imgs/icons/3283@2x.png
new file mode 100644
index 000000000..48a3965e3
Binary files /dev/null and b/imgs/icons/3283@2x.png differ
diff --git a/imgs/icons/3300.png b/imgs/icons/3300@1x.png
similarity index 100%
rename from imgs/icons/3300.png
rename to imgs/icons/3300@1x.png
diff --git a/imgs/icons/3300@2x.png b/imgs/icons/3300@2x.png
new file mode 100644
index 000000000..908c64708
Binary files /dev/null and b/imgs/icons/3300@2x.png differ
diff --git a/imgs/icons/3302.png b/imgs/icons/3302@1x.png
similarity index 100%
rename from imgs/icons/3302.png
rename to imgs/icons/3302@1x.png
diff --git a/imgs/icons/3302@2x.png b/imgs/icons/3302@2x.png
new file mode 100644
index 000000000..943730678
Binary files /dev/null and b/imgs/icons/3302@2x.png differ
diff --git a/imgs/icons/3303.png b/imgs/icons/3303@1x.png
similarity index 100%
rename from imgs/icons/3303.png
rename to imgs/icons/3303@1x.png
diff --git a/imgs/icons/3303@2x.png b/imgs/icons/3303@2x.png
new file mode 100644
index 000000000..e317685f6
Binary files /dev/null and b/imgs/icons/3303@2x.png differ
diff --git a/imgs/icons/3304.png b/imgs/icons/3304@1x.png
similarity index 100%
rename from imgs/icons/3304.png
rename to imgs/icons/3304@1x.png
diff --git a/imgs/icons/3304@2x.png b/imgs/icons/3304@2x.png
new file mode 100644
index 000000000..0e65107d6
Binary files /dev/null and b/imgs/icons/3304@2x.png differ
diff --git a/imgs/icons/3305.png b/imgs/icons/3305@1x.png
similarity index 100%
rename from imgs/icons/3305.png
rename to imgs/icons/3305@1x.png
diff --git a/imgs/icons/3305@2x.png b/imgs/icons/3305@2x.png
new file mode 100644
index 000000000..499be17de
Binary files /dev/null and b/imgs/icons/3305@2x.png differ
diff --git a/imgs/icons/3306.png b/imgs/icons/3306@1x.png
similarity index 100%
rename from imgs/icons/3306.png
rename to imgs/icons/3306@1x.png
diff --git a/imgs/icons/3306@2x.png b/imgs/icons/3306@2x.png
new file mode 100644
index 000000000..9234b9be9
Binary files /dev/null and b/imgs/icons/3306@2x.png differ
diff --git a/imgs/icons/3307.png b/imgs/icons/3307@1x.png
similarity index 100%
rename from imgs/icons/3307.png
rename to imgs/icons/3307@1x.png
diff --git a/imgs/icons/3307@2x.png b/imgs/icons/3307@2x.png
new file mode 100644
index 000000000..c792d88dc
Binary files /dev/null and b/imgs/icons/3307@2x.png differ
diff --git a/imgs/icons/3308.png b/imgs/icons/3308@1x.png
similarity index 100%
rename from imgs/icons/3308.png
rename to imgs/icons/3308@1x.png
diff --git a/imgs/icons/3308@2x.png b/imgs/icons/3308@2x.png
new file mode 100644
index 000000000..6201b2f4b
Binary files /dev/null and b/imgs/icons/3308@2x.png differ
diff --git a/imgs/icons/3309.png b/imgs/icons/3309@1x.png
similarity index 100%
rename from imgs/icons/3309.png
rename to imgs/icons/3309@1x.png
diff --git a/imgs/icons/3309@2x.png b/imgs/icons/3309@2x.png
new file mode 100644
index 000000000..14a08680b
Binary files /dev/null and b/imgs/icons/3309@2x.png differ
diff --git a/imgs/icons/3310.png b/imgs/icons/3310@1x.png
similarity index 100%
rename from imgs/icons/3310.png
rename to imgs/icons/3310@1x.png
diff --git a/imgs/icons/3310@2x.png b/imgs/icons/3310@2x.png
new file mode 100644
index 000000000..0a57e88e1
Binary files /dev/null and b/imgs/icons/3310@2x.png differ
diff --git a/imgs/icons/3311.png b/imgs/icons/3311@1x.png
similarity index 100%
rename from imgs/icons/3311.png
rename to imgs/icons/3311@1x.png
diff --git a/imgs/icons/3311@2x.png b/imgs/icons/3311@2x.png
new file mode 100644
index 000000000..9f29b8f38
Binary files /dev/null and b/imgs/icons/3311@2x.png differ
diff --git a/imgs/icons/3312.png b/imgs/icons/3312@1x.png
similarity index 100%
rename from imgs/icons/3312.png
rename to imgs/icons/3312@1x.png
diff --git a/imgs/icons/3312@2x.png b/imgs/icons/3312@2x.png
new file mode 100644
index 000000000..a454d1c7c
Binary files /dev/null and b/imgs/icons/3312@2x.png differ
diff --git a/imgs/icons/3313.png b/imgs/icons/3313@1x.png
similarity index 100%
rename from imgs/icons/3313.png
rename to imgs/icons/3313@1x.png
diff --git a/imgs/icons/3313@2x.png b/imgs/icons/3313@2x.png
new file mode 100644
index 000000000..e12f9ed08
Binary files /dev/null and b/imgs/icons/3313@2x.png differ
diff --git a/imgs/icons/3314.png b/imgs/icons/3314@1x.png
similarity index 100%
rename from imgs/icons/3314.png
rename to imgs/icons/3314@1x.png
diff --git a/imgs/icons/3314@2x.png b/imgs/icons/3314@2x.png
new file mode 100644
index 000000000..67d476267
Binary files /dev/null and b/imgs/icons/3314@2x.png differ
diff --git a/imgs/icons/3315.png b/imgs/icons/3315@1x.png
similarity index 100%
rename from imgs/icons/3315.png
rename to imgs/icons/3315@1x.png
diff --git a/imgs/icons/3315@2x.png b/imgs/icons/3315@2x.png
new file mode 100644
index 000000000..2f46b7961
Binary files /dev/null and b/imgs/icons/3315@2x.png differ
diff --git a/imgs/icons/3316.png b/imgs/icons/3316@1x.png
similarity index 100%
rename from imgs/icons/3316.png
rename to imgs/icons/3316@1x.png
diff --git a/imgs/icons/3316@2x.png b/imgs/icons/3316@2x.png
new file mode 100644
index 000000000..5c78fdfe3
Binary files /dev/null and b/imgs/icons/3316@2x.png differ
diff --git a/imgs/icons/3317.png b/imgs/icons/3317@1x.png
similarity index 100%
rename from imgs/icons/3317.png
rename to imgs/icons/3317@1x.png
diff --git a/imgs/icons/3317@2x.png b/imgs/icons/3317@2x.png
new file mode 100644
index 000000000..718d316fe
Binary files /dev/null and b/imgs/icons/3317@2x.png differ
diff --git a/imgs/icons/3318.png b/imgs/icons/3318@1x.png
similarity index 100%
rename from imgs/icons/3318.png
rename to imgs/icons/3318@1x.png
diff --git a/imgs/icons/3318@2x.png b/imgs/icons/3318@2x.png
new file mode 100644
index 000000000..4ba9457ec
Binary files /dev/null and b/imgs/icons/3318@2x.png differ
diff --git a/imgs/icons/3319.png b/imgs/icons/3319@1x.png
similarity index 100%
rename from imgs/icons/3319.png
rename to imgs/icons/3319@1x.png
diff --git a/imgs/icons/3319@2x.png b/imgs/icons/3319@2x.png
new file mode 100644
index 000000000..facbcfb16
Binary files /dev/null and b/imgs/icons/3319@2x.png differ
diff --git a/imgs/icons/3320.png b/imgs/icons/3320@1x.png
similarity index 100%
rename from imgs/icons/3320.png
rename to imgs/icons/3320@1x.png
diff --git a/imgs/icons/3320@2x.png b/imgs/icons/3320@2x.png
new file mode 100644
index 000000000..c449ab395
Binary files /dev/null and b/imgs/icons/3320@2x.png differ
diff --git a/imgs/icons/3321.png b/imgs/icons/3321@1x.png
similarity index 100%
rename from imgs/icons/3321.png
rename to imgs/icons/3321@1x.png
diff --git a/imgs/icons/3321@2x.png b/imgs/icons/3321@2x.png
new file mode 100644
index 000000000..00b079465
Binary files /dev/null and b/imgs/icons/3321@2x.png differ
diff --git a/imgs/icons/3322.png b/imgs/icons/3322@1x.png
similarity index 100%
rename from imgs/icons/3322.png
rename to imgs/icons/3322@1x.png
diff --git a/imgs/icons/3322@2x.png b/imgs/icons/3322@2x.png
new file mode 100644
index 000000000..7c34e301b
Binary files /dev/null and b/imgs/icons/3322@2x.png differ
diff --git a/imgs/icons/3323.png b/imgs/icons/3323@1x.png
similarity index 100%
rename from imgs/icons/3323.png
rename to imgs/icons/3323@1x.png
diff --git a/imgs/icons/3323@2x.png b/imgs/icons/3323@2x.png
new file mode 100644
index 000000000..8e7535eb8
Binary files /dev/null and b/imgs/icons/3323@2x.png differ
diff --git a/imgs/icons/3324.png b/imgs/icons/3324@1x.png
similarity index 100%
rename from imgs/icons/3324.png
rename to imgs/icons/3324@1x.png
diff --git a/imgs/icons/3324@2x.png b/imgs/icons/3324@2x.png
new file mode 100644
index 000000000..f14c174a5
Binary files /dev/null and b/imgs/icons/3324@2x.png differ
diff --git a/imgs/icons/3325.png b/imgs/icons/3325@1x.png
similarity index 100%
rename from imgs/icons/3325.png
rename to imgs/icons/3325@1x.png
diff --git a/imgs/icons/3325@2x.png b/imgs/icons/3325@2x.png
new file mode 100644
index 000000000..b79d27b90
Binary files /dev/null and b/imgs/icons/3325@2x.png differ
diff --git a/imgs/icons/3326.png b/imgs/icons/3326@1x.png
similarity index 100%
rename from imgs/icons/3326.png
rename to imgs/icons/3326@1x.png
diff --git a/imgs/icons/3326@2x.png b/imgs/icons/3326@2x.png
new file mode 100644
index 000000000..f42228789
Binary files /dev/null and b/imgs/icons/3326@2x.png differ
diff --git a/imgs/icons/3327.png b/imgs/icons/3327@1x.png
similarity index 100%
rename from imgs/icons/3327.png
rename to imgs/icons/3327@1x.png
diff --git a/imgs/icons/3327@2x.png b/imgs/icons/3327@2x.png
new file mode 100644
index 000000000..229e5456c
Binary files /dev/null and b/imgs/icons/3327@2x.png differ
diff --git a/imgs/icons/3328.png b/imgs/icons/3328@1x.png
similarity index 100%
rename from imgs/icons/3328.png
rename to imgs/icons/3328@1x.png
diff --git a/imgs/icons/3328@2x.png b/imgs/icons/3328@2x.png
new file mode 100644
index 000000000..94a1f6554
Binary files /dev/null and b/imgs/icons/3328@2x.png differ
diff --git a/imgs/icons/3329.png b/imgs/icons/3329@1x.png
similarity index 100%
rename from imgs/icons/3329.png
rename to imgs/icons/3329@1x.png
diff --git a/imgs/icons/3329@2x.png b/imgs/icons/3329@2x.png
new file mode 100644
index 000000000..33ef76488
Binary files /dev/null and b/imgs/icons/3329@2x.png differ
diff --git a/imgs/icons/3330.png b/imgs/icons/3330@1x.png
similarity index 100%
rename from imgs/icons/3330.png
rename to imgs/icons/3330@1x.png
diff --git a/imgs/icons/3330@2x.png b/imgs/icons/3330@2x.png
new file mode 100644
index 000000000..104a2719a
Binary files /dev/null and b/imgs/icons/3330@2x.png differ
diff --git a/imgs/icons/3333.png b/imgs/icons/3333@1x.png
similarity index 100%
rename from imgs/icons/3333.png
rename to imgs/icons/3333@1x.png
diff --git a/imgs/icons/3333@2x.png b/imgs/icons/3333@2x.png
new file mode 100644
index 000000000..52fd6e775
Binary files /dev/null and b/imgs/icons/3333@2x.png differ
diff --git a/imgs/icons/3334.png b/imgs/icons/3334@1x.png
similarity index 100%
rename from imgs/icons/3334.png
rename to imgs/icons/3334@1x.png
diff --git a/imgs/icons/3334@2x.png b/imgs/icons/3334@2x.png
new file mode 100644
index 000000000..c99377b8b
Binary files /dev/null and b/imgs/icons/3334@2x.png differ
diff --git a/imgs/icons/3335.png b/imgs/icons/3335@1x.png
similarity index 100%
rename from imgs/icons/3335.png
rename to imgs/icons/3335@1x.png
diff --git a/imgs/icons/3335@2x.png b/imgs/icons/3335@2x.png
new file mode 100644
index 000000000..9a2c1ca36
Binary files /dev/null and b/imgs/icons/3335@2x.png differ
diff --git a/imgs/icons/3336.png b/imgs/icons/3336@1x.png
similarity index 100%
rename from imgs/icons/3336.png
rename to imgs/icons/3336@1x.png
diff --git a/imgs/icons/3336@2x.png b/imgs/icons/3336@2x.png
new file mode 100644
index 000000000..374b0f3f2
Binary files /dev/null and b/imgs/icons/3336@2x.png differ
diff --git a/imgs/icons/3337.png b/imgs/icons/3337@1x.png
similarity index 100%
rename from imgs/icons/3337.png
rename to imgs/icons/3337@1x.png
diff --git a/imgs/icons/3337@2x.png b/imgs/icons/3337@2x.png
new file mode 100644
index 000000000..495903647
Binary files /dev/null and b/imgs/icons/3337@2x.png differ
diff --git a/imgs/icons/3338.png b/imgs/icons/3338@1x.png
similarity index 100%
rename from imgs/icons/3338.png
rename to imgs/icons/3338@1x.png
diff --git a/imgs/icons/3338@2x.png b/imgs/icons/3338@2x.png
new file mode 100644
index 000000000..d2489ee02
Binary files /dev/null and b/imgs/icons/3338@2x.png differ
diff --git a/imgs/icons/3339.png b/imgs/icons/3339@1x.png
similarity index 100%
rename from imgs/icons/3339.png
rename to imgs/icons/3339@1x.png
diff --git a/imgs/icons/3339@2x.png b/imgs/icons/3339@2x.png
new file mode 100644
index 000000000..394ccb954
Binary files /dev/null and b/imgs/icons/3339@2x.png differ
diff --git a/imgs/icons/3340.png b/imgs/icons/3340@1x.png
similarity index 100%
rename from imgs/icons/3340.png
rename to imgs/icons/3340@1x.png
diff --git a/imgs/icons/3340@2x.png b/imgs/icons/3340@2x.png
new file mode 100644
index 000000000..8802fcd93
Binary files /dev/null and b/imgs/icons/3340@2x.png differ
diff --git a/imgs/icons/3341.png b/imgs/icons/3341@1x.png
similarity index 100%
rename from imgs/icons/3341.png
rename to imgs/icons/3341@1x.png
diff --git a/imgs/icons/3341@2x.png b/imgs/icons/3341@2x.png
new file mode 100644
index 000000000..4fe2d853f
Binary files /dev/null and b/imgs/icons/3341@2x.png differ
diff --git a/imgs/icons/3342.png b/imgs/icons/3342@1x.png
similarity index 100%
rename from imgs/icons/3342.png
rename to imgs/icons/3342@1x.png
diff --git a/imgs/icons/3342@2x.png b/imgs/icons/3342@2x.png
new file mode 100644
index 000000000..31db01b99
Binary files /dev/null and b/imgs/icons/3342@2x.png differ
diff --git a/imgs/icons/3343.png b/imgs/icons/3343@1x.png
similarity index 100%
rename from imgs/icons/3343.png
rename to imgs/icons/3343@1x.png
diff --git a/imgs/icons/3343@2x.png b/imgs/icons/3343@2x.png
new file mode 100644
index 000000000..27097f8e2
Binary files /dev/null and b/imgs/icons/3343@2x.png differ
diff --git a/imgs/icons/3344.png b/imgs/icons/3344@1x.png
similarity index 100%
rename from imgs/icons/3344.png
rename to imgs/icons/3344@1x.png
diff --git a/imgs/icons/3344@2x.png b/imgs/icons/3344@2x.png
new file mode 100644
index 000000000..1fe845338
Binary files /dev/null and b/imgs/icons/3344@2x.png differ
diff --git a/imgs/icons/3345.png b/imgs/icons/3345@1x.png
similarity index 100%
rename from imgs/icons/3345.png
rename to imgs/icons/3345@1x.png
diff --git a/imgs/icons/3345@2x.png b/imgs/icons/3345@2x.png
new file mode 100644
index 000000000..f448325a0
Binary files /dev/null and b/imgs/icons/3345@2x.png differ
diff --git a/imgs/icons/3346.png b/imgs/icons/3346@1x.png
similarity index 100%
rename from imgs/icons/3346.png
rename to imgs/icons/3346@1x.png
diff --git a/imgs/icons/3346@2x.png b/imgs/icons/3346@2x.png
new file mode 100644
index 000000000..df0828e8b
Binary files /dev/null and b/imgs/icons/3346@2x.png differ
diff --git a/imgs/icons/3347.png b/imgs/icons/3347@1x.png
similarity index 100%
rename from imgs/icons/3347.png
rename to imgs/icons/3347@1x.png
diff --git a/imgs/icons/3347@2x.png b/imgs/icons/3347@2x.png
new file mode 100644
index 000000000..8c0eeb54a
Binary files /dev/null and b/imgs/icons/3347@2x.png differ
diff --git a/imgs/icons/3348.png b/imgs/icons/3348@1x.png
similarity index 100%
rename from imgs/icons/3348.png
rename to imgs/icons/3348@1x.png
diff --git a/imgs/icons/3348@2x.png b/imgs/icons/3348@2x.png
new file mode 100644
index 000000000..258e7a905
Binary files /dev/null and b/imgs/icons/3348@2x.png differ
diff --git a/imgs/icons/33.png b/imgs/icons/33@1x.png
similarity index 100%
rename from imgs/icons/33.png
rename to imgs/icons/33@1x.png
diff --git a/imgs/icons/33@2x.png b/imgs/icons/33@2x.png
new file mode 100644
index 000000000..2093f5222
Binary files /dev/null and b/imgs/icons/33@2x.png differ
diff --git a/imgs/icons/3433.png b/imgs/icons/3433@1x.png
similarity index 100%
rename from imgs/icons/3433.png
rename to imgs/icons/3433@1x.png
diff --git a/imgs/icons/3433@2x.png b/imgs/icons/3433@2x.png
new file mode 100644
index 000000000..9fca69ebc
Binary files /dev/null and b/imgs/icons/3433@2x.png differ
diff --git a/imgs/icons/3435.png b/imgs/icons/3435@1x.png
similarity index 100%
rename from imgs/icons/3435.png
rename to imgs/icons/3435@1x.png
diff --git a/imgs/icons/3435@2x.png b/imgs/icons/3435@2x.png
new file mode 100644
index 000000000..d46adc44a
Binary files /dev/null and b/imgs/icons/3435@2x.png differ
diff --git a/imgs/icons/3436.png b/imgs/icons/3436@1x.png
similarity index 100%
rename from imgs/icons/3436.png
rename to imgs/icons/3436@1x.png
diff --git a/imgs/icons/3436@2x.png b/imgs/icons/3436@2x.png
new file mode 100644
index 000000000..6ef151762
Binary files /dev/null and b/imgs/icons/3436@2x.png differ
diff --git a/imgs/icons/3437.png b/imgs/icons/3437@1x.png
similarity index 100%
rename from imgs/icons/3437.png
rename to imgs/icons/3437@1x.png
diff --git a/imgs/icons/3437@2x.png b/imgs/icons/3437@2x.png
new file mode 100644
index 000000000..aa72ff4df
Binary files /dev/null and b/imgs/icons/3437@2x.png differ
diff --git a/imgs/icons/3438.png b/imgs/icons/3438@1x.png
similarity index 100%
rename from imgs/icons/3438.png
rename to imgs/icons/3438@1x.png
diff --git a/imgs/icons/3438@2x.png b/imgs/icons/3438@2x.png
new file mode 100644
index 000000000..08bc7f5d8
Binary files /dev/null and b/imgs/icons/3438@2x.png differ
diff --git a/imgs/icons/3439.png b/imgs/icons/3439@1x.png
similarity index 100%
rename from imgs/icons/3439.png
rename to imgs/icons/3439@1x.png
diff --git a/imgs/icons/3439@2x.png b/imgs/icons/3439@2x.png
new file mode 100644
index 000000000..bfde70208
Binary files /dev/null and b/imgs/icons/3439@2x.png differ
diff --git a/imgs/icons/3440.png b/imgs/icons/3440@1x.png
similarity index 100%
rename from imgs/icons/3440.png
rename to imgs/icons/3440@1x.png
diff --git a/imgs/icons/3440@2x.png b/imgs/icons/3440@2x.png
new file mode 100644
index 000000000..db0839bfa
Binary files /dev/null and b/imgs/icons/3440@2x.png differ
diff --git a/imgs/icons/3441.png b/imgs/icons/3441@1x.png
similarity index 100%
rename from imgs/icons/3441.png
rename to imgs/icons/3441@1x.png
diff --git a/imgs/icons/3441@2x.png b/imgs/icons/3441@2x.png
new file mode 100644
index 000000000..9e32bbbba
Binary files /dev/null and b/imgs/icons/3441@2x.png differ
diff --git a/imgs/icons/3442.png b/imgs/icons/3442@1x.png
similarity index 100%
rename from imgs/icons/3442.png
rename to imgs/icons/3442@1x.png
diff --git a/imgs/icons/3442@2x.png b/imgs/icons/3442@2x.png
new file mode 100644
index 000000000..2504c9b17
Binary files /dev/null and b/imgs/icons/3442@2x.png differ
diff --git a/imgs/icons/3443.png b/imgs/icons/3443@1x.png
similarity index 100%
rename from imgs/icons/3443.png
rename to imgs/icons/3443@1x.png
diff --git a/imgs/icons/3443@2x.png b/imgs/icons/3443@2x.png
new file mode 100644
index 000000000..6f19f2f25
Binary files /dev/null and b/imgs/icons/3443@2x.png differ
diff --git a/imgs/icons/3444.png b/imgs/icons/3444@1x.png
similarity index 100%
rename from imgs/icons/3444.png
rename to imgs/icons/3444@1x.png
diff --git a/imgs/icons/3444@2x.png b/imgs/icons/3444@2x.png
new file mode 100644
index 000000000..ee70ae2b4
Binary files /dev/null and b/imgs/icons/3444@2x.png differ
diff --git a/imgs/icons/3445.png b/imgs/icons/3445@1x.png
similarity index 100%
rename from imgs/icons/3445.png
rename to imgs/icons/3445@1x.png
diff --git a/imgs/icons/3445@2x.png b/imgs/icons/3445@2x.png
new file mode 100644
index 000000000..7aecdbcca
Binary files /dev/null and b/imgs/icons/3445@2x.png differ
diff --git a/imgs/icons/3446.png b/imgs/icons/3446@1x.png
similarity index 100%
rename from imgs/icons/3446.png
rename to imgs/icons/3446@1x.png
diff --git a/imgs/icons/3446@2x.png b/imgs/icons/3446@2x.png
new file mode 100644
index 000000000..ad6a8c87b
Binary files /dev/null and b/imgs/icons/3446@2x.png differ
diff --git a/imgs/icons/3447.png b/imgs/icons/3447@1x.png
similarity index 100%
rename from imgs/icons/3447.png
rename to imgs/icons/3447@1x.png
diff --git a/imgs/icons/3447@2x.png b/imgs/icons/3447@2x.png
new file mode 100644
index 000000000..1cbc13e30
Binary files /dev/null and b/imgs/icons/3447@2x.png differ
diff --git a/imgs/icons/3448.png b/imgs/icons/3448@1x.png
similarity index 100%
rename from imgs/icons/3448.png
rename to imgs/icons/3448@1x.png
diff --git a/imgs/icons/3448@2x.png b/imgs/icons/3448@2x.png
new file mode 100644
index 000000000..c144e4b94
Binary files /dev/null and b/imgs/icons/3448@2x.png differ
diff --git a/imgs/icons/3449.png b/imgs/icons/3449@1x.png
similarity index 100%
rename from imgs/icons/3449.png
rename to imgs/icons/3449@1x.png
diff --git a/imgs/icons/3449@2x.png b/imgs/icons/3449@2x.png
new file mode 100644
index 000000000..81fb4b6a0
Binary files /dev/null and b/imgs/icons/3449@2x.png differ
diff --git a/imgs/icons/3450.png b/imgs/icons/3450@1x.png
similarity index 100%
rename from imgs/icons/3450.png
rename to imgs/icons/3450@1x.png
diff --git a/imgs/icons/3450@2x.png b/imgs/icons/3450@2x.png
new file mode 100644
index 000000000..bc05ad81d
Binary files /dev/null and b/imgs/icons/3450@2x.png differ
diff --git a/imgs/icons/349.png b/imgs/icons/349@1x.png
similarity index 100%
rename from imgs/icons/349.png
rename to imgs/icons/349@1x.png
diff --git a/imgs/icons/349@2x.png b/imgs/icons/349@2x.png
new file mode 100644
index 000000000..112981d9f
Binary files /dev/null and b/imgs/icons/349@2x.png differ
diff --git a/imgs/icons/34.png b/imgs/icons/34@1x.png
similarity index 100%
rename from imgs/icons/34.png
rename to imgs/icons/34@1x.png
diff --git a/imgs/icons/34@2x.png b/imgs/icons/34@2x.png
new file mode 100644
index 000000000..4ddff50c7
Binary files /dev/null and b/imgs/icons/34@2x.png differ
diff --git a/imgs/icons/350.png b/imgs/icons/350@1x.png
similarity index 100%
rename from imgs/icons/350.png
rename to imgs/icons/350@1x.png
diff --git a/imgs/icons/350@2x.png b/imgs/icons/350@2x.png
new file mode 100644
index 000000000..cb2d7f9cf
Binary files /dev/null and b/imgs/icons/350@2x.png differ
diff --git a/imgs/icons/352.png b/imgs/icons/352@1x.png
similarity index 100%
rename from imgs/icons/352.png
rename to imgs/icons/352@1x.png
diff --git a/imgs/icons/352@2x.png b/imgs/icons/352@2x.png
new file mode 100644
index 000000000..63009485c
Binary files /dev/null and b/imgs/icons/352@2x.png differ
diff --git a/imgs/icons/355.png b/imgs/icons/355@1x.png
similarity index 100%
rename from imgs/icons/355.png
rename to imgs/icons/355@1x.png
diff --git a/imgs/icons/355@2x.png b/imgs/icons/355@2x.png
new file mode 100644
index 000000000..d3dc75196
Binary files /dev/null and b/imgs/icons/355@2x.png differ
diff --git a/imgs/icons/356.png b/imgs/icons/356@1x.png
similarity index 100%
rename from imgs/icons/356.png
rename to imgs/icons/356@1x.png
diff --git a/imgs/icons/356@2x.png b/imgs/icons/356@2x.png
new file mode 100644
index 000000000..0777f64a1
Binary files /dev/null and b/imgs/icons/356@2x.png differ
diff --git a/imgs/icons/360.png b/imgs/icons/360@1x.png
similarity index 100%
rename from imgs/icons/360.png
rename to imgs/icons/360@1x.png
diff --git a/imgs/icons/360@2x.png b/imgs/icons/360@2x.png
new file mode 100644
index 000000000..9f80419b1
Binary files /dev/null and b/imgs/icons/360@2x.png differ
diff --git a/imgs/icons/361.png b/imgs/icons/361@1x.png
similarity index 100%
rename from imgs/icons/361.png
rename to imgs/icons/361@1x.png
diff --git a/imgs/icons/361@2x.png b/imgs/icons/361@2x.png
new file mode 100644
index 000000000..41bb2a10a
Binary files /dev/null and b/imgs/icons/361@2x.png differ
diff --git a/imgs/icons/3631.png b/imgs/icons/3631@1x.png
similarity index 100%
rename from imgs/icons/3631.png
rename to imgs/icons/3631@1x.png
diff --git a/imgs/icons/3631@2x.png b/imgs/icons/3631@2x.png
new file mode 100644
index 000000000..c2053c5cd
Binary files /dev/null and b/imgs/icons/3631@2x.png differ
diff --git a/imgs/icons/3636.png b/imgs/icons/3636@1x.png
similarity index 100%
rename from imgs/icons/3636.png
rename to imgs/icons/3636@1x.png
diff --git a/imgs/icons/3636@2x.png b/imgs/icons/3636@2x.png
new file mode 100644
index 000000000..9967ff446
Binary files /dev/null and b/imgs/icons/3636@2x.png differ
diff --git a/imgs/icons/3641.png b/imgs/icons/3641@1x.png
similarity index 100%
rename from imgs/icons/3641.png
rename to imgs/icons/3641@1x.png
diff --git a/imgs/icons/3641@2x.png b/imgs/icons/3641@2x.png
new file mode 100644
index 000000000..8488fb37b
Binary files /dev/null and b/imgs/icons/3641@2x.png differ
diff --git a/imgs/icons/3646.png b/imgs/icons/3646@1x.png
similarity index 100%
rename from imgs/icons/3646.png
rename to imgs/icons/3646@1x.png
diff --git a/imgs/icons/3646@2x.png b/imgs/icons/3646@2x.png
new file mode 100644
index 000000000..1aa1f3ae2
Binary files /dev/null and b/imgs/icons/3646@2x.png differ
diff --git a/imgs/icons/365.png b/imgs/icons/365@1x.png
similarity index 100%
rename from imgs/icons/365.png
rename to imgs/icons/365@1x.png
diff --git a/imgs/icons/365@2x.png b/imgs/icons/365@2x.png
new file mode 100644
index 000000000..e58e0eaeb
Binary files /dev/null and b/imgs/icons/365@2x.png differ
diff --git a/imgs/icons/366.png b/imgs/icons/366@1x.png
similarity index 100%
rename from imgs/icons/366.png
rename to imgs/icons/366@1x.png
diff --git a/imgs/icons/366@2x.png b/imgs/icons/366@2x.png
new file mode 100644
index 000000000..ef0d636f5
Binary files /dev/null and b/imgs/icons/366@2x.png differ
diff --git a/imgs/icons/370.png b/imgs/icons/370@1x.png
similarity index 100%
rename from imgs/icons/370.png
rename to imgs/icons/370@1x.png
diff --git a/imgs/icons/370@2x.png b/imgs/icons/370@2x.png
new file mode 100644
index 000000000..8d62dd2ef
Binary files /dev/null and b/imgs/icons/370@2x.png differ
diff --git a/imgs/icons/3716.png b/imgs/icons/3716@1x.png
similarity index 100%
rename from imgs/icons/3716.png
rename to imgs/icons/3716@1x.png
diff --git a/imgs/icons/3716@2x.png b/imgs/icons/3716@2x.png
new file mode 100644
index 000000000..579073a1d
Binary files /dev/null and b/imgs/icons/3716@2x.png differ
diff --git a/imgs/icons/3717.png b/imgs/icons/3717@1x.png
similarity index 100%
rename from imgs/icons/3717.png
rename to imgs/icons/3717@1x.png
diff --git a/imgs/icons/3717@2x.png b/imgs/icons/3717@2x.png
new file mode 100644
index 000000000..ccc6c9e50
Binary files /dev/null and b/imgs/icons/3717@2x.png differ
diff --git a/imgs/icons/3718.png b/imgs/icons/3718@1x.png
similarity index 100%
rename from imgs/icons/3718.png
rename to imgs/icons/3718@1x.png
diff --git a/imgs/icons/3718@2x.png b/imgs/icons/3718@2x.png
new file mode 100644
index 000000000..40960a0a9
Binary files /dev/null and b/imgs/icons/3718@2x.png differ
diff --git a/imgs/icons/3719.png b/imgs/icons/3719@1x.png
similarity index 100%
rename from imgs/icons/3719.png
rename to imgs/icons/3719@1x.png
diff --git a/imgs/icons/3719@2x.png b/imgs/icons/3719@2x.png
new file mode 100644
index 000000000..ef98f847f
Binary files /dev/null and b/imgs/icons/3719@2x.png differ
diff --git a/imgs/icons/371.png b/imgs/icons/371@1x.png
similarity index 100%
rename from imgs/icons/371.png
rename to imgs/icons/371@1x.png
diff --git a/imgs/icons/371@2x.png b/imgs/icons/371@2x.png
new file mode 100644
index 000000000..889bd3bf2
Binary files /dev/null and b/imgs/icons/371@2x.png differ
diff --git a/imgs/icons/3720.png b/imgs/icons/3720@1x.png
similarity index 100%
rename from imgs/icons/3720.png
rename to imgs/icons/3720@1x.png
diff --git a/imgs/icons/3720@2x.png b/imgs/icons/3720@2x.png
new file mode 100644
index 000000000..cd8f8f5cc
Binary files /dev/null and b/imgs/icons/3720@2x.png differ
diff --git a/imgs/icons/3721.png b/imgs/icons/3721@1x.png
similarity index 100%
rename from imgs/icons/3721.png
rename to imgs/icons/3721@1x.png
diff --git a/imgs/icons/3721@2x.png b/imgs/icons/3721@2x.png
new file mode 100644
index 000000000..ee49c5e49
Binary files /dev/null and b/imgs/icons/3721@2x.png differ
diff --git a/imgs/icons/3722.png b/imgs/icons/3722@1x.png
similarity index 100%
rename from imgs/icons/3722.png
rename to imgs/icons/3722@1x.png
diff --git a/imgs/icons/3722@2x.png b/imgs/icons/3722@2x.png
new file mode 100644
index 000000000..20aca3b9d
Binary files /dev/null and b/imgs/icons/3722@2x.png differ
diff --git a/imgs/icons/3723.png b/imgs/icons/3723@1x.png
similarity index 100%
rename from imgs/icons/3723.png
rename to imgs/icons/3723@1x.png
diff --git a/imgs/icons/3723@2x.png b/imgs/icons/3723@2x.png
new file mode 100644
index 000000000..00e6cb67a
Binary files /dev/null and b/imgs/icons/3723@2x.png differ
diff --git a/imgs/icons/3724.png b/imgs/icons/3724@1x.png
similarity index 100%
rename from imgs/icons/3724.png
rename to imgs/icons/3724@1x.png
diff --git a/imgs/icons/3724@2x.png b/imgs/icons/3724@2x.png
new file mode 100644
index 000000000..cb2c1ad51
Binary files /dev/null and b/imgs/icons/3724@2x.png differ
diff --git a/imgs/icons/3725.png b/imgs/icons/3725@1x.png
similarity index 100%
rename from imgs/icons/3725.png
rename to imgs/icons/3725@1x.png
diff --git a/imgs/icons/3725@2x.png b/imgs/icons/3725@2x.png
new file mode 100644
index 000000000..a1ca76ba0
Binary files /dev/null and b/imgs/icons/3725@2x.png differ
diff --git a/imgs/icons/3726.png b/imgs/icons/3726@1x.png
similarity index 100%
rename from imgs/icons/3726.png
rename to imgs/icons/3726@1x.png
diff --git a/imgs/icons/3726@2x.png b/imgs/icons/3726@2x.png
new file mode 100644
index 000000000..6e744dfb1
Binary files /dev/null and b/imgs/icons/3726@2x.png differ
diff --git a/imgs/icons/3727.png b/imgs/icons/3727@1x.png
similarity index 100%
rename from imgs/icons/3727.png
rename to imgs/icons/3727@1x.png
diff --git a/imgs/icons/3727@2x.png b/imgs/icons/3727@2x.png
new file mode 100644
index 000000000..85a565fc0
Binary files /dev/null and b/imgs/icons/3727@2x.png differ
diff --git a/imgs/icons/3729.png b/imgs/icons/3729@1x.png
similarity index 100%
rename from imgs/icons/3729.png
rename to imgs/icons/3729@1x.png
diff --git a/imgs/icons/3729@2x.png b/imgs/icons/3729@2x.png
new file mode 100644
index 000000000..0332863cb
Binary files /dev/null and b/imgs/icons/3729@2x.png differ
diff --git a/imgs/icons/3730.png b/imgs/icons/3730@1x.png
similarity index 100%
rename from imgs/icons/3730.png
rename to imgs/icons/3730@1x.png
diff --git a/imgs/icons/3730@2x.png b/imgs/icons/3730@2x.png
new file mode 100644
index 000000000..507f73025
Binary files /dev/null and b/imgs/icons/3730@2x.png differ
diff --git a/imgs/icons/3733.png b/imgs/icons/3733@1x.png
similarity index 100%
rename from imgs/icons/3733.png
rename to imgs/icons/3733@1x.png
diff --git a/imgs/icons/3733@2x.png b/imgs/icons/3733@2x.png
new file mode 100644
index 000000000..2ee6b51ac
Binary files /dev/null and b/imgs/icons/3733@2x.png differ
diff --git a/imgs/icons/3734.png b/imgs/icons/3734@1x.png
similarity index 100%
rename from imgs/icons/3734.png
rename to imgs/icons/3734@1x.png
diff --git a/imgs/icons/3734@2x.png b/imgs/icons/3734@2x.png
new file mode 100644
index 000000000..82047473a
Binary files /dev/null and b/imgs/icons/3734@2x.png differ
diff --git a/imgs/icons/3736.png b/imgs/icons/3736@1x.png
similarity index 100%
rename from imgs/icons/3736.png
rename to imgs/icons/3736@1x.png
diff --git a/imgs/icons/3736@2x.png b/imgs/icons/3736@2x.png
new file mode 100644
index 000000000..551b1a042
Binary files /dev/null and b/imgs/icons/3736@2x.png differ
diff --git a/imgs/icons/3737.png b/imgs/icons/3737@1x.png
similarity index 100%
rename from imgs/icons/3737.png
rename to imgs/icons/3737@1x.png
diff --git a/imgs/icons/3737@2x.png b/imgs/icons/3737@2x.png
new file mode 100644
index 000000000..103a99927
Binary files /dev/null and b/imgs/icons/3737@2x.png differ
diff --git a/imgs/icons/3738.png b/imgs/icons/3738@1x.png
similarity index 100%
rename from imgs/icons/3738.png
rename to imgs/icons/3738@1x.png
diff --git a/imgs/icons/3738@2x.png b/imgs/icons/3738@2x.png
new file mode 100644
index 000000000..77a978478
Binary files /dev/null and b/imgs/icons/3738@2x.png differ
diff --git a/imgs/icons/3739.png b/imgs/icons/3739@1x.png
similarity index 100%
rename from imgs/icons/3739.png
rename to imgs/icons/3739@1x.png
diff --git a/imgs/icons/3739@2x.png b/imgs/icons/3739@2x.png
new file mode 100644
index 000000000..b2a43657c
Binary files /dev/null and b/imgs/icons/3739@2x.png differ
diff --git a/imgs/icons/3740.png b/imgs/icons/3740@1x.png
similarity index 100%
rename from imgs/icons/3740.png
rename to imgs/icons/3740@1x.png
diff --git a/imgs/icons/3740@2x.png b/imgs/icons/3740@2x.png
new file mode 100644
index 000000000..c82da981f
Binary files /dev/null and b/imgs/icons/3740@2x.png differ
diff --git a/imgs/icons/3741.png b/imgs/icons/3741@1x.png
similarity index 100%
rename from imgs/icons/3741.png
rename to imgs/icons/3741@1x.png
diff --git a/imgs/icons/3741@2x.png b/imgs/icons/3741@2x.png
new file mode 100644
index 000000000..ac5b0b74e
Binary files /dev/null and b/imgs/icons/3741@2x.png differ
diff --git a/imgs/icons/3744.png b/imgs/icons/3744@1x.png
similarity index 100%
rename from imgs/icons/3744.png
rename to imgs/icons/3744@1x.png
diff --git a/imgs/icons/3744@2x.png b/imgs/icons/3744@2x.png
new file mode 100644
index 000000000..ac2c67d57
Binary files /dev/null and b/imgs/icons/3744@2x.png differ
diff --git a/imgs/icons/3745.png b/imgs/icons/3745@1x.png
similarity index 100%
rename from imgs/icons/3745.png
rename to imgs/icons/3745@1x.png
diff --git a/imgs/icons/3745@2x.png b/imgs/icons/3745@2x.png
new file mode 100644
index 000000000..7b1fdffbd
Binary files /dev/null and b/imgs/icons/3745@2x.png differ
diff --git a/imgs/icons/3746.png b/imgs/icons/3746@1x.png
similarity index 100%
rename from imgs/icons/3746.png
rename to imgs/icons/3746@1x.png
diff --git a/imgs/icons/3746@2x.png b/imgs/icons/3746@2x.png
new file mode 100644
index 000000000..69b6c9547
Binary files /dev/null and b/imgs/icons/3746@2x.png differ
diff --git a/imgs/icons/3750.png b/imgs/icons/3750@1x.png
similarity index 100%
rename from imgs/icons/3750.png
rename to imgs/icons/3750@1x.png
diff --git a/imgs/icons/3750@2x.png b/imgs/icons/3750@2x.png
new file mode 100644
index 000000000..c10c638d7
Binary files /dev/null and b/imgs/icons/3750@2x.png differ
diff --git a/imgs/icons/3751.png b/imgs/icons/3751@1x.png
similarity index 100%
rename from imgs/icons/3751.png
rename to imgs/icons/3751@1x.png
diff --git a/imgs/icons/3751@2x.png b/imgs/icons/3751@2x.png
new file mode 100644
index 000000000..825e0cf5c
Binary files /dev/null and b/imgs/icons/3751@2x.png differ
diff --git a/imgs/icons/3753.png b/imgs/icons/3753@1x.png
similarity index 100%
rename from imgs/icons/3753.png
rename to imgs/icons/3753@1x.png
diff --git a/imgs/icons/3753@2x.png b/imgs/icons/3753@2x.png
new file mode 100644
index 000000000..cee4f948e
Binary files /dev/null and b/imgs/icons/3753@2x.png differ
diff --git a/imgs/icons/3754.png b/imgs/icons/3754@1x.png
similarity index 100%
rename from imgs/icons/3754.png
rename to imgs/icons/3754@1x.png
diff --git a/imgs/icons/3754@2x.png b/imgs/icons/3754@2x.png
new file mode 100644
index 000000000..2946f3585
Binary files /dev/null and b/imgs/icons/3754@2x.png differ
diff --git a/imgs/icons/3755.png b/imgs/icons/3755@1x.png
similarity index 100%
rename from imgs/icons/3755.png
rename to imgs/icons/3755@1x.png
diff --git a/imgs/icons/3755@2x.png b/imgs/icons/3755@2x.png
new file mode 100644
index 000000000..49a942481
Binary files /dev/null and b/imgs/icons/3755@2x.png differ
diff --git a/imgs/icons/3756.png b/imgs/icons/3756@1x.png
similarity index 100%
rename from imgs/icons/3756.png
rename to imgs/icons/3756@1x.png
diff --git a/imgs/icons/3756@2x.png b/imgs/icons/3756@2x.png
new file mode 100644
index 000000000..d878506ee
Binary files /dev/null and b/imgs/icons/3756@2x.png differ
diff --git a/imgs/icons/3759.png b/imgs/icons/3759@1x.png
similarity index 100%
rename from imgs/icons/3759.png
rename to imgs/icons/3759@1x.png
diff --git a/imgs/icons/3759@2x.png b/imgs/icons/3759@2x.png
new file mode 100644
index 000000000..f1cd4efa9
Binary files /dev/null and b/imgs/icons/3759@2x.png differ
diff --git a/imgs/icons/3762.png b/imgs/icons/3762@1x.png
similarity index 100%
rename from imgs/icons/3762.png
rename to imgs/icons/3762@1x.png
diff --git a/imgs/icons/3762@2x.png b/imgs/icons/3762@2x.png
new file mode 100644
index 000000000..2c84df366
Binary files /dev/null and b/imgs/icons/3762@2x.png differ
diff --git a/imgs/icons/3763.png b/imgs/icons/3763@1x.png
similarity index 100%
rename from imgs/icons/3763.png
rename to imgs/icons/3763@1x.png
diff --git a/imgs/icons/3763@2x.png b/imgs/icons/3763@2x.png
new file mode 100644
index 000000000..1cba8287d
Binary files /dev/null and b/imgs/icons/3763@2x.png differ
diff --git a/imgs/icons/3764.png b/imgs/icons/3764@1x.png
similarity index 100%
rename from imgs/icons/3764.png
rename to imgs/icons/3764@1x.png
diff --git a/imgs/icons/3764@2x.png b/imgs/icons/3764@2x.png
new file mode 100644
index 000000000..594c34bae
Binary files /dev/null and b/imgs/icons/3764@2x.png differ
diff --git a/imgs/icons/3765.png b/imgs/icons/3765@1x.png
similarity index 100%
rename from imgs/icons/3765.png
rename to imgs/icons/3765@1x.png
diff --git a/imgs/icons/3765@2x.png b/imgs/icons/3765@2x.png
new file mode 100644
index 000000000..a7317d3ae
Binary files /dev/null and b/imgs/icons/3765@2x.png differ
diff --git a/imgs/icons/3766.png b/imgs/icons/3766@1x.png
similarity index 100%
rename from imgs/icons/3766.png
rename to imgs/icons/3766@1x.png
diff --git a/imgs/icons/3766@2x.png b/imgs/icons/3766@2x.png
new file mode 100644
index 000000000..a443a31ef
Binary files /dev/null and b/imgs/icons/3766@2x.png differ
diff --git a/imgs/icons/376.png b/imgs/icons/376@1x.png
similarity index 100%
rename from imgs/icons/376.png
rename to imgs/icons/376@1x.png
diff --git a/imgs/icons/376@2x.png b/imgs/icons/376@2x.png
new file mode 100644
index 000000000..614425f1b
Binary files /dev/null and b/imgs/icons/376@2x.png differ
diff --git a/imgs/icons/379.png b/imgs/icons/379@1x.png
similarity index 100%
rename from imgs/icons/379.png
rename to imgs/icons/379@1x.png
diff --git a/imgs/icons/379@2x.png b/imgs/icons/379@2x.png
new file mode 100644
index 000000000..85da62e68
Binary files /dev/null and b/imgs/icons/379@2x.png differ
diff --git a/imgs/icons/381.png b/imgs/icons/381@1x.png
similarity index 100%
rename from imgs/icons/381.png
rename to imgs/icons/381@1x.png
diff --git a/imgs/icons/381@2x.png b/imgs/icons/381@2x.png
new file mode 100644
index 000000000..5a7262486
Binary files /dev/null and b/imgs/icons/381@2x.png differ
diff --git a/imgs/icons/384.png b/imgs/icons/384@1x.png
similarity index 100%
rename from imgs/icons/384.png
rename to imgs/icons/384@1x.png
diff --git a/imgs/icons/384@2x.png b/imgs/icons/384@2x.png
new file mode 100644
index 000000000..140362d38
Binary files /dev/null and b/imgs/icons/384@2x.png differ
diff --git a/imgs/icons/386.png b/imgs/icons/386@1x.png
similarity index 100%
rename from imgs/icons/386.png
rename to imgs/icons/386@1x.png
diff --git a/imgs/icons/386@2x.png b/imgs/icons/386@2x.png
new file mode 100644
index 000000000..5094c458d
Binary files /dev/null and b/imgs/icons/386@2x.png differ
diff --git a/imgs/icons/387.png b/imgs/icons/387@1x.png
similarity index 100%
rename from imgs/icons/387.png
rename to imgs/icons/387@1x.png
diff --git a/imgs/icons/387@2x.png b/imgs/icons/387@2x.png
new file mode 100644
index 000000000..666a1b2af
Binary files /dev/null and b/imgs/icons/387@2x.png differ
diff --git a/imgs/icons/389.png b/imgs/icons/389@1x.png
similarity index 100%
rename from imgs/icons/389.png
rename to imgs/icons/389@1x.png
diff --git a/imgs/icons/389@2x.png b/imgs/icons/389@2x.png
new file mode 100644
index 000000000..54155d177
Binary files /dev/null and b/imgs/icons/389@2x.png differ
diff --git a/imgs/icons/3943.png b/imgs/icons/3943@1x.png
similarity index 100%
rename from imgs/icons/3943.png
rename to imgs/icons/3943@1x.png
diff --git a/imgs/icons/3943@2x.png b/imgs/icons/3943@2x.png
new file mode 100644
index 000000000..5926b3d23
Binary files /dev/null and b/imgs/icons/3943@2x.png differ
diff --git a/imgs/icons/3945.png b/imgs/icons/3945@1x.png
similarity index 100%
rename from imgs/icons/3945.png
rename to imgs/icons/3945@1x.png
diff --git a/imgs/icons/3945@2x.png b/imgs/icons/3945@2x.png
new file mode 100644
index 000000000..d473f5c02
Binary files /dev/null and b/imgs/icons/3945@2x.png differ
diff --git a/imgs/icons/3946.png b/imgs/icons/3946@1x.png
similarity index 100%
rename from imgs/icons/3946.png
rename to imgs/icons/3946@1x.png
diff --git a/imgs/icons/3946@2x.png b/imgs/icons/3946@2x.png
new file mode 100644
index 000000000..df72cbbe4
Binary files /dev/null and b/imgs/icons/3946@2x.png differ
diff --git a/imgs/icons/3947.png b/imgs/icons/3947@1x.png
similarity index 100%
rename from imgs/icons/3947.png
rename to imgs/icons/3947@1x.png
diff --git a/imgs/icons/3947@2x.png b/imgs/icons/3947@2x.png
new file mode 100644
index 000000000..afed04c1d
Binary files /dev/null and b/imgs/icons/3947@2x.png differ
diff --git a/imgs/icons/3948.png b/imgs/icons/3948@1x.png
similarity index 100%
rename from imgs/icons/3948.png
rename to imgs/icons/3948@1x.png
diff --git a/imgs/icons/3948@2x.png b/imgs/icons/3948@2x.png
new file mode 100644
index 000000000..4b6bbd722
Binary files /dev/null and b/imgs/icons/3948@2x.png differ
diff --git a/imgs/icons/3950.png b/imgs/icons/3950@1x.png
similarity index 100%
rename from imgs/icons/3950.png
rename to imgs/icons/3950@1x.png
diff --git a/imgs/icons/3950@2x.png b/imgs/icons/3950@2x.png
new file mode 100644
index 000000000..5affc1701
Binary files /dev/null and b/imgs/icons/3950@2x.png differ
diff --git a/imgs/icons/3951.png b/imgs/icons/3951@1x.png
similarity index 100%
rename from imgs/icons/3951.png
rename to imgs/icons/3951@1x.png
diff --git a/imgs/icons/3951@2x.png b/imgs/icons/3951@2x.png
new file mode 100644
index 000000000..a8ac8d79f
Binary files /dev/null and b/imgs/icons/3951@2x.png differ
diff --git a/imgs/icons/3952.png b/imgs/icons/3952@1x.png
similarity index 100%
rename from imgs/icons/3952.png
rename to imgs/icons/3952@1x.png
diff --git a/imgs/icons/3952@2x.png b/imgs/icons/3952@2x.png
new file mode 100644
index 000000000..2b3833575
Binary files /dev/null and b/imgs/icons/3952@2x.png differ
diff --git a/imgs/icons/3953.png b/imgs/icons/3953@1x.png
similarity index 100%
rename from imgs/icons/3953.png
rename to imgs/icons/3953@1x.png
diff --git a/imgs/icons/3953@2x.png b/imgs/icons/3953@2x.png
new file mode 100644
index 000000000..f3d9c3a6f
Binary files /dev/null and b/imgs/icons/3953@2x.png differ
diff --git a/imgs/icons/3955.png b/imgs/icons/3955@1x.png
similarity index 100%
rename from imgs/icons/3955.png
rename to imgs/icons/3955@1x.png
diff --git a/imgs/icons/3955@2x.png b/imgs/icons/3955@2x.png
new file mode 100644
index 000000000..c2b0e89e7
Binary files /dev/null and b/imgs/icons/3955@2x.png differ
diff --git a/imgs/icons/398.png b/imgs/icons/398@1x.png
similarity index 100%
rename from imgs/icons/398.png
rename to imgs/icons/398@1x.png
diff --git a/imgs/icons/398@2x.png b/imgs/icons/398@2x.png
new file mode 100644
index 000000000..514db4b32
Binary files /dev/null and b/imgs/icons/398@2x.png differ
diff --git a/imgs/icons/400.png b/imgs/icons/400@1x.png
similarity index 100%
rename from imgs/icons/400.png
rename to imgs/icons/400@1x.png
diff --git a/imgs/icons/400@2x.png b/imgs/icons/400@2x.png
new file mode 100644
index 000000000..65118cfe7
Binary files /dev/null and b/imgs/icons/400@2x.png differ
diff --git a/imgs/icons/401.png b/imgs/icons/401@1x.png
similarity index 100%
rename from imgs/icons/401.png
rename to imgs/icons/401@1x.png
diff --git a/imgs/icons/401@2x.png b/imgs/icons/401@2x.png
new file mode 100644
index 000000000..1ff5c1f72
Binary files /dev/null and b/imgs/icons/401@2x.png differ
diff --git a/imgs/icons/402.png b/imgs/icons/402@1x.png
similarity index 100%
rename from imgs/icons/402.png
rename to imgs/icons/402@1x.png
diff --git a/imgs/icons/402@2x.png b/imgs/icons/402@2x.png
new file mode 100644
index 000000000..c9f0090d2
Binary files /dev/null and b/imgs/icons/402@2x.png differ
diff --git a/imgs/icons/404.png b/imgs/icons/404@1x.png
similarity index 100%
rename from imgs/icons/404.png
rename to imgs/icons/404@1x.png
diff --git a/imgs/icons/404@2x.png b/imgs/icons/404@2x.png
new file mode 100644
index 000000000..18cae10b6
Binary files /dev/null and b/imgs/icons/404@2x.png differ
diff --git a/imgs/icons/405.png b/imgs/icons/405@1x.png
similarity index 100%
rename from imgs/icons/405.png
rename to imgs/icons/405@1x.png
diff --git a/imgs/icons/405@2x.png b/imgs/icons/405@2x.png
new file mode 100644
index 000000000..22caf4e4f
Binary files /dev/null and b/imgs/icons/405@2x.png differ
diff --git a/imgs/icons/413.png b/imgs/icons/413@1x.png
similarity index 100%
rename from imgs/icons/413.png
rename to imgs/icons/413@1x.png
diff --git a/imgs/icons/413@2x.png b/imgs/icons/413@2x.png
new file mode 100644
index 000000000..d3a74d702
Binary files /dev/null and b/imgs/icons/413@2x.png differ
diff --git a/imgs/icons/67.png b/imgs/icons/67@1x.png
similarity index 100%
rename from imgs/icons/67.png
rename to imgs/icons/67@1x.png
diff --git a/imgs/icons/67@2x.png b/imgs/icons/67@2x.png
new file mode 100644
index 000000000..61b5e6527
Binary files /dev/null and b/imgs/icons/67@2x.png differ
diff --git a/imgs/icons/68.png b/imgs/icons/68@1x.png
similarity index 100%
rename from imgs/icons/68.png
rename to imgs/icons/68@1x.png
diff --git a/imgs/icons/68@2x.png b/imgs/icons/68@2x.png
new file mode 100644
index 000000000..cfc74f5fe
Binary files /dev/null and b/imgs/icons/68@2x.png differ
diff --git a/imgs/icons/69.png b/imgs/icons/69@1x.png
similarity index 100%
rename from imgs/icons/69.png
rename to imgs/icons/69@1x.png
diff --git a/imgs/icons/69@2x.png b/imgs/icons/69@2x.png
new file mode 100644
index 000000000..ec60e4d33
Binary files /dev/null and b/imgs/icons/69@2x.png differ
diff --git a/imgs/icons/70.png b/imgs/icons/70@1x.png
similarity index 100%
rename from imgs/icons/70.png
rename to imgs/icons/70@1x.png
diff --git a/imgs/icons/70@2x.png b/imgs/icons/70@2x.png
new file mode 100644
index 000000000..96a869b05
Binary files /dev/null and b/imgs/icons/70@2x.png differ
diff --git a/imgs/icons/71.png b/imgs/icons/71@1x.png
similarity index 100%
rename from imgs/icons/71.png
rename to imgs/icons/71@1x.png
diff --git a/imgs/icons/71@2x.png b/imgs/icons/71@2x.png
new file mode 100644
index 000000000..69755f9dc
Binary files /dev/null and b/imgs/icons/71@2x.png differ
diff --git a/imgs/icons/72.png b/imgs/icons/72@1x.png
similarity index 100%
rename from imgs/icons/72.png
rename to imgs/icons/72@1x.png
diff --git a/imgs/icons/72@2x.png b/imgs/icons/72@2x.png
new file mode 100644
index 000000000..1d72afc1e
Binary files /dev/null and b/imgs/icons/72@2x.png differ
diff --git a/imgs/icons/73.png b/imgs/icons/73@1x.png
similarity index 100%
rename from imgs/icons/73.png
rename to imgs/icons/73@1x.png
diff --git a/imgs/icons/73@2x.png b/imgs/icons/73@2x.png
new file mode 100644
index 000000000..2397d1b53
Binary files /dev/null and b/imgs/icons/73@2x.png differ
diff --git a/imgs/icons/74.png b/imgs/icons/74@1x.png
similarity index 100%
rename from imgs/icons/74.png
rename to imgs/icons/74@1x.png
diff --git a/imgs/icons/74@2x.png b/imgs/icons/74@2x.png
new file mode 100644
index 000000000..379333c21
Binary files /dev/null and b/imgs/icons/74@2x.png differ
diff --git a/imgs/icons/76.png b/imgs/icons/76@1x.png
similarity index 100%
rename from imgs/icons/76.png
rename to imgs/icons/76@1x.png
diff --git a/imgs/icons/76@2x.png b/imgs/icons/76@2x.png
new file mode 100644
index 000000000..d9ad94806
Binary files /dev/null and b/imgs/icons/76@2x.png differ
diff --git a/imgs/icons/77.png b/imgs/icons/77@1x.png
similarity index 100%
rename from imgs/icons/77.png
rename to imgs/icons/77@1x.png
diff --git a/imgs/icons/77@2x.png b/imgs/icons/77@2x.png
new file mode 100644
index 000000000..bfb06da09
Binary files /dev/null and b/imgs/icons/77@2x.png differ
diff --git a/imgs/icons/79.png b/imgs/icons/79@1x.png
similarity index 100%
rename from imgs/icons/79.png
rename to imgs/icons/79@1x.png
diff --git a/imgs/icons/79@2x.png b/imgs/icons/79@2x.png
new file mode 100644
index 000000000..79999ed60
Binary files /dev/null and b/imgs/icons/79@2x.png differ
diff --git a/imgs/icons/80.png b/imgs/icons/80@1x.png
similarity index 100%
rename from imgs/icons/80.png
rename to imgs/icons/80@1x.png
diff --git a/imgs/icons/80@2x.png b/imgs/icons/80@2x.png
new file mode 100644
index 000000000..6444ff240
Binary files /dev/null and b/imgs/icons/80@2x.png differ
diff --git a/imgs/icons/81.png b/imgs/icons/81@1x.png
similarity index 100%
rename from imgs/icons/81.png
rename to imgs/icons/81@1x.png
diff --git a/imgs/icons/81@2x.png b/imgs/icons/81@2x.png
new file mode 100644
index 000000000..84e29b598
Binary files /dev/null and b/imgs/icons/81@2x.png differ
diff --git a/imgs/icons/82.png b/imgs/icons/82@1x.png
similarity index 100%
rename from imgs/icons/82.png
rename to imgs/icons/82@1x.png
diff --git a/imgs/icons/82@2x.png b/imgs/icons/82@2x.png
new file mode 100644
index 000000000..f85b363f5
Binary files /dev/null and b/imgs/icons/82@2x.png differ
diff --git a/imgs/icons/83.png b/imgs/icons/83@1x.png
similarity index 100%
rename from imgs/icons/83.png
rename to imgs/icons/83@1x.png
diff --git a/imgs/icons/83@2x.png b/imgs/icons/83@2x.png
new file mode 100644
index 000000000..e1d07ac65
Binary files /dev/null and b/imgs/icons/83@2x.png differ
diff --git a/imgs/icons/84.png b/imgs/icons/84@1x.png
similarity index 100%
rename from imgs/icons/84.png
rename to imgs/icons/84@1x.png
diff --git a/imgs/icons/84@2x.png b/imgs/icons/84@2x.png
new file mode 100644
index 000000000..3f5f1dbc6
Binary files /dev/null and b/imgs/icons/84@2x.png differ
diff --git a/imgs/icons/86.png b/imgs/icons/86@1x.png
similarity index 100%
rename from imgs/icons/86.png
rename to imgs/icons/86@1x.png
diff --git a/imgs/icons/86@2x.png b/imgs/icons/86@2x.png
new file mode 100644
index 000000000..b91cb449c
Binary files /dev/null and b/imgs/icons/86@2x.png differ
diff --git a/imgs/icons/89.png b/imgs/icons/89@1x.png
similarity index 100%
rename from imgs/icons/89.png
rename to imgs/icons/89@1x.png
diff --git a/imgs/icons/89@2x.png b/imgs/icons/89@2x.png
new file mode 100644
index 000000000..4c20f90d4
Binary files /dev/null and b/imgs/icons/89@2x.png differ
diff --git a/imgs/icons/90.png b/imgs/icons/90@1x.png
similarity index 100%
rename from imgs/icons/90.png
rename to imgs/icons/90@1x.png
diff --git a/imgs/icons/90@2x.png b/imgs/icons/90@2x.png
new file mode 100644
index 000000000..87faa4efb
Binary files /dev/null and b/imgs/icons/90@2x.png differ
diff --git a/imgs/icons/92.png b/imgs/icons/92@1x.png
similarity index 100%
rename from imgs/icons/92.png
rename to imgs/icons/92@1x.png
diff --git a/imgs/icons/92@2x.png b/imgs/icons/92@2x.png
new file mode 100644
index 000000000..65ee58139
Binary files /dev/null and b/imgs/icons/92@2x.png differ
diff --git a/imgs/icons/94.png b/imgs/icons/94@1x.png
similarity index 100%
rename from imgs/icons/94.png
rename to imgs/icons/94@1x.png
diff --git a/imgs/icons/94@2x.png b/imgs/icons/94@2x.png
new file mode 100644
index 000000000..31711e399
Binary files /dev/null and b/imgs/icons/94@2x.png differ
diff --git a/imgs/icons/96.png b/imgs/icons/96@1x.png
similarity index 100%
rename from imgs/icons/96.png
rename to imgs/icons/96@1x.png
diff --git a/imgs/icons/96@2x.png b/imgs/icons/96@2x.png
new file mode 100644
index 000000000..bbeaa2ed0
Binary files /dev/null and b/imgs/icons/96@2x.png differ
diff --git a/imgs/icons/97.png b/imgs/icons/97@1x.png
similarity index 100%
rename from imgs/icons/97.png
rename to imgs/icons/97@1x.png
diff --git a/imgs/icons/97@2x.png b/imgs/icons/97@2x.png
new file mode 100644
index 000000000..e17f74be5
Binary files /dev/null and b/imgs/icons/97@2x.png differ
diff --git a/imgs/icons/98.png b/imgs/icons/98@1x.png
similarity index 100%
rename from imgs/icons/98.png
rename to imgs/icons/98@1x.png
diff --git a/imgs/icons/98@2x.png b/imgs/icons/98@2x.png
new file mode 100644
index 000000000..3cc11c18d
Binary files /dev/null and b/imgs/icons/98@2x.png differ
diff --git a/imgs/renders/10006.png b/imgs/renders/10006@1x.png
similarity index 100%
rename from imgs/renders/10006.png
rename to imgs/renders/10006@1x.png
diff --git a/imgs/renders/10006@2x.png b/imgs/renders/10006@2x.png
new file mode 100644
index 000000000..5f6da7c12
Binary files /dev/null and b/imgs/renders/10006@2x.png differ
diff --git a/imgs/renders/10013.png b/imgs/renders/10013@1x.png
similarity index 100%
rename from imgs/renders/10013.png
rename to imgs/renders/10013@1x.png
diff --git a/imgs/renders/10013@2x.png b/imgs/renders/10013@2x.png
new file mode 100644
index 000000000..e26e82f2b
Binary files /dev/null and b/imgs/renders/10013@2x.png differ
diff --git a/imgs/renders/10038.png b/imgs/renders/10038@1x.png
similarity index 100%
rename from imgs/renders/10038.png
rename to imgs/renders/10038@1x.png
diff --git a/imgs/renders/10038@2x.png b/imgs/renders/10038@2x.png
new file mode 100644
index 000000000..db19b9e2f
Binary files /dev/null and b/imgs/renders/10038@2x.png differ
diff --git a/imgs/renders/10040.png b/imgs/renders/10040@1x.png
similarity index 100%
rename from imgs/renders/10040.png
rename to imgs/renders/10040@1x.png
diff --git a/imgs/renders/10040@2x.png b/imgs/renders/10040@2x.png
new file mode 100644
index 000000000..b1586930a
Binary files /dev/null and b/imgs/renders/10040@2x.png differ
diff --git a/imgs/renders/1053.png b/imgs/renders/1053.png
deleted file mode 100644
index 25e622fc0..000000000
Binary files a/imgs/renders/1053.png and /dev/null differ
diff --git a/imgs/renders/1053@1x.png b/imgs/renders/1053@1x.png
new file mode 100644
index 000000000..b7e1229e1
Binary files /dev/null and b/imgs/renders/1053@1x.png differ
diff --git a/imgs/renders/1053@2x.png b/imgs/renders/1053@2x.png
new file mode 100644
index 000000000..4a7ba1d78
Binary files /dev/null and b/imgs/renders/1053@2x.png differ
diff --git a/imgs/renders/1064.png b/imgs/renders/1064@1x.png
similarity index 100%
rename from imgs/renders/1064.png
rename to imgs/renders/1064@1x.png
diff --git a/imgs/renders/1064@2x.png b/imgs/renders/1064@2x.png
new file mode 100644
index 000000000..db11a9e2a
Binary files /dev/null and b/imgs/renders/1064@2x.png differ
diff --git a/imgs/renders/1065.png b/imgs/renders/1065@1x.png
similarity index 100%
rename from imgs/renders/1065.png
rename to imgs/renders/1065@1x.png
diff --git a/imgs/renders/1065@2x.png b/imgs/renders/1065@2x.png
new file mode 100644
index 000000000..dae0b90e9
Binary files /dev/null and b/imgs/renders/1065@2x.png differ
diff --git a/imgs/renders/1066.png b/imgs/renders/1066@1x.png
similarity index 100%
rename from imgs/renders/1066.png
rename to imgs/renders/1066@1x.png
diff --git a/imgs/renders/1066@2x.png b/imgs/renders/1066@2x.png
new file mode 100644
index 000000000..8896743a4
Binary files /dev/null and b/imgs/renders/1066@2x.png differ
diff --git a/imgs/renders/1067.png b/imgs/renders/1067@1x.png
similarity index 100%
rename from imgs/renders/1067.png
rename to imgs/renders/1067@1x.png
diff --git a/imgs/renders/1067@2x.png b/imgs/renders/1067@2x.png
new file mode 100644
index 000000000..edc6ed441
Binary files /dev/null and b/imgs/renders/1067@2x.png differ
diff --git a/imgs/renders/10782.png b/imgs/renders/10782@1x.png
similarity index 100%
rename from imgs/renders/10782.png
rename to imgs/renders/10782@1x.png
diff --git a/imgs/renders/10782@2x.png b/imgs/renders/10782@2x.png
new file mode 100644
index 000000000..0a7283928
Binary files /dev/null and b/imgs/renders/10782@2x.png differ
diff --git a/imgs/renders/10950.png b/imgs/renders/10950@1x.png
similarity index 100%
rename from imgs/renders/10950.png
rename to imgs/renders/10950@1x.png
diff --git a/imgs/renders/10950@2x.png b/imgs/renders/10950@2x.png
new file mode 100644
index 000000000..42d329edd
Binary files /dev/null and b/imgs/renders/10950@2x.png differ
diff --git a/imgs/renders/10951.png b/imgs/renders/10951@1x.png
similarity index 100%
rename from imgs/renders/10951.png
rename to imgs/renders/10951@1x.png
diff --git a/imgs/renders/10951@2x.png b/imgs/renders/10951@2x.png
new file mode 100644
index 000000000..87f947e09
Binary files /dev/null and b/imgs/renders/10951@2x.png differ
diff --git a/imgs/renders/11775.png b/imgs/renders/11775@1x.png
similarity index 100%
rename from imgs/renders/11775.png
rename to imgs/renders/11775@1x.png
diff --git a/imgs/renders/11775@2x.png b/imgs/renders/11775@2x.png
new file mode 100644
index 000000000..2c6301b62
Binary files /dev/null and b/imgs/renders/11775@2x.png differ
diff --git a/imgs/renders/11776.png b/imgs/renders/11776.png
deleted file mode 100644
index 98a7c6084..000000000
Binary files a/imgs/renders/11776.png and /dev/null differ
diff --git a/imgs/renders/11776@1x.png b/imgs/renders/11776@1x.png
new file mode 100644
index 000000000..e68378ca0
Binary files /dev/null and b/imgs/renders/11776@1x.png differ
diff --git a/imgs/renders/11776@2x.png b/imgs/renders/11776@2x.png
new file mode 100644
index 000000000..2f5f91898
Binary files /dev/null and b/imgs/renders/11776@2x.png differ
diff --git a/imgs/renders/11777.png b/imgs/renders/11777@1x.png
similarity index 100%
rename from imgs/renders/11777.png
rename to imgs/renders/11777@1x.png
diff --git a/imgs/renders/11777@2x.png b/imgs/renders/11777@2x.png
new file mode 100644
index 000000000..b24471030
Binary files /dev/null and b/imgs/renders/11777@2x.png differ
diff --git a/imgs/renders/11778.png b/imgs/renders/11778@1x.png
similarity index 100%
rename from imgs/renders/11778.png
rename to imgs/renders/11778@1x.png
diff --git a/imgs/renders/11778@2x.png b/imgs/renders/11778@2x.png
new file mode 100644
index 000000000..166063fff
Binary files /dev/null and b/imgs/renders/11778@2x.png differ
diff --git a/imgs/renders/11859.png b/imgs/renders/11859@1x.png
similarity index 100%
rename from imgs/renders/11859.png
rename to imgs/renders/11859@1x.png
diff --git a/imgs/renders/11859@2x.png b/imgs/renders/11859@2x.png
new file mode 100644
index 000000000..9eedb766d
Binary files /dev/null and b/imgs/renders/11859@2x.png differ
diff --git a/imgs/renders/11863.png b/imgs/renders/11863@1x.png
similarity index 100%
rename from imgs/renders/11863.png
rename to imgs/renders/11863@1x.png
diff --git a/imgs/renders/11863@2x.png b/imgs/renders/11863@2x.png
new file mode 100644
index 000000000..05f75d3ea
Binary files /dev/null and b/imgs/renders/11863@2x.png differ
diff --git a/imgs/renders/11865.png b/imgs/renders/11865.png
deleted file mode 100644
index c895bcb10..000000000
Binary files a/imgs/renders/11865.png and /dev/null differ
diff --git a/imgs/renders/11865@1x.png b/imgs/renders/11865@1x.png
new file mode 100644
index 000000000..c5ce92f59
Binary files /dev/null and b/imgs/renders/11865@1x.png differ
diff --git a/imgs/renders/11865@2x.png b/imgs/renders/11865@2x.png
new file mode 100644
index 000000000..9153f64d0
Binary files /dev/null and b/imgs/renders/11865@2x.png differ
diff --git a/imgs/renders/11869.png b/imgs/renders/11869@1x.png
similarity index 100%
rename from imgs/renders/11869.png
rename to imgs/renders/11869@1x.png
diff --git a/imgs/renders/11869@2x.png b/imgs/renders/11869@2x.png
new file mode 100644
index 000000000..8cd685759
Binary files /dev/null and b/imgs/renders/11869@2x.png differ
diff --git a/imgs/renders/11875.png b/imgs/renders/11875@1x.png
similarity index 100%
rename from imgs/renders/11875.png
rename to imgs/renders/11875@1x.png
diff --git a/imgs/renders/11875@2x.png b/imgs/renders/11875@2x.png
new file mode 100644
index 000000000..be98b75aa
Binary files /dev/null and b/imgs/renders/11875@2x.png differ
diff --git a/imgs/renders/11876.png b/imgs/renders/11876@1x.png
similarity index 100%
rename from imgs/renders/11876.png
rename to imgs/renders/11876@1x.png
diff --git a/imgs/renders/11876@2x.png b/imgs/renders/11876@2x.png
new file mode 100644
index 000000000..6c24d2c7b
Binary files /dev/null and b/imgs/renders/11876@2x.png differ
diff --git a/imgs/renders/11877.png b/imgs/renders/11877@1x.png
similarity index 100%
rename from imgs/renders/11877.png
rename to imgs/renders/11877@1x.png
diff --git a/imgs/renders/11877@2x.png b/imgs/renders/11877@2x.png
new file mode 100644
index 000000000..3abf182ff
Binary files /dev/null and b/imgs/renders/11877@2x.png differ
diff --git a/imgs/renders/1231.png b/imgs/renders/1231@1x.png
similarity index 100%
rename from imgs/renders/1231.png
rename to imgs/renders/1231@1x.png
diff --git a/imgs/renders/1231@2x.png b/imgs/renders/1231@2x.png
new file mode 100644
index 000000000..07728d68d
Binary files /dev/null and b/imgs/renders/1231@2x.png differ
diff --git a/imgs/renders/1232.png b/imgs/renders/1232.png
deleted file mode 100644
index b7ffd74fe..000000000
Binary files a/imgs/renders/1232.png and /dev/null differ
diff --git a/imgs/renders/1232@1x.png b/imgs/renders/1232@1x.png
new file mode 100644
index 000000000..4ec81f751
Binary files /dev/null and b/imgs/renders/1232@1x.png differ
diff --git a/imgs/renders/1232@2x.png b/imgs/renders/1232@2x.png
new file mode 100644
index 000000000..be9fadf5b
Binary files /dev/null and b/imgs/renders/1232@2x.png differ
diff --git a/imgs/renders/1233.png b/imgs/renders/1233@1x.png
similarity index 100%
rename from imgs/renders/1233.png
rename to imgs/renders/1233@1x.png
diff --git a/imgs/renders/1233@2x.png b/imgs/renders/1233@2x.png
new file mode 100644
index 000000000..10d2d15d3
Binary files /dev/null and b/imgs/renders/1233@2x.png differ
diff --git a/imgs/renders/1236.png b/imgs/renders/1236@1x.png
similarity index 100%
rename from imgs/renders/1236.png
rename to imgs/renders/1236@1x.png
diff --git a/imgs/renders/1236@2x.png b/imgs/renders/1236@2x.png
new file mode 100644
index 000000000..caedf1bd9
Binary files /dev/null and b/imgs/renders/1236@2x.png differ
diff --git a/imgs/renders/1237.png b/imgs/renders/1237@1x.png
similarity index 100%
rename from imgs/renders/1237.png
rename to imgs/renders/1237@1x.png
diff --git a/imgs/renders/1237@2x.png b/imgs/renders/1237@2x.png
new file mode 100644
index 000000000..e63c40fd1
Binary files /dev/null and b/imgs/renders/1237@2x.png differ
diff --git a/imgs/renders/1240.png b/imgs/renders/1240@1x.png
similarity index 100%
rename from imgs/renders/1240.png
rename to imgs/renders/1240@1x.png
diff --git a/imgs/renders/1240@2x.png b/imgs/renders/1240@2x.png
new file mode 100644
index 000000000..a6277c434
Binary files /dev/null and b/imgs/renders/1240@2x.png differ
diff --git a/imgs/renders/1730.png b/imgs/renders/1730.png
deleted file mode 100644
index 9eea77b49..000000000
Binary files a/imgs/renders/1730.png and /dev/null differ
diff --git a/imgs/renders/1730@1x.png b/imgs/renders/1730@1x.png
new file mode 100644
index 000000000..43f6ba8b9
Binary files /dev/null and b/imgs/renders/1730@1x.png differ
diff --git a/imgs/renders/1730@2x.png b/imgs/renders/1730@2x.png
new file mode 100644
index 000000000..d4f946e2c
Binary files /dev/null and b/imgs/renders/1730@2x.png differ
diff --git a/imgs/renders/1731.png b/imgs/renders/1731@1x.png
similarity index 100%
rename from imgs/renders/1731.png
rename to imgs/renders/1731@1x.png
diff --git a/imgs/renders/1731@2x.png b/imgs/renders/1731@2x.png
new file mode 100644
index 000000000..e7a487c08
Binary files /dev/null and b/imgs/renders/1731@2x.png differ
diff --git a/imgs/renders/1733.png b/imgs/renders/1733@1x.png
similarity index 100%
rename from imgs/renders/1733.png
rename to imgs/renders/1733@1x.png
diff --git a/imgs/renders/1733@2x.png b/imgs/renders/1733@2x.png
new file mode 100644
index 000000000..e0d3688c0
Binary files /dev/null and b/imgs/renders/1733@2x.png differ
diff --git a/imgs/renders/1751.png b/imgs/renders/1751@1x.png
similarity index 100%
rename from imgs/renders/1751.png
rename to imgs/renders/1751@1x.png
diff --git a/imgs/renders/1751@2x.png b/imgs/renders/1751@2x.png
new file mode 100644
index 000000000..fa8783741
Binary files /dev/null and b/imgs/renders/1751@2x.png differ
diff --git a/imgs/renders/1762.png b/imgs/renders/1762@1x.png
similarity index 100%
rename from imgs/renders/1762.png
rename to imgs/renders/1762@1x.png
diff --git a/imgs/renders/1762@2x.png b/imgs/renders/1762@2x.png
new file mode 100644
index 000000000..ca72bf073
Binary files /dev/null and b/imgs/renders/1762@2x.png differ
diff --git a/imgs/renders/1771.png b/imgs/renders/1771.png
deleted file mode 100644
index cbfa225c0..000000000
Binary files a/imgs/renders/1771.png and /dev/null differ
diff --git a/imgs/renders/1771@1x.png b/imgs/renders/1771@1x.png
new file mode 100644
index 000000000..594a31207
Binary files /dev/null and b/imgs/renders/1771@1x.png differ
diff --git a/imgs/renders/1771@2x.png b/imgs/renders/1771@2x.png
new file mode 100644
index 000000000..a537d8778
Binary files /dev/null and b/imgs/renders/1771@2x.png differ
diff --git a/imgs/renders/1773.png b/imgs/renders/1773@1x.png
similarity index 100%
rename from imgs/renders/1773.png
rename to imgs/renders/1773@1x.png
diff --git a/imgs/renders/1773@2x.png b/imgs/renders/1773@2x.png
new file mode 100644
index 000000000..7a70fd4ef
Binary files /dev/null and b/imgs/renders/1773@2x.png differ
diff --git a/imgs/renders/1776.png b/imgs/renders/1776@1x.png
similarity index 100%
rename from imgs/renders/1776.png
rename to imgs/renders/1776@1x.png
diff --git a/imgs/renders/1776@2x.png b/imgs/renders/1776@2x.png
new file mode 100644
index 000000000..3ec289edb
Binary files /dev/null and b/imgs/renders/1776@2x.png differ
diff --git a/imgs/renders/1777.png b/imgs/renders/1777@1x.png
similarity index 100%
rename from imgs/renders/1777.png
rename to imgs/renders/1777@1x.png
diff --git a/imgs/renders/1777@2x.png b/imgs/renders/1777@2x.png
new file mode 100644
index 000000000..d2ebc6fc4
Binary files /dev/null and b/imgs/renders/1777@2x.png differ
diff --git a/imgs/renders/1778.png b/imgs/renders/1778.png
deleted file mode 100644
index 1590473e9..000000000
Binary files a/imgs/renders/1778.png and /dev/null differ
diff --git a/imgs/renders/1778@1x.png b/imgs/renders/1778@1x.png
new file mode 100644
index 000000000..5ed72ed56
Binary files /dev/null and b/imgs/renders/1778@1x.png differ
diff --git a/imgs/renders/1778@2x.png b/imgs/renders/1778@2x.png
new file mode 100644
index 000000000..29cf08ba4
Binary files /dev/null and b/imgs/renders/1778@2x.png differ
diff --git a/imgs/renders/1779.png b/imgs/renders/1779@1x.png
similarity index 100%
rename from imgs/renders/1779.png
rename to imgs/renders/1779@1x.png
diff --git a/imgs/renders/1779@2x.png b/imgs/renders/1779@2x.png
new file mode 100644
index 000000000..b1a3e3252
Binary files /dev/null and b/imgs/renders/1779@2x.png differ
diff --git a/imgs/renders/1784.png b/imgs/renders/1784.png
deleted file mode 100644
index 901b12eb0..000000000
Binary files a/imgs/renders/1784.png and /dev/null differ
diff --git a/imgs/renders/1784@1x.png b/imgs/renders/1784@1x.png
new file mode 100644
index 000000000..c7e1587de
Binary files /dev/null and b/imgs/renders/1784@1x.png differ
diff --git a/imgs/renders/1784@2x.png b/imgs/renders/1784@2x.png
new file mode 100644
index 000000000..1579a3866
Binary files /dev/null and b/imgs/renders/1784@2x.png differ
diff --git a/imgs/renders/1786.png b/imgs/renders/1786@1x.png
similarity index 100%
rename from imgs/renders/1786.png
rename to imgs/renders/1786@1x.png
diff --git a/imgs/renders/1786@2x.png b/imgs/renders/1786@2x.png
new file mode 100644
index 000000000..0ca9b21de
Binary files /dev/null and b/imgs/renders/1786@2x.png differ
diff --git a/imgs/renders/1789.png b/imgs/renders/1789@1x.png
similarity index 100%
rename from imgs/renders/1789.png
rename to imgs/renders/1789@1x.png
diff --git a/imgs/renders/1789@2x.png b/imgs/renders/1789@2x.png
new file mode 100644
index 000000000..9de4e17fe
Binary files /dev/null and b/imgs/renders/1789@2x.png differ
diff --git a/imgs/renders/1802.png b/imgs/renders/1802.png
deleted file mode 100644
index 1a7fdf913..000000000
Binary files a/imgs/renders/1802.png and /dev/null differ
diff --git a/imgs/renders/1802@1x.png b/imgs/renders/1802@1x.png
new file mode 100644
index 000000000..c2dcf1390
Binary files /dev/null and b/imgs/renders/1802@1x.png differ
diff --git a/imgs/renders/1802@2x.png b/imgs/renders/1802@2x.png
new file mode 100644
index 000000000..0a5c7b939
Binary files /dev/null and b/imgs/renders/1802@2x.png differ
diff --git a/imgs/renders/1803.png b/imgs/renders/1803.png
deleted file mode 100644
index 1d11007a0..000000000
Binary files a/imgs/renders/1803.png and /dev/null differ
diff --git a/imgs/renders/1803@1x.png b/imgs/renders/1803@1x.png
new file mode 100644
index 000000000..3cf9b9871
Binary files /dev/null and b/imgs/renders/1803@1x.png differ
diff --git a/imgs/renders/1803@2x.png b/imgs/renders/1803@2x.png
new file mode 100644
index 000000000..6a480eb5b
Binary files /dev/null and b/imgs/renders/1803@2x.png differ
diff --git a/imgs/renders/1811.png b/imgs/renders/1811@1x.png
similarity index 100%
rename from imgs/renders/1811.png
rename to imgs/renders/1811@1x.png
diff --git a/imgs/renders/1811@2x.png b/imgs/renders/1811@2x.png
new file mode 100644
index 000000000..44e466df8
Binary files /dev/null and b/imgs/renders/1811@2x.png differ
diff --git a/imgs/renders/1814.png b/imgs/renders/1814.png
deleted file mode 100644
index 34b55f1f3..000000000
Binary files a/imgs/renders/1814.png and /dev/null differ
diff --git a/imgs/renders/1814@1x.png b/imgs/renders/1814@1x.png
new file mode 100644
index 000000000..d121e411e
Binary files /dev/null and b/imgs/renders/1814@1x.png differ
diff --git a/imgs/renders/1814@2x.png b/imgs/renders/1814@2x.png
new file mode 100644
index 000000000..44981e73e
Binary files /dev/null and b/imgs/renders/1814@2x.png differ
diff --git a/imgs/renders/1815.png b/imgs/renders/1815@1x.png
similarity index 100%
rename from imgs/renders/1815.png
rename to imgs/renders/1815@1x.png
diff --git a/imgs/renders/1815@2x.png b/imgs/renders/1815@2x.png
new file mode 100644
index 000000000..82a2fc456
Binary files /dev/null and b/imgs/renders/1815@2x.png differ
diff --git a/imgs/renders/1816.png b/imgs/renders/1816@1x.png
similarity index 100%
rename from imgs/renders/1816.png
rename to imgs/renders/1816@1x.png
diff --git a/imgs/renders/1816@2x.png b/imgs/renders/1816@2x.png
new file mode 100644
index 000000000..ccf4110fb
Binary files /dev/null and b/imgs/renders/1816@2x.png differ
diff --git a/imgs/renders/1824.png b/imgs/renders/1824.png
deleted file mode 100644
index 2746fc8ac..000000000
Binary files a/imgs/renders/1824.png and /dev/null differ
diff --git a/imgs/renders/1824@1x.png b/imgs/renders/1824@1x.png
new file mode 100644
index 000000000..3c39a4920
Binary files /dev/null and b/imgs/renders/1824@1x.png differ
diff --git a/imgs/renders/1824@2x.png b/imgs/renders/1824@2x.png
new file mode 100644
index 000000000..caf7fe570
Binary files /dev/null and b/imgs/renders/1824@2x.png differ
diff --git a/imgs/renders/1825.png b/imgs/renders/1825@1x.png
similarity index 100%
rename from imgs/renders/1825.png
rename to imgs/renders/1825@1x.png
diff --git a/imgs/renders/1825@2x.png b/imgs/renders/1825@2x.png
new file mode 100644
index 000000000..5da5c2ffd
Binary files /dev/null and b/imgs/renders/1825@2x.png differ
diff --git a/imgs/renders/1829.png b/imgs/renders/1829@1x.png
similarity index 100%
rename from imgs/renders/1829.png
rename to imgs/renders/1829@1x.png
diff --git a/imgs/renders/1829@2x.png b/imgs/renders/1829@2x.png
new file mode 100644
index 000000000..dfb553d16
Binary files /dev/null and b/imgs/renders/1829@2x.png differ
diff --git a/imgs/renders/1831.png b/imgs/renders/1831.png
deleted file mode 100644
index 78d329fba..000000000
Binary files a/imgs/renders/1831.png and /dev/null differ
diff --git a/imgs/renders/1831@1x.png b/imgs/renders/1831@1x.png
new file mode 100644
index 000000000..a80817437
Binary files /dev/null and b/imgs/renders/1831@1x.png differ
diff --git a/imgs/renders/1831@2x.png b/imgs/renders/1831@2x.png
new file mode 100644
index 000000000..dca6d9422
Binary files /dev/null and b/imgs/renders/1831@2x.png differ
diff --git a/imgs/renders/1835.png b/imgs/renders/1835.png
deleted file mode 100644
index 4a39bfec5..000000000
Binary files a/imgs/renders/1835.png and /dev/null differ
diff --git a/imgs/renders/1835@1x.png b/imgs/renders/1835@1x.png
new file mode 100644
index 000000000..cf9d424a0
Binary files /dev/null and b/imgs/renders/1835@1x.png differ
diff --git a/imgs/renders/1835@2x.png b/imgs/renders/1835@2x.png
new file mode 100644
index 000000000..aef05565f
Binary files /dev/null and b/imgs/renders/1835@2x.png differ
diff --git a/imgs/renders/1840.png b/imgs/renders/1840.png
deleted file mode 100644
index 5b829445b..000000000
Binary files a/imgs/renders/1840.png and /dev/null differ
diff --git a/imgs/renders/1840@1x.png b/imgs/renders/1840@1x.png
new file mode 100644
index 000000000..d66c9ea5f
Binary files /dev/null and b/imgs/renders/1840@1x.png differ
diff --git a/imgs/renders/1840@2x.png b/imgs/renders/1840@2x.png
new file mode 100644
index 000000000..188428352
Binary files /dev/null and b/imgs/renders/1840@2x.png differ
diff --git a/imgs/renders/1841.png b/imgs/renders/1841@1x.png
similarity index 100%
rename from imgs/renders/1841.png
rename to imgs/renders/1841@1x.png
diff --git a/imgs/renders/1841@2x.png b/imgs/renders/1841@2x.png
new file mode 100644
index 000000000..024928021
Binary files /dev/null and b/imgs/renders/1841@2x.png differ
diff --git a/imgs/renders/1847.png b/imgs/renders/1847.png
deleted file mode 100644
index 9ed1da920..000000000
Binary files a/imgs/renders/1847.png and /dev/null differ
diff --git a/imgs/renders/1847@1x.png b/imgs/renders/1847@1x.png
new file mode 100644
index 000000000..80c5b977c
Binary files /dev/null and b/imgs/renders/1847@1x.png differ
diff --git a/imgs/renders/1847@2x.png b/imgs/renders/1847@2x.png
new file mode 100644
index 000000000..ac037e317
Binary files /dev/null and b/imgs/renders/1847@2x.png differ
diff --git a/imgs/renders/1848.png b/imgs/renders/1848@1x.png
similarity index 100%
rename from imgs/renders/1848.png
rename to imgs/renders/1848@1x.png
diff --git a/imgs/renders/1848@2x.png b/imgs/renders/1848@2x.png
new file mode 100644
index 000000000..f2cecf10a
Binary files /dev/null and b/imgs/renders/1848@2x.png differ
diff --git a/imgs/renders/1854.png b/imgs/renders/1854@1x.png
similarity index 100%
rename from imgs/renders/1854.png
rename to imgs/renders/1854@1x.png
diff --git a/imgs/renders/1854@2x.png b/imgs/renders/1854@2x.png
new file mode 100644
index 000000000..dbbdfa617
Binary files /dev/null and b/imgs/renders/1854@2x.png differ
diff --git a/imgs/renders/1855.png b/imgs/renders/1855@1x.png
similarity index 100%
rename from imgs/renders/1855.png
rename to imgs/renders/1855@1x.png
diff --git a/imgs/renders/1855@2x.png b/imgs/renders/1855@2x.png
new file mode 100644
index 000000000..c14aa2431
Binary files /dev/null and b/imgs/renders/1855@2x.png differ
diff --git a/imgs/renders/1860.png b/imgs/renders/1860@1x.png
similarity index 100%
rename from imgs/renders/1860.png
rename to imgs/renders/1860@1x.png
diff --git a/imgs/renders/1860@2x.png b/imgs/renders/1860@2x.png
new file mode 100644
index 000000000..b351b74c9
Binary files /dev/null and b/imgs/renders/1860@2x.png differ
diff --git a/imgs/renders/1861.png b/imgs/renders/1861@1x.png
similarity index 100%
rename from imgs/renders/1861.png
rename to imgs/renders/1861@1x.png
diff --git a/imgs/renders/1861@2x.png b/imgs/renders/1861@2x.png
new file mode 100644
index 000000000..b160b03cd
Binary files /dev/null and b/imgs/renders/1861@2x.png differ
diff --git a/imgs/renders/1872.png b/imgs/renders/1872@1x.png
similarity index 100%
rename from imgs/renders/1872.png
rename to imgs/renders/1872@1x.png
diff --git a/imgs/renders/1872@2x.png b/imgs/renders/1872@2x.png
new file mode 100644
index 000000000..2125d5eb7
Binary files /dev/null and b/imgs/renders/1872@2x.png differ
diff --git a/imgs/renders/1878.png b/imgs/renders/1878.png
deleted file mode 100644
index ecc2b8735..000000000
Binary files a/imgs/renders/1878.png and /dev/null differ
diff --git a/imgs/renders/1878@1x.png b/imgs/renders/1878@1x.png
new file mode 100644
index 000000000..f08cadb2e
Binary files /dev/null and b/imgs/renders/1878@1x.png differ
diff --git a/imgs/renders/1878@2x.png b/imgs/renders/1878@2x.png
new file mode 100644
index 000000000..37e831c60
Binary files /dev/null and b/imgs/renders/1878@2x.png differ
diff --git a/imgs/renders/1881.png b/imgs/renders/1881@1x.png
similarity index 100%
rename from imgs/renders/1881.png
rename to imgs/renders/1881@1x.png
diff --git a/imgs/renders/1881@2x.png b/imgs/renders/1881@2x.png
new file mode 100644
index 000000000..6cb13a843
Binary files /dev/null and b/imgs/renders/1881@2x.png differ
diff --git a/imgs/renders/1882.png b/imgs/renders/1882@1x.png
similarity index 100%
rename from imgs/renders/1882.png
rename to imgs/renders/1882@1x.png
diff --git a/imgs/renders/1882@2x.png b/imgs/renders/1882@2x.png
new file mode 100644
index 000000000..071e2be8f
Binary files /dev/null and b/imgs/renders/1882@2x.png differ
diff --git a/imgs/renders/1884.png b/imgs/renders/1884@1x.png
similarity index 100%
rename from imgs/renders/1884.png
rename to imgs/renders/1884@1x.png
diff --git a/imgs/renders/1884@2x.png b/imgs/renders/1884@2x.png
new file mode 100644
index 000000000..d5f7ab3cf
Binary files /dev/null and b/imgs/renders/1884@2x.png differ
diff --git a/imgs/renders/1887.png b/imgs/renders/1887@1x.png
similarity index 100%
rename from imgs/renders/1887.png
rename to imgs/renders/1887@1x.png
diff --git a/imgs/renders/1887@2x.png b/imgs/renders/1887@2x.png
new file mode 100644
index 000000000..752a28bbb
Binary files /dev/null and b/imgs/renders/1887@2x.png differ
diff --git a/imgs/renders/1894.png b/imgs/renders/1894@1x.png
similarity index 100%
rename from imgs/renders/1894.png
rename to imgs/renders/1894@1x.png
diff --git a/imgs/renders/1894@2x.png b/imgs/renders/1894@2x.png
new file mode 100644
index 000000000..520998b9f
Binary files /dev/null and b/imgs/renders/1894@2x.png differ
diff --git a/imgs/renders/1901.png b/imgs/renders/1901@1x.png
similarity index 100%
rename from imgs/renders/1901.png
rename to imgs/renders/1901@1x.png
diff --git a/imgs/renders/1901@2x.png b/imgs/renders/1901@2x.png
new file mode 100644
index 000000000..22705878b
Binary files /dev/null and b/imgs/renders/1901@2x.png differ
diff --git a/imgs/renders/1902.png b/imgs/renders/1902@1x.png
similarity index 100%
rename from imgs/renders/1902.png
rename to imgs/renders/1902@1x.png
diff --git a/imgs/renders/1902@2x.png b/imgs/renders/1902@2x.png
new file mode 100644
index 000000000..a44bbe6bd
Binary files /dev/null and b/imgs/renders/1902@2x.png differ
diff --git a/imgs/renders/1903.png b/imgs/renders/1903@1x.png
similarity index 100%
rename from imgs/renders/1903.png
rename to imgs/renders/1903@1x.png
diff --git a/imgs/renders/1903@2x.png b/imgs/renders/1903@2x.png
new file mode 100644
index 000000000..77c048350
Binary files /dev/null and b/imgs/renders/1903@2x.png differ
diff --git a/imgs/renders/1909.png b/imgs/renders/1909.png
deleted file mode 100644
index 082141e76..000000000
Binary files a/imgs/renders/1909.png and /dev/null differ
diff --git a/imgs/renders/1909@1x.png b/imgs/renders/1909@1x.png
new file mode 100644
index 000000000..2ad6d62ef
Binary files /dev/null and b/imgs/renders/1909@1x.png differ
diff --git a/imgs/renders/1909@2x.png b/imgs/renders/1909@2x.png
new file mode 100644
index 000000000..e0441b134
Binary files /dev/null and b/imgs/renders/1909@2x.png differ
diff --git a/imgs/renders/1912.png b/imgs/renders/1912@1x.png
similarity index 100%
rename from imgs/renders/1912.png
rename to imgs/renders/1912@1x.png
diff --git a/imgs/renders/1912@2x.png b/imgs/renders/1912@2x.png
new file mode 100644
index 000000000..f1994e56a
Binary files /dev/null and b/imgs/renders/1912@2x.png differ
diff --git a/imgs/renders/1913.png b/imgs/renders/1913@1x.png
similarity index 100%
rename from imgs/renders/1913.png
rename to imgs/renders/1913@1x.png
diff --git a/imgs/renders/1913@2x.png b/imgs/renders/1913@2x.png
new file mode 100644
index 000000000..883af8000
Binary files /dev/null and b/imgs/renders/1913@2x.png differ
diff --git a/imgs/renders/1914.png b/imgs/renders/1914@1x.png
similarity index 100%
rename from imgs/renders/1914.png
rename to imgs/renders/1914@1x.png
diff --git a/imgs/renders/1914@2x.png b/imgs/renders/1914@2x.png
new file mode 100644
index 000000000..f77c7324d
Binary files /dev/null and b/imgs/renders/1914@2x.png differ
diff --git a/imgs/renders/1916.png b/imgs/renders/1916.png
deleted file mode 100644
index 75b6a8c35..000000000
Binary files a/imgs/renders/1916.png and /dev/null differ
diff --git a/imgs/renders/1916@1x.png b/imgs/renders/1916@1x.png
new file mode 100644
index 000000000..db1852f5f
Binary files /dev/null and b/imgs/renders/1916@1x.png differ
diff --git a/imgs/renders/1916@2x.png b/imgs/renders/1916@2x.png
new file mode 100644
index 000000000..803da798c
Binary files /dev/null and b/imgs/renders/1916@2x.png differ
diff --git a/imgs/renders/1920.png b/imgs/renders/1920@1x.png
similarity index 100%
rename from imgs/renders/1920.png
rename to imgs/renders/1920@1x.png
diff --git a/imgs/renders/1920@2x.png b/imgs/renders/1920@2x.png
new file mode 100644
index 000000000..6ca2297a4
Binary files /dev/null and b/imgs/renders/1920@2x.png differ
diff --git a/imgs/renders/1921.png b/imgs/renders/1921@1x.png
similarity index 100%
rename from imgs/renders/1921.png
rename to imgs/renders/1921@1x.png
diff --git a/imgs/renders/1921@2x.png b/imgs/renders/1921@2x.png
new file mode 100644
index 000000000..369d03485
Binary files /dev/null and b/imgs/renders/1921@2x.png differ
diff --git a/imgs/renders/1925.png b/imgs/renders/1925@1x.png
similarity index 100%
rename from imgs/renders/1925.png
rename to imgs/renders/1925@1x.png
diff --git a/imgs/renders/1925@2x.png b/imgs/renders/1925@2x.png
new file mode 100644
index 000000000..f61fa91cd
Binary files /dev/null and b/imgs/renders/1925@2x.png differ
diff --git a/imgs/renders/1928.png b/imgs/renders/1928@1x.png
similarity index 100%
rename from imgs/renders/1928.png
rename to imgs/renders/1928@1x.png
diff --git a/imgs/renders/1928@2x.png b/imgs/renders/1928@2x.png
new file mode 100644
index 000000000..2dc43437c
Binary files /dev/null and b/imgs/renders/1928@2x.png differ
diff --git a/imgs/renders/1931.png b/imgs/renders/1931@1x.png
similarity index 100%
rename from imgs/renders/1931.png
rename to imgs/renders/1931@1x.png
diff --git a/imgs/renders/1931@2x.png b/imgs/renders/1931@2x.png
new file mode 100644
index 000000000..e0a676c09
Binary files /dev/null and b/imgs/renders/1931@2x.png differ
diff --git a/imgs/renders/1943.png b/imgs/renders/1943@1x.png
similarity index 100%
rename from imgs/renders/1943.png
rename to imgs/renders/1943@1x.png
diff --git a/imgs/renders/1943@2x.png b/imgs/renders/1943@2x.png
new file mode 100644
index 000000000..2a86ed72e
Binary files /dev/null and b/imgs/renders/1943@2x.png differ
diff --git a/imgs/renders/1945.png b/imgs/renders/1945@1x.png
similarity index 100%
rename from imgs/renders/1945.png
rename to imgs/renders/1945@1x.png
diff --git a/imgs/renders/1945@2x.png b/imgs/renders/1945@2x.png
new file mode 100644
index 000000000..2b515f241
Binary files /dev/null and b/imgs/renders/1945@2x.png differ
diff --git a/imgs/renders/1948.png b/imgs/renders/1948@1x.png
similarity index 100%
rename from imgs/renders/1948.png
rename to imgs/renders/1948@1x.png
diff --git a/imgs/renders/1948@2x.png b/imgs/renders/1948@2x.png
new file mode 100644
index 000000000..ff2ec7499
Binary files /dev/null and b/imgs/renders/1948@2x.png differ
diff --git a/imgs/renders/1950.png b/imgs/renders/1950@1x.png
similarity index 100%
rename from imgs/renders/1950.png
rename to imgs/renders/1950@1x.png
diff --git a/imgs/renders/1950@2x.png b/imgs/renders/1950@2x.png
new file mode 100644
index 000000000..6bd0d4c41
Binary files /dev/null and b/imgs/renders/1950@2x.png differ
diff --git a/imgs/renders/1966.png b/imgs/renders/1966@1x.png
similarity index 100%
rename from imgs/renders/1966.png
rename to imgs/renders/1966@1x.png
diff --git a/imgs/renders/1966@2x.png b/imgs/renders/1966@2x.png
new file mode 100644
index 000000000..201b0df22
Binary files /dev/null and b/imgs/renders/1966@2x.png differ
diff --git a/imgs/renders/1973.png b/imgs/renders/1973@1x.png
similarity index 100%
rename from imgs/renders/1973.png
rename to imgs/renders/1973@1x.png
diff --git a/imgs/renders/1973@2x.png b/imgs/renders/1973@2x.png
new file mode 100644
index 000000000..b65aa4f35
Binary files /dev/null and b/imgs/renders/1973@2x.png differ
diff --git a/imgs/renders/1976.png b/imgs/renders/1976@1x.png
similarity index 100%
rename from imgs/renders/1976.png
rename to imgs/renders/1976@1x.png
diff --git a/imgs/renders/1976@2x.png b/imgs/renders/1976@2x.png
new file mode 100644
index 000000000..ebfa966ee
Binary files /dev/null and b/imgs/renders/1976@2x.png differ
diff --git a/imgs/renders/20136.png b/imgs/renders/20136@1x.png
similarity index 100%
rename from imgs/renders/20136.png
rename to imgs/renders/20136@1x.png
diff --git a/imgs/renders/20136@2x.png b/imgs/renders/20136@2x.png
new file mode 100644
index 000000000..5661464ec
Binary files /dev/null and b/imgs/renders/20136@2x.png differ
diff --git a/imgs/renders/20137.png b/imgs/renders/20137.png
deleted file mode 100644
index 50b114455..000000000
Binary files a/imgs/renders/20137.png and /dev/null differ
diff --git a/imgs/renders/20137@1x.png b/imgs/renders/20137@1x.png
new file mode 100644
index 000000000..f3e96ae7a
Binary files /dev/null and b/imgs/renders/20137@1x.png differ
diff --git a/imgs/renders/20137@2x.png b/imgs/renders/20137@2x.png
new file mode 100644
index 000000000..1779892e0
Binary files /dev/null and b/imgs/renders/20137@2x.png differ
diff --git a/imgs/renders/20198.png b/imgs/renders/20198.png
deleted file mode 100644
index 4ab2cadfb..000000000
Binary files a/imgs/renders/20198.png and /dev/null differ
diff --git a/imgs/renders/20198@1x.png b/imgs/renders/20198@1x.png
new file mode 100644
index 000000000..4d2a1d6d0
Binary files /dev/null and b/imgs/renders/20198@1x.png differ
diff --git a/imgs/renders/20198@2x.png b/imgs/renders/20198@2x.png
new file mode 100644
index 000000000..b9ec5e04d
Binary files /dev/null and b/imgs/renders/20198@2x.png differ
diff --git a/imgs/renders/20199.png b/imgs/renders/20199@1x.png
similarity index 100%
rename from imgs/renders/20199.png
rename to imgs/renders/20199@1x.png
diff --git a/imgs/renders/20199@2x.png b/imgs/renders/20199@2x.png
new file mode 100644
index 000000000..757a4985b
Binary files /dev/null and b/imgs/renders/20199@2x.png differ
diff --git a/imgs/renders/20200.png b/imgs/renders/20200.png
deleted file mode 100644
index ac05d0d78..000000000
Binary files a/imgs/renders/20200.png and /dev/null differ
diff --git a/imgs/renders/20200@1x.png b/imgs/renders/20200@1x.png
new file mode 100644
index 000000000..8648e030f
Binary files /dev/null and b/imgs/renders/20200@1x.png differ
diff --git a/imgs/renders/20200@2x.png b/imgs/renders/20200@2x.png
new file mode 100644
index 000000000..6497820a1
Binary files /dev/null and b/imgs/renders/20200@2x.png differ
diff --git a/imgs/renders/20201.png b/imgs/renders/20201@1x.png
similarity index 100%
rename from imgs/renders/20201.png
rename to imgs/renders/20201@1x.png
diff --git a/imgs/renders/20201@2x.png b/imgs/renders/20201@2x.png
new file mode 100644
index 000000000..6f011af2c
Binary files /dev/null and b/imgs/renders/20201@2x.png differ
diff --git a/imgs/renders/20202.png b/imgs/renders/20202@1x.png
similarity index 100%
rename from imgs/renders/20202.png
rename to imgs/renders/20202@1x.png
diff --git a/imgs/renders/20202@2x.png b/imgs/renders/20202@2x.png
new file mode 100644
index 000000000..989fa0772
Binary files /dev/null and b/imgs/renders/20202@2x.png differ
diff --git a/imgs/renders/20215.png b/imgs/renders/20215.png
deleted file mode 100644
index aabe56a1c..000000000
Binary files a/imgs/renders/20215.png and /dev/null differ
diff --git a/imgs/renders/20215@1x.png b/imgs/renders/20215@1x.png
new file mode 100644
index 000000000..12974bb88
Binary files /dev/null and b/imgs/renders/20215@1x.png differ
diff --git a/imgs/renders/20215@2x.png b/imgs/renders/20215@2x.png
new file mode 100644
index 000000000..1a8c86618
Binary files /dev/null and b/imgs/renders/20215@2x.png differ
diff --git a/imgs/renders/20216.png b/imgs/renders/20216.png
deleted file mode 100644
index e955b2c45..000000000
Binary files a/imgs/renders/20216.png and /dev/null differ
diff --git a/imgs/renders/20216@1x.png b/imgs/renders/20216@1x.png
new file mode 100644
index 000000000..327e1a170
Binary files /dev/null and b/imgs/renders/20216@1x.png differ
diff --git a/imgs/renders/20216@2x.png b/imgs/renders/20216@2x.png
new file mode 100644
index 000000000..c349a240e
Binary files /dev/null and b/imgs/renders/20216@2x.png differ
diff --git a/imgs/renders/20217.png b/imgs/renders/20217.png
deleted file mode 100644
index b8586bae0..000000000
Binary files a/imgs/renders/20217.png and /dev/null differ
diff --git a/imgs/renders/20217@1x.png b/imgs/renders/20217@1x.png
new file mode 100644
index 000000000..0aac1bd9e
Binary files /dev/null and b/imgs/renders/20217@1x.png differ
diff --git a/imgs/renders/20217@2x.png b/imgs/renders/20217@2x.png
new file mode 100644
index 000000000..d48d2287d
Binary files /dev/null and b/imgs/renders/20217@2x.png differ
diff --git a/imgs/renders/20218.png b/imgs/renders/20218.png
deleted file mode 100644
index cdbb2d9f5..000000000
Binary files a/imgs/renders/20218.png and /dev/null differ
diff --git a/imgs/renders/20218@1x.png b/imgs/renders/20218@1x.png
new file mode 100644
index 000000000..26c13bfa8
Binary files /dev/null and b/imgs/renders/20218@1x.png differ
diff --git a/imgs/renders/20218@2x.png b/imgs/renders/20218@2x.png
new file mode 100644
index 000000000..43dc3def5
Binary files /dev/null and b/imgs/renders/20218@2x.png differ
diff --git a/imgs/renders/20227.png b/imgs/renders/20227.png
deleted file mode 100644
index 0ab8aeea9..000000000
Binary files a/imgs/renders/20227.png and /dev/null differ
diff --git a/imgs/renders/20227@1x.png b/imgs/renders/20227@1x.png
new file mode 100644
index 000000000..338d14f3f
Binary files /dev/null and b/imgs/renders/20227@1x.png differ
diff --git a/imgs/renders/20227@2x.png b/imgs/renders/20227@2x.png
new file mode 100644
index 000000000..f0794e021
Binary files /dev/null and b/imgs/renders/20227@2x.png differ
diff --git a/imgs/renders/20229.png b/imgs/renders/20229.png
deleted file mode 100644
index fcc104dbc..000000000
Binary files a/imgs/renders/20229.png and /dev/null differ
diff --git a/imgs/renders/20229@1x.png b/imgs/renders/20229@1x.png
new file mode 100644
index 000000000..7d31a8f50
Binary files /dev/null and b/imgs/renders/20229@1x.png differ
diff --git a/imgs/renders/20229@2x.png b/imgs/renders/20229@2x.png
new file mode 100644
index 000000000..69f066d10
Binary files /dev/null and b/imgs/renders/20229@2x.png differ
diff --git a/imgs/renders/20230.png b/imgs/renders/20230.png
deleted file mode 100644
index fe2b13d20..000000000
Binary files a/imgs/renders/20230.png and /dev/null differ
diff --git a/imgs/renders/20230@1x.png b/imgs/renders/20230@1x.png
new file mode 100644
index 000000000..5a504135e
Binary files /dev/null and b/imgs/renders/20230@1x.png differ
diff --git a/imgs/renders/20230@2x.png b/imgs/renders/20230@2x.png
new file mode 100644
index 000000000..f9b11ded2
Binary files /dev/null and b/imgs/renders/20230@2x.png differ
diff --git a/imgs/renders/20231.png b/imgs/renders/20231@1x.png
similarity index 100%
rename from imgs/renders/20231.png
rename to imgs/renders/20231@1x.png
diff --git a/imgs/renders/20231@2x.png b/imgs/renders/20231@2x.png
new file mode 100644
index 000000000..9223a89ca
Binary files /dev/null and b/imgs/renders/20231@2x.png differ
diff --git a/imgs/renders/20277.png b/imgs/renders/20277@1x.png
similarity index 100%
rename from imgs/renders/20277.png
rename to imgs/renders/20277@1x.png
diff --git a/imgs/renders/20277@2x.png b/imgs/renders/20277@2x.png
new file mode 100644
index 000000000..a5d146674
Binary files /dev/null and b/imgs/renders/20277@2x.png differ
diff --git a/imgs/renders/20283.png b/imgs/renders/20283.png
deleted file mode 100644
index b09434c1d..000000000
Binary files a/imgs/renders/20283.png and /dev/null differ
diff --git a/imgs/renders/20283@1x.png b/imgs/renders/20283@1x.png
new file mode 100644
index 000000000..5c388a341
Binary files /dev/null and b/imgs/renders/20283@1x.png differ
diff --git a/imgs/renders/20283@2x.png b/imgs/renders/20283@2x.png
new file mode 100644
index 000000000..8ed14eab2
Binary files /dev/null and b/imgs/renders/20283@2x.png differ
diff --git a/imgs/renders/20301.png b/imgs/renders/20301@1x.png
similarity index 100%
rename from imgs/renders/20301.png
rename to imgs/renders/20301@1x.png
diff --git a/imgs/renders/20301@2x.png b/imgs/renders/20301@2x.png
new file mode 100644
index 000000000..e3c0c6313
Binary files /dev/null and b/imgs/renders/20301@2x.png differ
diff --git a/imgs/renders/20344.png b/imgs/renders/20344@1x.png
similarity index 100%
rename from imgs/renders/20344.png
rename to imgs/renders/20344@1x.png
diff --git a/imgs/renders/20344@2x.png b/imgs/renders/20344@2x.png
new file mode 100644
index 000000000..60b274dea
Binary files /dev/null and b/imgs/renders/20344@2x.png differ
diff --git a/imgs/renders/20345.png b/imgs/renders/20345@1x.png
similarity index 100%
rename from imgs/renders/20345.png
rename to imgs/renders/20345@1x.png
diff --git a/imgs/renders/20345@2x.png b/imgs/renders/20345@2x.png
new file mode 100644
index 000000000..3c3914289
Binary files /dev/null and b/imgs/renders/20345@2x.png differ
diff --git a/imgs/renders/20384.png b/imgs/renders/20384@1x.png
similarity index 100%
rename from imgs/renders/20384.png
rename to imgs/renders/20384@1x.png
diff --git a/imgs/renders/20384@2x.png b/imgs/renders/20384@2x.png
new file mode 100644
index 000000000..825ec73d6
Binary files /dev/null and b/imgs/renders/20384@2x.png differ
diff --git a/imgs/renders/20385.png b/imgs/renders/20385@1x.png
similarity index 100%
rename from imgs/renders/20385.png
rename to imgs/renders/20385@1x.png
diff --git a/imgs/renders/20385@2x.png b/imgs/renders/20385@2x.png
new file mode 100644
index 000000000..97c4632de
Binary files /dev/null and b/imgs/renders/20385@2x.png differ
diff --git a/imgs/renders/20386.png b/imgs/renders/20386@1x.png
similarity index 100%
rename from imgs/renders/20386.png
rename to imgs/renders/20386@1x.png
diff --git a/imgs/renders/20386@2x.png b/imgs/renders/20386@2x.png
new file mode 100644
index 000000000..4bad4be1d
Binary files /dev/null and b/imgs/renders/20386@2x.png differ
diff --git a/imgs/renders/20402.png b/imgs/renders/20402@1x.png
similarity index 100%
rename from imgs/renders/20402.png
rename to imgs/renders/20402@1x.png
diff --git a/imgs/renders/20402@2x.png b/imgs/renders/20402@2x.png
new file mode 100644
index 000000000..77ee3c59b
Binary files /dev/null and b/imgs/renders/20402@2x.png differ
diff --git a/imgs/renders/20403.png b/imgs/renders/20403@1x.png
similarity index 100%
rename from imgs/renders/20403.png
rename to imgs/renders/20403@1x.png
diff --git a/imgs/renders/20403@2x.png b/imgs/renders/20403@2x.png
new file mode 100644
index 000000000..05ffccb7b
Binary files /dev/null and b/imgs/renders/20403@2x.png differ
diff --git a/imgs/renders/2043.png b/imgs/renders/2043@1x.png
similarity index 100%
rename from imgs/renders/2043.png
rename to imgs/renders/2043@1x.png
diff --git a/imgs/renders/2043@2x.png b/imgs/renders/2043@2x.png
new file mode 100644
index 000000000..5825741ce
Binary files /dev/null and b/imgs/renders/2043@2x.png differ
diff --git a/imgs/renders/2044.png b/imgs/renders/2044@1x.png
similarity index 100%
rename from imgs/renders/2044.png
rename to imgs/renders/2044@1x.png
diff --git a/imgs/renders/2044@2x.png b/imgs/renders/2044@2x.png
new file mode 100644
index 000000000..27719a56e
Binary files /dev/null and b/imgs/renders/2044@2x.png differ
diff --git a/imgs/renders/2045.png b/imgs/renders/2045@1x.png
similarity index 100%
rename from imgs/renders/2045.png
rename to imgs/renders/2045@1x.png
diff --git a/imgs/renders/2045@2x.png b/imgs/renders/2045@2x.png
new file mode 100644
index 000000000..6a95562b3
Binary files /dev/null and b/imgs/renders/2045@2x.png differ
diff --git a/imgs/renders/20600.png b/imgs/renders/20600@1x.png
similarity index 100%
rename from imgs/renders/20600.png
rename to imgs/renders/20600@1x.png
diff --git a/imgs/renders/20600@2x.png b/imgs/renders/20600@2x.png
new file mode 100644
index 000000000..75e98dbdd
Binary files /dev/null and b/imgs/renders/20600@2x.png differ
diff --git a/imgs/renders/20604.png b/imgs/renders/20604@1x.png
similarity index 100%
rename from imgs/renders/20604.png
rename to imgs/renders/20604@1x.png
diff --git a/imgs/renders/20604@2x.png b/imgs/renders/20604@2x.png
new file mode 100644
index 000000000..3a1799c5b
Binary files /dev/null and b/imgs/renders/20604@2x.png differ
diff --git a/imgs/renders/20605.png b/imgs/renders/20605.png
deleted file mode 100644
index 1ef80c05a..000000000
Binary files a/imgs/renders/20605.png and /dev/null differ
diff --git a/imgs/renders/20605@1x.png b/imgs/renders/20605@1x.png
new file mode 100644
index 000000000..724645b65
Binary files /dev/null and b/imgs/renders/20605@1x.png differ
diff --git a/imgs/renders/20605@2x.png b/imgs/renders/20605@2x.png
new file mode 100644
index 000000000..2e561effa
Binary files /dev/null and b/imgs/renders/20605@2x.png differ
diff --git a/imgs/renders/20614.png b/imgs/renders/20614@1x.png
similarity index 100%
rename from imgs/renders/20614.png
rename to imgs/renders/20614@1x.png
diff --git a/imgs/renders/20614@2x.png b/imgs/renders/20614@2x.png
new file mode 100644
index 000000000..0e79f28f0
Binary files /dev/null and b/imgs/renders/20614@2x.png differ
diff --git a/imgs/renders/20615.png b/imgs/renders/20615@1x.png
similarity index 100%
rename from imgs/renders/20615.png
rename to imgs/renders/20615@1x.png
diff --git a/imgs/renders/20615@2x.png b/imgs/renders/20615@2x.png
new file mode 100644
index 000000000..71cef3a23
Binary files /dev/null and b/imgs/renders/20615@2x.png differ
diff --git a/imgs/renders/20616.png b/imgs/renders/20616@1x.png
similarity index 100%
rename from imgs/renders/20616.png
rename to imgs/renders/20616@1x.png
diff --git a/imgs/renders/20616@2x.png b/imgs/renders/20616@2x.png
new file mode 100644
index 000000000..be8cd9f81
Binary files /dev/null and b/imgs/renders/20616@2x.png differ
diff --git a/imgs/renders/20977.png b/imgs/renders/20977@1x.png
similarity index 100%
rename from imgs/renders/20977.png
rename to imgs/renders/20977@1x.png
diff --git a/imgs/renders/20977@2x.png b/imgs/renders/20977@2x.png
new file mode 100644
index 000000000..95663cd70
Binary files /dev/null and b/imgs/renders/20977@2x.png differ
diff --git a/imgs/renders/20980.png b/imgs/renders/20980.png
deleted file mode 100644
index 4e38b88e7..000000000
Binary files a/imgs/renders/20980.png and /dev/null differ
diff --git a/imgs/renders/20980@1x.png b/imgs/renders/20980@1x.png
new file mode 100644
index 000000000..c8c6653a5
Binary files /dev/null and b/imgs/renders/20980@1x.png differ
diff --git a/imgs/renders/20980@2x.png b/imgs/renders/20980@2x.png
new file mode 100644
index 000000000..02e1d326e
Binary files /dev/null and b/imgs/renders/20980@2x.png differ
diff --git a/imgs/renders/21052.png b/imgs/renders/21052.png
deleted file mode 100644
index afc5ec8a7..000000000
Binary files a/imgs/renders/21052.png and /dev/null differ
diff --git a/imgs/renders/21052@1x.png b/imgs/renders/21052@1x.png
new file mode 100644
index 000000000..5ae1cc314
Binary files /dev/null and b/imgs/renders/21052@1x.png differ
diff --git a/imgs/renders/21052@2x.png b/imgs/renders/21052@2x.png
new file mode 100644
index 000000000..88fe72edc
Binary files /dev/null and b/imgs/renders/21052@2x.png differ
diff --git a/imgs/renders/21076.png b/imgs/renders/21076@1x.png
similarity index 100%
rename from imgs/renders/21076.png
rename to imgs/renders/21076@1x.png
diff --git a/imgs/renders/21076@2x.png b/imgs/renders/21076@2x.png
new file mode 100644
index 000000000..2e53baa96
Binary files /dev/null and b/imgs/renders/21076@2x.png differ
diff --git a/imgs/renders/21135.png b/imgs/renders/21135.png
deleted file mode 100644
index 4147746cf..000000000
Binary files a/imgs/renders/21135.png and /dev/null differ
diff --git a/imgs/renders/21135@1x.png b/imgs/renders/21135@1x.png
new file mode 100644
index 000000000..fff7d9114
Binary files /dev/null and b/imgs/renders/21135@1x.png differ
diff --git a/imgs/renders/21135@2x.png b/imgs/renders/21135@2x.png
new file mode 100644
index 000000000..54fbbce65
Binary files /dev/null and b/imgs/renders/21135@2x.png differ
diff --git a/imgs/renders/21137.png b/imgs/renders/21137.png
deleted file mode 100644
index 75c6fb597..000000000
Binary files a/imgs/renders/21137.png and /dev/null differ
diff --git a/imgs/renders/21137@1x.png b/imgs/renders/21137@1x.png
new file mode 100644
index 000000000..968934a44
Binary files /dev/null and b/imgs/renders/21137@1x.png differ
diff --git a/imgs/renders/21137@2x.png b/imgs/renders/21137@2x.png
new file mode 100644
index 000000000..a5e7fdfbe
Binary files /dev/null and b/imgs/renders/21137@2x.png differ
diff --git a/imgs/renders/21138.png b/imgs/renders/21138@1x.png
similarity index 100%
rename from imgs/renders/21138.png
rename to imgs/renders/21138@1x.png
diff --git a/imgs/renders/21138@2x.png b/imgs/renders/21138@2x.png
new file mode 100644
index 000000000..fd47ef661
Binary files /dev/null and b/imgs/renders/21138@2x.png differ
diff --git a/imgs/renders/21139.png b/imgs/renders/21139.png
deleted file mode 100644
index d2172c7d2..000000000
Binary files a/imgs/renders/21139.png and /dev/null differ
diff --git a/imgs/renders/21139@1x.png b/imgs/renders/21139@1x.png
new file mode 100644
index 000000000..312191a0e
Binary files /dev/null and b/imgs/renders/21139@1x.png differ
diff --git a/imgs/renders/21139@2x.png b/imgs/renders/21139@2x.png
new file mode 100644
index 000000000..964fe4481
Binary files /dev/null and b/imgs/renders/21139@2x.png differ
diff --git a/imgs/renders/21150.png b/imgs/renders/21150.png
deleted file mode 100644
index 3c059ade9..000000000
Binary files a/imgs/renders/21150.png and /dev/null differ
diff --git a/imgs/renders/21150@1x.png b/imgs/renders/21150@1x.png
new file mode 100644
index 000000000..85332d957
Binary files /dev/null and b/imgs/renders/21150@1x.png differ
diff --git a/imgs/renders/21150@2x.png b/imgs/renders/21150@2x.png
new file mode 100644
index 000000000..4f97be0a8
Binary files /dev/null and b/imgs/renders/21150@2x.png differ
diff --git a/imgs/renders/21155.png b/imgs/renders/21155@1x.png
similarity index 100%
rename from imgs/renders/21155.png
rename to imgs/renders/21155@1x.png
diff --git a/imgs/renders/21155@2x.png b/imgs/renders/21155@2x.png
new file mode 100644
index 000000000..011f097fb
Binary files /dev/null and b/imgs/renders/21155@2x.png differ
diff --git a/imgs/renders/21156.png b/imgs/renders/21156@1x.png
similarity index 100%
rename from imgs/renders/21156.png
rename to imgs/renders/21156@1x.png
diff --git a/imgs/renders/21156@2x.png b/imgs/renders/21156@2x.png
new file mode 100644
index 000000000..29e3aff01
Binary files /dev/null and b/imgs/renders/21156@2x.png differ
diff --git a/imgs/renders/21210.png b/imgs/renders/21210@1x.png
similarity index 100%
rename from imgs/renders/21210.png
rename to imgs/renders/21210@1x.png
diff --git a/imgs/renders/21210@2x.png b/imgs/renders/21210@2x.png
new file mode 100644
index 000000000..bcfcde99c
Binary files /dev/null and b/imgs/renders/21210@2x.png differ
diff --git a/imgs/renders/21217.png b/imgs/renders/21217.png
deleted file mode 100644
index 7a1ba9757..000000000
Binary files a/imgs/renders/21217.png and /dev/null differ
diff --git a/imgs/renders/21217@1x.png b/imgs/renders/21217@1x.png
new file mode 100644
index 000000000..1db6f4399
Binary files /dev/null and b/imgs/renders/21217@1x.png differ
diff --git a/imgs/renders/21217@2x.png b/imgs/renders/21217@2x.png
new file mode 100644
index 000000000..9f33cae74
Binary files /dev/null and b/imgs/renders/21217@2x.png differ
diff --git a/imgs/renders/21218.png b/imgs/renders/21218@1x.png
similarity index 100%
rename from imgs/renders/21218.png
rename to imgs/renders/21218@1x.png
diff --git a/imgs/renders/21218@2x.png b/imgs/renders/21218@2x.png
new file mode 100644
index 000000000..2e615eaa0
Binary files /dev/null and b/imgs/renders/21218@2x.png differ
diff --git a/imgs/renders/21219.png b/imgs/renders/21219@1x.png
similarity index 100%
rename from imgs/renders/21219.png
rename to imgs/renders/21219@1x.png
diff --git a/imgs/renders/21219@2x.png b/imgs/renders/21219@2x.png
new file mode 100644
index 000000000..b831bbd45
Binary files /dev/null and b/imgs/renders/21219@2x.png differ
diff --git a/imgs/renders/21220.png b/imgs/renders/21220@1x.png
similarity index 100%
rename from imgs/renders/21220.png
rename to imgs/renders/21220@1x.png
diff --git a/imgs/renders/21220@2x.png b/imgs/renders/21220@2x.png
new file mode 100644
index 000000000..12110db02
Binary files /dev/null and b/imgs/renders/21220@2x.png differ
diff --git a/imgs/renders/21221.png b/imgs/renders/21221@1x.png
similarity index 100%
rename from imgs/renders/21221.png
rename to imgs/renders/21221@1x.png
diff --git a/imgs/renders/21221@2x.png b/imgs/renders/21221@2x.png
new file mode 100644
index 000000000..cffa0837b
Binary files /dev/null and b/imgs/renders/21221@2x.png differ
diff --git a/imgs/renders/21222.png b/imgs/renders/21222@1x.png
similarity index 100%
rename from imgs/renders/21222.png
rename to imgs/renders/21222@1x.png
diff --git a/imgs/renders/21222@2x.png b/imgs/renders/21222@2x.png
new file mode 100644
index 000000000..28773ac39
Binary files /dev/null and b/imgs/renders/21222@2x.png differ
diff --git a/imgs/renders/21223.png b/imgs/renders/21223@1x.png
similarity index 100%
rename from imgs/renders/21223.png
rename to imgs/renders/21223@1x.png
diff --git a/imgs/renders/21223@2x.png b/imgs/renders/21223@2x.png
new file mode 100644
index 000000000..485e800fa
Binary files /dev/null and b/imgs/renders/21223@2x.png differ
diff --git a/imgs/renders/21224.png b/imgs/renders/21224@1x.png
similarity index 100%
rename from imgs/renders/21224.png
rename to imgs/renders/21224@1x.png
diff --git a/imgs/renders/21224@2x.png b/imgs/renders/21224@2x.png
new file mode 100644
index 000000000..103a68a60
Binary files /dev/null and b/imgs/renders/21224@2x.png differ
diff --git a/imgs/renders/2122.png b/imgs/renders/2122@1x.png
similarity index 100%
rename from imgs/renders/2122.png
rename to imgs/renders/2122@1x.png
diff --git a/imgs/renders/2122@2x.png b/imgs/renders/2122@2x.png
new file mode 100644
index 000000000..86aa335a9
Binary files /dev/null and b/imgs/renders/2122@2x.png differ
diff --git a/imgs/renders/2123.png b/imgs/renders/2123.png
deleted file mode 100644
index 683c7c203..000000000
Binary files a/imgs/renders/2123.png and /dev/null differ
diff --git a/imgs/renders/2123@1x.png b/imgs/renders/2123@1x.png
new file mode 100644
index 000000000..6996dfe2a
Binary files /dev/null and b/imgs/renders/2123@1x.png differ
diff --git a/imgs/renders/2123@2x.png b/imgs/renders/2123@2x.png
new file mode 100644
index 000000000..e34fe7b26
Binary files /dev/null and b/imgs/renders/2123@2x.png differ
diff --git a/imgs/renders/21252.png b/imgs/renders/21252@1x.png
similarity index 100%
rename from imgs/renders/21252.png
rename to imgs/renders/21252@1x.png
diff --git a/imgs/renders/21252@2x.png b/imgs/renders/21252@2x.png
new file mode 100644
index 000000000..4acfb7ac1
Binary files /dev/null and b/imgs/renders/21252@2x.png differ
diff --git a/imgs/renders/21254.png b/imgs/renders/21254@1x.png
similarity index 100%
rename from imgs/renders/21254.png
rename to imgs/renders/21254@1x.png
diff --git a/imgs/renders/21254@2x.png b/imgs/renders/21254@2x.png
new file mode 100644
index 000000000..3f7ab3b7e
Binary files /dev/null and b/imgs/renders/21254@2x.png differ
diff --git a/imgs/renders/21255.png b/imgs/renders/21255@1x.png
similarity index 100%
rename from imgs/renders/21255.png
rename to imgs/renders/21255@1x.png
diff --git a/imgs/renders/21255@2x.png b/imgs/renders/21255@2x.png
new file mode 100644
index 000000000..94f22e4b1
Binary files /dev/null and b/imgs/renders/21255@2x.png differ
diff --git a/imgs/renders/21256.png b/imgs/renders/21256@1x.png
similarity index 100%
rename from imgs/renders/21256.png
rename to imgs/renders/21256@1x.png
diff --git a/imgs/renders/21256@2x.png b/imgs/renders/21256@2x.png
new file mode 100644
index 000000000..cf23c71fe
Binary files /dev/null and b/imgs/renders/21256@2x.png differ
diff --git a/imgs/renders/21277.png b/imgs/renders/21277@1x.png
similarity index 100%
rename from imgs/renders/21277.png
rename to imgs/renders/21277@1x.png
diff --git a/imgs/renders/21277@2x.png b/imgs/renders/21277@2x.png
new file mode 100644
index 000000000..04b3b3e98
Binary files /dev/null and b/imgs/renders/21277@2x.png differ
diff --git a/imgs/renders/21278.png b/imgs/renders/21278@1x.png
similarity index 100%
rename from imgs/renders/21278.png
rename to imgs/renders/21278@1x.png
diff --git a/imgs/renders/21278@2x.png b/imgs/renders/21278@2x.png
new file mode 100644
index 000000000..24f60abb4
Binary files /dev/null and b/imgs/renders/21278@2x.png differ
diff --git a/imgs/renders/21279.png b/imgs/renders/21279.png
deleted file mode 100644
index f208bbe6d..000000000
Binary files a/imgs/renders/21279.png and /dev/null differ
diff --git a/imgs/renders/21279@1x.png b/imgs/renders/21279@1x.png
new file mode 100644
index 000000000..a9217b225
Binary files /dev/null and b/imgs/renders/21279@1x.png differ
diff --git a/imgs/renders/21279@2x.png b/imgs/renders/21279@2x.png
new file mode 100644
index 000000000..5a2b9eb96
Binary files /dev/null and b/imgs/renders/21279@2x.png differ
diff --git a/imgs/renders/21280.png b/imgs/renders/21280.png
deleted file mode 100644
index 551b3fcee..000000000
Binary files a/imgs/renders/21280.png and /dev/null differ
diff --git a/imgs/renders/21280@1x.png b/imgs/renders/21280@1x.png
new file mode 100644
index 000000000..a69ccc58f
Binary files /dev/null and b/imgs/renders/21280@1x.png differ
diff --git a/imgs/renders/21280@2x.png b/imgs/renders/21280@2x.png
new file mode 100644
index 000000000..8e71c1f4e
Binary files /dev/null and b/imgs/renders/21280@2x.png differ
diff --git a/imgs/renders/21282.png b/imgs/renders/21282@1x.png
similarity index 100%
rename from imgs/renders/21282.png
rename to imgs/renders/21282@1x.png
diff --git a/imgs/renders/21282@2x.png b/imgs/renders/21282@2x.png
new file mode 100644
index 000000000..74b977562
Binary files /dev/null and b/imgs/renders/21282@2x.png differ
diff --git a/imgs/renders/21283.png b/imgs/renders/21283@1x.png
similarity index 100%
rename from imgs/renders/21283.png
rename to imgs/renders/21283@1x.png
diff --git a/imgs/renders/21283@2x.png b/imgs/renders/21283@2x.png
new file mode 100644
index 000000000..9fd62b988
Binary files /dev/null and b/imgs/renders/21283@2x.png differ
diff --git a/imgs/renders/21315.png b/imgs/renders/21315.png
deleted file mode 100644
index a979cf167..000000000
Binary files a/imgs/renders/21315.png and /dev/null differ
diff --git a/imgs/renders/21315@1x.png b/imgs/renders/21315@1x.png
new file mode 100644
index 000000000..533c0e8b0
Binary files /dev/null and b/imgs/renders/21315@1x.png differ
diff --git a/imgs/renders/21315@2x.png b/imgs/renders/21315@2x.png
new file mode 100644
index 000000000..73d49c207
Binary files /dev/null and b/imgs/renders/21315@2x.png differ
diff --git a/imgs/renders/21344.png b/imgs/renders/21344@1x.png
similarity index 100%
rename from imgs/renders/21344.png
rename to imgs/renders/21344@1x.png
diff --git a/imgs/renders/21344@2x.png b/imgs/renders/21344@2x.png
new file mode 100644
index 000000000..9acc6be76
Binary files /dev/null and b/imgs/renders/21344@2x.png differ
diff --git a/imgs/renders/21354.png b/imgs/renders/21354@1x.png
similarity index 100%
rename from imgs/renders/21354.png
rename to imgs/renders/21354@1x.png
diff --git a/imgs/renders/21354@2x.png b/imgs/renders/21354@2x.png
new file mode 100644
index 000000000..558912f59
Binary files /dev/null and b/imgs/renders/21354@2x.png differ
diff --git a/imgs/renders/21358.png b/imgs/renders/21358@1x.png
similarity index 100%
rename from imgs/renders/21358.png
rename to imgs/renders/21358@1x.png
diff --git a/imgs/renders/21358@2x.png b/imgs/renders/21358@2x.png
new file mode 100644
index 000000000..ffca3508c
Binary files /dev/null and b/imgs/renders/21358@2x.png differ
diff --git a/imgs/renders/21360.png b/imgs/renders/21360@1x.png
similarity index 100%
rename from imgs/renders/21360.png
rename to imgs/renders/21360@1x.png
diff --git a/imgs/renders/21360@2x.png b/imgs/renders/21360@2x.png
new file mode 100644
index 000000000..0178d7833
Binary files /dev/null and b/imgs/renders/21360@2x.png differ
diff --git a/imgs/renders/21361.png b/imgs/renders/21361@1x.png
similarity index 100%
rename from imgs/renders/21361.png
rename to imgs/renders/21361@1x.png
diff --git a/imgs/renders/21361@2x.png b/imgs/renders/21361@2x.png
new file mode 100644
index 000000000..13dc94b6c
Binary files /dev/null and b/imgs/renders/21361@2x.png differ
diff --git a/imgs/renders/21362.png b/imgs/renders/21362@1x.png
similarity index 100%
rename from imgs/renders/21362.png
rename to imgs/renders/21362@1x.png
diff --git a/imgs/renders/21362@2x.png b/imgs/renders/21362@2x.png
new file mode 100644
index 000000000..76f8c21ec
Binary files /dev/null and b/imgs/renders/21362@2x.png differ
diff --git a/imgs/renders/2138.png b/imgs/renders/2138@1x.png
similarity index 100%
rename from imgs/renders/2138.png
rename to imgs/renders/2138@1x.png
diff --git a/imgs/renders/2138@2x.png b/imgs/renders/2138@2x.png
new file mode 100644
index 000000000..8188ae96d
Binary files /dev/null and b/imgs/renders/2138@2x.png differ
diff --git a/imgs/renders/2139.png b/imgs/renders/2139@1x.png
similarity index 100%
rename from imgs/renders/2139.png
rename to imgs/renders/2139@1x.png
diff --git a/imgs/renders/2139@2x.png b/imgs/renders/2139@2x.png
new file mode 100644
index 000000000..0958b3f25
Binary files /dev/null and b/imgs/renders/2139@2x.png differ
diff --git a/imgs/renders/21405.png b/imgs/renders/21405@1x.png
similarity index 100%
rename from imgs/renders/21405.png
rename to imgs/renders/21405@1x.png
diff --git a/imgs/renders/21405@2x.png b/imgs/renders/21405@2x.png
new file mode 100644
index 000000000..1544305ff
Binary files /dev/null and b/imgs/renders/21405@2x.png differ
diff --git a/imgs/renders/21406.png b/imgs/renders/21406@1x.png
similarity index 100%
rename from imgs/renders/21406.png
rename to imgs/renders/21406@1x.png
diff --git a/imgs/renders/21406@2x.png b/imgs/renders/21406@2x.png
new file mode 100644
index 000000000..82b347168
Binary files /dev/null and b/imgs/renders/21406@2x.png differ
diff --git a/imgs/renders/2140.png b/imgs/renders/2140@1x.png
similarity index 100%
rename from imgs/renders/2140.png
rename to imgs/renders/2140@1x.png
diff --git a/imgs/renders/2140@2x.png b/imgs/renders/2140@2x.png
new file mode 100644
index 000000000..003424167
Binary files /dev/null and b/imgs/renders/2140@2x.png differ
diff --git a/imgs/renders/2141.png b/imgs/renders/2141.png
deleted file mode 100644
index 30e1aeb1c..000000000
Binary files a/imgs/renders/2141.png and /dev/null differ
diff --git a/imgs/renders/2141@1x.png b/imgs/renders/2141@1x.png
new file mode 100644
index 000000000..22f7ee49e
Binary files /dev/null and b/imgs/renders/2141@1x.png differ
diff --git a/imgs/renders/2141@2x.png b/imgs/renders/2141@2x.png
new file mode 100644
index 000000000..affc62937
Binary files /dev/null and b/imgs/renders/2141@2x.png differ
diff --git a/imgs/renders/21445.png b/imgs/renders/21445@1x.png
similarity index 100%
rename from imgs/renders/21445.png
rename to imgs/renders/21445@1x.png
diff --git a/imgs/renders/21445@2x.png b/imgs/renders/21445@2x.png
new file mode 100644
index 000000000..0b706a6b7
Binary files /dev/null and b/imgs/renders/21445@2x.png differ
diff --git a/imgs/renders/21451.png b/imgs/renders/21451@1x.png
similarity index 100%
rename from imgs/renders/21451.png
rename to imgs/renders/21451@1x.png
diff --git a/imgs/renders/21451@2x.png b/imgs/renders/21451@2x.png
new file mode 100644
index 000000000..cf04b1c99
Binary files /dev/null and b/imgs/renders/21451@2x.png differ
diff --git a/imgs/renders/21489.png b/imgs/renders/21489.png
deleted file mode 100644
index dd586ff40..000000000
Binary files a/imgs/renders/21489.png and /dev/null differ
diff --git a/imgs/renders/21489@1x.png b/imgs/renders/21489@1x.png
new file mode 100644
index 000000000..35bdf361f
Binary files /dev/null and b/imgs/renders/21489@1x.png differ
diff --git a/imgs/renders/21489@2x.png b/imgs/renders/21489@2x.png
new file mode 100644
index 000000000..28857c7cd
Binary files /dev/null and b/imgs/renders/21489@2x.png differ
diff --git a/imgs/renders/21490.png b/imgs/renders/21490.png
deleted file mode 100644
index 24cd179bd..000000000
Binary files a/imgs/renders/21490.png and /dev/null differ
diff --git a/imgs/renders/21490@1x.png b/imgs/renders/21490@1x.png
new file mode 100644
index 000000000..553afa996
Binary files /dev/null and b/imgs/renders/21490@1x.png differ
diff --git a/imgs/renders/21490@2x.png b/imgs/renders/21490@2x.png
new file mode 100644
index 000000000..be309b02e
Binary files /dev/null and b/imgs/renders/21490@2x.png differ
diff --git a/imgs/renders/21493.png b/imgs/renders/21493@1x.png
similarity index 100%
rename from imgs/renders/21493.png
rename to imgs/renders/21493@1x.png
diff --git a/imgs/renders/21493@2x.png b/imgs/renders/21493@2x.png
new file mode 100644
index 000000000..bdeef99c4
Binary files /dev/null and b/imgs/renders/21493@2x.png differ
diff --git a/imgs/renders/2157.png b/imgs/renders/2157@1x.png
similarity index 100%
rename from imgs/renders/2157.png
rename to imgs/renders/2157@1x.png
diff --git a/imgs/renders/2157@2x.png b/imgs/renders/2157@2x.png
new file mode 100644
index 000000000..c4439cd7e
Binary files /dev/null and b/imgs/renders/2157@2x.png differ
diff --git a/imgs/renders/2159.png b/imgs/renders/2159@1x.png
similarity index 100%
rename from imgs/renders/2159.png
rename to imgs/renders/2159@1x.png
diff --git a/imgs/renders/2159@2x.png b/imgs/renders/2159@2x.png
new file mode 100644
index 000000000..658697ccf
Binary files /dev/null and b/imgs/renders/2159@2x.png differ
diff --git a/imgs/renders/2160.png b/imgs/renders/2160.png
deleted file mode 100644
index 9672f7bc9..000000000
Binary files a/imgs/renders/2160.png and /dev/null differ
diff --git a/imgs/renders/2160@1x.png b/imgs/renders/2160@1x.png
new file mode 100644
index 000000000..3699c211a
Binary files /dev/null and b/imgs/renders/2160@1x.png differ
diff --git a/imgs/renders/2160@2x.png b/imgs/renders/2160@2x.png
new file mode 100644
index 000000000..3b02baf32
Binary files /dev/null and b/imgs/renders/2160@2x.png differ
diff --git a/imgs/renders/21766.png b/imgs/renders/21766.png
deleted file mode 100644
index 1c86ba6dd..000000000
Binary files a/imgs/renders/21766.png and /dev/null differ
diff --git a/imgs/renders/21766@1x.png b/imgs/renders/21766@1x.png
new file mode 100644
index 000000000..c4dacd372
Binary files /dev/null and b/imgs/renders/21766@1x.png differ
diff --git a/imgs/renders/21766@2x.png b/imgs/renders/21766@2x.png
new file mode 100644
index 000000000..746d9f943
Binary files /dev/null and b/imgs/renders/21766@2x.png differ
diff --git a/imgs/renders/21821.png b/imgs/renders/21821.png
deleted file mode 100644
index ddbb7cf5e..000000000
Binary files a/imgs/renders/21821.png and /dev/null differ
diff --git a/imgs/renders/21821@1x.png b/imgs/renders/21821@1x.png
new file mode 100644
index 000000000..ec9ae7e67
Binary files /dev/null and b/imgs/renders/21821@1x.png differ
diff --git a/imgs/renders/21821@2x.png b/imgs/renders/21821@2x.png
new file mode 100644
index 000000000..4afffee71
Binary files /dev/null and b/imgs/renders/21821@2x.png differ
diff --git a/imgs/renders/21822.png b/imgs/renders/21822@1x.png
similarity index 100%
rename from imgs/renders/21822.png
rename to imgs/renders/21822@1x.png
diff --git a/imgs/renders/21822@2x.png b/imgs/renders/21822@2x.png
new file mode 100644
index 000000000..66111d5de
Binary files /dev/null and b/imgs/renders/21822@2x.png differ
diff --git a/imgs/renders/21864.png b/imgs/renders/21864.png
deleted file mode 100644
index 350ae2319..000000000
Binary files a/imgs/renders/21864.png and /dev/null differ
diff --git a/imgs/renders/21864@1x.png b/imgs/renders/21864@1x.png
new file mode 100644
index 000000000..55b34dc6a
Binary files /dev/null and b/imgs/renders/21864@1x.png differ
diff --git a/imgs/renders/21864@2x.png b/imgs/renders/21864@2x.png
new file mode 100644
index 000000000..c3f37a42e
Binary files /dev/null and b/imgs/renders/21864@2x.png differ
diff --git a/imgs/renders/21976.png b/imgs/renders/21976.png
deleted file mode 100644
index aefeddc98..000000000
Binary files a/imgs/renders/21976.png and /dev/null differ
diff --git a/imgs/renders/21976@1x.png b/imgs/renders/21976@1x.png
new file mode 100644
index 000000000..29d5502a0
Binary files /dev/null and b/imgs/renders/21976@1x.png differ
diff --git a/imgs/renders/21976@2x.png b/imgs/renders/21976@2x.png
new file mode 100644
index 000000000..96ba704b8
Binary files /dev/null and b/imgs/renders/21976@2x.png differ
diff --git a/imgs/renders/21993.png b/imgs/renders/21993.png
deleted file mode 100644
index 58d3b493a..000000000
Binary files a/imgs/renders/21993.png and /dev/null differ
diff --git a/imgs/renders/21993@1x.png b/imgs/renders/21993@1x.png
new file mode 100644
index 000000000..dd556f7e5
Binary files /dev/null and b/imgs/renders/21993@1x.png differ
diff --git a/imgs/renders/21993@2x.png b/imgs/renders/21993@2x.png
new file mode 100644
index 000000000..613f33632
Binary files /dev/null and b/imgs/renders/21993@2x.png differ
diff --git a/imgs/renders/22001.png b/imgs/renders/22001.png
deleted file mode 100644
index 1f87b04ab..000000000
Binary files a/imgs/renders/22001.png and /dev/null differ
diff --git a/imgs/renders/22001@1x.png b/imgs/renders/22001@1x.png
new file mode 100644
index 000000000..049b625b1
Binary files /dev/null and b/imgs/renders/22001@1x.png differ
diff --git a/imgs/renders/22001@2x.png b/imgs/renders/22001@2x.png
new file mode 100644
index 000000000..04a3b2135
Binary files /dev/null and b/imgs/renders/22001@2x.png differ
diff --git a/imgs/renders/22007.png b/imgs/renders/22007.png
deleted file mode 100644
index 9fcb0d65a..000000000
Binary files a/imgs/renders/22007.png and /dev/null differ
diff --git a/imgs/renders/22007@1x.png b/imgs/renders/22007@1x.png
new file mode 100644
index 000000000..9fd047486
Binary files /dev/null and b/imgs/renders/22007@1x.png differ
diff --git a/imgs/renders/22007@2x.png b/imgs/renders/22007@2x.png
new file mode 100644
index 000000000..4f7daa73d
Binary files /dev/null and b/imgs/renders/22007@2x.png differ
diff --git a/imgs/renders/22070.png b/imgs/renders/22070@1x.png
similarity index 100%
rename from imgs/renders/22070.png
rename to imgs/renders/22070@1x.png
diff --git a/imgs/renders/22070@2x.png b/imgs/renders/22070@2x.png
new file mode 100644
index 000000000..cb1645d5a
Binary files /dev/null and b/imgs/renders/22070@2x.png differ
diff --git a/imgs/renders/22142.png b/imgs/renders/22142.png
deleted file mode 100644
index 9697779ee..000000000
Binary files a/imgs/renders/22142.png and /dev/null differ
diff --git a/imgs/renders/22142@1x.png b/imgs/renders/22142@1x.png
new file mode 100644
index 000000000..bbd81ce5a
Binary files /dev/null and b/imgs/renders/22142@1x.png differ
diff --git a/imgs/renders/22142@2x.png b/imgs/renders/22142@2x.png
new file mode 100644
index 000000000..b2dfe5322
Binary files /dev/null and b/imgs/renders/22142@2x.png differ
diff --git a/imgs/renders/22150.png b/imgs/renders/22150.png
deleted file mode 100644
index 3124c9d54..000000000
Binary files a/imgs/renders/22150.png and /dev/null differ
diff --git a/imgs/renders/22150@1x.png b/imgs/renders/22150@1x.png
new file mode 100644
index 000000000..3f0a62a40
Binary files /dev/null and b/imgs/renders/22150@1x.png differ
diff --git a/imgs/renders/22150@2x.png b/imgs/renders/22150@2x.png
new file mode 100644
index 000000000..750a4aad6
Binary files /dev/null and b/imgs/renders/22150@2x.png differ
diff --git a/imgs/renders/22161.png b/imgs/renders/22161.png
deleted file mode 100644
index a6cf11b6c..000000000
Binary files a/imgs/renders/22161.png and /dev/null differ
diff --git a/imgs/renders/22161@1x.png b/imgs/renders/22161@1x.png
new file mode 100644
index 000000000..2d5a611d2
Binary files /dev/null and b/imgs/renders/22161@1x.png differ
diff --git a/imgs/renders/22161@2x.png b/imgs/renders/22161@2x.png
new file mode 100644
index 000000000..26f32ac08
Binary files /dev/null and b/imgs/renders/22161@2x.png differ
diff --git a/imgs/renders/22189.png b/imgs/renders/22189.png
deleted file mode 100644
index d60a33c87..000000000
Binary files a/imgs/renders/22189.png and /dev/null differ
diff --git a/imgs/renders/22189@1x.png b/imgs/renders/22189@1x.png
new file mode 100644
index 000000000..b247ba1a4
Binary files /dev/null and b/imgs/renders/22189@1x.png differ
diff --git a/imgs/renders/22189@2x.png b/imgs/renders/22189@2x.png
new file mode 100644
index 000000000..b6fff3a88
Binary files /dev/null and b/imgs/renders/22189@2x.png differ
diff --git a/imgs/renders/22195.png b/imgs/renders/22195@1x.png
similarity index 100%
rename from imgs/renders/22195.png
rename to imgs/renders/22195@1x.png
diff --git a/imgs/renders/22195@2x.png b/imgs/renders/22195@2x.png
new file mode 100644
index 000000000..3efbecda1
Binary files /dev/null and b/imgs/renders/22195@2x.png differ
diff --git a/imgs/renders/22233@1x.png b/imgs/renders/22233@1x.png
new file mode 100644
index 000000000..22c110277
Binary files /dev/null and b/imgs/renders/22233@1x.png differ
diff --git a/imgs/renders/22233@2x.png b/imgs/renders/22233@2x.png
new file mode 100644
index 000000000..a33bc7820
Binary files /dev/null and b/imgs/renders/22233@2x.png differ
diff --git a/imgs/renders/22234@1x.png b/imgs/renders/22234@1x.png
new file mode 100644
index 000000000..27ffbbbd0
Binary files /dev/null and b/imgs/renders/22234@1x.png differ
diff --git a/imgs/renders/22234@2x.png b/imgs/renders/22234@2x.png
new file mode 100644
index 000000000..00dde9e58
Binary files /dev/null and b/imgs/renders/22234@2x.png differ
diff --git a/imgs/renders/2239.png b/imgs/renders/2239@1x.png
similarity index 100%
rename from imgs/renders/2239.png
rename to imgs/renders/2239@1x.png
diff --git a/imgs/renders/2239@2x.png b/imgs/renders/2239@2x.png
new file mode 100644
index 000000000..e2433c80c
Binary files /dev/null and b/imgs/renders/2239@2x.png differ
diff --git a/imgs/renders/2240.png b/imgs/renders/2240@1x.png
similarity index 100%
rename from imgs/renders/2240.png
rename to imgs/renders/2240@1x.png
diff --git a/imgs/renders/2240@2x.png b/imgs/renders/2240@2x.png
new file mode 100644
index 000000000..7c9790a15
Binary files /dev/null and b/imgs/renders/2240@2x.png differ
diff --git a/imgs/renders/2241.png b/imgs/renders/2241@1x.png
similarity index 100%
rename from imgs/renders/2241.png
rename to imgs/renders/2241@1x.png
diff --git a/imgs/renders/2241@2x.png b/imgs/renders/2241@2x.png
new file mode 100644
index 000000000..b590233d4
Binary files /dev/null and b/imgs/renders/2241@2x.png differ
diff --git a/imgs/renders/2242.png b/imgs/renders/2242@1x.png
similarity index 100%
rename from imgs/renders/2242.png
rename to imgs/renders/2242@1x.png
diff --git a/imgs/renders/2242@2x.png b/imgs/renders/2242@2x.png
new file mode 100644
index 000000000..d7b33969f
Binary files /dev/null and b/imgs/renders/2242@2x.png differ
diff --git a/imgs/renders/2295.png b/imgs/renders/2295@1x.png
similarity index 100%
rename from imgs/renders/2295.png
rename to imgs/renders/2295@1x.png
diff --git a/imgs/renders/2295@2x.png b/imgs/renders/2295@2x.png
new file mode 100644
index 000000000..88e709206
Binary files /dev/null and b/imgs/renders/2295@2x.png differ
diff --git a/imgs/renders/2382.png b/imgs/renders/2382@1x.png
similarity index 100%
rename from imgs/renders/2382.png
rename to imgs/renders/2382@1x.png
diff --git a/imgs/renders/2382@2x.png b/imgs/renders/2382@2x.png
new file mode 100644
index 000000000..165882bf4
Binary files /dev/null and b/imgs/renders/2382@2x.png differ
diff --git a/imgs/renders/2383.png b/imgs/renders/2383.png
deleted file mode 100644
index daf484d79..000000000
Binary files a/imgs/renders/2383.png and /dev/null differ
diff --git a/imgs/renders/2383@1x.png b/imgs/renders/2383@1x.png
new file mode 100644
index 000000000..f722400a7
Binary files /dev/null and b/imgs/renders/2383@1x.png differ
diff --git a/imgs/renders/2383@2x.png b/imgs/renders/2383@2x.png
new file mode 100644
index 000000000..16d84b194
Binary files /dev/null and b/imgs/renders/2383@2x.png differ
diff --git a/imgs/renders/2384.png b/imgs/renders/2384@1x.png
similarity index 100%
rename from imgs/renders/2384.png
rename to imgs/renders/2384@1x.png
diff --git a/imgs/renders/2384@2x.png b/imgs/renders/2384@2x.png
new file mode 100644
index 000000000..60165dbad
Binary files /dev/null and b/imgs/renders/2384@2x.png differ
diff --git a/imgs/renders/2385.png b/imgs/renders/2385@1x.png
similarity index 100%
rename from imgs/renders/2385.png
rename to imgs/renders/2385@1x.png
diff --git a/imgs/renders/2385@2x.png b/imgs/renders/2385@2x.png
new file mode 100644
index 000000000..09881a9d0
Binary files /dev/null and b/imgs/renders/2385@2x.png differ
diff --git a/imgs/renders/2387.png b/imgs/renders/2387@1x.png
similarity index 100%
rename from imgs/renders/2387.png
rename to imgs/renders/2387@1x.png
diff --git a/imgs/renders/2387@2x.png b/imgs/renders/2387@2x.png
new file mode 100644
index 000000000..8f3a85357
Binary files /dev/null and b/imgs/renders/2387@2x.png differ
diff --git a/imgs/renders/2388.png b/imgs/renders/2388.png
deleted file mode 100644
index b9d52d9c8..000000000
Binary files a/imgs/renders/2388.png and /dev/null differ
diff --git a/imgs/renders/2388@1x.png b/imgs/renders/2388@1x.png
new file mode 100644
index 000000000..5c8d536e6
Binary files /dev/null and b/imgs/renders/2388@1x.png differ
diff --git a/imgs/renders/2388@2x.png b/imgs/renders/2388@2x.png
new file mode 100644
index 000000000..9f73c244c
Binary files /dev/null and b/imgs/renders/2388@2x.png differ
diff --git a/imgs/renders/2389.png b/imgs/renders/2389@1x.png
similarity index 100%
rename from imgs/renders/2389.png
rename to imgs/renders/2389@1x.png
diff --git a/imgs/renders/2389@2x.png b/imgs/renders/2389@2x.png
new file mode 100644
index 000000000..f420a61cd
Binary files /dev/null and b/imgs/renders/2389@2x.png differ
diff --git a/imgs/renders/2390.png b/imgs/renders/2390@1x.png
similarity index 100%
rename from imgs/renders/2390.png
rename to imgs/renders/2390@1x.png
diff --git a/imgs/renders/2390@2x.png b/imgs/renders/2390@2x.png
new file mode 100644
index 000000000..b36ac5956
Binary files /dev/null and b/imgs/renders/2390@2x.png differ
diff --git a/imgs/renders/2522.png b/imgs/renders/2522@1x.png
similarity index 100%
rename from imgs/renders/2522.png
rename to imgs/renders/2522@1x.png
diff --git a/imgs/renders/2522@2x.png b/imgs/renders/2522@2x.png
new file mode 100644
index 000000000..ecc2771a7
Binary files /dev/null and b/imgs/renders/2522@2x.png differ
diff --git a/imgs/renders/2523.png b/imgs/renders/2523@1x.png
similarity index 100%
rename from imgs/renders/2523.png
rename to imgs/renders/2523@1x.png
diff --git a/imgs/renders/2523@2x.png b/imgs/renders/2523@2x.png
new file mode 100644
index 000000000..68fada7e3
Binary files /dev/null and b/imgs/renders/2523@2x.png differ
diff --git a/imgs/renders/2524.png b/imgs/renders/2524@1x.png
similarity index 100%
rename from imgs/renders/2524.png
rename to imgs/renders/2524@1x.png
diff --git a/imgs/renders/2524@2x.png b/imgs/renders/2524@2x.png
new file mode 100644
index 000000000..414f70b1b
Binary files /dev/null and b/imgs/renders/2524@2x.png differ
diff --git a/imgs/renders/2632.png b/imgs/renders/2632@1x.png
similarity index 100%
rename from imgs/renders/2632.png
rename to imgs/renders/2632@1x.png
diff --git a/imgs/renders/2632@2x.png b/imgs/renders/2632@2x.png
new file mode 100644
index 000000000..98be2635e
Binary files /dev/null and b/imgs/renders/2632@2x.png differ
diff --git a/imgs/renders/2633.png b/imgs/renders/2633@1x.png
similarity index 100%
rename from imgs/renders/2633.png
rename to imgs/renders/2633@1x.png
diff --git a/imgs/renders/2633@2x.png b/imgs/renders/2633@2x.png
new file mode 100644
index 000000000..552c3dc20
Binary files /dev/null and b/imgs/renders/2633@2x.png differ
diff --git a/imgs/renders/2634.png b/imgs/renders/2634@1x.png
similarity index 100%
rename from imgs/renders/2634.png
rename to imgs/renders/2634@1x.png
diff --git a/imgs/renders/2634@2x.png b/imgs/renders/2634@2x.png
new file mode 100644
index 000000000..8c2237639
Binary files /dev/null and b/imgs/renders/2634@2x.png differ
diff --git a/imgs/renders/2635.png b/imgs/renders/2635@1x.png
similarity index 100%
rename from imgs/renders/2635.png
rename to imgs/renders/2635@1x.png
diff --git a/imgs/renders/2635@2x.png b/imgs/renders/2635@2x.png
new file mode 100644
index 000000000..64bc61436
Binary files /dev/null and b/imgs/renders/2635@2x.png differ
diff --git a/imgs/renders/2636.png b/imgs/renders/2636@1x.png
similarity index 100%
rename from imgs/renders/2636.png
rename to imgs/renders/2636@1x.png
diff --git a/imgs/renders/2636@2x.png b/imgs/renders/2636@2x.png
new file mode 100644
index 000000000..cced2c3e2
Binary files /dev/null and b/imgs/renders/2636@2x.png differ
diff --git a/imgs/renders/2642.png b/imgs/renders/2642.png
deleted file mode 100644
index faa239356..000000000
Binary files a/imgs/renders/2642.png and /dev/null differ
diff --git a/imgs/renders/2642@1x.png b/imgs/renders/2642@1x.png
new file mode 100644
index 000000000..0385a2fd2
Binary files /dev/null and b/imgs/renders/2642@1x.png differ
diff --git a/imgs/renders/2642@2x.png b/imgs/renders/2642@2x.png
new file mode 100644
index 000000000..827b32d53
Binary files /dev/null and b/imgs/renders/2642@2x.png differ
diff --git a/imgs/renders/2709.png b/imgs/renders/2709.png
deleted file mode 100644
index e437369b1..000000000
Binary files a/imgs/renders/2709.png and /dev/null differ
diff --git a/imgs/renders/2709@1x.png b/imgs/renders/2709@1x.png
new file mode 100644
index 000000000..0bb43ac77
Binary files /dev/null and b/imgs/renders/2709@1x.png differ
diff --git a/imgs/renders/2709@2x.png b/imgs/renders/2709@2x.png
new file mode 100644
index 000000000..d50a2dcda
Binary files /dev/null and b/imgs/renders/2709@2x.png differ
diff --git a/imgs/renders/2710.png b/imgs/renders/2710@1x.png
similarity index 100%
rename from imgs/renders/2710.png
rename to imgs/renders/2710@1x.png
diff --git a/imgs/renders/2710@2x.png b/imgs/renders/2710@2x.png
new file mode 100644
index 000000000..4f18d52bd
Binary files /dev/null and b/imgs/renders/2710@2x.png differ
diff --git a/imgs/renders/2711.png b/imgs/renders/2711@1x.png
similarity index 100%
rename from imgs/renders/2711.png
rename to imgs/renders/2711@1x.png
diff --git a/imgs/renders/2711@2x.png b/imgs/renders/2711@2x.png
new file mode 100644
index 000000000..c8e0a87bd
Binary files /dev/null and b/imgs/renders/2711@2x.png differ
diff --git a/imgs/renders/2712.png b/imgs/renders/2712@1x.png
similarity index 100%
rename from imgs/renders/2712.png
rename to imgs/renders/2712@1x.png
diff --git a/imgs/renders/2712@2x.png b/imgs/renders/2712@2x.png
new file mode 100644
index 000000000..926ba7d56
Binary files /dev/null and b/imgs/renders/2712@2x.png differ
diff --git a/imgs/renders/2713.png b/imgs/renders/2713@1x.png
similarity index 100%
rename from imgs/renders/2713.png
rename to imgs/renders/2713@1x.png
diff --git a/imgs/renders/2713@2x.png b/imgs/renders/2713@2x.png
new file mode 100644
index 000000000..03dc00c40
Binary files /dev/null and b/imgs/renders/2713@2x.png differ
diff --git a/imgs/renders/2714.png b/imgs/renders/2714@1x.png
similarity index 100%
rename from imgs/renders/2714.png
rename to imgs/renders/2714@1x.png
diff --git a/imgs/renders/2714@2x.png b/imgs/renders/2714@2x.png
new file mode 100644
index 000000000..937a6133f
Binary files /dev/null and b/imgs/renders/2714@2x.png differ
diff --git a/imgs/renders/2715.png b/imgs/renders/2715@1x.png
similarity index 100%
rename from imgs/renders/2715.png
rename to imgs/renders/2715@1x.png
diff --git a/imgs/renders/2715@2x.png b/imgs/renders/2715@2x.png
new file mode 100644
index 000000000..e441c5a11
Binary files /dev/null and b/imgs/renders/2715@2x.png differ
diff --git a/imgs/renders/2716.png b/imgs/renders/2716@1x.png
similarity index 100%
rename from imgs/renders/2716.png
rename to imgs/renders/2716@1x.png
diff --git a/imgs/renders/2716@2x.png b/imgs/renders/2716@2x.png
new file mode 100644
index 000000000..402baf61f
Binary files /dev/null and b/imgs/renders/2716@2x.png differ
diff --git a/imgs/renders/2737.png b/imgs/renders/2737.png
deleted file mode 100644
index b52180477..000000000
Binary files a/imgs/renders/2737.png and /dev/null differ
diff --git a/imgs/renders/2737@1x.png b/imgs/renders/2737@1x.png
new file mode 100644
index 000000000..fd4694f0c
Binary files /dev/null and b/imgs/renders/2737@1x.png differ
diff --git a/imgs/renders/2737@2x.png b/imgs/renders/2737@2x.png
new file mode 100644
index 000000000..48c2b48c4
Binary files /dev/null and b/imgs/renders/2737@2x.png differ
diff --git a/imgs/renders/2738.png b/imgs/renders/2738@1x.png
similarity index 100%
rename from imgs/renders/2738.png
rename to imgs/renders/2738@1x.png
diff --git a/imgs/renders/2738@2x.png b/imgs/renders/2738@2x.png
new file mode 100644
index 000000000..6d5a9cacc
Binary files /dev/null and b/imgs/renders/2738@2x.png differ
diff --git a/imgs/renders/2739.png b/imgs/renders/2739@1x.png
similarity index 100%
rename from imgs/renders/2739.png
rename to imgs/renders/2739@1x.png
diff --git a/imgs/renders/2739@2x.png b/imgs/renders/2739@2x.png
new file mode 100644
index 000000000..3f72b6a6d
Binary files /dev/null and b/imgs/renders/2739@2x.png differ
diff --git a/imgs/renders/2740.png b/imgs/renders/2740@1x.png
similarity index 100%
rename from imgs/renders/2740.png
rename to imgs/renders/2740@1x.png
diff --git a/imgs/renders/2740@2x.png b/imgs/renders/2740@2x.png
new file mode 100644
index 000000000..fe2f138d4
Binary files /dev/null and b/imgs/renders/2740@2x.png differ
diff --git a/imgs/renders/2743.png b/imgs/renders/2743@1x.png
similarity index 100%
rename from imgs/renders/2743.png
rename to imgs/renders/2743@1x.png
diff --git a/imgs/renders/2743@2x.png b/imgs/renders/2743@2x.png
new file mode 100644
index 000000000..88a97404d
Binary files /dev/null and b/imgs/renders/2743@2x.png differ
diff --git a/imgs/renders/2744.png b/imgs/renders/2744@1x.png
similarity index 100%
rename from imgs/renders/2744.png
rename to imgs/renders/2744@1x.png
diff --git a/imgs/renders/2744@2x.png b/imgs/renders/2744@2x.png
new file mode 100644
index 000000000..b2f69cb9e
Binary files /dev/null and b/imgs/renders/2744@2x.png differ
diff --git a/imgs/renders/2755.png b/imgs/renders/2755@1x.png
similarity index 100%
rename from imgs/renders/2755.png
rename to imgs/renders/2755@1x.png
diff --git a/imgs/renders/2755@2x.png b/imgs/renders/2755@2x.png
new file mode 100644
index 000000000..7281bd35b
Binary files /dev/null and b/imgs/renders/2755@2x.png differ
diff --git a/imgs/renders/2786.png b/imgs/renders/2786.png
deleted file mode 100644
index d090d0188..000000000
Binary files a/imgs/renders/2786.png and /dev/null differ
diff --git a/imgs/renders/2786@1x.png b/imgs/renders/2786@1x.png
new file mode 100644
index 000000000..c08540b89
Binary files /dev/null and b/imgs/renders/2786@1x.png differ
diff --git a/imgs/renders/2786@2x.png b/imgs/renders/2786@2x.png
new file mode 100644
index 000000000..ba10fb3b2
Binary files /dev/null and b/imgs/renders/2786@2x.png differ
diff --git a/imgs/renders/2794.png b/imgs/renders/2794@1x.png
similarity index 100%
rename from imgs/renders/2794.png
rename to imgs/renders/2794@1x.png
diff --git a/imgs/renders/2794@2x.png b/imgs/renders/2794@2x.png
new file mode 100644
index 000000000..3052282df
Binary files /dev/null and b/imgs/renders/2794@2x.png differ
diff --git a/imgs/renders/2798.png b/imgs/renders/2798@1x.png
similarity index 100%
rename from imgs/renders/2798.png
rename to imgs/renders/2798@1x.png
diff --git a/imgs/renders/2798@2x.png b/imgs/renders/2798@2x.png
new file mode 100644
index 000000000..3ec36d68d
Binary files /dev/null and b/imgs/renders/2798@2x.png differ
diff --git a/imgs/renders/2801.png b/imgs/renders/2801@1x.png
similarity index 100%
rename from imgs/renders/2801.png
rename to imgs/renders/2801@1x.png
diff --git a/imgs/renders/2801@2x.png b/imgs/renders/2801@2x.png
new file mode 100644
index 000000000..1caf066ff
Binary files /dev/null and b/imgs/renders/2801@2x.png differ
diff --git a/imgs/renders/2802.png b/imgs/renders/2802.png
deleted file mode 100644
index 146953185..000000000
Binary files a/imgs/renders/2802.png and /dev/null differ
diff --git a/imgs/renders/2802@1x.png b/imgs/renders/2802@1x.png
new file mode 100644
index 000000000..ac3e234fc
Binary files /dev/null and b/imgs/renders/2802@1x.png differ
diff --git a/imgs/renders/2802@2x.png b/imgs/renders/2802@2x.png
new file mode 100644
index 000000000..5f5aee771
Binary files /dev/null and b/imgs/renders/2802@2x.png differ
diff --git a/imgs/renders/2804.png b/imgs/renders/2804@1x.png
similarity index 100%
rename from imgs/renders/2804.png
rename to imgs/renders/2804@1x.png
diff --git a/imgs/renders/2804@2x.png b/imgs/renders/2804@2x.png
new file mode 100644
index 000000000..381fb4307
Binary files /dev/null and b/imgs/renders/2804@2x.png differ
diff --git a/imgs/renders/2805.png b/imgs/renders/2805@1x.png
similarity index 100%
rename from imgs/renders/2805.png
rename to imgs/renders/2805@1x.png
diff --git a/imgs/renders/2805@2x.png b/imgs/renders/2805@2x.png
new file mode 100644
index 000000000..3456df374
Binary files /dev/null and b/imgs/renders/2805@2x.png differ
diff --git a/imgs/renders/2807.png b/imgs/renders/2807@1x.png
similarity index 100%
rename from imgs/renders/2807.png
rename to imgs/renders/2807@1x.png
diff --git a/imgs/renders/2807@2x.png b/imgs/renders/2807@2x.png
new file mode 100644
index 000000000..aa1b8d5a7
Binary files /dev/null and b/imgs/renders/2807@2x.png differ
diff --git a/imgs/renders/2811.png b/imgs/renders/2811@1x.png
similarity index 100%
rename from imgs/renders/2811.png
rename to imgs/renders/2811@1x.png
diff --git a/imgs/renders/2811@2x.png b/imgs/renders/2811@2x.png
new file mode 100644
index 000000000..b447b7903
Binary files /dev/null and b/imgs/renders/2811@2x.png differ
diff --git a/imgs/renders/2814.png b/imgs/renders/2814@1x.png
similarity index 100%
rename from imgs/renders/2814.png
rename to imgs/renders/2814@1x.png
diff --git a/imgs/renders/2814@2x.png b/imgs/renders/2814@2x.png
new file mode 100644
index 000000000..9bc8de96e
Binary files /dev/null and b/imgs/renders/2814@2x.png differ
diff --git a/imgs/renders/2894.png b/imgs/renders/2894@1x.png
similarity index 100%
rename from imgs/renders/2894.png
rename to imgs/renders/2894@1x.png
diff --git a/imgs/renders/2894@2x.png b/imgs/renders/2894@2x.png
new file mode 100644
index 000000000..3ca2f962c
Binary files /dev/null and b/imgs/renders/2894@2x.png differ
diff --git a/imgs/renders/2905.png b/imgs/renders/2905@1x.png
similarity index 100%
rename from imgs/renders/2905.png
rename to imgs/renders/2905@1x.png
diff --git a/imgs/renders/2905@2x.png b/imgs/renders/2905@2x.png
new file mode 100644
index 000000000..ac45e925f
Binary files /dev/null and b/imgs/renders/2905@2x.png differ
diff --git a/imgs/renders/2906.png b/imgs/renders/2906@1x.png
similarity index 100%
rename from imgs/renders/2906.png
rename to imgs/renders/2906@1x.png
diff --git a/imgs/renders/2906@2x.png b/imgs/renders/2906@2x.png
new file mode 100644
index 000000000..3cfa0b5d2
Binary files /dev/null and b/imgs/renders/2906@2x.png differ
diff --git a/imgs/renders/2909.png b/imgs/renders/2909@1x.png
similarity index 100%
rename from imgs/renders/2909.png
rename to imgs/renders/2909@1x.png
diff --git a/imgs/renders/2909@2x.png b/imgs/renders/2909@2x.png
new file mode 100644
index 000000000..30025dc56
Binary files /dev/null and b/imgs/renders/2909@2x.png differ
diff --git a/imgs/renders/2910.png b/imgs/renders/2910@1x.png
similarity index 100%
rename from imgs/renders/2910.png
rename to imgs/renders/2910@1x.png
diff --git a/imgs/renders/2910@2x.png b/imgs/renders/2910@2x.png
new file mode 100644
index 000000000..3852665eb
Binary files /dev/null and b/imgs/renders/2910@2x.png differ
diff --git a/imgs/renders/2911.png b/imgs/renders/2911@1x.png
similarity index 100%
rename from imgs/renders/2911.png
rename to imgs/renders/2911@1x.png
diff --git a/imgs/renders/2911@2x.png b/imgs/renders/2911@2x.png
new file mode 100644
index 000000000..29af5e012
Binary files /dev/null and b/imgs/renders/2911@2x.png differ
diff --git a/imgs/renders/2912.png b/imgs/renders/2912@1x.png
similarity index 100%
rename from imgs/renders/2912.png
rename to imgs/renders/2912@1x.png
diff --git a/imgs/renders/2912@2x.png b/imgs/renders/2912@2x.png
new file mode 100644
index 000000000..13193e340
Binary files /dev/null and b/imgs/renders/2912@2x.png differ
diff --git a/imgs/renders/2925.png b/imgs/renders/2925@1x.png
similarity index 100%
rename from imgs/renders/2925.png
rename to imgs/renders/2925@1x.png
diff --git a/imgs/renders/2925@2x.png b/imgs/renders/2925@2x.png
new file mode 100644
index 000000000..42a1df4d8
Binary files /dev/null and b/imgs/renders/2925@2x.png differ
diff --git a/imgs/renders/2926.png b/imgs/renders/2926@1x.png
similarity index 100%
rename from imgs/renders/2926.png
rename to imgs/renders/2926@1x.png
diff --git a/imgs/renders/2926@2x.png b/imgs/renders/2926@2x.png
new file mode 100644
index 000000000..2fe719202
Binary files /dev/null and b/imgs/renders/2926@2x.png differ
diff --git a/imgs/renders/2928.png b/imgs/renders/2928@1x.png
similarity index 100%
rename from imgs/renders/2928.png
rename to imgs/renders/2928@1x.png
diff --git a/imgs/renders/2928@2x.png b/imgs/renders/2928@2x.png
new file mode 100644
index 000000000..fc2262fa9
Binary files /dev/null and b/imgs/renders/2928@2x.png differ
diff --git a/imgs/renders/2929.png b/imgs/renders/2929@1x.png
similarity index 100%
rename from imgs/renders/2929.png
rename to imgs/renders/2929@1x.png
diff --git a/imgs/renders/2929@2x.png b/imgs/renders/2929@2x.png
new file mode 100644
index 000000000..03c398000
Binary files /dev/null and b/imgs/renders/2929@2x.png differ
diff --git a/imgs/renders/2930.png b/imgs/renders/2930.png
deleted file mode 100644
index cb53959f7..000000000
Binary files a/imgs/renders/2930.png and /dev/null differ
diff --git a/imgs/renders/2930@1x.png b/imgs/renders/2930@1x.png
new file mode 100644
index 000000000..38633f3c3
Binary files /dev/null and b/imgs/renders/2930@1x.png differ
diff --git a/imgs/renders/2930@2x.png b/imgs/renders/2930@2x.png
new file mode 100644
index 000000000..0fa786dfa
Binary files /dev/null and b/imgs/renders/2930@2x.png differ
diff --git a/imgs/renders/2931.png b/imgs/renders/2931@1x.png
similarity index 100%
rename from imgs/renders/2931.png
rename to imgs/renders/2931@1x.png
diff --git a/imgs/renders/2931@2x.png b/imgs/renders/2931@2x.png
new file mode 100644
index 000000000..d9d3c18da
Binary files /dev/null and b/imgs/renders/2931@2x.png differ
diff --git a/imgs/renders/2932.png b/imgs/renders/2932@1x.png
similarity index 100%
rename from imgs/renders/2932.png
rename to imgs/renders/2932@1x.png
diff --git a/imgs/renders/2932@2x.png b/imgs/renders/2932@2x.png
new file mode 100644
index 000000000..854aa2e0f
Binary files /dev/null and b/imgs/renders/2932@2x.png differ
diff --git a/imgs/renders/2938.png b/imgs/renders/2938@1x.png
similarity index 100%
rename from imgs/renders/2938.png
rename to imgs/renders/2938@1x.png
diff --git a/imgs/renders/2938@2x.png b/imgs/renders/2938@2x.png
new file mode 100644
index 000000000..e444da622
Binary files /dev/null and b/imgs/renders/2938@2x.png differ
diff --git a/imgs/renders/2939.png b/imgs/renders/2939@1x.png
similarity index 100%
rename from imgs/renders/2939.png
rename to imgs/renders/2939@1x.png
diff --git a/imgs/renders/2939@2x.png b/imgs/renders/2939@2x.png
new file mode 100644
index 000000000..92d265e56
Binary files /dev/null and b/imgs/renders/2939@2x.png differ
diff --git a/imgs/renders/2940.png b/imgs/renders/2940@1x.png
similarity index 100%
rename from imgs/renders/2940.png
rename to imgs/renders/2940@1x.png
diff --git a/imgs/renders/2940@2x.png b/imgs/renders/2940@2x.png
new file mode 100644
index 000000000..a71a705bf
Binary files /dev/null and b/imgs/renders/2940@2x.png differ
diff --git a/imgs/renders/2942.png b/imgs/renders/2942@1x.png
similarity index 100%
rename from imgs/renders/2942.png
rename to imgs/renders/2942@1x.png
diff --git a/imgs/renders/2942@2x.png b/imgs/renders/2942@2x.png
new file mode 100644
index 000000000..ded9f82bf
Binary files /dev/null and b/imgs/renders/2942@2x.png differ
diff --git a/imgs/renders/296.png b/imgs/renders/296@1x.png
similarity index 100%
rename from imgs/renders/296.png
rename to imgs/renders/296@1x.png
diff --git a/imgs/renders/296@2x.png b/imgs/renders/296@2x.png
new file mode 100644
index 000000000..382b06b29
Binary files /dev/null and b/imgs/renders/296@2x.png differ
diff --git a/imgs/renders/297.png b/imgs/renders/297@1x.png
similarity index 100%
rename from imgs/renders/297.png
rename to imgs/renders/297@1x.png
diff --git a/imgs/renders/297@2x.png b/imgs/renders/297@2x.png
new file mode 100644
index 000000000..736137aa1
Binary files /dev/null and b/imgs/renders/297@2x.png differ
diff --git a/imgs/renders/298.png b/imgs/renders/298@1x.png
similarity index 100%
rename from imgs/renders/298.png
rename to imgs/renders/298@1x.png
diff --git a/imgs/renders/298@2x.png b/imgs/renders/298@2x.png
new file mode 100644
index 000000000..3bd6da2e7
Binary files /dev/null and b/imgs/renders/298@2x.png differ
diff --git a/imgs/renders/299.png b/imgs/renders/299@1x.png
similarity index 100%
rename from imgs/renders/299.png
rename to imgs/renders/299@1x.png
diff --git a/imgs/renders/299@2x.png b/imgs/renders/299@2x.png
new file mode 100644
index 000000000..aea47ec58
Binary files /dev/null and b/imgs/renders/299@2x.png differ
diff --git a/imgs/renders/300.png b/imgs/renders/300@1x.png
similarity index 100%
rename from imgs/renders/300.png
rename to imgs/renders/300@1x.png
diff --git a/imgs/renders/300@2x.png b/imgs/renders/300@2x.png
new file mode 100644
index 000000000..1b765462b
Binary files /dev/null and b/imgs/renders/300@2x.png differ
diff --git a/imgs/renders/301.png b/imgs/renders/301.png
deleted file mode 100644
index 7289b5453..000000000
Binary files a/imgs/renders/301.png and /dev/null differ
diff --git a/imgs/renders/301@1x.png b/imgs/renders/301@1x.png
new file mode 100644
index 000000000..ca566e6b9
Binary files /dev/null and b/imgs/renders/301@1x.png differ
diff --git a/imgs/renders/301@2x.png b/imgs/renders/301@2x.png
new file mode 100644
index 000000000..de7f133cf
Binary files /dev/null and b/imgs/renders/301@2x.png differ
diff --git a/imgs/renders/3020.png b/imgs/renders/3020.png
deleted file mode 100644
index f6d281f90..000000000
Binary files a/imgs/renders/3020.png and /dev/null differ
diff --git a/imgs/renders/3020@1x.png b/imgs/renders/3020@1x.png
new file mode 100644
index 000000000..39c2823ab
Binary files /dev/null and b/imgs/renders/3020@1x.png differ
diff --git a/imgs/renders/3020@2x.png b/imgs/renders/3020@2x.png
new file mode 100644
index 000000000..5f3c3b979
Binary files /dev/null and b/imgs/renders/3020@2x.png differ
diff --git a/imgs/renders/302.png b/imgs/renders/302@1x.png
similarity index 100%
rename from imgs/renders/302.png
rename to imgs/renders/302@1x.png
diff --git a/imgs/renders/302@2x.png b/imgs/renders/302@2x.png
new file mode 100644
index 000000000..202163430
Binary files /dev/null and b/imgs/renders/302@2x.png differ
diff --git a/imgs/renders/303.png b/imgs/renders/303@1x.png
similarity index 100%
rename from imgs/renders/303.png
rename to imgs/renders/303@1x.png
diff --git a/imgs/renders/303@2x.png b/imgs/renders/303@2x.png
new file mode 100644
index 000000000..a9ac0a3a8
Binary files /dev/null and b/imgs/renders/303@2x.png differ
diff --git a/imgs/renders/304.png b/imgs/renders/304@1x.png
similarity index 100%
rename from imgs/renders/304.png
rename to imgs/renders/304@1x.png
diff --git a/imgs/renders/304@2x.png b/imgs/renders/304@2x.png
new file mode 100644
index 000000000..55f0bb17b
Binary files /dev/null and b/imgs/renders/304@2x.png differ
diff --git a/imgs/renders/305.png b/imgs/renders/305@1x.png
similarity index 100%
rename from imgs/renders/305.png
rename to imgs/renders/305@1x.png
diff --git a/imgs/renders/305@2x.png b/imgs/renders/305@2x.png
new file mode 100644
index 000000000..e93c77b01
Binary files /dev/null and b/imgs/renders/305@2x.png differ
diff --git a/imgs/renders/306.png b/imgs/renders/306@1x.png
similarity index 100%
rename from imgs/renders/306.png
rename to imgs/renders/306@1x.png
diff --git a/imgs/renders/306@2x.png b/imgs/renders/306@2x.png
new file mode 100644
index 000000000..20143b293
Binary files /dev/null and b/imgs/renders/306@2x.png differ
diff --git a/imgs/renders/308.png b/imgs/renders/308@1x.png
similarity index 100%
rename from imgs/renders/308.png
rename to imgs/renders/308@1x.png
diff --git a/imgs/renders/308@2x.png b/imgs/renders/308@2x.png
new file mode 100644
index 000000000..2f3e6b0be
Binary files /dev/null and b/imgs/renders/308@2x.png differ
diff --git a/imgs/renders/309.png b/imgs/renders/309@1x.png
similarity index 100%
rename from imgs/renders/309.png
rename to imgs/renders/309@1x.png
diff --git a/imgs/renders/309@2x.png b/imgs/renders/309@2x.png
new file mode 100644
index 000000000..5365d4c90
Binary files /dev/null and b/imgs/renders/309@2x.png differ
diff --git a/imgs/renders/310.png b/imgs/renders/310@1x.png
similarity index 100%
rename from imgs/renders/310.png
rename to imgs/renders/310@1x.png
diff --git a/imgs/renders/310@2x.png b/imgs/renders/310@2x.png
new file mode 100644
index 000000000..6dfaa81c0
Binary files /dev/null and b/imgs/renders/310@2x.png differ
diff --git a/imgs/renders/311.png b/imgs/renders/311@1x.png
similarity index 100%
rename from imgs/renders/311.png
rename to imgs/renders/311@1x.png
diff --git a/imgs/renders/311@2x.png b/imgs/renders/311@2x.png
new file mode 100644
index 000000000..89f358f56
Binary files /dev/null and b/imgs/renders/311@2x.png differ
diff --git a/imgs/renders/312.png b/imgs/renders/312@1x.png
similarity index 100%
rename from imgs/renders/312.png
rename to imgs/renders/312@1x.png
diff --git a/imgs/renders/312@2x.png b/imgs/renders/312@2x.png
new file mode 100644
index 000000000..e205c14b1
Binary files /dev/null and b/imgs/renders/312@2x.png differ
diff --git a/imgs/renders/3132.png b/imgs/renders/3132@1x.png
similarity index 100%
rename from imgs/renders/3132.png
rename to imgs/renders/3132@1x.png
diff --git a/imgs/renders/3132@2x.png b/imgs/renders/3132@2x.png
new file mode 100644
index 000000000..f24552069
Binary files /dev/null and b/imgs/renders/3132@2x.png differ
diff --git a/imgs/renders/3133.png b/imgs/renders/3133.png
deleted file mode 100644
index c56e40ad8..000000000
Binary files a/imgs/renders/3133.png and /dev/null differ
diff --git a/imgs/renders/3133@1x.png b/imgs/renders/3133@1x.png
new file mode 100644
index 000000000..bc2d28f76
Binary files /dev/null and b/imgs/renders/3133@1x.png differ
diff --git a/imgs/renders/3133@2x.png b/imgs/renders/3133@2x.png
new file mode 100644
index 000000000..2a35a6a6d
Binary files /dev/null and b/imgs/renders/3133@2x.png differ
diff --git a/imgs/renders/3134.png b/imgs/renders/3134@1x.png
similarity index 100%
rename from imgs/renders/3134.png
rename to imgs/renders/3134@1x.png
diff --git a/imgs/renders/3134@2x.png b/imgs/renders/3134@2x.png
new file mode 100644
index 000000000..43ca33246
Binary files /dev/null and b/imgs/renders/3134@2x.png differ
diff --git a/imgs/renders/3135.png b/imgs/renders/3135.png
deleted file mode 100644
index b203b719c..000000000
Binary files a/imgs/renders/3135.png and /dev/null differ
diff --git a/imgs/renders/3135@1x.png b/imgs/renders/3135@1x.png
new file mode 100644
index 000000000..3c6349623
Binary files /dev/null and b/imgs/renders/3135@1x.png differ
diff --git a/imgs/renders/3135@2x.png b/imgs/renders/3135@2x.png
new file mode 100644
index 000000000..7fba72010
Binary files /dev/null and b/imgs/renders/3135@2x.png differ
diff --git a/imgs/renders/313.png b/imgs/renders/313@1x.png
similarity index 100%
rename from imgs/renders/313.png
rename to imgs/renders/313@1x.png
diff --git a/imgs/renders/313@2x.png b/imgs/renders/313@2x.png
new file mode 100644
index 000000000..d832c2dbc
Binary files /dev/null and b/imgs/renders/313@2x.png differ
diff --git a/imgs/renders/314.png b/imgs/renders/314.png
deleted file mode 100644
index 3afed99e3..000000000
Binary files a/imgs/renders/314.png and /dev/null differ
diff --git a/imgs/renders/314@1x.png b/imgs/renders/314@1x.png
new file mode 100644
index 000000000..9b0420410
Binary files /dev/null and b/imgs/renders/314@1x.png differ
diff --git a/imgs/renders/314@2x.png b/imgs/renders/314@2x.png
new file mode 100644
index 000000000..2d5f2fcd9
Binary files /dev/null and b/imgs/renders/314@2x.png differ
diff --git a/imgs/renders/3168.png b/imgs/renders/3168@1x.png
similarity index 100%
rename from imgs/renders/3168.png
rename to imgs/renders/3168@1x.png
diff --git a/imgs/renders/3168@2x.png b/imgs/renders/3168@2x.png
new file mode 100644
index 000000000..ae6aa2176
Binary files /dev/null and b/imgs/renders/3168@2x.png differ
diff --git a/imgs/renders/3169.png b/imgs/renders/3169.png
deleted file mode 100644
index b1d3f187c..000000000
Binary files a/imgs/renders/3169.png and /dev/null differ
diff --git a/imgs/renders/3169@1x.png b/imgs/renders/3169@1x.png
new file mode 100644
index 000000000..aa39b88cf
Binary files /dev/null and b/imgs/renders/3169@1x.png differ
diff --git a/imgs/renders/3169@2x.png b/imgs/renders/3169@2x.png
new file mode 100644
index 000000000..66a7cd89b
Binary files /dev/null and b/imgs/renders/3169@2x.png differ
diff --git a/imgs/renders/316.png b/imgs/renders/316@1x.png
similarity index 100%
rename from imgs/renders/316.png
rename to imgs/renders/316@1x.png
diff --git a/imgs/renders/316@2x.png b/imgs/renders/316@2x.png
new file mode 100644
index 000000000..3f43abe03
Binary files /dev/null and b/imgs/renders/316@2x.png differ
diff --git a/imgs/renders/3170.png b/imgs/renders/3170.png
deleted file mode 100644
index 0c6786b73..000000000
Binary files a/imgs/renders/3170.png and /dev/null differ
diff --git a/imgs/renders/3170@1x.png b/imgs/renders/3170@1x.png
new file mode 100644
index 000000000..1e7620b4c
Binary files /dev/null and b/imgs/renders/3170@1x.png differ
diff --git a/imgs/renders/3170@2x.png b/imgs/renders/3170@2x.png
new file mode 100644
index 000000000..d50fbf2eb
Binary files /dev/null and b/imgs/renders/3170@2x.png differ
diff --git a/imgs/renders/317.png b/imgs/renders/317@1x.png
similarity index 100%
rename from imgs/renders/317.png
rename to imgs/renders/317@1x.png
diff --git a/imgs/renders/317@2x.png b/imgs/renders/317@2x.png
new file mode 100644
index 000000000..f6ffb521c
Binary files /dev/null and b/imgs/renders/317@2x.png differ
diff --git a/imgs/renders/318.png b/imgs/renders/318@1x.png
similarity index 100%
rename from imgs/renders/318.png
rename to imgs/renders/318@1x.png
diff --git a/imgs/renders/318@2x.png b/imgs/renders/318@2x.png
new file mode 100644
index 000000000..c945194c8
Binary files /dev/null and b/imgs/renders/318@2x.png differ
diff --git a/imgs/renders/319.png b/imgs/renders/319@1x.png
similarity index 100%
rename from imgs/renders/319.png
rename to imgs/renders/319@1x.png
diff --git a/imgs/renders/319@2x.png b/imgs/renders/319@2x.png
new file mode 100644
index 000000000..5e2b16bf6
Binary files /dev/null and b/imgs/renders/319@2x.png differ
diff --git a/imgs/renders/320.png b/imgs/renders/320.png
deleted file mode 100644
index d1087c7a1..000000000
Binary files a/imgs/renders/320.png and /dev/null differ
diff --git a/imgs/renders/3204.png b/imgs/renders/3204.png
deleted file mode 100644
index 8d66a2c90..000000000
Binary files a/imgs/renders/3204.png and /dev/null differ
diff --git a/imgs/renders/3204@1x.png b/imgs/renders/3204@1x.png
new file mode 100644
index 000000000..cfbde7a4e
Binary files /dev/null and b/imgs/renders/3204@1x.png differ
diff --git a/imgs/renders/3204@2x.png b/imgs/renders/3204@2x.png
new file mode 100644
index 000000000..1b201f610
Binary files /dev/null and b/imgs/renders/3204@2x.png differ
diff --git a/imgs/renders/3205.png b/imgs/renders/3205.png
deleted file mode 100644
index 15a06c49e..000000000
Binary files a/imgs/renders/3205.png and /dev/null differ
diff --git a/imgs/renders/3205@1x.png b/imgs/renders/3205@1x.png
new file mode 100644
index 000000000..eee980b50
Binary files /dev/null and b/imgs/renders/3205@1x.png differ
diff --git a/imgs/renders/3205@2x.png b/imgs/renders/3205@2x.png
new file mode 100644
index 000000000..967ee07f5
Binary files /dev/null and b/imgs/renders/3205@2x.png differ
diff --git a/imgs/renders/3207.png b/imgs/renders/3207.png
deleted file mode 100644
index 769c51579..000000000
Binary files a/imgs/renders/3207.png and /dev/null differ
diff --git a/imgs/renders/3207@1x.png b/imgs/renders/3207@1x.png
new file mode 100644
index 000000000..72621e35d
Binary files /dev/null and b/imgs/renders/3207@1x.png differ
diff --git a/imgs/renders/3207@2x.png b/imgs/renders/3207@2x.png
new file mode 100644
index 000000000..df46f232d
Binary files /dev/null and b/imgs/renders/3207@2x.png differ
diff --git a/imgs/renders/320@1x.png b/imgs/renders/320@1x.png
new file mode 100644
index 000000000..b820a724a
Binary files /dev/null and b/imgs/renders/320@1x.png differ
diff --git a/imgs/renders/320@2x.png b/imgs/renders/320@2x.png
new file mode 100644
index 000000000..90f5b2357
Binary files /dev/null and b/imgs/renders/320@2x.png differ
diff --git a/imgs/renders/321.png b/imgs/renders/321@1x.png
similarity index 100%
rename from imgs/renders/321.png
rename to imgs/renders/321@1x.png
diff --git a/imgs/renders/321@2x.png b/imgs/renders/321@2x.png
new file mode 100644
index 000000000..243f656fd
Binary files /dev/null and b/imgs/renders/321@2x.png differ
diff --git a/imgs/renders/322.png b/imgs/renders/322@1x.png
similarity index 100%
rename from imgs/renders/322.png
rename to imgs/renders/322@1x.png
diff --git a/imgs/renders/322@2x.png b/imgs/renders/322@2x.png
new file mode 100644
index 000000000..0b8df05cf
Binary files /dev/null and b/imgs/renders/322@2x.png differ
diff --git a/imgs/renders/323.png b/imgs/renders/323@1x.png
similarity index 100%
rename from imgs/renders/323.png
rename to imgs/renders/323@1x.png
diff --git a/imgs/renders/323@2x.png b/imgs/renders/323@2x.png
new file mode 100644
index 000000000..038ba78c4
Binary files /dev/null and b/imgs/renders/323@2x.png differ
diff --git a/imgs/renders/324.png b/imgs/renders/324@1x.png
similarity index 100%
rename from imgs/renders/324.png
rename to imgs/renders/324@1x.png
diff --git a/imgs/renders/324@2x.png b/imgs/renders/324@2x.png
new file mode 100644
index 000000000..15ef937bc
Binary files /dev/null and b/imgs/renders/324@2x.png differ
diff --git a/imgs/renders/325.png b/imgs/renders/325@1x.png
similarity index 100%
rename from imgs/renders/325.png
rename to imgs/renders/325@1x.png
diff --git a/imgs/renders/325@2x.png b/imgs/renders/325@2x.png
new file mode 100644
index 000000000..bb99a3d41
Binary files /dev/null and b/imgs/renders/325@2x.png differ
diff --git a/imgs/renders/326.png b/imgs/renders/326@1x.png
similarity index 100%
rename from imgs/renders/326.png
rename to imgs/renders/326@1x.png
diff --git a/imgs/renders/326@2x.png b/imgs/renders/326@2x.png
new file mode 100644
index 000000000..0b63b7629
Binary files /dev/null and b/imgs/renders/326@2x.png differ
diff --git a/imgs/renders/327.png b/imgs/renders/327@1x.png
similarity index 100%
rename from imgs/renders/327.png
rename to imgs/renders/327@1x.png
diff --git a/imgs/renders/327@2x.png b/imgs/renders/327@2x.png
new file mode 100644
index 000000000..acc8ffe97
Binary files /dev/null and b/imgs/renders/327@2x.png differ
diff --git a/imgs/renders/328.png b/imgs/renders/328@1x.png
similarity index 100%
rename from imgs/renders/328.png
rename to imgs/renders/328@1x.png
diff --git a/imgs/renders/328@2x.png b/imgs/renders/328@2x.png
new file mode 100644
index 000000000..90ec7033e
Binary files /dev/null and b/imgs/renders/328@2x.png differ
diff --git a/imgs/renders/330.png b/imgs/renders/330@1x.png
similarity index 100%
rename from imgs/renders/330.png
rename to imgs/renders/330@1x.png
diff --git a/imgs/renders/330@2x.png b/imgs/renders/330@2x.png
new file mode 100644
index 000000000..2b691fd9f
Binary files /dev/null and b/imgs/renders/330@2x.png differ
diff --git a/imgs/renders/3331.png b/imgs/renders/3331.png
deleted file mode 100644
index fd0ef771c..000000000
Binary files a/imgs/renders/3331.png and /dev/null differ
diff --git a/imgs/renders/3331@1x.png b/imgs/renders/3331@1x.png
new file mode 100644
index 000000000..d5283fd9d
Binary files /dev/null and b/imgs/renders/3331@1x.png differ
diff --git a/imgs/renders/3331@2x.png b/imgs/renders/3331@2x.png
new file mode 100644
index 000000000..1ce49c770
Binary files /dev/null and b/imgs/renders/3331@2x.png differ
diff --git a/imgs/renders/3349.png b/imgs/renders/3349@1x.png
similarity index 100%
rename from imgs/renders/3349.png
rename to imgs/renders/3349@1x.png
diff --git a/imgs/renders/3349@2x.png b/imgs/renders/3349@2x.png
new file mode 100644
index 000000000..f941a8a2c
Binary files /dev/null and b/imgs/renders/3349@2x.png differ
diff --git a/imgs/renders/3350.png b/imgs/renders/3350@1x.png
similarity index 100%
rename from imgs/renders/3350.png
rename to imgs/renders/3350@1x.png
diff --git a/imgs/renders/3350@2x.png b/imgs/renders/3350@2x.png
new file mode 100644
index 000000000..7a4a5bd98
Binary files /dev/null and b/imgs/renders/3350@2x.png differ
diff --git a/imgs/renders/3351.png b/imgs/renders/3351@1x.png
similarity index 100%
rename from imgs/renders/3351.png
rename to imgs/renders/3351@1x.png
diff --git a/imgs/renders/3351@2x.png b/imgs/renders/3351@2x.png
new file mode 100644
index 000000000..678dc06d4
Binary files /dev/null and b/imgs/renders/3351@2x.png differ
diff --git a/imgs/renders/3352.png b/imgs/renders/3352.png
deleted file mode 100644
index 53a6b27fa..000000000
Binary files a/imgs/renders/3352.png and /dev/null differ
diff --git a/imgs/renders/3352@1x.png b/imgs/renders/3352@1x.png
new file mode 100644
index 000000000..8ab4a80a0
Binary files /dev/null and b/imgs/renders/3352@1x.png differ
diff --git a/imgs/renders/3352@2x.png b/imgs/renders/3352@2x.png
new file mode 100644
index 000000000..37619cdc7
Binary files /dev/null and b/imgs/renders/3352@2x.png differ
diff --git a/imgs/renders/3353.png b/imgs/renders/3353.png
deleted file mode 100644
index ee643cfa1..000000000
Binary files a/imgs/renders/3353.png and /dev/null differ
diff --git a/imgs/renders/3353@1x.png b/imgs/renders/3353@1x.png
new file mode 100644
index 000000000..0b5a566e6
Binary files /dev/null and b/imgs/renders/3353@1x.png differ
diff --git a/imgs/renders/3353@2x.png b/imgs/renders/3353@2x.png
new file mode 100644
index 000000000..4ab820b78
Binary files /dev/null and b/imgs/renders/3353@2x.png differ
diff --git a/imgs/renders/3354.png b/imgs/renders/3354.png
deleted file mode 100644
index 5137bb437..000000000
Binary files a/imgs/renders/3354.png and /dev/null differ
diff --git a/imgs/renders/3354@1x.png b/imgs/renders/3354@1x.png
new file mode 100644
index 000000000..4f06805cc
Binary files /dev/null and b/imgs/renders/3354@1x.png differ
diff --git a/imgs/renders/3354@2x.png b/imgs/renders/3354@2x.png
new file mode 100644
index 000000000..8fd971282
Binary files /dev/null and b/imgs/renders/3354@2x.png differ
diff --git a/imgs/renders/3355.png b/imgs/renders/3355@1x.png
similarity index 100%
rename from imgs/renders/3355.png
rename to imgs/renders/3355@1x.png
diff --git a/imgs/renders/3355@2x.png b/imgs/renders/3355@2x.png
new file mode 100644
index 000000000..771362023
Binary files /dev/null and b/imgs/renders/3355@2x.png differ
diff --git a/imgs/renders/3356.png b/imgs/renders/3356.png
deleted file mode 100644
index a24de44ec..000000000
Binary files a/imgs/renders/3356.png and /dev/null differ
diff --git a/imgs/renders/3356@1x.png b/imgs/renders/3356@1x.png
new file mode 100644
index 000000000..70dbdf5a8
Binary files /dev/null and b/imgs/renders/3356@1x.png differ
diff --git a/imgs/renders/3356@2x.png b/imgs/renders/3356@2x.png
new file mode 100644
index 000000000..1d5f6c266
Binary files /dev/null and b/imgs/renders/3356@2x.png differ
diff --git a/imgs/renders/3357.png b/imgs/renders/3357@1x.png
similarity index 100%
rename from imgs/renders/3357.png
rename to imgs/renders/3357@1x.png
diff --git a/imgs/renders/3357@2x.png b/imgs/renders/3357@2x.png
new file mode 100644
index 000000000..517ea1593
Binary files /dev/null and b/imgs/renders/3357@2x.png differ
diff --git a/imgs/renders/3359.png b/imgs/renders/3359@1x.png
similarity index 100%
rename from imgs/renders/3359.png
rename to imgs/renders/3359@1x.png
diff --git a/imgs/renders/3359@2x.png b/imgs/renders/3359@2x.png
new file mode 100644
index 000000000..37ee5ab6d
Binary files /dev/null and b/imgs/renders/3359@2x.png differ
diff --git a/imgs/renders/335.png b/imgs/renders/335@1x.png
similarity index 100%
rename from imgs/renders/335.png
rename to imgs/renders/335@1x.png
diff --git a/imgs/renders/335@2x.png b/imgs/renders/335@2x.png
new file mode 100644
index 000000000..c11336575
Binary files /dev/null and b/imgs/renders/335@2x.png differ
diff --git a/imgs/renders/3360.png b/imgs/renders/3360.png
deleted file mode 100644
index bb2a89a6c..000000000
Binary files a/imgs/renders/3360.png and /dev/null differ
diff --git a/imgs/renders/3360@1x.png b/imgs/renders/3360@1x.png
new file mode 100644
index 000000000..9f2d144c7
Binary files /dev/null and b/imgs/renders/3360@1x.png differ
diff --git a/imgs/renders/3360@2x.png b/imgs/renders/3360@2x.png
new file mode 100644
index 000000000..20f7e1684
Binary files /dev/null and b/imgs/renders/3360@2x.png differ
diff --git a/imgs/renders/3361.png b/imgs/renders/3361@1x.png
similarity index 100%
rename from imgs/renders/3361.png
rename to imgs/renders/3361@1x.png
diff --git a/imgs/renders/3361@2x.png b/imgs/renders/3361@2x.png
new file mode 100644
index 000000000..b7ff0713d
Binary files /dev/null and b/imgs/renders/3361@2x.png differ
diff --git a/imgs/renders/3362.png b/imgs/renders/3362@1x.png
similarity index 100%
rename from imgs/renders/3362.png
rename to imgs/renders/3362@1x.png
diff --git a/imgs/renders/3362@2x.png b/imgs/renders/3362@2x.png
new file mode 100644
index 000000000..76aa6a1e4
Binary files /dev/null and b/imgs/renders/3362@2x.png differ
diff --git a/imgs/renders/3363.png b/imgs/renders/3363@1x.png
similarity index 100%
rename from imgs/renders/3363.png
rename to imgs/renders/3363@1x.png
diff --git a/imgs/renders/3363@2x.png b/imgs/renders/3363@2x.png
new file mode 100644
index 000000000..22dcfc172
Binary files /dev/null and b/imgs/renders/3363@2x.png differ
diff --git a/imgs/renders/3364.png b/imgs/renders/3364@1x.png
similarity index 100%
rename from imgs/renders/3364.png
rename to imgs/renders/3364@1x.png
diff --git a/imgs/renders/3364@2x.png b/imgs/renders/3364@2x.png
new file mode 100644
index 000000000..0dd9fb1bb
Binary files /dev/null and b/imgs/renders/3364@2x.png differ
diff --git a/imgs/renders/3365.png b/imgs/renders/3365@1x.png
similarity index 100%
rename from imgs/renders/3365.png
rename to imgs/renders/3365@1x.png
diff --git a/imgs/renders/3365@2x.png b/imgs/renders/3365@2x.png
new file mode 100644
index 000000000..6a21945de
Binary files /dev/null and b/imgs/renders/3365@2x.png differ
diff --git a/imgs/renders/3367.png b/imgs/renders/3367@1x.png
similarity index 100%
rename from imgs/renders/3367.png
rename to imgs/renders/3367@1x.png
diff --git a/imgs/renders/3367@2x.png b/imgs/renders/3367@2x.png
new file mode 100644
index 000000000..a581ce1f9
Binary files /dev/null and b/imgs/renders/3367@2x.png differ
diff --git a/imgs/renders/337.png b/imgs/renders/337@1x.png
similarity index 100%
rename from imgs/renders/337.png
rename to imgs/renders/337@1x.png
diff --git a/imgs/renders/337@2x.png b/imgs/renders/337@2x.png
new file mode 100644
index 000000000..10a6ce998
Binary files /dev/null and b/imgs/renders/337@2x.png differ
diff --git a/imgs/renders/338.png b/imgs/renders/338@1x.png
similarity index 100%
rename from imgs/renders/338.png
rename to imgs/renders/338@1x.png
diff --git a/imgs/renders/338@2x.png b/imgs/renders/338@2x.png
new file mode 100644
index 000000000..ee86a318b
Binary files /dev/null and b/imgs/renders/338@2x.png differ
diff --git a/imgs/renders/341.png b/imgs/renders/341@1x.png
similarity index 100%
rename from imgs/renders/341.png
rename to imgs/renders/341@1x.png
diff --git a/imgs/renders/341@2x.png b/imgs/renders/341@2x.png
new file mode 100644
index 000000000..edc8d2aa2
Binary files /dev/null and b/imgs/renders/341@2x.png differ
diff --git a/imgs/renders/3424.png b/imgs/renders/3424@1x.png
similarity index 100%
rename from imgs/renders/3424.png
rename to imgs/renders/3424@1x.png
diff --git a/imgs/renders/3424@2x.png b/imgs/renders/3424@2x.png
new file mode 100644
index 000000000..e7a769c64
Binary files /dev/null and b/imgs/renders/3424@2x.png differ
diff --git a/imgs/renders/343.png b/imgs/renders/343@1x.png
similarity index 100%
rename from imgs/renders/343.png
rename to imgs/renders/343@1x.png
diff --git a/imgs/renders/343@2x.png b/imgs/renders/343@2x.png
new file mode 100644
index 000000000..d96d1fa4d
Binary files /dev/null and b/imgs/renders/343@2x.png differ
diff --git a/imgs/renders/3466.png b/imgs/renders/3466@1x.png
similarity index 100%
rename from imgs/renders/3466.png
rename to imgs/renders/3466@1x.png
diff --git a/imgs/renders/3466@2x.png b/imgs/renders/3466@2x.png
new file mode 100644
index 000000000..650c89c3d
Binary files /dev/null and b/imgs/renders/3466@2x.png differ
diff --git a/imgs/renders/3714.png b/imgs/renders/3714@1x.png
similarity index 100%
rename from imgs/renders/3714.png
rename to imgs/renders/3714@1x.png
diff --git a/imgs/renders/3714@2x.png b/imgs/renders/3714@2x.png
new file mode 100644
index 000000000..113f76a20
Binary files /dev/null and b/imgs/renders/3714@2x.png differ
diff --git a/imgs/renders/3799.png b/imgs/renders/3799@1x.png
similarity index 100%
rename from imgs/renders/3799.png
rename to imgs/renders/3799@1x.png
diff --git a/imgs/renders/3799@2x.png b/imgs/renders/3799@2x.png
new file mode 100644
index 000000000..b8b96de4c
Binary files /dev/null and b/imgs/renders/3799@2x.png differ
diff --git a/imgs/renders/3800.png b/imgs/renders/3800@1x.png
similarity index 100%
rename from imgs/renders/3800.png
rename to imgs/renders/3800@1x.png
diff --git a/imgs/renders/3800@2x.png b/imgs/renders/3800@2x.png
new file mode 100644
index 000000000..9e80be2f8
Binary files /dev/null and b/imgs/renders/3800@2x.png differ
diff --git a/imgs/renders/3814.png b/imgs/renders/3814@1x.png
similarity index 100%
rename from imgs/renders/3814.png
rename to imgs/renders/3814@1x.png
diff --git a/imgs/renders/3814@2x.png b/imgs/renders/3814@2x.png
new file mode 100644
index 000000000..d9e9e4f64
Binary files /dev/null and b/imgs/renders/3814@2x.png differ
diff --git a/imgs/renders/3815.png b/imgs/renders/3815@1x.png
similarity index 100%
rename from imgs/renders/3815.png
rename to imgs/renders/3815@1x.png
diff --git a/imgs/renders/3815@2x.png b/imgs/renders/3815@2x.png
new file mode 100644
index 000000000..823d22d64
Binary files /dev/null and b/imgs/renders/3815@2x.png differ
diff --git a/imgs/renders/38.png b/imgs/renders/38@1x.png
similarity index 100%
rename from imgs/renders/38.png
rename to imgs/renders/38@1x.png
diff --git a/imgs/renders/38@2x.png b/imgs/renders/38@2x.png
new file mode 100644
index 000000000..fd76cbb48
Binary files /dev/null and b/imgs/renders/38@2x.png differ
diff --git a/imgs/renders/39.png b/imgs/renders/39@1x.png
similarity index 100%
rename from imgs/renders/39.png
rename to imgs/renders/39@1x.png
diff --git a/imgs/renders/39@2x.png b/imgs/renders/39@2x.png
new file mode 100644
index 000000000..f9f187dab
Binary files /dev/null and b/imgs/renders/39@2x.png differ
diff --git a/imgs/renders/40.png b/imgs/renders/40@1x.png
similarity index 100%
rename from imgs/renders/40.png
rename to imgs/renders/40@1x.png
diff --git a/imgs/renders/40@2x.png b/imgs/renders/40@2x.png
new file mode 100644
index 000000000..974dd59c3
Binary files /dev/null and b/imgs/renders/40@2x.png differ
diff --git a/imgs/renders/41.png b/imgs/renders/41.png
deleted file mode 100644
index 875f340b9..000000000
Binary files a/imgs/renders/41.png and /dev/null differ
diff --git a/imgs/renders/41@1x.png b/imgs/renders/41@1x.png
new file mode 100644
index 000000000..71ab534ae
Binary files /dev/null and b/imgs/renders/41@1x.png differ
diff --git a/imgs/renders/41@2x.png b/imgs/renders/41@2x.png
new file mode 100644
index 000000000..9bc8a9601
Binary files /dev/null and b/imgs/renders/41@2x.png differ
diff --git a/imgs/renders/42.png b/imgs/renders/42@1x.png
similarity index 100%
rename from imgs/renders/42.png
rename to imgs/renders/42@1x.png
diff --git a/imgs/renders/42@2x.png b/imgs/renders/42@2x.png
new file mode 100644
index 000000000..40bbf1ef4
Binary files /dev/null and b/imgs/renders/42@2x.png differ
diff --git a/imgs/renders/43.png b/imgs/renders/43.png
deleted file mode 100644
index b66ce126b..000000000
Binary files a/imgs/renders/43.png and /dev/null differ
diff --git a/imgs/renders/43@1x.png b/imgs/renders/43@1x.png
new file mode 100644
index 000000000..d74477001
Binary files /dev/null and b/imgs/renders/43@1x.png differ
diff --git a/imgs/renders/43@2x.png b/imgs/renders/43@2x.png
new file mode 100644
index 000000000..33b35e6d4
Binary files /dev/null and b/imgs/renders/43@2x.png differ
diff --git a/imgs/renders/44.png b/imgs/renders/44@1x.png
similarity index 100%
rename from imgs/renders/44.png
rename to imgs/renders/44@1x.png
diff --git a/imgs/renders/44@2x.png b/imgs/renders/44@2x.png
new file mode 100644
index 000000000..a0d7f44d0
Binary files /dev/null and b/imgs/renders/44@2x.png differ
diff --git a/imgs/renders/4515.png b/imgs/renders/4515@1x.png
similarity index 100%
rename from imgs/renders/4515.png
rename to imgs/renders/4515@1x.png
diff --git a/imgs/renders/4515@2x.png b/imgs/renders/4515@2x.png
new file mode 100644
index 000000000..8fd5f451e
Binary files /dev/null and b/imgs/renders/4515@2x.png differ
diff --git a/imgs/renders/4517.png b/imgs/renders/4517.png
deleted file mode 100644
index 376875fbb..000000000
Binary files a/imgs/renders/4517.png and /dev/null differ
diff --git a/imgs/renders/4517@1x.png b/imgs/renders/4517@1x.png
new file mode 100644
index 000000000..1027aa7cb
Binary files /dev/null and b/imgs/renders/4517@1x.png differ
diff --git a/imgs/renders/4517@2x.png b/imgs/renders/4517@2x.png
new file mode 100644
index 000000000..387195407
Binary files /dev/null and b/imgs/renders/4517@2x.png differ
diff --git a/imgs/renders/45.png b/imgs/renders/45@1x.png
similarity index 100%
rename from imgs/renders/45.png
rename to imgs/renders/45@1x.png
diff --git a/imgs/renders/45@2x.png b/imgs/renders/45@2x.png
new file mode 100644
index 000000000..ab9fb392b
Binary files /dev/null and b/imgs/renders/45@2x.png differ
diff --git a/imgs/renders/46.png b/imgs/renders/46@1x.png
similarity index 100%
rename from imgs/renders/46.png
rename to imgs/renders/46@1x.png
diff --git a/imgs/renders/46@2x.png b/imgs/renders/46@2x.png
new file mode 100644
index 000000000..2a1bdc3ed
Binary files /dev/null and b/imgs/renders/46@2x.png differ
diff --git a/imgs/renders/47.png b/imgs/renders/47@1x.png
similarity index 100%
rename from imgs/renders/47.png
rename to imgs/renders/47@1x.png
diff --git a/imgs/renders/47@2x.png b/imgs/renders/47@2x.png
new file mode 100644
index 000000000..84f0269e8
Binary files /dev/null and b/imgs/renders/47@2x.png differ
diff --git a/imgs/renders/48.png b/imgs/renders/48.png
deleted file mode 100644
index 850a21007..000000000
Binary files a/imgs/renders/48.png and /dev/null differ
diff --git a/imgs/renders/48@1x.png b/imgs/renders/48@1x.png
new file mode 100644
index 000000000..9de44dde9
Binary files /dev/null and b/imgs/renders/48@1x.png differ
diff --git a/imgs/renders/48@2x.png b/imgs/renders/48@2x.png
new file mode 100644
index 000000000..eb69a54f5
Binary files /dev/null and b/imgs/renders/48@2x.png differ
diff --git a/imgs/renders/49.png b/imgs/renders/49.png
deleted file mode 100644
index 9fd16706e..000000000
Binary files a/imgs/renders/49.png and /dev/null differ
diff --git a/imgs/renders/49@1x.png b/imgs/renders/49@1x.png
new file mode 100644
index 000000000..2cde9edcd
Binary files /dev/null and b/imgs/renders/49@1x.png differ
diff --git a/imgs/renders/49@2x.png b/imgs/renders/49@2x.png
new file mode 100644
index 000000000..c06572017
Binary files /dev/null and b/imgs/renders/49@2x.png differ
diff --git a/imgs/renders/50.png b/imgs/renders/50@1x.png
similarity index 100%
rename from imgs/renders/50.png
rename to imgs/renders/50@1x.png
diff --git a/imgs/renders/50@2x.png b/imgs/renders/50@2x.png
new file mode 100644
index 000000000..c5846a07d
Binary files /dev/null and b/imgs/renders/50@2x.png differ
diff --git a/imgs/renders/51.png b/imgs/renders/51.png
deleted file mode 100644
index d580823cc..000000000
Binary files a/imgs/renders/51.png and /dev/null differ
diff --git a/imgs/renders/51@1x.png b/imgs/renders/51@1x.png
new file mode 100644
index 000000000..8deaf09df
Binary files /dev/null and b/imgs/renders/51@1x.png differ
diff --git a/imgs/renders/51@2x.png b/imgs/renders/51@2x.png
new file mode 100644
index 000000000..c54853a83
Binary files /dev/null and b/imgs/renders/51@2x.png differ
diff --git a/imgs/renders/52.png b/imgs/renders/52.png
deleted file mode 100644
index cbe43aea5..000000000
Binary files a/imgs/renders/52.png and /dev/null differ
diff --git a/imgs/renders/52@1x.png b/imgs/renders/52@1x.png
new file mode 100644
index 000000000..944a42f72
Binary files /dev/null and b/imgs/renders/52@1x.png differ
diff --git a/imgs/renders/52@2x.png b/imgs/renders/52@2x.png
new file mode 100644
index 000000000..ff4565ccc
Binary files /dev/null and b/imgs/renders/52@2x.png differ
diff --git a/imgs/renders/53.png b/imgs/renders/53@1x.png
similarity index 100%
rename from imgs/renders/53.png
rename to imgs/renders/53@1x.png
diff --git a/imgs/renders/53@2x.png b/imgs/renders/53@2x.png
new file mode 100644
index 000000000..9ba84b056
Binary files /dev/null and b/imgs/renders/53@2x.png differ
diff --git a/imgs/renders/54.png b/imgs/renders/54@1x.png
similarity index 100%
rename from imgs/renders/54.png
rename to imgs/renders/54@1x.png
diff --git a/imgs/renders/54@2x.png b/imgs/renders/54@2x.png
new file mode 100644
index 000000000..6a5e3bc51
Binary files /dev/null and b/imgs/renders/54@2x.png differ
diff --git a/imgs/renders/55.png b/imgs/renders/55@1x.png
similarity index 100%
rename from imgs/renders/55.png
rename to imgs/renders/55@1x.png
diff --git a/imgs/renders/55@2x.png b/imgs/renders/55@2x.png
new file mode 100644
index 000000000..c90cc4120
Binary files /dev/null and b/imgs/renders/55@2x.png differ
diff --git a/imgs/renders/56.png b/imgs/renders/56@1x.png
similarity index 100%
rename from imgs/renders/56.png
rename to imgs/renders/56@1x.png
diff --git a/imgs/renders/56@2x.png b/imgs/renders/56@2x.png
new file mode 100644
index 000000000..d59129fd6
Binary files /dev/null and b/imgs/renders/56@2x.png differ
diff --git a/imgs/renders/57.png b/imgs/renders/57@1x.png
similarity index 100%
rename from imgs/renders/57.png
rename to imgs/renders/57@1x.png
diff --git a/imgs/renders/57@2x.png b/imgs/renders/57@2x.png
new file mode 100644
index 000000000..088ce39d2
Binary files /dev/null and b/imgs/renders/57@2x.png differ
diff --git a/imgs/renders/58.png b/imgs/renders/58.png
deleted file mode 100644
index cae7b85d1..000000000
Binary files a/imgs/renders/58.png and /dev/null differ
diff --git a/imgs/renders/58@1x.png b/imgs/renders/58@1x.png
new file mode 100644
index 000000000..17bcc1c34
Binary files /dev/null and b/imgs/renders/58@1x.png differ
diff --git a/imgs/renders/58@2x.png b/imgs/renders/58@2x.png
new file mode 100644
index 000000000..1ed0c52cf
Binary files /dev/null and b/imgs/renders/58@2x.png differ
diff --git a/imgs/renders/59.png b/imgs/renders/59.png
deleted file mode 100644
index ca316b3b1..000000000
Binary files a/imgs/renders/59.png and /dev/null differ
diff --git a/imgs/renders/59@1x.png b/imgs/renders/59@1x.png
new file mode 100644
index 000000000..4a97e584f
Binary files /dev/null and b/imgs/renders/59@1x.png differ
diff --git a/imgs/renders/59@2x.png b/imgs/renders/59@2x.png
new file mode 100644
index 000000000..1150ec746
Binary files /dev/null and b/imgs/renders/59@2x.png differ
diff --git a/imgs/renders/60.png b/imgs/renders/60@1x.png
similarity index 100%
rename from imgs/renders/60.png
rename to imgs/renders/60@1x.png
diff --git a/imgs/renders/60@2x.png b/imgs/renders/60@2x.png
new file mode 100644
index 000000000..3f91d11a9
Binary files /dev/null and b/imgs/renders/60@2x.png differ
diff --git a/imgs/renders/61.png b/imgs/renders/61.png
deleted file mode 100644
index 169752d86..000000000
Binary files a/imgs/renders/61.png and /dev/null differ
diff --git a/imgs/renders/61@1x.png b/imgs/renders/61@1x.png
new file mode 100644
index 000000000..8be84d9a0
Binary files /dev/null and b/imgs/renders/61@1x.png differ
diff --git a/imgs/renders/61@2x.png b/imgs/renders/61@2x.png
new file mode 100644
index 000000000..3b5694ffd
Binary files /dev/null and b/imgs/renders/61@2x.png differ
diff --git a/imgs/renders/62.png b/imgs/renders/62.png
deleted file mode 100644
index 1775d7347..000000000
Binary files a/imgs/renders/62.png and /dev/null differ
diff --git a/imgs/renders/62@1x.png b/imgs/renders/62@1x.png
new file mode 100644
index 000000000..b44fbffeb
Binary files /dev/null and b/imgs/renders/62@1x.png differ
diff --git a/imgs/renders/62@2x.png b/imgs/renders/62@2x.png
new file mode 100644
index 000000000..a047591f2
Binary files /dev/null and b/imgs/renders/62@2x.png differ
diff --git a/imgs/renders/63.png b/imgs/renders/63@1x.png
similarity index 100%
rename from imgs/renders/63.png
rename to imgs/renders/63@1x.png
diff --git a/imgs/renders/63@2x.png b/imgs/renders/63@2x.png
new file mode 100644
index 000000000..6f5048536
Binary files /dev/null and b/imgs/renders/63@2x.png differ
diff --git a/imgs/renders/64.png b/imgs/renders/64@1x.png
similarity index 100%
rename from imgs/renders/64.png
rename to imgs/renders/64@1x.png
diff --git a/imgs/renders/64@2x.png b/imgs/renders/64@2x.png
new file mode 100644
index 000000000..5485594ee
Binary files /dev/null and b/imgs/renders/64@2x.png differ
diff --git a/imgs/renders/65.png b/imgs/renders/65@1x.png
similarity index 100%
rename from imgs/renders/65.png
rename to imgs/renders/65@1x.png
diff --git a/imgs/renders/65@2x.png b/imgs/renders/65@2x.png
new file mode 100644
index 000000000..2347cb17b
Binary files /dev/null and b/imgs/renders/65@2x.png differ
diff --git a/pyfa.py b/pyfa.py
index 740d443ab..d73ef0975 100755
--- a/pyfa.py
+++ b/pyfa.py
@@ -19,13 +19,14 @@
# ==============================================================================
+import datetime
import os
import sys
-import traceback
from optparse import AmbiguousOptionError, BadOptionError, OptionParser
-from service.prereqsCheck import PreCheckException, PreCheckMessage, version_precheck, version_block
+
import config
-import datetime
+from service.prereqsCheck import PreCheckException, PreCheckMessage, version_block, version_precheck
+
# ascii_text = '''
# ++++++++++++++++++++++++++++++++++++++++++++++++++
diff --git a/scripts/dump_data.py b/scripts/dump_data.py
index 2393fb8c4..876c251d7 100644
--- a/scripts/dump_data.py
+++ b/scripts/dump_data.py
@@ -66,6 +66,7 @@ miners = (
TraitMiner(staticcache_miner, bulkdata_miner, trans),
SqliteMiner(rvr.paths.root, trans),
CachedCallsMiner(rvr, trans),
+ DynamicAttributesMiner(rvr),
pickle_miner
)
@@ -76,6 +77,6 @@ writers = (
list = "dgmexpressions,dgmattribs,dgmeffects,dgmtypeattribs,dgmtypeeffects,"\
"dgmunits,invcategories,invgroups,invmetagroups,invmetatypes,"\
"invtypes,mapbulk_marketGroups,phbmetadata,phbtraits,fsdTypeOverrides,"\
- "evegroups,evetypes,evecategories,mapbulk_marketGroups,clonegrades"
+ "evegroups,evetypes,evecategories,mapbulk_marketGroups,clonegrades,dynamicattributes"
FlowManager(miners, writers).run(list, "en-us")
diff --git a/scripts/dynamicattributes.py b/scripts/dynamicattributes.py
index f21a5f96a..b6a2d720b 100644
--- a/scripts/dynamicattributes.py
+++ b/scripts/dynamicattributes.py
@@ -6,13 +6,8 @@ This script will generate a dynamicItemAttributes.json file using res files
import argparse
-import os
-import re
-import sqlite3
import json
-
-from PIL import Image
-
+import os
from shutil import copyfile
parser = argparse.ArgumentParser(description='This script updates module icons for pyfa')
diff --git a/scripts/effectUsedBy.py b/scripts/effectUsedBy.py
index dc231c61c..aa5f878b3 100755
--- a/scripts/effectUsedBy.py
+++ b/scripts/effectUsedBy.py
@@ -410,7 +410,7 @@ else:
if not effect_file.startswith('__'):
file_name, file_extension = effect_file.rsplit('.', 1)
# Ignore non-py files and exclude implementation-specific 'effects'
- if file_extension == "py" and not file_name in ("__init__"):
+ if file_extension == "py" and not file_name in "__init__":
effect_list.append(file_name)
# Stage 2
diff --git a/scripts/icons_update.py b/scripts/icons_update.py
index 0ad4c5359..50945ff1c 100644
--- a/scripts/icons_update.py
+++ b/scripts/icons_update.py
@@ -6,15 +6,13 @@ This script updates only market/item icons.
import argparse
-import os
-import re
-import sqlite3
import json
+import os
+import sqlite3
+from shutil import copyfile
from PIL import Image
-from shutil import copyfile
-
parser = argparse.ArgumentParser(description='This script updates module icons for pyfa')
parser.add_argument('-e', '--eve', required=True, type=str, help='path to eve\'s ')
parser.add_argument('-s', '--server', required=False, default='tq', type=str, help='which server to use (defaults to tq)')
@@ -67,8 +65,8 @@ graphics = graphicIDsLoader.load(os.path.join(to_path, 'graphicIDs.fsdbinary'))
graphics_py_ob = {}
for x, v in graphics.items():
- if (hasattr(v, 'iconFolder')):
- graphics_py_ob[x] = v.iconFolder
+ if hasattr(v, 'iconInfo') and hasattr(v.iconInfo, 'folder'):
+ graphics_py_ob[x] = v.iconInfo.folder
# Add children to market group list
# {parent: {children}}
@@ -198,13 +196,16 @@ if toadd:
print("Can't find iconID {}".format(fname))
continue
key = icon['iconFile'].lower()
- icon = get_icon_file(key, ICON_SIZE)
- if icon is None:
- missing.add(fname)
- continue
- fullname = '{}.png'.format(fname)
- fullpath = os.path.join(icons_dir, fullname)
- icon.save(fullpath, 'png')
+
+ for i in range(2):
+ scale = i+1
+ icon = get_icon_file(key, tuple([x*scale for x in ICON_SIZE]))
+ if icon is None:
+ missing.add(fname)
+ continue
+ fullname = '{}@{}x.png'.format(fname, scale)
+ fullpath = os.path.join(icons_dir, fullname)
+ icon.save(fullpath, 'png')
if missing:
print((' {} icons are missing in export:'.format(len(missing))))
for fname in sorted(missing):
@@ -229,15 +230,22 @@ if toadd:
print(('Adding {} icons...'.format(len(toadd))))
missing = set()
for fname in sorted(toadd):
- icon = graphics_py_ob[int(fname)]
- icon = "{}/{}_64.png".format(icon, fname)
- icon = get_icon_file(icon, RENDER_SIZE)
- if icon is None:
- missing.add(fname)
- continue
- fullname = '{}.png'.format(fname)
- fullpath = os.path.join(render_dir, fullname)
- icon.save(fullpath, 'png')
+ try:
+ key = graphics_py_ob[int(fname)]
+ except KeyError:
+ print("Can't find graphicID {}".format(fname))
+
+ key = "{}/{}_64.png".format(key, fname)
+
+ for i in range(2):
+ scale = i+1
+ icon = get_icon_file(key, tuple([x*scale for x in RENDER_SIZE]))
+ if icon is None:
+ missing.add(fname)
+ continue
+ fullname = '{}@{}x.png'.format(fname, scale)
+ fullpath = os.path.join(render_dir, fullname)
+ icon.save(fullpath, 'png')
if missing:
print((' {} icons are missing in export:'.format(len(missing))))
for fname in sorted(missing):
diff --git a/scripts/itemDiff.py b/scripts/itemDiff.py
index 053e36222..e03f259d6 100755
--- a/scripts/itemDiff.py
+++ b/scripts/itemDiff.py
@@ -19,17 +19,16 @@
#===============================================================================
-'''
+"""
This script is used to compare two different database versions.
It shows removed/changed/new items with list of changed effects,
changed attributes and effects which were renamed
-'''
+"""
import argparse
import os.path
import re
import sqlite3
-import sys
script_dir = os.path.dirname(__file__)
default_old = os.path.join(script_dir, "..", "eve.db")
@@ -282,14 +281,12 @@ def main(old, new, groups=True, effects=True, attributes=True, renames=True):
oldgroup = old_itmdata[item][0]
groupdata = (S["unchanged"], oldgroup, None)
# Set old set of effects and mark all as unchanged
- effectsdata = {}
- effectsdata[S["unchanged"]] = set()
+ effectsdata = {S["unchanged"]: set()}
if effects:
oldeffects = old_itmdata[item][1]
effectsdata[S["unchanged"]].update(oldeffects)
# Set old set of attributes and mark all as unchanged
- attrdata = {}
- attrdata[S["unchanged"]] = {}
+ attrdata = {S["unchanged"]: {}}
if attributes:
oldattrs = old_itmdata[item][2]
for attr in oldattrs:
@@ -307,14 +304,12 @@ def main(old, new, groups=True, effects=True, attributes=True, renames=True):
newgroup = new_itmdata[item][0]
groupdata = (S["unchanged"], None, newgroup)
# Set new set of effects and mark all as unchanged
- effectsdata = {}
- effectsdata[S["unchanged"]] = set()
+ effectsdata = {S["unchanged"]: set()}
if effects:
neweffects = new_itmdata[item][1]
effectsdata[S["unchanged"]].update(neweffects)
# Set new set of attributes and mark all as unchanged
- attrdata = {}
- attrdata[S["unchanged"]] = {}
+ attrdata = {S["unchanged"]: {}}
if attributes:
newattrs = new_itmdata[item][2]
for attr in newattrs:
diff --git a/scripts/jsonToSql.py b/scripts/jsonToSql.py
index add0fe957..b9493372a 100755
--- a/scripts/jsonToSql.py
+++ b/scripts/jsonToSql.py
@@ -18,10 +18,9 @@
# License along with eos. If not, see .
#======================================================================
+import functools
import os
import sys
-import functools
-import re
# Add eos root path to sys.path so we can import ourselves
path = os.path.dirname(__file__)
@@ -241,7 +240,7 @@ def main(db, json_path):
row['iconFile'] = row['iconFile'].lower().replace('modules/', '').replace('.png', '')
if jsonName is 'clonegrades':
- if (row['alphaCloneID'] not in tmp):
+ if row['alphaCloneID'] not in tmp:
cloneParent = eos.gamedata.AlphaClone()
setattr(cloneParent, 'alphaCloneID', row['alphaCloneID'])
setattr(cloneParent, 'alphaCloneName', row['alphaCloneName'])
@@ -249,7 +248,7 @@ def main(db, json_path):
tmp.append(row['alphaCloneID'])
for k, v in row.items():
- if (isinstance(v, str)):
+ if isinstance(v, str):
v = v.strip()
setattr(instance, fieldMap.get(k, k), v)
diff --git a/scripts/sdeReadIcons.py b/scripts/sdeReadIcons.py
index 66010a53c..d099f6bd5 100644
--- a/scripts/sdeReadIcons.py
+++ b/scripts/sdeReadIcons.py
@@ -1,8 +1,8 @@
-'''
+"""
A change to EVE Online's cache format rendered Reverence unable to correctly dump the icons file. As a stop gap, this
reads the offical SDE iconIDs.yaml and populates our own icons.json file. This files should then be transferred to the
other JSON files Phobos dumps before being converted to SQL
-'''
+"""
import yaml
import json
diff --git a/scripts/t3conversions.py b/scripts/t3conversions.py
index 8b6e7e09a..4f2445071 100644
--- a/scripts/t3conversions.py
+++ b/scripts/t3conversions.py
@@ -2,11 +2,11 @@
# Requires eve-old.db file (which is the previous releases database so that we can lookup the old items)
# See https://community.eveonline.com/news/patch-notes/patch-notes-for-july-2017-release
-import sys
-from os.path import realpath, join, dirname, abspath
-from sqlalchemy import MetaData, create_engine
-from sqlalchemy.orm import sessionmaker
import csv
+import sys
+from os.path import abspath, dirname, join, realpath
+
+from sqlalchemy import create_engine
newDB = create_engine('sqlite:///' + unicode(realpath(join(dirname(abspath(__file__)), "..", "eve.db")), sys.getfilesystemencoding()))
oldDB = create_engine('sqlite:///' + unicode(realpath(join(dirname(abspath(__file__)), "..", "eve-old.db")), sys.getfilesystemencoding()))
diff --git a/service/attribute.py b/service/attribute.py
index b4c3453e9..b5ebcae66 100644
--- a/service/attribute.py
+++ b/service/attribute.py
@@ -33,10 +33,10 @@ class Attribute(object):
@staticmethod
def getAttributeInfo(identity):
if isinstance(identity, (int, str)):
- info = eos.db.getAttributeInfo(identity, eager=("unit"))
+ info = eos.db.getAttributeInfo(identity, eager="unit")
elif isinstance(identity, (int, float)):
id_ = int(identity)
- info = eos.db.getAttributeInfo(id_, eager=("unit"))
+ info = eos.db.getAttributeInfo(id_, eager="unit")
else:
info = None
return info
diff --git a/service/character.py b/service/character.py
index 2ff03de67..565d7d329 100644
--- a/service/character.py
+++ b/service/character.py
@@ -337,7 +337,7 @@ class Character(object):
@staticmethod
def getApiDetails(charID):
# todo: fix this (or get rid of?)
- return ("", "", "", [])
+ return "", "", "", []
char = eos.db.getCharacter(charID)
if char.chars is not None:
chars = json.loads(char.chars)
diff --git a/service/esi.py b/service/esi.py
index 4b5f8198f..7b5247bec 100644
--- a/service/esi.py
+++ b/service/esi.py
@@ -138,7 +138,7 @@ class Esi(EsiAccess):
def handleLogin(self, message):
# we already have authenticated stuff for the auto mode
- if (self.settings.get('ssoMode') == SsoMode.AUTO):
+ if self.settings.get('ssoMode') == SsoMode.AUTO:
ssoInfo = message['SSOInfo'][0]
auth_response = json.loads(base64.b64decode(ssoInfo))
else:
diff --git a/service/esiAccess.py b/service/esiAccess.py
index bbddc6384..db1931fa2 100644
--- a/service/esiAccess.py
+++ b/service/esiAccess.py
@@ -1,4 +1,4 @@
-'''
+"""
A lot of the inspiration (and straight up code copying!) for this class comes from EsiPy
Much of the credit goes to the maintainer of that package, Kyria . The reasoning for no
@@ -7,7 +7,7 @@ low level.
Eventually I'll rewrite this to be a bit cleaner and a bit more generic, but for now, it works!
-'''
+"""
# noinspection PyPackageRequirements
from logbook import Logger
@@ -63,7 +63,7 @@ class APIException(Exception):
elif 'message' in self.response:
return 'HTTP Error %s: %s' % (self.status_code,
self.response['message'])
- return 'HTTP Error %s' % (self.status_code)
+ return 'HTTP Error %s' % self.status_code
class ESIEndpoints(Enum):
@@ -89,7 +89,7 @@ class EsiAccess(object):
@property
def sso_url(self):
- if (self.settings.get("ssoMode") == SsoMode.CUSTOM):
+ if self.settings.get("ssoMode") == SsoMode.CUSTOM:
return "https://login.eveonline.com"
return "https://www.pyfa.io"
@@ -136,7 +136,7 @@ class EsiAccess(object):
def getLoginURI(self, redirect=None):
self.state = str(uuid.uuid4())
- if (self.settings.get("ssoMode") == SsoMode.AUTO):
+ if self.settings.get("ssoMode") == SsoMode.AUTO:
args = {
'state': self.state,
'pyfa_version': config.version,
@@ -256,7 +256,7 @@ class EsiAccess(object):
self._session.headers.update(self.get_oauth_header(ssoChar.accessToken))
def _after_request(self, resp):
- if ("warning" in resp.headers):
+ if "warning" in resp.headers:
pyfalog.warn("{} - {}".format(resp.headers["warning"], resp.url))
if resp.status_code >= 400:
diff --git a/service/fit.py b/service/fit.py
index d45219cad..3cbe96fcf 100644
--- a/service/fit.py
+++ b/service/fit.py
@@ -18,31 +18,48 @@
# ===============================================================================
import copy
-from logbook import Logger
-from time import time
import datetime
+from time import time
+
+import wx
+from logbook import Logger
import eos.db
-from eos.saveddata.booster import Booster as es_Booster
-from eos.saveddata.cargo import Cargo as es_Cargo
from eos.saveddata.character import Character as saveddata_Character
from eos.saveddata.citadel import Citadel as es_Citadel
from eos.saveddata.damagePattern import DamagePattern as es_DamagePattern
from eos.saveddata.drone import Drone as es_Drone
from eos.saveddata.fighter import Fighter as es_Fighter
-from eos.saveddata.implant import Implant as es_Implant
-from eos.saveddata.ship import Ship as es_Ship
-from eos.saveddata.module import Module as es_Module, State, Slot
from eos.saveddata.fit import Fit as FitType, ImplantLocation
+from eos.saveddata.module import Module as es_Module, State
+from eos.saveddata.ship import Ship as es_Ship
from service.character import Character
from service.damagePattern import DamagePattern
+from service.fitDeprecated import FitDeprecated
from service.settings import SettingsProvider
+from utils.deprecated import deprecated
pyfalog = Logger(__name__)
-class Fit(object):
+class DeferRecalc:
+ def __init__(self, fitID):
+ self.fitID = fitID
+ self.sFit = Fit.getInstance()
+
+ def __enter__(self):
+ self._recalc = self.sFit.recalc
+ self.sFit.recalc = lambda x: print('Deferred Recalc')
+
+ def __exit__(self, *args):
+ self.sFit.recalc = self._recalc
+ self.sFit.recalc(self.fitID)
+
+
+# inherits from FitDeprecated so that I can move all the dead shit, but not affect functionality
+class Fit(FitDeprecated):
instance = None
+ processors = {}
@classmethod
def getInstance(cls):
@@ -166,13 +183,6 @@ class Fit(object):
fit.booster = not fit.booster
eos.db.commit()
- @staticmethod
- def renameFit(fitID, newName):
- pyfalog.debug("Renaming fit ({0}) to: {1}", fitID, newName)
- fit = eos.db.getFit(fitID)
- fit.name = newName
- eos.db.commit()
-
@staticmethod
def deleteFit(fitID):
fit = eos.db.getFit(fitID)
@@ -196,12 +206,21 @@ class Fit(object):
eos.db.remove(fit)
+ if fitID in Fit.processors:
+ del Fit.processors[fitID]
+
pyfalog.debug(" Need to refresh {} fits: {}", len(refreshFits), refreshFits)
for fit in refreshFits:
eos.db.saveddata_session.refresh(fit)
eos.db.saveddata_session.commit()
+ @classmethod
+ def getCommandProcessor(cls, fitID):
+ if fitID not in cls.processors:
+ cls.processors[fitID] = wx.CommandProcessor()
+ return cls.processors[fitID]
+
@staticmethod
def copyFit(fitID):
pyfalog.debug("Creating copy of fit ID: {0}", fitID)
@@ -316,142 +335,6 @@ class Fit(object):
fit.notes))
return fits
- def addImplant(self, fitID, itemID, recalc=True):
- pyfalog.debug("Adding implant to fit ({0}) for item ID: {1}", fitID, itemID)
- if fitID is None:
- return False
-
- fit = eos.db.getFit(fitID)
- item = eos.db.getItem(itemID, eager="attributes")
- try:
- implant = es_Implant(item)
- except ValueError:
- pyfalog.warning("Invalid item: {0}", itemID)
- return False
-
- fit.implants.append(implant)
- if recalc:
- self.recalc(fit)
- return True
-
- def removeImplant(self, fitID, position, recalc=True):
- pyfalog.debug("Removing implant from position ({0}) for fit ID: {1}", position, fitID)
- if fitID is None:
- return False
-
- fit = eos.db.getFit(fitID)
- implant = fit.implants[position]
- fit.implants.remove(implant)
- if recalc:
- self.recalc(fit)
- return True
-
- def addBooster(self, fitID, itemID, recalc=True):
- pyfalog.debug("Adding booster ({0}) to fit ID: {1}", itemID, fitID)
- if fitID is None:
- return False
-
- fit = eos.db.getFit(fitID)
- item = eos.db.getItem(itemID, eager="attributes")
- try:
- booster = es_Booster(item)
- except ValueError:
- pyfalog.warning("Invalid item: {0}", itemID)
- return False
-
- fit.boosters.append(booster)
- if recalc:
- self.recalc(fit)
- return True
-
- def removeBooster(self, fitID, position, recalc=True):
- pyfalog.debug("Removing booster from position ({0}) for fit ID: {1}", position, fitID)
- if fitID is None:
- return False
-
- fit = eos.db.getFit(fitID)
- booster = fit.boosters[position]
- fit.boosters.remove(booster)
- if recalc:
- self.recalc(fit)
- return True
-
- def project(self, fitID, thing):
- pyfalog.debug("Projecting fit ({0}) onto: {1}", fitID, thing)
- if fitID is None:
- return
-
- fit = eos.db.getFit(fitID)
-
- if isinstance(thing, int):
- thing = eos.db.getItem(thing,
- eager=("attributes", "group.category"))
-
- if isinstance(thing, es_Module):
- thing = copy.deepcopy(thing)
- fit.projectedModules.append(thing)
- elif isinstance(thing, FitType):
- if thing in fit.projectedFits:
- return
-
- fit.__projectedFits[thing.ID] = thing
-
- # this bit is required -- see GH issue # 83
- eos.db.saveddata_session.flush()
- eos.db.saveddata_session.refresh(thing)
- elif thing.category.name == "Drone":
- drone = None
- for d in fit.projectedDrones.find(thing):
- if d is None or d.amountActive == d.amount or d.amount >= 5:
- drone = d
- break
-
- if drone is None:
- drone = es_Drone(thing)
- fit.projectedDrones.append(drone)
-
- drone.amount += 1
- elif thing.category.name == "Fighter":
- fighter = es_Fighter(thing)
- fit.projectedFighters.append(fighter)
- elif thing.group.name in es_Module.SYSTEM_GROUPS:
- module = es_Module(thing)
- module.state = State.ONLINE
- fit.projectedModules.append(module)
- else:
- try:
- module = es_Module(thing)
- except ValueError:
- return False
- module.state = State.ACTIVE
- if not module.canHaveState(module.state, fit):
- module.state = State.OFFLINE
- fit.projectedModules.append(module)
-
- eos.db.commit()
- self.recalc(fit)
- return True
-
- def addCommandFit(self, fitID, thing):
- pyfalog.debug("Projecting command fit ({0}) onto: {1}", fitID, thing)
- if fitID is None:
- return
-
- fit = eos.db.getFit(fitID)
-
- if thing in fit.commandFits:
- return
-
- fit.__commandFits[thing.ID] = thing
-
- # this bit is required -- see GH issue # 83
- eos.db.saveddata_session.flush()
- eos.db.saveddata_session.refresh(thing)
-
- eos.db.commit()
- self.recalc(fit)
- return True
-
def toggleProjected(self, fitID, thing, click):
pyfalog.debug("Toggling projected on fit ({0}) for: {1}", fitID, thing)
fit = eos.db.getFit(fitID)
@@ -463,7 +346,7 @@ class Fit(object):
elif isinstance(thing, es_Fighter):
thing.active = not thing.active
elif isinstance(thing, es_Module):
- thing.state = self.__getProposedState(thing, click)
+ thing.state = es_Module.getProposedState(thing, click)
if not thing.canHaveState(thing.state, fit):
thing.state = State.OFFLINE
elif isinstance(thing, FitType):
@@ -474,60 +357,6 @@ class Fit(object):
eos.db.commit()
self.recalc(fit)
- def toggleCommandFit(self, fitID, thing):
- pyfalog.debug("Toggle command fit ({0}) for: {1}", fitID, thing)
- fit = eos.db.getFit(fitID)
- commandInfo = thing.getCommandInfo(fitID)
- if commandInfo:
- commandInfo.active = not commandInfo.active
-
- eos.db.commit()
- self.recalc(fit)
-
- def changeAmount(self, fitID, projected_fit, amount):
- """Change amount of projected fits"""
- pyfalog.debug("Changing fit ({0}) for projected fit ({1}) to new amount: {2}", fitID, projected_fit.getProjectionInfo(fitID), amount)
- fit = eos.db.getFit(fitID)
- amount = min(20, max(1, amount)) # 1 <= a <= 20
- projectionInfo = projected_fit.getProjectionInfo(fitID)
- if projectionInfo:
- projectionInfo.amount = amount
-
- eos.db.commit()
- self.recalc(fit)
-
- def changeActiveFighters(self, fitID, fighter, amount):
- pyfalog.debug("Changing active fighters ({0}) for fit ({1}) to amount: {2}", fighter.itemID, fitID, amount)
- fit = eos.db.getFit(fitID)
- fighter.amountActive = amount
-
- eos.db.commit()
- self.recalc(fit)
-
- def removeProjected(self, fitID, thing):
- pyfalog.debug("Removing projection on fit ({0}) from: {1}", fitID, thing)
- fit = eos.db.getFit(fitID)
- if isinstance(thing, es_Drone):
- fit.projectedDrones.remove(thing)
- elif isinstance(thing, es_Module):
- fit.projectedModules.remove(thing)
- elif isinstance(thing, es_Fighter):
- fit.projectedFighters.remove(thing)
- else:
- del fit.__projectedFits[thing.ID]
- # fit.projectedFits.remove(thing)
-
- eos.db.commit()
- self.recalc(fit)
-
- def removeCommand(self, fitID, thing):
- pyfalog.debug("Removing command projection from fit ({0}) for: {1}", fitID, thing)
- fit = eos.db.getFit(fitID)
- del fit.__commandFits[thing.ID]
-
- eos.db.commit()
- self.recalc(fit)
-
def changeMutatedValue(self, mutator, value):
pyfalog.debug("Changing mutated value for {} / {}: {} => {}".format(mutator.module, mutator.module.mutaplasmid, mutator.value, value))
mutator.value = value
@@ -535,64 +364,6 @@ class Fit(object):
eos.db.commit()
return mutator.value
- def appendModule(self, fitID, itemID):
- pyfalog.debug("Appending module for fit ({0}) using item: {1}", fitID, itemID)
- fit = eos.db.getFit(fitID)
- item = eos.db.getItem(itemID, eager=("attributes", "group.category"))
- try:
- m = es_Module(item)
- except ValueError:
- pyfalog.warning("Invalid item: {0}", itemID)
- return False
-
- if m.item.category.name == "Subsystem":
- fit.modules.freeSlot(m.getModifiedItemAttr("subSystemSlot"))
-
- if m.fits(fit):
- m.owner = fit
- numSlots = len(fit.modules)
- fit.modules.append(m)
- if m.isValidState(State.ACTIVE):
- m.state = State.ACTIVE
-
- # As some items may affect state-limiting attributes of the ship, calculate new attributes first
- self.recalc(fit)
- # Then, check states of all modules and change where needed. This will recalc if needed
- self.checkStates(fit, m)
-
- fit.fill()
- eos.db.commit()
-
- return numSlots != len(fit.modules)
- else:
- return None
-
- def removeModule(self, fitID, positions):
- """Removes modules based on a number of positions."""
- pyfalog.debug("Removing module from position ({0}) for fit ID: {1}", positions, fitID)
- fit = eos.db.getFit(fitID)
-
- # Convert scalar value to list
- if not isinstance(positions, list):
- positions = [positions]
-
- modulesChanged = False
- for x in positions:
- if not fit.modules[x].isEmpty:
- fit.modules.toDummy(x)
- modulesChanged = True
-
- # if no modules have changes, report back None
- if not modulesChanged:
- return None
-
- numSlots = len(fit.modules)
- self.recalc(fit)
- self.checkStates(fit, None)
- fit.fill()
- eos.db.commit()
- return numSlots != len(fit.modules)
-
def convertMutaplasmid(self, fitID, position, mutaplasmid):
# this is mostly the same thing as the self.changeModule method, however it initializes an abyssal module with
# the old module as it's base, and then replaces it
@@ -624,256 +395,7 @@ class Fit(object):
else:
return None
- def changeModule(self, fitID, position, newItemID):
- fit = eos.db.getFit(fitID)
- module = fit.modules[position]
-
- # We're trying to add a charge to a slot, which won't work. Instead, try to add the charge to the module in that slot.
- if self.isAmmo(newItemID) and not module.isEmpty:
- self.setAmmo(fitID, newItemID, [module])
- return True
-
- pyfalog.debug("Changing position of module from position ({0}) for fit ID: {1}", position, fitID)
-
- item = eos.db.getItem(newItemID, eager=("attributes", "group.category"))
-
- # Dummy it out in case the next bit fails
- fit.modules.toDummy(position)
- ret = None
- try:
- m = es_Module(item)
- except ValueError:
- pyfalog.warning("Invalid item: {0}", newItemID)
- return False
- if m.slot != module.slot:
- fit.modules.toModule(position, module)
- # Fits, but we selected wrong slot type, so don't want to overwrite because we will append on failure (none)
- ret = None
- elif m.fits(fit):
- m.owner = fit
- fit.modules.toModule(position, m)
- if m.isValidState(State.ACTIVE):
- m.state = State.ACTIVE
-
- # As some items may affect state-limiting attributes of the ship, calculate new attributes first
- self.recalc(fit)
- # Then, check states of all modules and change where needed. This will recalc if needed
- self.checkStates(fit, m)
-
- fit.fill()
- eos.db.commit()
-
- ret = True
- return ret
-
- def moveCargoToModule(self, fitID, moduleIdx, cargoIdx, copyMod=False):
- """
- Moves cargo to fitting window. Can either do a copy, move, or swap with current module
- If we try to copy/move into a spot with a non-empty module, we swap instead.
- To avoid redundancy in converting Cargo item, this function does the
- sanity checks as opposed to the GUI View. This is different than how the
- normal .swapModules() does things, which is mostly a blind swap.
- """
-
- fit = eos.db.getFit(fitID)
- module = fit.modules[moduleIdx]
- cargo = fit.cargo[cargoIdx]
-
- # We're trying to move a charge from cargo to a slot - try to add charge to dst module. Don't do anything with
- # the charge in the cargo (don't respect move vs copy)
- if self.isAmmo(cargo.item.ID):
- if not module.isEmpty:
- self.setAmmo(fitID, cargo.item.ID, [module])
- return
-
- pyfalog.debug("Moving cargo item to module for fit ID: {0}", fitID)
-
- # Gather modules and convert Cargo item to Module, silently return if not a module
- try:
- cargoP = es_Module(cargo.item)
- cargoP.owner = fit
- if cargoP.isValidState(State.ACTIVE):
- cargoP.state = State.ACTIVE
- except:
- pyfalog.warning("Invalid item: {0}", cargo.item)
- return
-
- if cargoP.slot != module.slot: # can't swap modules to different racks
- return
-
- # remove module that we are trying to move cargo to
- fit.modules.remove(module)
-
- if not cargoP.fits(fit): # if cargo doesn't fit, rollback and return
- fit.modules.insert(moduleIdx, module)
- return
-
- fit.modules.insert(moduleIdx, cargoP)
-
- if not copyMod: # remove existing cargo if not cloning
- if cargo.amount == 1:
- fit.cargo.remove(cargo)
- else:
- cargo.amount -= 1
-
- if not module.isEmpty: # if module is placeholder, we don't want to convert/add it
- moduleItem = module.item if not module.item.isAbyssal else module.baseItem
- for x in fit.cargo.find(moduleItem):
- x.amount += 1
- break
- else:
- moduleP = es_Cargo(moduleItem)
- moduleP.amount = 1
- fit.cargo.insert(cargoIdx, moduleP)
-
- eos.db.commit()
- self.recalc(fit)
-
- @staticmethod
- def swapModules(fitID, src, dst):
- pyfalog.debug("Swapping modules from source ({0}) to destination ({1}) for fit ID: {1}", src, dst, fitID)
- fit = eos.db.getFit(fitID)
- # Gather modules
- srcMod = fit.modules[src]
- dstMod = fit.modules[dst]
-
- # To swap, we simply remove mod and insert at destination.
- fit.modules.remove(srcMod)
- fit.modules.insert(dst, srcMod)
- fit.modules.remove(dstMod)
- fit.modules.insert(src, dstMod)
-
- eos.db.commit()
-
- def cloneModule(self, fitID, src, dst):
- """
- Clone a module from src to dst
- This will overwrite dst! Checking for empty module must be
- done at a higher level
- """
- pyfalog.debug("Cloning modules from source ({0}) to destination ({1}) for fit ID: {1}", src, dst, fitID)
- fit = eos.db.getFit(fitID)
- # Gather modules
- srcMod = fit.modules[src]
- dstMod = fit.modules[dst] # should be a placeholder module
-
- new = copy.deepcopy(srcMod)
- new.owner = fit
- if new.fits(fit):
- # insert copy if module meets hardpoint restrictions
- fit.modules.remove(dstMod)
- fit.modules.insert(dst, new)
-
- eos.db.commit()
- self.recalc(fit)
-
- def addCargo(self, fitID, itemID, amount=1, replace=False):
- """
- Adds cargo via typeID of item. If replace = True, we replace amount with
- given parameter, otherwise we increment
- """
- pyfalog.debug("Adding cargo ({0}) fit ID: {1}", itemID, fitID)
-
- if fitID is None:
- return False
-
- fit = eos.db.getFit(fitID)
- item = eos.db.getItem(itemID)
- cargo = None
-
- # adding from market
- for x in fit.cargo.find(item):
- if x is not None:
- # found item already in cargo, use previous value and remove old
- cargo = x
- fit.cargo.remove(x)
- break
-
- if cargo is None:
- # if we don't have the item already in cargo, use default values
- cargo = es_Cargo(item)
-
- fit.cargo.append(cargo)
- if replace:
- cargo.amount = amount
- else:
- cargo.amount += amount
-
- self.recalc(fit)
- eos.db.commit()
-
- return True
-
- def removeCargo(self, fitID, position):
- pyfalog.debug("Removing cargo from position ({0}) fit ID: {1}", position, fitID)
- if fitID is None:
- return False
-
- fit = eos.db.getFit(fitID)
- charge = fit.cargo[position]
- fit.cargo.remove(charge)
- self.recalc(fit)
- return True
-
- def addFighter(self, fitID, itemID, recalc=True):
- pyfalog.debug("Adding fighters ({0}) to fit ID: {1}", itemID, fitID)
- if fitID is None:
- return False
-
- fit = eos.db.getFit(fitID)
- item = eos.db.getItem(itemID, eager=("attributes", "group.category"))
- if item.category.name == "Fighter":
- fighter = None
- '''
- for d in fit.fighters.find(item):
- if d is not None and d.amountActive == 0 and d.amount < max(5, fit.extraAttributes["maxActiveDrones"]):
- drone = d
- break
- '''
- if fighter is None:
- fighter = es_Fighter(item)
- used = fit.getSlotsUsed(fighter.slot)
- total = fit.getNumSlots(fighter.slot)
- standardAttackActive = False
- for ability in fighter.abilities:
- if ability.effect.isImplemented and ability.effect.handlerName == 'fighterabilityattackm':
- # Activate "standard attack" if available
- ability.active = True
- standardAttackActive = True
- else:
- # Activate all other abilities (Neut, Web, etc) except propmods if no standard attack is active
- if ability.effect.isImplemented and \
- standardAttackActive is False and \
- ability.effect.handlerName != 'fighterabilitymicrowarpdrive' and \
- ability.effect.handlerName != 'fighterabilityevasivemaneuvers':
- ability.active = True
-
- if used >= total:
- fighter.active = False
-
- if fighter.fits(fit) is True:
- fit.fighters.append(fighter)
- else:
- return False
-
- eos.db.commit()
- if recalc:
- self.recalc(fit)
- return True
- else:
- return False
-
- def removeFighter(self, fitID, i, recalc=True):
- pyfalog.debug("Removing fighters from fit ID: {0}", fitID)
- fit = eos.db.getFit(fitID)
- f = fit.fighters[i]
- fit.fighters.remove(f)
-
- eos.db.commit()
- if recalc:
- self.recalc(fit)
- return True
-
+ @deprecated
def addDrone(self, fitID, itemID, numDronesToAdd=1, recalc=True):
pyfalog.debug("Adding {0} drones ({1}) to fit ID: {2}", numDronesToAdd, itemID, fitID)
if fitID is None:
@@ -902,111 +424,6 @@ class Fit(object):
else:
return False
- def mergeDrones(self, fitID, d1, d2, projected=False):
- pyfalog.debug("Merging drones on fit ID: {0}", fitID)
- if fitID is None:
- return False
-
- fit = eos.db.getFit(fitID)
- if d1.item != d2.item:
- return False
-
- if projected:
- fit.projectedDrones.remove(d1)
- else:
- fit.drones.remove(d1)
-
- d2.amount += d1.amount
- d2.amountActive += d1.amountActive
-
- # If we have less than the total number of drones active, make them all active. Fixes #728
- # This could be removed if we ever add an enhancement to make drone stacks partially active.
- if d2.amount > d2.amountActive:
- d2.amountActive = d2.amount
-
- eos.db.commit()
- self.recalc(fit)
- return True
-
- @staticmethod
- def splitDrones(fit, d, amount, l):
- pyfalog.debug("Splitting drones for fit ID: {0}", fit)
- total = d.amount
- active = d.amountActive > 0
- d.amount = amount
- d.amountActive = amount if active else 0
-
- newD = es_Drone(d.item)
- newD.amount = total - amount
- newD.amountActive = newD.amount if active else 0
- l.append(newD)
- eos.db.commit()
-
- def splitProjectedDroneStack(self, fitID, d, amount):
- pyfalog.debug("Splitting projected drone stack for fit ID: {0}", fitID)
- if fitID is None:
- return False
-
- fit = eos.db.getFit(fitID)
- self.splitDrones(fit, d, amount, fit.projectedDrones)
-
- def splitDroneStack(self, fitID, d, amount):
- pyfalog.debug("Splitting drone stack for fit ID: {0}", fitID)
- if fitID is None:
- return False
-
- fit = eos.db.getFit(fitID)
- self.splitDrones(fit, d, amount, fit.drones)
-
- def removeDrone(self, fitID, i, numDronesToRemove=1, recalc=True):
- pyfalog.debug("Removing {0} drones for fit ID: {1}", numDronesToRemove, fitID)
- fit = eos.db.getFit(fitID)
- d = fit.drones[i]
- d.amount -= numDronesToRemove
- if d.amountActive > 0:
- d.amountActive -= numDronesToRemove
-
- if d.amount == 0:
- del fit.drones[i]
-
- eos.db.commit()
- if recalc:
- self.recalc(fit)
- return True
-
- def toggleDrone(self, fitID, i):
- pyfalog.debug("Toggling drones for fit ID: {0}", fitID)
- fit = eos.db.getFit(fitID)
- d = fit.drones[i]
- if d.amount == d.amountActive:
- d.amountActive = 0
- else:
- d.amountActive = d.amount
-
- eos.db.commit()
- self.recalc(fit)
- return True
-
- def toggleFighter(self, fitID, i):
- pyfalog.debug("Toggling fighters for fit ID: {0}", fitID)
- fit = eos.db.getFit(fitID)
- f = fit.fighters[i]
- f.active = not f.active
-
- eos.db.commit()
- self.recalc(fit)
- return True
-
- def toggleImplant(self, fitID, i):
- pyfalog.debug("Toggling implant for fit ID: {0}", fitID)
- fit = eos.db.getFit(fitID)
- implant = fit.implants[i]
- implant.active = not implant.active
-
- eos.db.commit()
- self.recalc(fit)
- return True
-
def toggleImplantSource(self, fitID, source):
pyfalog.debug("Toggling implant source for fit ID: {0}", fitID)
fit = eos.db.getFit(fitID)
@@ -1031,16 +448,6 @@ class Fit(object):
self.recalc(fit)
return True
- def toggleBooster(self, fitID, i):
- pyfalog.debug("Toggling booster for fit ID: {0}", fitID)
- fit = eos.db.getFit(fitID)
- booster = fit.boosters[i]
- booster.active = not booster.active
-
- eos.db.commit()
- self.recalc(fit)
- return True
-
def toggleFighterAbility(self, fitID, ability):
pyfalog.debug("Toggling fighter ability for fit ID: {0}", fitID)
fit = eos.db.getFit(fitID)
@@ -1069,21 +476,8 @@ class Fit(object):
@staticmethod
def isAmmo(itemID):
- return eos.db.getItem(itemID).category.name == "Charge"
-
- def setAmmo(self, fitID, ammoID, modules):
- pyfalog.debug("Set ammo for fit ID: {0}", fitID)
- if fitID is None:
- return
-
- fit = eos.db.getFit(fitID)
- ammo = eos.db.getItem(ammoID) if ammoID else None
-
- for mod in modules:
- if mod.isValidCharge(ammo):
- mod.charge = ammo
-
- self.recalc(fit)
+ # todo: get rid of this form the service, use directly from item
+ return eos.db.getItem(itemID).isCharge
@staticmethod
def getTargetResists(fitID):
@@ -1125,17 +519,6 @@ class Fit(object):
self.recalc(fit)
- def setMode(self, fitID, mode):
- pyfalog.debug("Set mode for fit ID: {0}", fitID)
- if fitID is None:
- return
-
- fit = eos.db.getFit(fitID)
- fit.mode = mode
- eos.db.commit()
-
- self.recalc(fit)
-
def setAsPattern(self, fitID, ammo):
pyfalog.debug("Set as pattern for fit ID: {0}", fitID)
if fitID is None:
@@ -1175,77 +558,10 @@ class Fit(object):
drone.amountActive = 0
changed = True
+ return changed
# If any state was changed, recalculate attributes again
- if changed:
- self.recalc(fit)
-
- def toggleModulesState(self, fitID, base, modules, click):
- pyfalog.debug("Toggle module state for fit ID: {0}", fitID)
- changed = False
- proposedState = self.__getProposedState(base, click)
-
- if proposedState != base.state:
- changed = True
- base.state = proposedState
- for mod in modules:
- if mod != base:
- p = self.__getProposedState(mod, click, proposedState)
- mod.state = p
- if p != mod.state:
- changed = True
-
- if changed:
- eos.db.commit()
- fit = eos.db.getFit(fitID)
-
- # As some items may affect state-limiting attributes of the ship, calculate new attributes first
- self.recalc(fit)
- # Then, check states of all modules and change where needed. This will recalc if needed
- self.checkStates(fit, base)
-
- # Old state : New State
- localMap = {
- State.OVERHEATED: State.ACTIVE,
- State.ACTIVE: State.ONLINE,
- State.OFFLINE: State.ONLINE,
- State.ONLINE: State.ACTIVE}
- projectedMap = {
- State.OVERHEATED: State.ACTIVE,
- State.ACTIVE: State.OFFLINE,
- State.OFFLINE: State.ACTIVE,
- State.ONLINE: State.ACTIVE} # Just in case
- # For system effects. They should only ever be online or offline
- projectedSystem = {
- State.OFFLINE: State.ONLINE,
- State.ONLINE: State.OFFLINE}
-
- def __getProposedState(self, mod, click, proposedState=None):
- pyfalog.debug("Get proposed state for module.")
- if mod.slot == Slot.SUBSYSTEM or mod.isEmpty:
- return State.ONLINE
-
- if mod.slot == Slot.SYSTEM:
- transitionMap = self.projectedSystem
- else:
- transitionMap = self.projectedMap if mod.projected else self.localMap
-
- currState = mod.state
-
- if proposedState is not None:
- state = proposedState
- elif click == "right":
- state = State.OVERHEATED
- elif click == "ctrl":
- state = State.OFFLINE
- else:
- state = transitionMap[currState]
- if not mod.isValidState(state):
- state = -1
-
- if mod.isValidState(state):
- return state
- else:
- return currState
+ # if changed:
+ # self.recalc(fit)
def refreshFit(self, fitID):
pyfalog.debug("Refresh fit for fit ID: {0}", fitID)
@@ -1257,6 +573,8 @@ class Fit(object):
self.recalc(fit)
def recalc(self, fit):
+ if isinstance(fit, int):
+ fit = self.getFit(fit)
start_time = time()
pyfalog.info("=" * 10 + "recalc: {0}" + "=" * 10, fit.name)
@@ -1264,5 +582,5 @@ class Fit(object):
fit.clear()
fit.calculateModifiedAttributes()
-
+ fit.fill()
pyfalog.info("=" * 10 + "recalc time: " + str(time() - start_time) + "=" * 10)
diff --git a/service/fitDeprecated.py b/service/fitDeprecated.py
new file mode 100644
index 000000000..531191b9d
--- /dev/null
+++ b/service/fitDeprecated.py
@@ -0,0 +1,760 @@
+# ===============================================================================
+# Copyright (C) 2010 Diego Duclos
+#
+# This file is part of pyfa.
+#
+# pyfa is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# pyfa is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with pyfa. If not, see .
+# ===============================================================================
+
+import copy
+from logbook import Logger
+
+import eos.db
+from eos.saveddata.booster import Booster as es_Booster
+from eos.saveddata.cargo import Cargo as es_Cargo
+
+from eos.saveddata.drone import Drone as es_Drone
+from eos.saveddata.fighter import Fighter as es_Fighter
+from eos.saveddata.implant import Implant as es_Implant
+from eos.saveddata.module import Module as es_Module, State
+from eos.saveddata.fit import Fit as FitType
+from utils.deprecated import deprecated
+
+pyfalog = Logger(__name__)
+
+
+class FitDeprecated(object):
+
+ @staticmethod
+ @deprecated
+ def renameFit(fitID, newName):
+ pyfalog.debug("Renaming fit ({0}) to: {1}", fitID, newName)
+ fit = eos.db.getFit(fitID)
+ old_name = fit.name
+ fit.name = newName
+ eos.db.commit()
+ return old_name, newName
+
+ @deprecated
+ def toggleDrone(self, fitID, i):
+ pyfalog.debug("Toggling drones for fit ID: {0}", fitID)
+ fit = eos.db.getFit(fitID)
+ d = fit.drones[i]
+ if d.amount == d.amountActive:
+ d.amountActive = 0
+ else:
+ d.amountActive = d.amount
+
+ eos.db.commit()
+ self.recalc(fit)
+ return True
+
+ @deprecated
+ def mergeDrones(self, fitID, d1, d2, projected=False):
+ pyfalog.debug("Merging drones on fit ID: {0}", fitID)
+ if fitID is None:
+ return False
+
+ fit = eos.db.getFit(fitID)
+ if d1.item != d2.item:
+ return False
+
+ if projected:
+ fit.projectedDrones.remove(d1)
+ else:
+ fit.drones.remove(d1)
+
+ d2.amount += d1.amount
+ d2.amountActive += d1.amountActive
+
+ # If we have less than the total number of drones active, make them all active. Fixes #728
+ # This could be removed if we ever add an enhancement to make drone stacks partially active.
+ if d2.amount > d2.amountActive:
+ d2.amountActive = d2.amount
+
+ eos.db.commit()
+ self.recalc(fit)
+ return True
+
+ @staticmethod
+ @deprecated
+ def splitDrones(fit, d, amount, l):
+ pyfalog.debug("Splitting drones for fit ID: {0}", fit)
+ total = d.amount
+ active = d.amountActive > 0
+ d.amount = amount
+ d.amountActive = amount if active else 0
+
+ newD = es_Drone(d.item)
+ newD.amount = total - amount
+ newD.amountActive = newD.amount if active else 0
+ l.append(newD)
+ eos.db.commit()
+
+ @deprecated
+ def splitProjectedDroneStack(self, fitID, d, amount):
+ pyfalog.debug("Splitting projected drone stack for fit ID: {0}", fitID)
+ if fitID is None:
+ return False
+
+ fit = eos.db.getFit(fitID)
+ self.splitDrones(fit, d, amount, fit.projectedDrones)
+
+ @deprecated
+ def splitDroneStack(self, fitID, d, amount):
+ pyfalog.debug("Splitting drone stack for fit ID: {0}", fitID)
+ if fitID is None:
+ return False
+
+ fit = eos.db.getFit(fitID)
+ self.splitDrones(fit, d, amount, fit.drones)
+
+ @deprecated
+ def removeDrone(self, fitID, i, numDronesToRemove=1, recalc=True):
+ pyfalog.debug("Removing {0} drones for fit ID: {1}", numDronesToRemove, fitID)
+ fit = eos.db.getFit(fitID)
+ d = fit.drones[i]
+ d.amount -= numDronesToRemove
+ if d.amountActive > 0:
+ d.amountActive -= numDronesToRemove
+
+ if d.amount == 0:
+ del fit.drones[i]
+
+ eos.db.commit()
+ if recalc:
+ self.recalc(fit)
+ return True
+
+ @deprecated
+ def changeAmount(self, fitID, projected_fit, amount):
+ """Change amount of projected fits"""
+ pyfalog.debug("Changing fit ({0}) for projected fit ({1}) to new amount: {2}", fitID,
+ projected_fit.getProjectionInfo(fitID), amount)
+ fit = eos.db.getFit(fitID)
+ amount = min(20, max(1, amount)) # 1 <= a <= 20
+ projectionInfo = projected_fit.getProjectionInfo(fitID)
+ if projectionInfo:
+ projectionInfo.amount = amount
+
+ eos.db.commit()
+ self.recalc(fit)
+
+ @deprecated
+ def changeActiveFighters(self, fitID, fighter, amount):
+ pyfalog.debug("Changing active fighters ({0}) for fit ({1}) to amount: {2}", fighter.itemID, fitID, amount)
+ fit = eos.db.getFit(fitID)
+ fighter.amountActive = amount
+
+ eos.db.commit()
+ self.recalc(fit)
+
+ @deprecated
+ def addDrone(self, fitID, itemID, numDronesToAdd=1, recalc=True):
+ pyfalog.debug("Adding {0} drones ({1}) to fit ID: {2}", numDronesToAdd, itemID, fitID)
+ if fitID is None:
+ return False
+
+ fit = eos.db.getFit(fitID)
+ item = eos.db.getItem(itemID, eager=("attributes", "group.category"))
+ if item.category.name == "Drone":
+ drone = None
+ for d in fit.drones.find(item):
+ if d is not None and d.amountActive == 0 and d.amount < max(5, fit.extraAttributes["maxActiveDrones"]):
+ drone = d
+ break
+
+ if drone is None:
+ drone = es_Drone(item)
+ if drone.fits(fit) is True:
+ fit.drones.append(drone)
+ else:
+ return False
+ drone.amount += numDronesToAdd
+ eos.db.commit()
+ if recalc:
+ self.recalc(fit)
+ return True
+ else:
+ return False
+
+ @deprecated
+ def addImplant(self, fitID, itemID, recalc=True):
+ pyfalog.debug("Adding implant to fit ({0}) for item ID: {1}", fitID, itemID)
+ if fitID is None:
+ return False
+
+ fit = eos.db.getFit(fitID)
+ item = eos.db.getItem(itemID, eager="attributes")
+ try:
+ implant = es_Implant(item)
+ except ValueError:
+ pyfalog.warning("Invalid item: {0}", itemID)
+ return False
+
+ fit.implants.append(implant)
+ if recalc:
+ self.recalc(fit)
+ return True
+
+ @deprecated
+ def removeImplant(self, fitID, position, recalc=True):
+ pyfalog.debug("Removing implant from position ({0}) for fit ID: {1}", position, fitID)
+ if fitID is None:
+ return False
+
+ fit = eos.db.getFit(fitID)
+ implant = fit.implants[position]
+ fit.implants.remove(implant)
+ if recalc:
+ self.recalc(fit)
+ return True
+
+ @deprecated
+ def addBooster(self, fitID, itemID, recalc=True):
+ pyfalog.debug("Adding booster ({0}) to fit ID: {1}", itemID, fitID)
+ if fitID is None:
+ return False
+
+ fit = eos.db.getFit(fitID)
+ item = eos.db.getItem(itemID, eager="attributes")
+ try:
+ booster = es_Booster(item)
+ except ValueError:
+ pyfalog.warning("Invalid item: {0}", itemID)
+ return False
+
+ fit.boosters.append(booster)
+ if recalc:
+ self.recalc(fit)
+ return True
+
+ @deprecated
+ def removeBooster(self, fitID, position, recalc=True):
+ pyfalog.debug("Removing booster from position ({0}) for fit ID: {1}", position, fitID)
+ if fitID is None:
+ return False
+
+ fit = eos.db.getFit(fitID)
+ booster = fit.boosters[position]
+ fit.boosters.remove(booster)
+ if recalc:
+ self.recalc(fit)
+ return True
+
+ @deprecated
+ def project(self, fitID, thing):
+ pyfalog.debug("Projecting fit ({0}) onto: {1}", fitID, thing)
+ if fitID is None:
+ return
+
+ fit = eos.db.getFit(fitID)
+
+ if isinstance(thing, int):
+ thing = eos.db.getItem(thing,
+ eager=("attributes", "group.category"))
+
+ if isinstance(thing, es_Module):
+ thing = copy.deepcopy(thing)
+ fit.projectedModules.append(thing)
+ elif isinstance(thing, FitType):
+ if thing in fit.projectedFits:
+ return
+
+ fit.projectedFitDict[thing.ID] = thing
+
+ # this bit is required -- see GH issue # 83
+ eos.db.saveddata_session.flush()
+ eos.db.saveddata_session.refresh(thing)
+ elif thing.category.name == "Drone":
+ drone = None
+ for d in fit.projectedDrones.find(thing):
+ if d is None or d.amountActive == d.amount or d.amount >= 5:
+ drone = d
+ break
+
+ if drone is None:
+ drone = es_Drone(thing)
+ fit.projectedDrones.append(drone)
+
+ drone.amount += 1
+ elif thing.category.name == "Fighter":
+ fighter = es_Fighter(thing)
+ fit.projectedFighters.append(fighter)
+ elif thing.group.name in es_Module.SYSTEM_GROUPS:
+ module = es_Module(thing)
+ module.state = State.ONLINE
+ fit.projectedModules.append(module)
+ else:
+ try:
+ module = es_Module(thing)
+ except ValueError:
+ return False
+ module.state = State.ACTIVE
+ if not module.canHaveState(module.state, fit):
+ module.state = State.OFFLINE
+ fit.projectedModules.append(module)
+
+ eos.db.commit()
+ self.recalc(fit)
+ return True
+
+ @deprecated
+ def addCommandFit(self, fitID, thing):
+ pyfalog.debug("Projecting command fit ({0}) onto: {1}", fitID, thing)
+ if fitID is None:
+ return
+
+ fit = eos.db.getFit(fitID)
+
+ if thing in fit.commandFits:
+ return
+
+ fit.commandFitDict[thing.ID] = thing
+
+ # this bit is required -- see GH issue # 83
+ eos.db.saveddata_session.flush()
+ eos.db.saveddata_session.refresh(thing)
+
+ eos.db.commit()
+ self.recalc(fit)
+ return True
+
+ @deprecated
+ def toggleCommandFit(self, fitID, thing):
+ pyfalog.debug("Toggle command fit ({0}) for: {1}", fitID, thing)
+ fit = eos.db.getFit(fitID)
+ commandInfo = thing.getCommandInfo(fitID)
+ if commandInfo:
+ commandInfo.active = not commandInfo.active
+
+ eos.db.commit()
+ self.recalc(fit)
+
+ @deprecated
+ def removeProjected(self, fitID, thing):
+ pyfalog.debug("Removing projection on fit ({0}) from: {1}", fitID, thing)
+ fit = eos.db.getFit(fitID)
+ if isinstance(thing, es_Drone):
+ fit.projectedDrones.remove(thing)
+ elif isinstance(thing, es_Module):
+ fit.projectedModules.remove(thing)
+ elif isinstance(thing, es_Fighter):
+ fit.projectedFighters.remove(thing)
+ else:
+ del fit.projectedFitDict[thing.ID]
+ # fit.projectedFits.remove(thing)
+
+ eos.db.commit()
+ self.recalc(fit)
+
+ @deprecated
+ def removeCommand(self, fitID, thing):
+ pyfalog.debug("Removing command projection from fit ({0}) for: {1}", fitID, thing)
+ fit = eos.db.getFit(fitID)
+ del fit.commandFitDict[thing.ID]
+
+ eos.db.commit()
+ self.recalc(fit)
+
+ @deprecated
+ def appendModule(self, fitID, itemID):
+ pyfalog.debug("Appending module for fit ({0}) using item: {1}", fitID, itemID)
+ fit = eos.db.getFit(fitID)
+ item = eos.db.getItem(itemID, eager=("attributes", "group.category"))
+ try:
+ m = es_Module(item)
+ except ValueError:
+ pyfalog.warning("Invalid item: {0}", itemID)
+ return False
+
+ if m.item.category.name == "Subsystem":
+ fit.modules.freeSlot(m.getModifiedItemAttr("subSystemSlot"))
+
+ if m.fits(fit):
+ m.owner = fit
+ numSlots = len(fit.modules)
+ fit.modules.append(m)
+ if m.isValidState(State.ACTIVE):
+ m.state = State.ACTIVE
+
+ # As some items may affect state-limiting attributes of the ship, calculate new attributes first
+ self.recalc(fit)
+ # Then, check states of all modules and change where needed. This will recalc if needed
+ self.checkStates(fit, m)
+
+ fit.fill()
+ eos.db.commit()
+
+ return numSlots != len(fit.modules), m.modPosition
+ else:
+ return None, None
+
+ @deprecated
+ def removeModule(self, fitID, positions):
+ """Removes modules based on a number of positions."""
+ pyfalog.debug("Removing module from position ({0}) for fit ID: {1}", positions, fitID)
+ fit = eos.db.getFit(fitID)
+
+ # Convert scalar value to list
+ if not isinstance(positions, list):
+ positions = [positions]
+
+ modulesChanged = False
+ for x in positions:
+ if not fit.modules[x].isEmpty:
+ fit.modules.toDummy(x)
+ modulesChanged = True
+
+ # if no modules have changes, report back None
+ if not modulesChanged:
+ return None
+
+ numSlots = len(fit.modules)
+ self.recalc(fit)
+ self.checkStates(fit, None)
+ fit.fill()
+ eos.db.commit()
+ return numSlots != len(fit.modules)
+
+ @deprecated
+ def changeModule(self, fitID, position, newItemID, recalc=True):
+ fit = eos.db.getFit(fitID)
+
+ # We're trying to add a charge to a slot, which won't work. Instead, try to add the charge to the module in that slot.
+ if self.isAmmo(newItemID):
+ module = fit.modules[position]
+ if not module.isEmpty:
+ self.setAmmo(fitID, newItemID, [module])
+ return True
+
+ pyfalog.debug("Changing position of module from position ({0}) for fit ID: {1}", position, fitID)
+
+ item = eos.db.getItem(newItemID, eager=("attributes", "group.category"))
+
+ # Dummy it out in case the next bit fails
+ fit.modules.toDummy(position)
+
+ try:
+ m = es_Module(item)
+ except ValueError:
+ pyfalog.warning("Invalid item: {0}", newItemID)
+ return False
+
+ if m.fits(fit):
+ m.owner = fit
+ fit.modules.toModule(position, m)
+ if m.isValidState(State.ACTIVE):
+ m.state = State.ACTIVE
+
+ if recalc:
+ # As some items may affect state-limiting attributes of the ship, calculate new attributes first
+ self.recalc(fit)
+ # Then, check states of all modules and change where needed. This will recalc if needed
+ self.checkStates(fit, m)
+
+ fit.fill()
+ eos.db.commit()
+
+ return m
+ else:
+ return None
+
+ @deprecated
+ def moveCargoToModule(self, fitID, moduleIdx, cargoIdx, copyMod=False):
+ """
+ Moves cargo to fitting window. Can either do a copy, move, or swap with current module
+ If we try to copy/move into a spot with a non-empty module, we swap instead.
+ To avoid redundancy in converting Cargo item, this function does the
+ sanity checks as opposed to the GUI View. This is different than how the
+ normal .swapModules() does things, which is mostly a blind swap.
+ """
+
+ fit = eos.db.getFit(fitID)
+ module = fit.modules[moduleIdx]
+ cargo = fit.cargo[cargoIdx]
+
+ # We're trying to move a charge from cargo to a slot - try to add charge to dst module. Don't do anything with
+ # the charge in the cargo (don't respect move vs copy)
+ if self.isAmmo(cargo.item.ID):
+ if not module.isEmpty:
+ self.setAmmo(fitID, cargo.item.ID, [module])
+ return
+
+ pyfalog.debug("Moving cargo item to module for fit ID: {0}", fitID)
+
+ # Gather modules and convert Cargo item to Module, silently return if not a module
+ try:
+ cargoP = es_Module(cargo.item)
+ cargoP.owner = fit
+ if cargoP.isValidState(State.ACTIVE):
+ cargoP.state = State.ACTIVE
+ except:
+ pyfalog.warning("Invalid item: {0}", cargo.item)
+ return
+
+ if cargoP.slot != module.slot: # can't swap modules to different racks
+ return
+
+ # remove module that we are trying to move cargo to
+ fit.modules.remove(module)
+
+ if not cargoP.fits(fit): # if cargo doesn't fit, rollback and return
+ fit.modules.insert(moduleIdx, module)
+ return
+
+ fit.modules.insert(moduleIdx, cargoP)
+
+ if not copyMod: # remove existing cargo if not cloning
+ if cargo.amount == 1:
+ fit.cargo.remove(cargo)
+ else:
+ cargo.amount -= 1
+
+ if not module.isEmpty: # if module is placeholder, we don't want to convert/add it
+ moduleItem = module.item if not module.item.isAbyssal else module.baseItem
+ for x in fit.cargo.find(moduleItem):
+ x.amount += 1
+ break
+ else:
+ moduleP = es_Cargo(moduleItem)
+ moduleP.amount = 1
+ fit.cargo.insert(cargoIdx, moduleP)
+
+ eos.db.commit()
+ self.recalc(fit)
+
+ @staticmethod
+ @deprecated
+ def swapModules(fitID, src, dst):
+ pyfalog.debug("Swapping modules from source ({0}) to destination ({1}) for fit ID: {1}", src, dst, fitID)
+ fit = eos.db.getFit(fitID)
+ # Gather modules
+ srcMod = fit.modules[src]
+ dstMod = fit.modules[dst]
+
+ # To swap, we simply remove mod and insert at destination.
+ fit.modules.remove(srcMod)
+ fit.modules.insert(dst, srcMod)
+ fit.modules.remove(dstMod)
+ fit.modules.insert(src, dstMod)
+
+ eos.db.commit()
+
+ @deprecated
+ def cloneModule(self, fitID, src, dst):
+ """
+ Clone a module from src to dst
+ This will overwrite dst! Checking for empty module must be
+ done at a higher level
+ """
+ pyfalog.debug("Cloning modules from source ({0}) to destination ({1}) for fit ID: {1}", src, dst, fitID)
+ fit = eos.db.getFit(fitID)
+ # Gather modules
+ srcMod = fit.modules[src]
+ dstMod = fit.modules[dst] # should be a placeholder module
+
+ new = copy.deepcopy(srcMod)
+ new.owner = fit
+ if new.fits(fit):
+ # insert copy if module meets hardpoint restrictions
+ fit.modules.remove(dstMod)
+ fit.modules.insert(dst, new)
+
+ eos.db.commit()
+ self.recalc(fit)
+
+ @deprecated
+ def addCargo(self, fitID, itemID, amount=1, replace=False):
+ """
+ Adds cargo via typeID of item. If replace = True, we replace amount with
+ given parameter, otherwise we increment
+ """
+ pyfalog.debug("Adding cargo ({0}) fit ID: {1}", itemID, fitID)
+
+ if fitID is None:
+ return False
+
+ fit = eos.db.getFit(fitID)
+ item = eos.db.getItem(itemID)
+ cargo = None
+
+ # adding from market
+ for x in fit.cargo.find(item):
+ if x is not None:
+ # found item already in cargo, use previous value and remove old
+ cargo = x
+ fit.cargo.remove(x)
+ break
+
+ if cargo is None:
+ # if we don't have the item already in cargo, use default values
+ cargo = es_Cargo(item)
+
+ fit.cargo.append(cargo)
+ if replace:
+ cargo.amount = amount
+ else:
+ cargo.amount += amount
+
+ self.recalc(fit)
+ eos.db.commit()
+
+ return True
+
+ @deprecated
+ def removeCargo(self, fitID, position):
+ pyfalog.debug("Removing cargo from position ({0}) fit ID: {1}", position, fitID)
+ if fitID is None:
+ return False
+
+ fit = eos.db.getFit(fitID)
+ charge = fit.cargo[position]
+ fit.cargo.remove(charge)
+ self.recalc(fit)
+ return True
+
+ @deprecated
+ def addFighter(self, fitID, itemID, recalc=True):
+ pyfalog.debug("Adding fighters ({0}) to fit ID: {1}", itemID, fitID)
+ if fitID is None:
+ return False
+
+ fit = eos.db.getFit(fitID)
+ item = eos.db.getItem(itemID, eager=("attributes", "group.category"))
+ if item.category.name == "Fighter":
+ fighter = None
+ '''
+ for d in fit.fighters.find(item):
+ if d is not None and d.amountActive == 0 and d.amount < max(5, fit.extraAttributes["maxActiveDrones"]):
+ drone = d
+ break
+ '''
+ if fighter is None:
+ fighter = es_Fighter(item)
+ used = fit.getSlotsUsed(fighter.slot)
+ total = fit.getNumSlots(fighter.slot)
+
+ if used >= total:
+ fighter.active = False
+
+ if fighter.fits(fit) is True:
+ fit.fighters.append(fighter)
+ else:
+ return False
+
+ eos.db.commit()
+ if recalc:
+ self.recalc(fit)
+ return True
+ else:
+ return False
+
+ @deprecated
+ def removeFighter(self, fitID, i, recalc=True):
+ pyfalog.debug("Removing fighters from fit ID: {0}", fitID)
+ fit = eos.db.getFit(fitID)
+ f = fit.fighters[i]
+ fit.fighters.remove(f)
+
+ eos.db.commit()
+ if recalc:
+ self.recalc(fit)
+ return True
+
+ @deprecated
+ def toggleFighter(self, fitID, i):
+ pyfalog.debug("Toggling fighters for fit ID: {0}", fitID)
+ fit = eos.db.getFit(fitID)
+ f = fit.fighters[i]
+ f.active = not f.active
+
+ eos.db.commit()
+ self.recalc(fit)
+ return True
+
+ @deprecated
+ def toggleImplant(self, fitID, i):
+ pyfalog.debug("Toggling implant for fit ID: {0}", fitID)
+ fit = eos.db.getFit(fitID)
+ implant = fit.implants[i]
+ implant.active = not implant.active
+
+ eos.db.commit()
+ self.recalc(fit)
+ return True
+
+ @deprecated
+ def toggleBooster(self, fitID, i):
+ pyfalog.debug("Toggling booster for fit ID: {0}", fitID)
+ fit = eos.db.getFit(fitID)
+ booster = fit.boosters[i]
+ booster.active = not booster.active
+
+ eos.db.commit()
+ self.recalc(fit)
+ return True
+
+ @deprecated
+ def setAmmo(self, fitID, ammoID, modules, recalc=True):
+ pyfalog.debug("Set ammo for fit ID: {0}", fitID)
+ if fitID is None:
+ return
+
+ fit = eos.db.getFit(fitID)
+ ammo = eos.db.getItem(ammoID) if ammoID else None
+
+ for mod in modules:
+ if mod.isValidCharge(ammo):
+ mod.charge = ammo
+
+ if recalc:
+ self.recalc(fit)
+
+ @deprecated
+ def setMode(self, fitID, mode):
+ pyfalog.debug("Set mode for fit ID: {0}", fitID)
+ if fitID is None:
+ return
+
+ fit = eos.db.getFit(fitID)
+ fit.mode = mode
+ eos.db.commit()
+
+ self.recalc(fit)
+
+ @deprecated
+ def toggleModulesState(self, fitID, base, modules, click):
+ pyfalog.debug("Toggle module state for fit ID: {0}", fitID)
+ changed = False
+ proposedState = es_Module.getProposedState(base, click)
+
+ if proposedState != base.state:
+ changed = True
+ base.state = proposedState
+ for mod in modules:
+ if mod != base:
+ p = es_Module.getProposedState(mod, click, proposedState)
+ mod.state = p
+ if p != mod.state:
+ changed = True
+
+ if changed:
+ eos.db.commit()
+ fit = eos.db.getFit(fitID)
+
+ # As some items may affect state-limiting attributes of the ship, calculate new attributes first
+ self.recalc(fit)
+ # Then, check states of all modules and change where needed. This will recalc if needed
+ self.checkStates(fit, base)
diff --git a/service/jargon/jargon.py b/service/jargon/jargon.py
index bc9a0d525..3530d0859 100644
--- a/service/jargon/jargon.py
+++ b/service/jargon/jargon.py
@@ -17,9 +17,6 @@
# along with pyfa. If not, see .
# =============================================================================
-import config
-import pkg_resources
-
class Jargon(object):
def __init__(self, rawdata: dict):
diff --git a/service/market.py b/service/market.py
index 545b1a66f..3e128cbbc 100644
--- a/service/market.py
+++ b/service/market.py
@@ -17,25 +17,22 @@
# along with pyfa. If not, see .
# ===============================================================================
-import re
-import threading
-from logbook import Logger
import queue
-from itertools import chain
+import threading
+from collections import OrderedDict
# noinspection PyPackageRequirements
import wx
+from logbook import Logger
from sqlalchemy.sql import or_
import config
import eos.db
-from service import conversions
-from service.settings import SettingsProvider
-from service.jargon import JargonLoader
-
from eos.gamedata import Category as types_Category, Group as types_Group, Item as types_Item, MarketGroup as types_MarketGroup, \
MetaGroup as types_MetaGroup, MetaType as types_MetaType
-from collections import OrderedDict
+from service import conversions
+from service.jargon import JargonLoader
+from service.settings import SettingsProvider
pyfalog = Logger(__name__)
diff --git a/service/marketSources/evemarketdata.py b/service/marketSources/evemarketdata.py
index be42cb66d..bd1f8f3af 100644
--- a/service/marketSources/evemarketdata.py
+++ b/service/marketSources/evemarketdata.py
@@ -18,12 +18,12 @@
# =============================================================================
import time
-from logbook import Logger
from xml.dom import minidom
-from service.network import Network
-from service.price import Price, VALIDITY, TIMEOUT, TimeoutError
+from logbook import Logger
+from service.network import Network
+from service.price import Price, TIMEOUT, VALIDITY
pyfalog = Logger(__name__)
diff --git a/service/marketSources/evemarketer.py b/service/marketSources/evemarketer.py
index 948b9ec48..a2728ddfb 100644
--- a/service/marketSources/evemarketer.py
+++ b/service/marketSources/evemarketer.py
@@ -18,12 +18,12 @@
# =============================================================================
import time
-from logbook import Logger
from xml.dom import minidom
-from service.network import Network
-from service.price import Price, VALIDITY, TIMEOUT, TimeoutError
+from logbook import Logger
+from service.network import Network
+from service.price import Price, VALIDITY
pyfalog = Logger(__name__)
diff --git a/service/port.py b/service/port.py
deleted file mode 100644
index 5ad5c4ed3..000000000
--- a/service/port.py
+++ /dev/null
@@ -1,1399 +0,0 @@
-# =============================================================================
-# Copyright (C) 2014 Ryan Holmes
-#
-# This file is part of pyfa.
-#
-# pyfa is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# pyfa is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with pyfa. If not, see .
-# =============================================================================
-
-import re
-import os
-import xml.dom
-from logbook import Logger
-import collections
-import json
-import threading
-from bs4 import UnicodeDammit
-
-
-from codecs import open
-
-import xml.parsers.expat
-
-from eos import db
-from eos.db.gamedata.queries import getAttributeInfo
-from service.fit import Fit as svcFit
-
-# noinspection PyPackageRequirements
-import wx
-
-from eos.saveddata.cargo import Cargo
-from eos.saveddata.implant import Implant
-from eos.saveddata.booster import Booster
-from eos.saveddata.drone import Drone
-from eos.saveddata.fighter import Fighter
-from eos.saveddata.module import Module, State, Slot
-from eos.saveddata.ship import Ship
-from eos.saveddata.citadel import Citadel
-from eos.saveddata.fit import Fit, ImplantLocation
-from service.market import Market
-from utils.strfunctions import sequential_rep, replace_ltgt
-from abc import ABCMeta, abstractmethod
-
-from service.esi import Esi
-from collections import OrderedDict
-
-
-class ESIExportException(Exception):
- pass
-
-
-pyfalog = Logger(__name__)
-
-EFT_SLOT_ORDER = [Slot.LOW, Slot.MED, Slot.HIGH, Slot.RIG, Slot.SUBSYSTEM, Slot.SERVICE]
-INV_FLAGS = {
- Slot.LOW: 11,
- Slot.MED: 19,
- Slot.HIGH: 27,
- Slot.RIG: 92,
- Slot.SUBSYSTEM: 125,
- Slot.SERVICE: 164
-}
-
-INV_FLAG_CARGOBAY = 5
-INV_FLAG_DRONEBAY = 87
-INV_FLAG_FIGHTER = 158
-
-# 2017/04/05 NOTE: simple validation, for xml file
-RE_XML_START = r'<\?xml\s+version="1.0"\s*\?>'
-
-# -- 170327 Ignored description --
-RE_LTGT = "&(lt|gt);"
-L_MARK = "<localized hint=""
-# <localized hint="([^"]+)">([^\*]+)\*<\/localized>
-LOCALIZED_PATTERN = re.compile(r'([^\*]+)\*')
-
-
-def _extract_match(t):
- m = LOCALIZED_PATTERN.match(t)
- # hint attribute, text content
- return m.group(1), m.group(2)
-
-
-def _resolve_ship(fitting, sMkt, b_localized):
- # type: (xml.dom.minidom.Element, service.market.Market, bool) -> eos.saveddata.fit.Fit
- """ NOTE: Since it is meaningless unless a correct ship object can be constructed,
- process flow changed
- """
- # ------ Confirm ship
- # Maelstrom
- shipType = fitting.getElementsByTagName("shipType").item(0).getAttribute("value")
- anything = None
- if b_localized:
- # expect an official name, emergency cache
- shipType, anything = _extract_match(shipType)
-
- limit = 2
- ship = None
- while True:
- must_retry = False
- try:
- try:
- ship = Ship(sMkt.getItem(shipType))
- except ValueError:
- ship = Citadel(sMkt.getItem(shipType))
- except Exception as e:
- pyfalog.warning("Caught exception on _resolve_ship")
- pyfalog.error(e)
- limit -= 1
- if limit is 0:
- break
- shipType = anything
- must_retry = True
- if not must_retry:
- break
-
- if ship is None:
- raise Exception("cannot resolve ship type.")
-
- fitobj = Fit(ship=ship)
- # ------ Confirm fit name
- anything = fitting.getAttribute("name")
- # 2017/03/29 NOTE:
- # if fit name contained "<" or ">" then reprace to named html entity by EVE client
- # if re.search(RE_LTGT, anything):
- if "<" in anything or ">" in anything:
- anything = replace_ltgt(anything)
- fitobj.name = anything
-
- return fitobj
-
-
-def _resolve_module(hardware, sMkt, b_localized):
- # type: (xml.dom.minidom.Element, service.market.Market, bool) -> eos.saveddata.module.Module
- moduleName = hardware.getAttribute("type")
- emergency = None
- if b_localized:
- # expect an official name, emergency cache
- moduleName, emergency = _extract_match(moduleName)
-
- item = None
- limit = 2
- while True:
- must_retry = False
- try:
- item = sMkt.getItem(moduleName, eager="group.category")
- except Exception as e:
- pyfalog.warning("Caught exception on _resolve_module")
- pyfalog.error(e)
- limit -= 1
- if limit is 0:
- break
- moduleName = emergency
- must_retry = True
- if not must_retry:
- break
- return item
-
-
-class UserCancelException(Exception):
- """when user cancel on port processing."""
- pass
-
-
-class IPortUser(metaclass=ABCMeta):
-
- ID_PULSE = 1
- # Pulse the progress bar
- ID_UPDATE = ID_PULSE << 1
- # Replace message with data: update messate
- ID_DONE = ID_PULSE << 2
- # open fits: import process done
- ID_ERROR = ID_PULSE << 3
- # display error: raise some error
-
- PROCESS_IMPORT = ID_PULSE << 4
- # means import process.
- PROCESS_EXPORT = ID_PULSE << 5
- # means import process.
-
- @abstractmethod
- def on_port_processing(self, action, data=None):
- """
- While importing fits from file, the logic calls back to this function to
- update progress bar to show activity. XML files can contain multiple
- ships with multiple fits, whereas EFT cfg files contain many fits of
- a single ship. When iterating through the files, we update the message
- when we start a new file, and then Pulse the progress bar with every fit
- that is processed.
-
- action : a flag that lets us know how to deal with :data
- None: Pulse the progress bar
- 1: Replace message with data
- other: Close dialog and handle based on :action (-1 open fits, -2 display error)
- """
-
- """return: True is continue process, False is cancel."""
- pass
-
- def on_port_process_start(self):
- pass
-
-
-class Port(object):
- """
- 2017/03/31 NOTE: About change
- 1. want to keep the description recorded in fit
- 2. i think should not write wx.CallAfter in here
- """
- instance = None
- __tag_replace_flag = True
-
- @classmethod
- def getInstance(cls):
- if cls.instance is None:
- cls.instance = Port()
-
- return cls.instance
-
- @classmethod
- def set_tag_replace(cls, b):
- cls.__tag_replace_flag = b
-
- @classmethod
- def is_tag_replace(cls):
- # might there is a person who wants to hold tags.
- # (item link in EVE client etc. When importing again to EVE)
- return cls.__tag_replace_flag
-
- @staticmethod
- def backupFits(path, iportuser):
- pyfalog.debug("Starting backup fits thread.")
-# thread = FitBackupThread(path, callback)
-# thread.start()
- threading.Thread(
- target=PortProcessing.backupFits,
- args=(path, iportuser)
- ).start()
-
- @staticmethod
- def importFitsThreaded(paths, iportuser):
- # type: (tuple, IPortUser) -> None
- """
- :param paths: fits data file path list.
- :param iportuser: IPortUser implemented class.
- :rtype: None
- """
- pyfalog.debug("Starting import fits thread.")
-# thread = FitImportThread(paths, iportuser)
-# thread.start()
- threading.Thread(
- target=PortProcessing.importFitsFromFile,
- args=(paths, iportuser)
- ).start()
-
- @staticmethod
- def importFitFromFiles(paths, iportuser=None):
- """
- Imports fits from file(s). First processes all provided paths and stores
- assembled fits into a list. This allows us to call back to the GUI as
- fits are processed as well as when fits are being saved.
- returns
- """
-
- sFit = svcFit.getInstance()
-
- fit_list = []
- try:
- for path in paths:
- if iportuser: # Pulse
- msg = "Processing file:\n%s" % path
- pyfalog.debug(msg)
- PortProcessing.notify(iportuser, IPortUser.PROCESS_IMPORT | IPortUser.ID_UPDATE, msg)
- # wx.CallAfter(callback, 1, msg)
-
- with open(path, "rb") as file_:
- srcString = file_.read()
- dammit = UnicodeDammit(srcString)
- srcString = dammit.unicode_markup
-
- if len(srcString) == 0: # ignore blank files
- pyfalog.debug("File is blank.")
- continue
-
- try:
- _, fitsImport = Port.importAuto(srcString, path, iportuser=iportuser)
- fit_list += fitsImport
- except xml.parsers.expat.ExpatError:
- pyfalog.warning("Malformed XML in:\n{0}", path)
- return False, "Malformed XML in %s" % path
-
- # IDs = [] # NOTE: what use for IDs?
- numFits = len(fit_list)
- for idx, fit in enumerate(fit_list):
- # Set some more fit attributes and save
- fit.character = sFit.character
- fit.damagePattern = sFit.pattern
- fit.targetResists = sFit.targetResists
- if len(fit.implants) > 0:
- fit.implantLocation = ImplantLocation.FIT
- else:
- useCharImplants = sFit.serviceFittingOptions["useCharacterImplantsByDefault"]
- fit.implantLocation = ImplantLocation.CHARACTER if useCharImplants else ImplantLocation.FIT
- db.save(fit)
- # IDs.append(fit.ID)
- if iportuser: # Pulse
- pyfalog.debug("Processing complete, saving fits to database: {0}/{1}", idx + 1, numFits)
- PortProcessing.notify(
- iportuser, IPortUser.PROCESS_IMPORT | IPortUser.ID_UPDATE,
- "Processing complete, saving fits to database\n(%d/%d) %s" % (idx + 1, numFits, fit.ship.name)
- )
-
- except UserCancelException:
- return False, "Processing has been canceled.\n"
- except Exception as e:
- pyfalog.critical("Unknown exception processing: {0}", path)
- pyfalog.critical(e)
- # TypeError: not all arguments converted during string formatting
-# return False, "Unknown Error while processing {0}" % path
- return False, "Unknown error while processing %s\n\n Error: %s" % (path, e.message)
-
- return True, fit_list
-
- @staticmethod
- def importFitFromBuffer(bufferStr, activeFit=None):
- # type: (basestring, object) -> object
- # TODO: catch the exception?
- # activeFit is reserved?, bufferStr is unicode? (assume only clipboard string?
- sFit = svcFit.getInstance()
- _, fits = Port.importAuto(bufferStr, activeFit=activeFit)
- for fit in fits:
- fit.character = sFit.character
- fit.damagePattern = sFit.pattern
- fit.targetResists = sFit.targetResists
- if len(fit.implants) > 0:
- fit.implantLocation = ImplantLocation.FIT
- else:
- useCharImplants = sFit.serviceFittingOptions["useCharacterImplantsByDefault"]
- fit.implantLocation = ImplantLocation.CHARACTER if useCharImplants else ImplantLocation.FIT
- db.save(fit)
- return fits
-
- """Service which houses all import/export format functions"""
-
- @classmethod
- def exportESI(cls, ofit, callback=None):
- # A few notes:
- # max fit name length is 50 characters
- # Most keys are created simply because they are required, but bogus data is okay
-
- nested_dict = lambda: collections.defaultdict(nested_dict)
- fit = nested_dict()
- sFit = svcFit.getInstance()
-
- # max length is 50 characters
- name = ofit.name[:47] + '...' if len(ofit.name) > 50 else ofit.name
- fit['name'] = name
- fit['ship_type_id'] = ofit.ship.item.ID
-
- # 2017/03/29 NOTE: "<" or "<" is Ignored
- # fit['description'] = "" % ofit.ID
- fit['description'] = ofit.notes[:397] + '...' if len(ofit.notes) > 400 else ofit.notes if ofit.notes is not None else ""
- fit['items'] = []
-
- slotNum = {}
- charges = {}
- for module in ofit.modules:
- if module.isEmpty:
- continue
-
- item = nested_dict()
- slot = module.slot
-
- if slot == Slot.SUBSYSTEM:
- # Order of subsystem matters based on this attr. See GH issue #130
- slot = int(module.getModifiedItemAttr("subSystemSlot"))
- item['flag'] = slot
- else:
- if slot not in slotNum:
- slotNum[slot] = INV_FLAGS[slot]
-
- item['flag'] = slotNum[slot]
- slotNum[slot] += 1
-
- item['quantity'] = 1
- item['type_id'] = module.item.ID
- fit['items'].append(item)
-
- if module.charge and sFit.serviceFittingOptions["exportCharges"]:
- if module.chargeID not in charges:
- charges[module.chargeID] = 0
- # `or 1` because some charges (ie scripts) are without qty
- charges[module.chargeID] += module.numCharges or 1
-
- for cargo in ofit.cargo:
- item = nested_dict()
- item['flag'] = INV_FLAG_CARGOBAY
- item['quantity'] = cargo.amount
- item['type_id'] = cargo.item.ID
- fit['items'].append(item)
-
- for chargeID, amount in list(charges.items()):
- item = nested_dict()
- item['flag'] = INV_FLAG_CARGOBAY
- item['quantity'] = amount
- item['type_id'] = chargeID
- fit['items'].append(item)
-
- for drone in ofit.drones:
- item = nested_dict()
- item['flag'] = INV_FLAG_DRONEBAY
- item['quantity'] = drone.amount
- item['type_id'] = drone.item.ID
- fit['items'].append(item)
-
- for fighter in ofit.fighters:
- item = nested_dict()
- item['flag'] = INV_FLAG_FIGHTER
- item['quantity'] = fighter.amountActive
- item['type_id'] = fighter.item.ID
- fit['items'].append(item)
-
- if len(fit['items']) == 0:
- raise ESIExportException("Cannot export fitting: module list cannot be empty.")
-
- return json.dumps(fit)
-
- @classmethod
- def importAuto(cls, string, path=None, activeFit=None, iportuser=None):
- # type: (basestring, basestring, object, IPortUser, basestring) -> object
- # Get first line and strip space symbols of it to avoid possible detection errors
- firstLine = re.split("[\n\r]+", string.strip(), maxsplit=1)[0]
- firstLine = firstLine.strip()
-
- # If XML-style start of tag encountered, detect as XML
- if re.search(RE_XML_START, firstLine):
- return "XML", cls.importXml(string, iportuser)
-
- # If JSON-style start, parse as CREST/JSON
- if firstLine[0] == '{':
- return "JSON", (cls.importESI(string),)
-
- # If we've got source file name which is used to describe ship name
- # and first line contains something like [setup name], detect as eft config file
- if re.match("\[.*\]", firstLine) and path is not None:
- filename = os.path.split(path)[1]
- shipName = filename.rsplit('.')[0]
- return "EFT Config", cls.importEftCfg(shipName, string, iportuser)
-
- # If no file is specified and there's comma between brackets,
- # consider that we have [ship, setup name] and detect like eft export format
- if re.match("\[.*,.*\]", firstLine):
- return "EFT", (cls.importEft(string),)
-
- # Use DNA format for all other cases
- return "DNA", (cls.importDna(string),)
-
- @staticmethod
- def importESI(str_):
-
- sMkt = Market.getInstance()
- fitobj = Fit()
- refobj = json.loads(str_)
- items = refobj['items']
- # "<" and ">" is replace to "<", ">" by EVE client
- fitobj.name = refobj['name']
- # 2017/03/29: read description
- fitobj.notes = refobj['description']
-
- try:
- ship = refobj['ship_type_id']
- try:
- fitobj.ship = Ship(sMkt.getItem(ship))
- except ValueError:
- fitobj.ship = Citadel(sMkt.getItem(ship))
- except:
- pyfalog.warning("Caught exception in importESI")
- return None
-
- items.sort(key=lambda k: k['flag'])
-
- moduleList = []
- for module in items:
- try:
- item = sMkt.getItem(module['type_id'], eager="group.category")
- if not item.published:
- continue
- if module['flag'] == INV_FLAG_DRONEBAY:
- d = Drone(item)
- d.amount = module['quantity']
- fitobj.drones.append(d)
- elif module['flag'] == INV_FLAG_CARGOBAY:
- c = Cargo(item)
- c.amount = module['quantity']
- fitobj.cargo.append(c)
- elif module['flag'] == INV_FLAG_FIGHTER:
- fighter = Fighter(item)
- fitobj.fighters.append(fighter)
- else:
- try:
- m = Module(item)
- # When item can't be added to any slot (unknown item or just charge), ignore it
- except ValueError:
- pyfalog.debug("Item can't be added to any slot (unknown item or just charge)")
- continue
- # Add subsystems before modules to make sure T3 cruisers have subsystems installed
- if item.category.name == "Subsystem":
- if m.fits(fitobj):
- fitobj.modules.append(m)
- else:
- if m.isValidState(State.ACTIVE):
- m.state = State.ACTIVE
-
- moduleList.append(m)
-
- except:
- pyfalog.warning("Could not process module.")
- continue
-
- # Recalc to get slot numbers correct for T3 cruisers
- svcFit.getInstance().recalc(fitobj)
-
- for module in moduleList:
- if module.fits(fitobj):
- fitobj.modules.append(module)
-
- return fitobj
-
- @staticmethod
- def importDna(string):
- sMkt = Market.getInstance()
-
- ids = list(map(int, re.findall(r'\d+', string)))
- for id_ in ids:
- try:
- try:
- try:
- Ship(sMkt.getItem(sMkt.getItem(id_)))
- except ValueError:
- Citadel(sMkt.getItem(sMkt.getItem(id_)))
- except ValueError:
- Citadel(sMkt.getItem(id_))
- string = string[string.index(str(id_)):]
- break
- except:
- pyfalog.warning("Exception caught in importDna")
- pass
- string = string[:string.index("::") + 2]
- info = string.split(":")
-
- f = Fit()
- try:
- try:
- f.ship = Ship(sMkt.getItem(int(info[0])))
- except ValueError:
- f.ship = Citadel(sMkt.getItem(int(info[0])))
- f.name = "{0} - DNA Imported".format(f.ship.item.name)
- except UnicodeEncodeError:
- def logtransform(s_):
- if len(s_) > 10:
- return s_[:10] + "..."
- return s_
-
- pyfalog.exception("Couldn't import ship data {0}", [logtransform(s) for s in info])
- return None
-
- moduleList = []
- for itemInfo in info[1:]:
- if itemInfo:
- itemID, amount = itemInfo.split(";")
- item = sMkt.getItem(int(itemID), eager="group.category")
-
- if item.category.name == "Drone":
- d = Drone(item)
- d.amount = int(amount)
- f.drones.append(d)
- elif item.category.name == "Fighter":
- ft = Fighter(item)
- ft.amount = int(amount) if ft.amount <= ft.fighterSquadronMaxSize else ft.fighterSquadronMaxSize
- if ft.fits(f):
- f.fighters.append(ft)
- elif item.category.name == "Charge":
- c = Cargo(item)
- c.amount = int(amount)
- f.cargo.append(c)
- else:
- for i in range(int(amount)):
- try:
- m = Module(item)
- except:
- pyfalog.warning("Exception caught in importDna")
- continue
- # Add subsystems before modules to make sure T3 cruisers have subsystems installed
- if item.category.name == "Subsystem":
- if m.fits(f):
- f.modules.append(m)
- else:
- m.owner = f
- if m.isValidState(State.ACTIVE):
- m.state = State.ACTIVE
- moduleList.append(m)
-
- # Recalc to get slot numbers correct for T3 cruisers
- svcFit.getInstance().recalc(f)
-
- for module in moduleList:
- if module.fits(f):
- module.owner = f
- if module.isValidState(State.ACTIVE):
- module.state = State.ACTIVE
- f.modules.append(module)
-
- return f
-
- @staticmethod
- def importEft(eftString):
- sMkt = Market.getInstance()
- offineSuffix = " /OFFLINE"
-
- fit = Fit()
- eftString = eftString.strip()
- lines = re.split('[\n\r]+', eftString)
- info = lines[0][1:-1].split(",", 1)
-
- if len(info) == 2:
- shipType = info[0].strip()
- fitName = info[1].strip()
- else:
- shipType = info[0].strip()
- fitName = "Imported %s" % shipType
-
- try:
- ship = sMkt.getItem(shipType)
- try:
- fit.ship = Ship(ship)
- except ValueError:
- fit.ship = Citadel(ship)
- fit.name = fitName
- except:
- pyfalog.warning("Exception caught in importEft")
- return
-
- # maintain map of drones and their quantities
- droneMap = {}
- cargoMap = {}
- moduleList = []
- for i in range(1, len(lines)):
- ammoName = None
- extraAmount = None
-
- line = lines[i].strip()
- if not line:
- continue
-
- setOffline = line.endswith(offineSuffix)
- if setOffline is True:
- # remove offline suffix from line
- line = line[:len(line) - len(offineSuffix)]
-
- modAmmo = line.split(",")
- # matches drone and cargo with x{qty}
- modExtra = modAmmo[0].split(" x")
-
- if len(modAmmo) == 2:
- # line with a module and ammo
- ammoName = modAmmo[1].strip()
- modName = modAmmo[0].strip()
- elif len(modExtra) == 2:
- # line with drone/cargo and qty
- extraAmount = modExtra[1].strip()
- modName = modExtra[0].strip()
- else:
- # line with just module
- modName = modExtra[0].strip()
-
- try:
- # get item information. If we are on a Drone/Cargo line, throw out cargo
- item = sMkt.getItem(modName, eager="group.category")
- except:
- # if no data can be found (old names)
- pyfalog.warning("no data can be found (old names)")
- continue
-
- if not item.published:
- continue
-
- if item.category.name == "Drone":
- extraAmount = int(extraAmount) if extraAmount is not None else 1
- if modName not in droneMap:
- droneMap[modName] = 0
- droneMap[modName] += extraAmount
- elif item.category.name == "Fighter":
- extraAmount = int(extraAmount) if extraAmount is not None else 1
- fighterItem = Fighter(item)
- if extraAmount > fighterItem.fighterSquadronMaxSize: # Amount bigger then max fightergroup size
- extraAmount = fighterItem.fighterSquadronMaxSize
- if fighterItem.fits(fit):
- fit.fighters.append(fighterItem)
-
- if len(modExtra) == 2 and item.category.name != "Drone" and item.category.name != "Fighter":
- extraAmount = int(extraAmount) if extraAmount is not None else 1
- if modName not in cargoMap:
- cargoMap[modName] = 0
- cargoMap[modName] += extraAmount
- elif item.category.name == "Implant":
- if "implantness" in item.attributes:
- fit.implants.append(Implant(item))
- elif "boosterness" in item.attributes:
- fit.boosters.append(Booster(item))
- else:
- pyfalog.error("Failed to import implant: {0}", line)
- # elif item.category.name == "Subsystem":
- # try:
- # subsystem = Module(item)
- # except ValueError:
- # continue
- #
- # if subsystem.fits(fit):
- # fit.modules.append(subsystem)
- else:
- try:
- m = Module(item)
- except ValueError:
- continue
- # Add subsystems before modules to make sure T3 cruisers have subsystems installed
- if item.category.name == "Subsystem":
- if m.fits(fit):
- fit.modules.append(m)
- else:
- if ammoName:
- try:
- ammo = sMkt.getItem(ammoName)
- if m.isValidCharge(ammo) and m.charge is None:
- m.charge = ammo
- except:
- pass
-
- if setOffline is True and m.isValidState(State.OFFLINE):
- m.state = State.OFFLINE
- elif m.isValidState(State.ACTIVE):
- m.state = State.ACTIVE
-
- moduleList.append(m)
-
- # Recalc to get slot numbers correct for T3 cruisers
- svcFit.getInstance().recalc(fit)
-
- for m in moduleList:
- if m.fits(fit):
- m.owner = fit
- if not m.isValidState(m.state):
- pyfalog.warning("Error: Module {0} cannot have state {1}", m, m.state)
-
- fit.modules.append(m)
-
- for droneName in droneMap:
- d = Drone(sMkt.getItem(droneName))
- d.amount = droneMap[droneName]
- fit.drones.append(d)
-
- for cargoName in cargoMap:
- c = Cargo(sMkt.getItem(cargoName))
- c.amount = cargoMap[cargoName]
- fit.cargo.append(c)
-
- return fit
-
- @staticmethod
- def importEftCfg(shipname, contents, iportuser=None):
- """Handle import from EFT config store file"""
-
- # Check if we have such ship in database, bail if we don't
- sMkt = Market.getInstance()
- try:
- sMkt.getItem(shipname)
- except:
- return [] # empty list is expected
-
- fits = [] # List for fits
- fitIndices = [] # List for starting line numbers for each fit
- lines = re.split('[\n\r]+', contents) # Separate string into lines
-
- for line in lines:
- # Detect fit header
- if line[:1] == "[" and line[-1:] == "]":
- # Line index where current fit starts
- startPos = lines.index(line)
- fitIndices.append(startPos)
-
- for i, startPos in enumerate(fitIndices):
- # End position is last file line if we're trying to get it for last fit,
- # or start position of next fit minus 1
- endPos = len(lines) if i == len(fitIndices) - 1 else fitIndices[i + 1]
-
- # Finally, get lines for current fitting
- fitLines = lines[startPos:endPos]
-
- try:
- # Create fit object
- fitobj = Fit()
- # Strip square brackets and pull out a fit name
- fitobj.name = fitLines[0][1:-1]
- # Assign ship to fitting
- try:
- fitobj.ship = Ship(sMkt.getItem(shipname))
- except ValueError:
- fitobj.ship = Citadel(sMkt.getItem(shipname))
-
- moduleList = []
- for x in range(1, len(fitLines)):
- line = fitLines[x]
- if not line:
- continue
-
- # Parse line into some data we will need
- misc = re.match("(Drones|Implant|Booster)_(Active|Inactive)=(.+)", line)
- cargo = re.match("Cargohold=(.+)", line)
- # 2017/03/27 NOTE: store description from EFT
- description = re.match("Description=(.+)", line)
-
- if misc:
- entityType = misc.group(1)
- entityState = misc.group(2)
- entityData = misc.group(3)
- if entityType == "Drones":
- droneData = re.match("(.+),([0-9]+)", entityData)
- # Get drone name and attempt to detect drone number
- droneName = droneData.group(1) if droneData else entityData
- droneAmount = int(droneData.group(2)) if droneData else 1
- # Bail if we can't get item or it's not from drone category
- try:
- droneItem = sMkt.getItem(droneName, eager="group.category")
- except:
- pyfalog.warning("Cannot get item.")
- continue
- if droneItem.category.name == "Drone":
- # Add drone to the fitting
- d = Drone(droneItem)
- d.amount = droneAmount
- if entityState == "Active":
- d.amountActive = droneAmount
- elif entityState == "Inactive":
- d.amountActive = 0
- fitobj.drones.append(d)
- elif droneItem.category.name == "Fighter": # EFT saves fighter as drones
- ft = Fighter(droneItem)
- ft.amount = int(droneAmount) if ft.amount <= ft.fighterSquadronMaxSize else ft.fighterSquadronMaxSize
- fitobj.fighters.append(ft)
- else:
- continue
- elif entityType == "Implant":
- # Bail if we can't get item or it's not from implant category
- try:
- implantItem = sMkt.getItem(entityData, eager="group.category")
- except:
- pyfalog.warning("Cannot get item.")
- continue
- if implantItem.category.name != "Implant":
- continue
- # Add implant to the fitting
- imp = Implant(implantItem)
- if entityState == "Active":
- imp.active = True
- elif entityState == "Inactive":
- imp.active = False
- fitobj.implants.append(imp)
- elif entityType == "Booster":
- # Bail if we can't get item or it's not from implant category
- try:
- boosterItem = sMkt.getItem(entityData, eager="group.category")
- except:
- pyfalog.warning("Cannot get item.")
- continue
- # All boosters have implant category
- if boosterItem.category.name != "Implant":
- continue
- # Add booster to the fitting
- b = Booster(boosterItem)
- if entityState == "Active":
- b.active = True
- elif entityState == "Inactive":
- b.active = False
- fitobj.boosters.append(b)
- # If we don't have any prefixes, then it's a module
- elif cargo:
- cargoData = re.match("(.+),([0-9]+)", cargo.group(1))
- cargoName = cargoData.group(1) if cargoData else cargo.group(1)
- cargoAmount = int(cargoData.group(2)) if cargoData else 1
- # Bail if we can't get item
- try:
- item = sMkt.getItem(cargoName)
- except:
- pyfalog.warning("Cannot get item.")
- continue
- # Add Cargo to the fitting
- c = Cargo(item)
- c.amount = cargoAmount
- fitobj.cargo.append(c)
- # 2017/03/27 NOTE: store description from EFT
- elif description:
- fitobj.notes = description.group(1).replace("|", "\n")
- else:
- withCharge = re.match("(.+),(.+)", line)
- modName = withCharge.group(1) if withCharge else line
- chargeName = withCharge.group(2) if withCharge else None
- # If we can't get module item, skip it
- try:
- modItem = sMkt.getItem(modName)
- except:
- pyfalog.warning("Cannot get item.")
- continue
-
- # Create module
- m = Module(modItem)
-
- # Add subsystems before modules to make sure T3 cruisers have subsystems installed
- if modItem.category.name == "Subsystem":
- if m.fits(fitobj):
- fitobj.modules.append(m)
- else:
- m.owner = fitobj
- # Activate mod if it is activable
- if m.isValidState(State.ACTIVE):
- m.state = State.ACTIVE
- # Add charge to mod if applicable, on any errors just don't add anything
- if chargeName:
- try:
- chargeItem = sMkt.getItem(chargeName, eager="group.category")
- if chargeItem.category.name == "Charge":
- m.charge = chargeItem
- except:
- pyfalog.warning("Cannot get item.")
- pass
- # Append module to fit
- moduleList.append(m)
-
- # Recalc to get slot numbers correct for T3 cruisers
- svcFit.getInstance().recalc(fitobj)
-
- for module in moduleList:
- if module.fits(fitobj):
- fitobj.modules.append(module)
-
- # Append fit to list of fits
- fits.append(fitobj)
-
- if iportuser: # NOTE: Send current processing status
- PortProcessing.notify(
- iportuser, IPortUser.PROCESS_IMPORT | IPortUser.ID_UPDATE,
- "%s:\n%s" % (fitobj.ship.name, fitobj.name)
- )
-
- # Skip fit silently if we get an exception
- except Exception as e:
- pyfalog.error("Caught exception on fit.")
- pyfalog.error(e)
- pass
-
- return fits
-
- @staticmethod
- def importXml(text, iportuser=None):
- # type: (basestring, IPortUser, basestring) -> list[eos.saveddata.fit.Fit]
- sMkt = Market.getInstance()
- doc = xml.dom.minidom.parseString(text)
- # NOTE:
- # When L_MARK is included at this point,
- # Decided to be localized data
- b_localized = L_MARK in text
- fittings = doc.getElementsByTagName("fittings").item(0)
- fittings = fittings.getElementsByTagName("fitting")
- fit_list = []
- failed = 0
-
- for fitting in fittings:
- try:
- fitobj = _resolve_ship(fitting, sMkt, b_localized)
- except:
- failed += 1
- continue
-
- # -- 170327 Ignored description --
- # read description from exported xml. (EVE client, EFT)
- description = fitting.getElementsByTagName("description").item(0).getAttribute("value")
- if description is None:
- description = ""
- elif len(description):
- # convert
to "\n" and remove html tags.
- if Port.is_tag_replace():
- description = replace_ltgt(
- sequential_rep(description, r"<(br|BR)>", "\n", r"<[^<>]+>", "")
- )
- fitobj.notes = description
-
- hardwares = fitting.getElementsByTagName("hardware")
- moduleList = []
- for hardware in hardwares:
- try:
- item = _resolve_module(hardware, sMkt, b_localized)
- if not item or not item.published:
- continue
-
- if item.category.name == "Drone":
- d = Drone(item)
- d.amount = int(hardware.getAttribute("qty"))
- fitobj.drones.append(d)
- elif item.category.name == "Fighter":
- ft = Fighter(item)
- ft.amount = int(hardware.getAttribute("qty")) if ft.amount <= ft.fighterSquadronMaxSize else ft.fighterSquadronMaxSize
- fitobj.fighters.append(ft)
- elif hardware.getAttribute("slot").lower() == "cargo":
- # although the eve client only support charges in cargo, third-party programs
- # may support items or "refits" in cargo. Support these by blindly adding all
- # cargo, not just charges
- c = Cargo(item)
- c.amount = int(hardware.getAttribute("qty"))
- fitobj.cargo.append(c)
- else:
- try:
- m = Module(item)
- # When item can't be added to any slot (unknown item or just charge), ignore it
- except ValueError:
- pyfalog.warning("item can't be added to any slot (unknown item or just charge), ignore it")
- continue
- # Add subsystems before modules to make sure T3 cruisers have subsystems installed
- if item.category.name == "Subsystem":
- if m.fits(fitobj):
- m.owner = fitobj
- fitobj.modules.append(m)
- else:
- if m.isValidState(State.ACTIVE):
- m.state = State.ACTIVE
-
- moduleList.append(m)
-
- except KeyboardInterrupt:
- pyfalog.warning("Keyboard Interrupt")
- continue
-
- # Recalc to get slot numbers correct for T3 cruisers
- svcFit.getInstance().recalc(fitobj)
-
- for module in moduleList:
- if module.fits(fitobj):
- module.owner = fitobj
- fitobj.modules.append(module)
-
- fit_list.append(fitobj)
- if iportuser: # NOTE: Send current processing status
- PortProcessing.notify(
- iportuser, IPortUser.PROCESS_IMPORT | IPortUser.ID_UPDATE,
- "Processing %s\n%s" % (fitobj.ship.name, fitobj.name)
- )
-
- return fit_list
-
-
- @classmethod
- def exportEft(cls, fit, mutations=False, implants=False):
- # EFT formatted export is split in several sections, each section is
- # separated from another using 2 blank lines. Sections might have several
- # sub-sections, which are separated by 1 blank line
- sections = []
-
- header = '[{}, {}]'.format(fit.ship.item.name, fit.name)
-
- # Section 1: modules, rigs, subsystems, services
- def formatAttrVal(val):
- if int(val) == val:
- return int(val)
- return val
-
- offineSuffix = ' /OFFLINE'
- modsBySlotType = {}
- sFit = svcFit.getInstance()
- for module in fit.modules:
- slot = module.slot
- slotTypeMods = modsBySlotType.setdefault(slot, [])
- if module.item:
- mutatedMod = bool(module.mutators)
- # if module was mutated, use base item name for export
- if mutatedMod:
- modName = module.baseItem.name
- else:
- modName = module.item.name
- modOfflineSuffix = offineSuffix if module.state == State.OFFLINE else ''
- if module.charge and sFit.serviceFittingOptions['exportCharges']:
- slotTypeMods.append('{}, {}{}'.format(modName, module.charge.name, modOfflineSuffix))
- else:
- slotTypeMods.append('{}{}'.format(modName, modOfflineSuffix))
- if mutatedMod and mutations:
- mutationGrade = module.mutaplasmid.item.name.split(' ', 1)[0].lower()
- mutatedAttrs = {}
- for attrID, mutator in module.mutators.items():
- attrName = getAttributeInfo(attrID).name
- mutatedAttrs[attrName] = mutator.value
- customAttrsLine = ', '.join('{} {}'.format(a, formatAttrVal(mutatedAttrs[a])) for a in sorted(mutatedAttrs))
- slotTypeMods.append(' {}: {}'.format(mutationGrade, customAttrsLine))
- else:
- slotTypeMods.append('[Empty {} slot]'.format(Slot.getName(slot).capitalize() if slot is not None else ''))
- modSection = []
- for slotType in EFT_SLOT_ORDER:
- rackLines = []
- data = modsBySlotType.get(slotType, ())
- for line in data:
- rackLines.append(line)
- if rackLines:
- modSection.append('\n'.join(rackLines))
- if modSection:
- sections.append('\n\n'.join(modSection))
-
- # Section 2: drones, fighters
- minionSection = []
- droneLines = []
- for drone in sorted(fit.drones, key=lambda d: d.item.name):
- droneLines.append('{} x{}'.format(drone.item.name, drone.amount))
- if droneLines:
- minionSection.append('\n'.join(droneLines))
- fighterLines = []
- for fighter in sorted(fit.fighters, key=lambda f: f.item.name):
- fighterLines.append('{} x{}'.format(fighter.item.name, fighter.amountActive))
- if fighterLines:
- minionSection.append('\n'.join(fighterLines))
- if minionSection:
- sections.append('\n\n'.join(minionSection))
-
- # Section 3: implants, boosters
- if implants:
- charSection = []
- implantLines = []
- for implant in fit.implants:
- implantLines.append(implant.item.name)
- if implantLines:
- charSection.append('\n'.join(implantLines))
- boosterLines = []
- for booster in fit.boosters:
- boosterLines.append(booster.item.name)
- if boosterLines:
- charSection.append('\n'.join(boosterLines))
- if charSection:
- sections.append('\n\n'.join(charSection))
-
- # Section 4: cargo
- cargoLines = []
- for cargo in sorted(fit.cargo, key=lambda c: (c.item.group.category.name, c.item.group.name, c.item.name)):
- cargoLines.append('{} x{}'.format(cargo.item.name, cargo.amount))
- if cargoLines:
- sections.append('\n'.join(cargoLines))
-
- return '{}\n\n{}'.format(header, '\n\n\n'.join(sections))
-
- @classmethod
- def exportEftImps(cls, fit):
- return cls.exportEft(fit, implants=True)
-
- @staticmethod
- def exportDna(fit):
- dna = str(fit.shipID)
- subsystems = [] # EVE cares which order you put these in
- mods = OrderedDict()
- charges = OrderedDict()
- sFit = svcFit.getInstance()
- for mod in fit.modules:
- if not mod.isEmpty:
- if mod.slot == Slot.SUBSYSTEM:
- subsystems.append(mod)
- continue
- if mod.itemID not in mods:
- mods[mod.itemID] = 0
- mods[mod.itemID] += 1
-
- if mod.charge and sFit.serviceFittingOptions["exportCharges"]:
- if mod.chargeID not in charges:
- charges[mod.chargeID] = 0
- # `or 1` because some charges (ie scripts) are without qty
- charges[mod.chargeID] += mod.numCharges or 1
-
- for subsystem in sorted(subsystems, key=lambda mod_: mod_.getModifiedItemAttr("subSystemSlot")):
- dna += ":{0};1".format(subsystem.itemID)
-
- for mod in mods:
- dna += ":{0};{1}".format(mod, mods[mod])
-
- for drone in fit.drones:
- dna += ":{0};{1}".format(drone.itemID, drone.amount)
-
- for fighter in fit.fighters:
- dna += ":{0};{1}".format(fighter.itemID, fighter.amountActive)
-
- for fighter in fit.fighters:
- dna += ":{0};{1}".format(fighter.itemID, fighter.amountActive)
-
- for cargo in fit.cargo:
- # DNA format is a simple/dumb format. As CCP uses the slot information of the item itself
- # without designating slots in the DNA standard, we need to make sure we only include
- # charges in the DNA export. If modules were included, the EVE Client will interpret these
- # as being "Fitted" to whatever slot they are for, and it causes an corruption error in the
- # client when trying to save the fit
- if cargo.item.category.name == "Charge":
- if cargo.item.ID not in charges:
- charges[cargo.item.ID] = 0
- charges[cargo.item.ID] += cargo.amount
-
- for charge in charges:
- dna += ":{0};{1}".format(charge, charges[charge])
-
- return dna + "::"
-
- @staticmethod
- def exportXml(iportuser=None, *fits):
- doc = xml.dom.minidom.Document()
- fittings = doc.createElement("fittings")
- # fit count
- fit_count = len(fits)
- fittings.setAttribute("count", "%s" % fit_count)
- doc.appendChild(fittings)
- sFit = svcFit.getInstance()
-
- for i, fit in enumerate(fits):
- try:
- fitting = doc.createElement("fitting")
- fitting.setAttribute("name", fit.name)
- fittings.appendChild(fitting)
- description = doc.createElement("description")
- # -- 170327 Ignored description --
- try:
- notes = fit.notes # unicode
-
- if notes:
- notes = notes[:397] + '...' if len(notes) > 400 else notes
-
- description.setAttribute(
- "value", re.sub("(\r|\n|\r\n)+", "
", notes) if notes is not None else ""
- )
- except Exception as e:
- pyfalog.warning("read description is failed, msg=%s\n" % e.args)
-
- fitting.appendChild(description)
- shipType = doc.createElement("shipType")
- shipType.setAttribute("value", fit.ship.name)
- fitting.appendChild(shipType)
-
- charges = {}
- slotNum = {}
- for module in fit.modules:
- if module.isEmpty:
- continue
-
- slot = module.slot
-
- if slot == Slot.SUBSYSTEM:
- # Order of subsystem matters based on this attr. See GH issue #130
- slotId = module.getModifiedItemAttr("subSystemSlot") - 125
- else:
- if slot not in slotNum:
- slotNum[slot] = 0
-
- slotId = slotNum[slot]
- slotNum[slot] += 1
-
- hardware = doc.createElement("hardware")
- hardware.setAttribute("type", module.item.name)
- slotName = Slot.getName(slot).lower()
- slotName = slotName if slotName != "high" else "hi"
- hardware.setAttribute("slot", "%s slot %d" % (slotName, slotId))
- fitting.appendChild(hardware)
-
- if module.charge and sFit.serviceFittingOptions["exportCharges"]:
- if module.charge.name not in charges:
- charges[module.charge.name] = 0
- # `or 1` because some charges (ie scripts) are without qty
- charges[module.charge.name] += module.numCharges or 1
-
- for drone in fit.drones:
- hardware = doc.createElement("hardware")
- hardware.setAttribute("qty", "%d" % drone.amount)
- hardware.setAttribute("slot", "drone bay")
- hardware.setAttribute("type", drone.item.name)
- fitting.appendChild(hardware)
-
- for fighter in fit.fighters:
- hardware = doc.createElement("hardware")
- hardware.setAttribute("qty", "%d" % fighter.amountActive)
- hardware.setAttribute("slot", "fighter bay")
- hardware.setAttribute("type", fighter.item.name)
- fitting.appendChild(hardware)
-
- for cargo in fit.cargo:
- if cargo.item.name not in charges:
- charges[cargo.item.name] = 0
- charges[cargo.item.name] += cargo.amount
-
- for name, qty in list(charges.items()):
- hardware = doc.createElement("hardware")
- hardware.setAttribute("qty", "%d" % qty)
- hardware.setAttribute("slot", "cargo")
- hardware.setAttribute("type", name)
- fitting.appendChild(hardware)
- except Exception as e:
- # print("Failed on fitID: %d" % fit.ID)
- pyfalog.error("Failed on fitID: %d, message: %s" % e.message)
- continue
- finally:
- if iportuser:
- PortProcessing.notify(
- iportuser, IPortUser.PROCESS_EXPORT | IPortUser.ID_UPDATE,
- (i, "convert to xml (%s/%s) %s" % (i + 1, fit_count, fit.ship.name))
- )
-# wx.CallAfter(callback, i, "(%s/%s) %s" % (i, fit_count, fit.ship.name))
-
- return doc.toprettyxml()
-
- @staticmethod
- def exportMultiBuy(fit):
- export = "%s\n" % fit.ship.item.name
- stuff = {}
- sFit = svcFit.getInstance()
- for module in fit.modules:
- slot = module.slot
- if slot not in stuff:
- stuff[slot] = []
- curr = "%s\n" % module.item.name if module.item else ""
- if module.charge and sFit.serviceFittingOptions["exportCharges"]:
- curr += "%s x%s\n" % (module.charge.name, module.numCharges)
- stuff[slot].append(curr)
-
- for slotType in EFT_SLOT_ORDER:
- data = stuff.get(slotType)
- if data is not None:
- # export += "\n"
- for curr in data:
- export += curr
-
- if len(fit.drones) > 0:
- for drone in fit.drones:
- export += "%s x%s\n" % (drone.item.name, drone.amount)
-
- if len(fit.cargo) > 0:
- for cargo in fit.cargo:
- export += "%s x%s\n" % (cargo.item.name, cargo.amount)
-
- if len(fit.implants) > 0:
- for implant in fit.implants:
- export += "%s\n" % implant.item.name
-
- if len(fit.boosters) > 0:
- for booster in fit.boosters:
- export += "%s\n" % booster.item.name
-
- if len(fit.fighters) > 0:
- for fighter in fit.fighters:
- export += "%s x%s\n" % (fighter.item.name, fighter.amountActive)
-
- if export[-1] == "\n":
- export = export[:-1]
-
- return export
-
-
-class PortProcessing(object):
- """Port Processing class """
- @staticmethod
- def backupFits(path, iportuser):
- success = True
- try:
- iportuser.on_port_process_start()
- backedUpFits = Port.exportXml(iportuser, *svcFit.getInstance().getAllFits())
- backupFile = open(path, "w", encoding="utf-8")
- backupFile.write(backedUpFits)
- backupFile.close()
- except UserCancelException:
- success = False
- # Send done signal to GUI
-# wx.CallAfter(callback, -1, "Done.")
- flag = IPortUser.ID_ERROR if not success else IPortUser.ID_DONE
- iportuser.on_port_processing(IPortUser.PROCESS_EXPORT | flag,
- "User canceled or some error occurrence." if not success else "Done.")
-
- @staticmethod
- def importFitsFromFile(paths, iportuser):
- iportuser.on_port_process_start()
- success, result = Port.importFitFromFiles(paths, iportuser)
- flag = IPortUser.ID_ERROR if not success else IPortUser.ID_DONE
- iportuser.on_port_processing(IPortUser.PROCESS_IMPORT | flag, result)
-
- @staticmethod
- def notify(iportuser, flag, data):
- if not iportuser.on_port_processing(flag, data):
- raise UserCancelException
diff --git a/service/port/__init__.py b/service/port/__init__.py
new file mode 100644
index 000000000..2e884d214
--- /dev/null
+++ b/service/port/__init__.py
@@ -0,0 +1,2 @@
+from .efs import EfsPort
+from .port import Port, IPortUser
diff --git a/service/port/dna.py b/service/port/dna.py
new file mode 100644
index 000000000..bd2645ef8
--- /dev/null
+++ b/service/port/dna.py
@@ -0,0 +1,176 @@
+# =============================================================================
+# Copyright (C) 2014 Ryan Holmes
+#
+# This file is part of pyfa.
+#
+# pyfa is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# pyfa is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with pyfa. If not, see .
+# =============================================================================
+
+
+import re
+from collections import OrderedDict
+
+from logbook import Logger
+
+from eos.saveddata.cargo import Cargo
+from eos.saveddata.citadel import Citadel
+from eos.saveddata.drone import Drone
+from eos.saveddata.fighter import Fighter
+from eos.saveddata.fit import Fit
+from eos.saveddata.module import Module, State, Slot
+from eos.saveddata.ship import Ship
+from service.fit import Fit as svcFit
+from service.market import Market
+
+
+pyfalog = Logger(__name__)
+
+
+def importDna(string):
+ sMkt = Market.getInstance()
+
+ ids = list(map(int, re.findall(r'\d+', string)))
+ for id_ in ids:
+ try:
+ try:
+ try:
+ Ship(sMkt.getItem(sMkt.getItem(id_)))
+ except ValueError:
+ Citadel(sMkt.getItem(sMkt.getItem(id_)))
+ except ValueError:
+ Citadel(sMkt.getItem(id_))
+ string = string[string.index(str(id_)):]
+ break
+ except:
+ pyfalog.warning("Exception caught in importDna")
+ pass
+ string = string[:string.index("::") + 2]
+ info = string.split(":")
+
+ f = Fit()
+ try:
+ try:
+ f.ship = Ship(sMkt.getItem(int(info[0])))
+ except ValueError:
+ f.ship = Citadel(sMkt.getItem(int(info[0])))
+ f.name = "{0} - DNA Imported".format(f.ship.item.name)
+ except UnicodeEncodeError:
+ def logtransform(s_):
+ if len(s_) > 10:
+ return s_[:10] + "..."
+ return s_
+
+ pyfalog.exception("Couldn't import ship data {0}", [logtransform(s) for s in info])
+ return None
+
+ moduleList = []
+ for itemInfo in info[1:]:
+ if itemInfo:
+ itemID, amount = itemInfo.split(";")
+ item = sMkt.getItem(int(itemID), eager="group.category")
+
+ if item.category.name == "Drone":
+ d = Drone(item)
+ d.amount = int(amount)
+ f.drones.append(d)
+ elif item.category.name == "Fighter":
+ ft = Fighter(item)
+ ft.amount = int(amount) if ft.amount <= ft.fighterSquadronMaxSize else ft.fighterSquadronMaxSize
+ if ft.fits(f):
+ f.fighters.append(ft)
+ elif item.category.name == "Charge":
+ c = Cargo(item)
+ c.amount = int(amount)
+ f.cargo.append(c)
+ else:
+ for i in range(int(amount)):
+ try:
+ m = Module(item)
+ except:
+ pyfalog.warning("Exception caught in importDna")
+ continue
+ # Add subsystems before modules to make sure T3 cruisers have subsystems installed
+ if item.category.name == "Subsystem":
+ if m.fits(f):
+ f.modules.append(m)
+ else:
+ m.owner = f
+ if m.isValidState(State.ACTIVE):
+ m.state = State.ACTIVE
+ moduleList.append(m)
+
+ # Recalc to get slot numbers correct for T3 cruisers
+ svcFit.getInstance().recalc(f)
+
+ for module in moduleList:
+ if module.fits(f):
+ module.owner = f
+ if module.isValidState(State.ACTIVE):
+ module.state = State.ACTIVE
+ f.modules.append(module)
+
+ return f
+
+
+def exportDna(fit):
+ dna = str(fit.shipID)
+ subsystems = [] # EVE cares which order you put these in
+ mods = OrderedDict()
+ charges = OrderedDict()
+ sFit = svcFit.getInstance()
+ for mod in fit.modules:
+ if not mod.isEmpty:
+ if mod.slot == Slot.SUBSYSTEM:
+ subsystems.append(mod)
+ continue
+ if mod.itemID not in mods:
+ mods[mod.itemID] = 0
+ mods[mod.itemID] += 1
+
+ if mod.charge and sFit.serviceFittingOptions["exportCharges"]:
+ if mod.chargeID not in charges:
+ charges[mod.chargeID] = 0
+ # `or 1` because some charges (ie scripts) are without qty
+ charges[mod.chargeID] += mod.numCharges or 1
+
+ for subsystem in sorted(subsystems, key=lambda mod_: mod_.getModifiedItemAttr("subSystemSlot")):
+ dna += ":{0};1".format(subsystem.itemID)
+
+ for mod in mods:
+ dna += ":{0};{1}".format(mod, mods[mod])
+
+ for drone in fit.drones:
+ dna += ":{0};{1}".format(drone.itemID, drone.amount)
+
+ for fighter in fit.fighters:
+ dna += ":{0};{1}".format(fighter.itemID, fighter.amountActive)
+
+ for fighter in fit.fighters:
+ dna += ":{0};{1}".format(fighter.itemID, fighter.amountActive)
+
+ for cargo in fit.cargo:
+ # DNA format is a simple/dumb format. As CCP uses the slot information of the item itself
+ # without designating slots in the DNA standard, we need to make sure we only include
+ # charges in the DNA export. If modules were included, the EVE Client will interpret these
+ # as being "Fitted" to whatever slot they are for, and it causes an corruption error in the
+ # client when trying to save the fit
+ if cargo.item.category.name == "Charge":
+ if cargo.item.ID not in charges:
+ charges[cargo.item.ID] = 0
+ charges[cargo.item.ID] += cargo.amount
+
+ for charge in charges:
+ dna += ":{0};{1}".format(charge, charges[charge])
+
+ return dna + "::"
diff --git a/service/efsPort.py b/service/port/efs.py
similarity index 100%
rename from service/efsPort.py
rename to service/port/efs.py
diff --git a/service/port/eft.py b/service/port/eft.py
new file mode 100644
index 000000000..fc8576d01
--- /dev/null
+++ b/service/port/eft.py
@@ -0,0 +1,878 @@
+# =============================================================================
+# Copyright (C) 2014 Ryan Holmes
+#
+# This file is part of pyfa.
+#
+# pyfa is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# pyfa is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with pyfa. If not, see .
+# =============================================================================
+
+
+import re
+
+from logbook import Logger
+
+from eos.db.gamedata.queries import getAttributeInfo, getDynamicItem
+from eos.saveddata.cargo import Cargo
+from eos.saveddata.citadel import Citadel
+from eos.saveddata.booster import Booster
+from eos.saveddata.drone import Drone
+from eos.saveddata.fighter import Fighter
+from eos.saveddata.implant import Implant
+from eos.saveddata.module import Module, State, Slot
+from eos.saveddata.ship import Ship
+from eos.saveddata.fit import Fit
+from gui.utils.numberFormatter import roundToPrec
+from service.fit import Fit as svcFit
+from service.market import Market
+from service.port.shared import IPortUser, processing_notify
+from enum import Enum
+
+
+pyfalog = Logger(__name__)
+
+
+class Options(Enum):
+ IMPLANTS = 1
+ MUTATIONS = 2
+
+
+MODULE_CATS = ('Module', 'Subsystem', 'Structure Module')
+SLOT_ORDER = (Slot.LOW, Slot.MED, Slot.HIGH, Slot.RIG, Slot.SUBSYSTEM, Slot.SERVICE)
+OFFLINE_SUFFIX = '/OFFLINE'
+
+EFT_OPTIONS = {
+ Options.IMPLANTS.value: {
+ "name": "Implants",
+ "description": "Exports implants"
+ },
+ Options.MUTATIONS.value: {
+ "name": "Mutated Attributes",
+ "description": "Exports Abyssal stats"
+ }
+}
+
+
+def exportEft(fit, options):
+ # EFT formatted export is split in several sections, each section is
+ # separated from another using 2 blank lines. Sections might have several
+ # sub-sections, which are separated by 1 blank line
+ sections = []
+
+ header = '[{}, {}]'.format(fit.ship.item.name, fit.name)
+
+ # Section 1: modules, rigs, subsystems, services
+ modsBySlotType = {}
+ sFit = svcFit.getInstance()
+ for module in fit.modules:
+ modsBySlotType.setdefault(module.slot, []).append(module)
+ modSection = []
+
+ mutants = {} # Format: {reference number: module}
+ mutantReference = 1
+ for slotType in SLOT_ORDER:
+ rackLines = []
+ modules = modsBySlotType.get(slotType, ())
+ for module in modules:
+ if module.item:
+ mutated = bool(module.mutators)
+ # if module was mutated, use base item name for export
+ if mutated:
+ modName = module.baseItem.name
+ else:
+ modName = module.item.name
+ if mutated and options & Options.MUTATIONS.value:
+ mutants[mutantReference] = module
+ mutationSuffix = ' [{}]'.format(mutantReference)
+ mutantReference += 1
+ else:
+ mutationSuffix = ''
+ modOfflineSuffix = ' {}'.format(OFFLINE_SUFFIX) if module.state == State.OFFLINE else ''
+ if module.charge and sFit.serviceFittingOptions['exportCharges']:
+ rackLines.append('{}, {}{}{}'.format(
+ modName, module.charge.name, modOfflineSuffix, mutationSuffix))
+ else:
+ rackLines.append('{}{}{}'.format(modName, modOfflineSuffix, mutationSuffix))
+ else:
+ rackLines.append('[Empty {} slot]'.format(
+ Slot.getName(slotType).capitalize() if slotType is not None else ''))
+ if rackLines:
+ modSection.append('\n'.join(rackLines))
+ if modSection:
+ sections.append('\n\n'.join(modSection))
+
+ # Section 2: drones, fighters
+ minionSection = []
+ droneLines = []
+ for drone in sorted(fit.drones, key=lambda d: d.item.name):
+ droneLines.append('{} x{}'.format(drone.item.name, drone.amount))
+ if droneLines:
+ minionSection.append('\n'.join(droneLines))
+ fighterLines = []
+ for fighter in sorted(fit.fighters, key=lambda f: f.item.name):
+ fighterLines.append('{} x{}'.format(fighter.item.name, fighter.amountActive))
+ if fighterLines:
+ minionSection.append('\n'.join(fighterLines))
+ if minionSection:
+ sections.append('\n\n'.join(minionSection))
+
+ # Section 3: implants, boosters
+ if options & Options.IMPLANTS.value:
+ charSection = []
+ implantLines = []
+ for implant in fit.implants:
+ implantLines.append(implant.item.name)
+ if implantLines:
+ charSection.append('\n'.join(implantLines))
+ boosterLines = []
+ for booster in fit.boosters:
+ boosterLines.append(booster.item.name)
+ if boosterLines:
+ charSection.append('\n'.join(boosterLines))
+ if charSection:
+ sections.append('\n\n'.join(charSection))
+
+ # Section 4: cargo
+ cargoLines = []
+ for cargo in sorted(
+ fit.cargo,
+ key=lambda c: (c.item.group.category.name, c.item.group.name, c.item.name)
+ ):
+ cargoLines.append('{} x{}'.format(cargo.item.name, cargo.amount))
+ if cargoLines:
+ sections.append('\n'.join(cargoLines))
+
+ # Section 5: mutated modules' details
+ mutationLines = []
+ if mutants and options & Options.MUTATIONS.value:
+ for mutantReference in sorted(mutants):
+ mutant = mutants[mutantReference]
+ mutatedAttrs = {}
+ for attrID, mutator in mutant.mutators.items():
+ attrName = getAttributeInfo(attrID).name
+ mutatedAttrs[attrName] = mutator.value
+ mutationLines.append('[{}] {}'.format(mutantReference, mutant.baseItem.name))
+ mutationLines.append(' {}'.format(mutant.mutaplasmid.item.name))
+ # Round to 7th significant number to avoid exporting float errors
+ customAttrsLine = ', '.join(
+ '{} {}'.format(a, roundToPrec(mutatedAttrs[a], 7))
+ for a in sorted(mutatedAttrs))
+ mutationLines.append(' {}'.format(customAttrsLine))
+ if mutationLines:
+ sections.append('\n'.join(mutationLines))
+
+ return '{}\n\n{}'.format(header, '\n\n\n'.join(sections))
+
+
+def importEft(eftString):
+ lines = _importPrepareString(eftString)
+ try:
+ fit = _importCreateFit(lines)
+ except EftImportError:
+ return
+
+ aFit = AbstractFit()
+ aFit.mutations = _importGetMutationData(lines)
+
+ nameChars = '[^,/\[\]]' # Characters which are allowed to be used in name
+ stubPattern = '^\[.+?\]$'
+ modulePattern = '^(?P{0}+?)(,\s*(?P{0}+?))?(?P\s*{1})?(\s*\[(?P\d+?)\])?$'.format(nameChars, OFFLINE_SUFFIX)
+ droneCargoPattern = '^(?P{}+?) x(?P\d+?)$'.format(nameChars)
+
+ sections = []
+ for section in _importSectionIter(lines):
+ for line in section.lines:
+ # Stub line
+ if re.match(stubPattern, line):
+ section.itemSpecs.append(None)
+ continue
+ # Items with quantity specifier
+ m = re.match(droneCargoPattern, line)
+ if m:
+ try:
+ itemSpec = MultiItemSpec(m.group('typeName'))
+ # Items which cannot be fetched are considered as stubs
+ except EftImportError:
+ section.itemSpecs.append(None)
+ else:
+ itemSpec.amount = int(m.group('amount'))
+ section.itemSpecs.append(itemSpec)
+ continue
+ # All other items
+ m = re.match(modulePattern, line)
+ if m:
+ try:
+ itemSpec = RegularItemSpec(m.group('typeName'), chargeName=m.group('chargeName'))
+ # Items which cannot be fetched are considered as stubs
+ except EftImportError:
+ section.itemSpecs.append(None)
+ else:
+ if m.group('offline'):
+ itemSpec.offline = True
+ if m.group('mutation'):
+ itemSpec.mutationIdx = int(m.group('mutation'))
+ section.itemSpecs.append(itemSpec)
+ continue
+ _clearTail(section.itemSpecs)
+ sections.append(section)
+
+ hasDroneBay = any(s.isDroneBay for s in sections)
+ hasFighterBay = any(s.isFighterBay for s in sections)
+ for section in sections:
+ if section.isModuleRack:
+ aFit.addModules(section.itemSpecs)
+ elif section.isImplantRack:
+ for itemSpec in section.itemSpecs:
+ aFit.addImplant(itemSpec)
+ elif section.isDroneBay:
+ for itemSpec in section.itemSpecs:
+ aFit.addDrone(itemSpec)
+ elif section.isFighterBay:
+ for itemSpec in section.itemSpecs:
+ aFit.addFighter(itemSpec)
+ elif section.isCargoHold:
+ for itemSpec in section.itemSpecs:
+ aFit.addCargo(itemSpec)
+ # Mix between different kinds of item specs (can happen when some
+ # blank lines are removed)
+ else:
+ for itemSpec in section.itemSpecs:
+ if itemSpec is None:
+ continue
+ if itemSpec.isModule:
+ aFit.addModule(itemSpec)
+ elif itemSpec.isImplant:
+ aFit.addImplant(itemSpec)
+ elif itemSpec.isDrone and not hasDroneBay:
+ aFit.addDrone(itemSpec)
+ elif itemSpec.isFighter and not hasFighterBay:
+ aFit.addFighter(itemSpec)
+ elif itemSpec.isCargo:
+ aFit.addCargo(itemSpec)
+
+ # Subsystems first because they modify slot amount
+ for m in aFit.subsystems:
+ if m is None:
+ dummy = Module.buildEmpty(aFit.getSlotByContainer(aFit.subsystems))
+ dummy.owner = fit
+ fit.modules.appendIgnoreEmpty(dummy)
+ elif m.fits(fit):
+ m.owner = fit
+ fit.modules.appendIgnoreEmpty(m)
+ svcFit.getInstance().recalc(fit)
+
+ # Other stuff
+ for modRack in (
+ aFit.rigs,
+ aFit.services,
+ aFit.modulesHigh,
+ aFit.modulesMed,
+ aFit.modulesLow,
+ ):
+ for m in modRack:
+ if m is None:
+ dummy = Module.buildEmpty(aFit.getSlotByContainer(modRack))
+ dummy.owner = fit
+ fit.modules.appendIgnoreEmpty(dummy)
+ elif m.fits(fit):
+ m.owner = fit
+ if not m.isValidState(m.state):
+ pyfalog.warning('service.port.eft.importEft: module {} cannot have state {}', m, m.state)
+ fit.modules.appendIgnoreEmpty(m)
+ for implant in aFit.implants:
+ fit.implants.append(implant)
+ for booster in aFit.boosters:
+ fit.boosters.append(booster)
+ for drone in aFit.drones.values():
+ fit.drones.append(drone)
+ for fighter in aFit.fighters:
+ fit.fighters.append(fighter)
+ for cargo in aFit.cargo.values():
+ fit.cargo.append(cargo)
+
+ return fit
+
+
+def importEftCfg(shipname, contents, iportuser):
+ """Handle import from EFT config store file"""
+
+ # Check if we have such ship in database, bail if we don't
+ sMkt = Market.getInstance()
+ try:
+ sMkt.getItem(shipname)
+ except:
+ return [] # empty list is expected
+
+ fits = [] # List for fits
+ fitIndices = [] # List for starting line numbers for each fit
+ lines = re.split('[\n\r]+', contents) # Separate string into lines
+
+ for line in lines:
+ # Detect fit header
+ if line[:1] == "[" and line[-1:] == "]":
+ # Line index where current fit starts
+ startPos = lines.index(line)
+ fitIndices.append(startPos)
+
+ for i, startPos in enumerate(fitIndices):
+ # End position is last file line if we're trying to get it for last fit,
+ # or start position of next fit minus 1
+ endPos = len(lines) if i == len(fitIndices) - 1 else fitIndices[i + 1]
+
+ # Finally, get lines for current fitting
+ fitLines = lines[startPos:endPos]
+
+ try:
+ # Create fit object
+ fitobj = Fit()
+ # Strip square brackets and pull out a fit name
+ fitobj.name = fitLines[0][1:-1]
+ # Assign ship to fitting
+ try:
+ fitobj.ship = Ship(sMkt.getItem(shipname))
+ except ValueError:
+ fitobj.ship = Citadel(sMkt.getItem(shipname))
+
+ moduleList = []
+ for x in range(1, len(fitLines)):
+ line = fitLines[x]
+ if not line:
+ continue
+
+ # Parse line into some data we will need
+ misc = re.match("(Drones|Implant|Booster)_(Active|Inactive)=(.+)", line)
+ cargo = re.match("Cargohold=(.+)", line)
+ # 2017/03/27 NOTE: store description from EFT
+ description = re.match("Description=(.+)", line)
+
+ if misc:
+ entityType = misc.group(1)
+ entityState = misc.group(2)
+ entityData = misc.group(3)
+ if entityType == "Drones":
+ droneData = re.match("(.+),([0-9]+)", entityData)
+ # Get drone name and attempt to detect drone number
+ droneName = droneData.group(1) if droneData else entityData
+ droneAmount = int(droneData.group(2)) if droneData else 1
+ # Bail if we can't get item or it's not from drone category
+ try:
+ droneItem = sMkt.getItem(droneName, eager="group.category")
+ except:
+ pyfalog.warning("Cannot get item.")
+ continue
+ if droneItem.category.name == "Drone":
+ # Add drone to the fitting
+ d = Drone(droneItem)
+ d.amount = droneAmount
+ if entityState == "Active":
+ d.amountActive = droneAmount
+ elif entityState == "Inactive":
+ d.amountActive = 0
+ fitobj.drones.append(d)
+ elif droneItem.category.name == "Fighter": # EFT saves fighter as drones
+ ft = Fighter(droneItem)
+ ft.amount = int(droneAmount) if ft.amount <= ft.fighterSquadronMaxSize else ft.fighterSquadronMaxSize
+ fitobj.fighters.append(ft)
+ else:
+ continue
+ elif entityType == "Implant":
+ # Bail if we can't get item or it's not from implant category
+ try:
+ implantItem = sMkt.getItem(entityData, eager="group.category")
+ except:
+ pyfalog.warning("Cannot get item.")
+ continue
+ if implantItem.category.name != "Implant":
+ continue
+ # Add implant to the fitting
+ imp = Implant(implantItem)
+ if entityState == "Active":
+ imp.active = True
+ elif entityState == "Inactive":
+ imp.active = False
+ fitobj.implants.append(imp)
+ elif entityType == "Booster":
+ # Bail if we can't get item or it's not from implant category
+ try:
+ boosterItem = sMkt.getItem(entityData, eager="group.category")
+ except:
+ pyfalog.warning("Cannot get item.")
+ continue
+ # All boosters have implant category
+ if boosterItem.category.name != "Implant":
+ continue
+ # Add booster to the fitting
+ b = Booster(boosterItem)
+ if entityState == "Active":
+ b.active = True
+ elif entityState == "Inactive":
+ b.active = False
+ fitobj.boosters.append(b)
+ # If we don't have any prefixes, then it's a module
+ elif cargo:
+ cargoData = re.match("(.+),([0-9]+)", cargo.group(1))
+ cargoName = cargoData.group(1) if cargoData else cargo.group(1)
+ cargoAmount = int(cargoData.group(2)) if cargoData else 1
+ # Bail if we can't get item
+ try:
+ item = sMkt.getItem(cargoName)
+ except:
+ pyfalog.warning("Cannot get item.")
+ continue
+ # Add Cargo to the fitting
+ c = Cargo(item)
+ c.amount = cargoAmount
+ fitobj.cargo.append(c)
+ # 2017/03/27 NOTE: store description from EFT
+ elif description:
+ fitobj.notes = description.group(1).replace("|", "\n")
+ else:
+ withCharge = re.match("(.+),(.+)", line)
+ modName = withCharge.group(1) if withCharge else line
+ chargeName = withCharge.group(2) if withCharge else None
+ # If we can't get module item, skip it
+ try:
+ modItem = sMkt.getItem(modName)
+ except:
+ pyfalog.warning("Cannot get item.")
+ continue
+
+ # Create module
+ m = Module(modItem)
+
+ # Add subsystems before modules to make sure T3 cruisers have subsystems installed
+ if modItem.category.name == "Subsystem":
+ if m.fits(fitobj):
+ fitobj.modules.append(m)
+ else:
+ m.owner = fitobj
+ # Activate mod if it is activable
+ if m.isValidState(State.ACTIVE):
+ m.state = State.ACTIVE
+ # Add charge to mod if applicable, on any errors just don't add anything
+ if chargeName:
+ try:
+ chargeItem = sMkt.getItem(chargeName, eager="group.category")
+ if chargeItem.category.name == "Charge":
+ m.charge = chargeItem
+ except:
+ pyfalog.warning("Cannot get item.")
+ pass
+ # Append module to fit
+ moduleList.append(m)
+
+ # Recalc to get slot numbers correct for T3 cruisers
+ svcFit.getInstance().recalc(fitobj)
+
+ for module in moduleList:
+ if module.fits(fitobj):
+ fitobj.modules.append(module)
+
+ # Append fit to list of fits
+ fits.append(fitobj)
+
+ if iportuser: # NOTE: Send current processing status
+ processing_notify(
+ iportuser, IPortUser.PROCESS_IMPORT | IPortUser.ID_UPDATE,
+ "%s:\n%s" % (fitobj.ship.name, fitobj.name)
+ )
+
+ # Skip fit silently if we get an exception
+ except Exception as e:
+ pyfalog.error("Caught exception on fit.")
+ pyfalog.error(e)
+ pass
+
+ return fits
+
+
+def _importPrepareString(eftString):
+ lines = eftString.splitlines()
+ for i in range(len(lines)):
+ lines[i] = lines[i].strip()
+ while lines and not lines[0]:
+ del lines[0]
+ while lines and not lines[-1]:
+ del lines[-1]
+ return lines
+
+
+def _importGetMutationData(lines):
+ data = {}
+ consumedIndices = set()
+ for i in range(len(lines)):
+ line = lines[i]
+ m = re.match('^\[(?P[\d+)\]', line)
+ if m:
+ ref = int(m.group('ref'))
+ # Attempt to apply mutation is useless w/o mutaplasmid, so skip it
+ # altogether if we have no info on it
+ try:
+ mutaName = lines[i + 1]
+ except IndexError:
+ continue
+ else:
+ consumedIndices.add(i)
+ consumedIndices.add(i + 1)
+ # Get custom attribute values
+ mutaAttrs = {}
+ try:
+ mutaAttrsLine = lines[i + 2]
+ except IndexError:
+ pass
+ else:
+ consumedIndices.add(i + 2)
+ pairs = [p.strip() for p in mutaAttrsLine.split(',')]
+ for pair in pairs:
+ try:
+ attrName, value = pair.split(' ')
+ except ValueError:
+ continue
+ try:
+ value = float(value)
+ except (ValueError, TypeError):
+ continue
+ attrInfo = getAttributeInfo(attrName.strip())
+ if attrInfo is None:
+ continue
+ mutaAttrs[attrInfo.ID] = value
+ mutaItem = _fetchItem(mutaName)
+ if mutaItem is None:
+ continue
+ data[ref] = (mutaItem, mutaAttrs)
+ # If we got here, we have seen at least correct reference line and
+ # mutaplasmid name line
+ i += 2
+ # Bonus points for seeing correct attrs line. Worst case we
+ # will have to scan it once again
+ if mutaAttrs:
+ i += 1
+ # Cleanup the lines from mutaplasmid info
+ for i in sorted(consumedIndices, reverse=True):
+ del lines[i]
+ return data
+
+
+def _importSectionIter(lines):
+ section = Section()
+ for line in lines:
+ if not line:
+ if section.lines:
+ yield section
+ section = Section()
+ else:
+ section.lines.append(line)
+ if section.lines:
+ yield section
+
+
+def _importCreateFit(lines):
+ """Create fit and set top-level entity (ship or citadel)."""
+ fit = Fit()
+ header = lines.pop(0)
+ m = re.match('\[(?P[\w\s]+),\s*(?P.+)\]', header)
+ if not m:
+ pyfalog.warning('service.port.eft.importEft: corrupted fit header')
+ raise EftImportError
+ shipType = m.group('shipType').strip()
+ fitName = m.group('fitName').strip()
+ try:
+ ship = _fetchItem(shipType)
+ try:
+ fit.ship = Ship(ship)
+ except ValueError:
+ fit.ship = Citadel(ship)
+ fit.name = fitName
+ except:
+ pyfalog.warning('service.port.eft.importEft: exception caught when parsing header')
+ raise EftImportError
+ return fit
+
+
+def _fetchItem(typeName, eagerCat=False):
+ sMkt = Market.getInstance()
+ eager = 'group.category' if eagerCat else None
+ try:
+ item = sMkt.getItem(typeName, eager=eager)
+ except:
+ pyfalog.warning('service.port.eft: unable to fetch item "{}"'.format(typeName))
+ return None
+ if sMkt.getPublicityByItem(item):
+ return item
+ else:
+ return None
+
+
+def _clearTail(lst):
+ while lst and lst[-1] is None:
+ del lst[-1]
+
+
+class EftImportError(Exception):
+ """Exception class emitted and consumed by EFT importer internally."""
+ ...
+
+
+class Section:
+
+ def __init__(self):
+ self.lines = []
+ self.itemSpecs = []
+ self.__itemDataCats = None
+
+ @property
+ def itemDataCats(self):
+ if self.__itemDataCats is None:
+ cats = set()
+ for itemSpec in self.itemSpecs:
+ if itemSpec is None:
+ continue
+ cats.add(itemSpec.item.category.name)
+ self.__itemDataCats = tuple(sorted(cats))
+ return self.__itemDataCats
+
+ @property
+ def isModuleRack(self):
+ return all(i is None or i.isModule for i in self.itemSpecs)
+
+ @property
+ def isImplantRack(self):
+ return all(i is not None and i.isImplant for i in self.itemSpecs)
+
+ @property
+ def isDroneBay(self):
+ return all(i is not None and i.isDrone for i in self.itemSpecs)
+
+ @property
+ def isFighterBay(self):
+ return all(i is not None and i.isFighter for i in self.itemSpecs)
+
+ @property
+ def isCargoHold(self):
+ return (
+ all(i is not None and i.isCargo for i in self.itemSpecs) and
+ not self.isDroneBay and not self.isFighterBay)
+
+
+class BaseItemSpec:
+
+ def __init__(self, typeName):
+ item = _fetchItem(typeName, eagerCat=True)
+ if item is None:
+ raise EftImportError
+ self.typeName = typeName
+ self.item = item
+
+ @property
+ def isModule(self):
+ return False
+
+ @property
+ def isImplant(self):
+ return False
+
+ @property
+ def isDrone(self):
+ return False
+
+ @property
+ def isFighter(self):
+ return False
+
+ @property
+ def isCargo(self):
+ return False
+
+
+class RegularItemSpec(BaseItemSpec):
+
+ def __init__(self, typeName, chargeName=None):
+ super().__init__(typeName)
+ self.charge = self.__fetchCharge(chargeName)
+ self.offline = False
+ self.mutationIdx = None
+
+ def __fetchCharge(self, chargeName):
+ if chargeName:
+ charge = _fetchItem(chargeName, eagerCat=True)
+ if not charge or charge.category.name != 'Charge':
+ charge = None
+ else:
+ charge = None
+ return charge
+
+ @property
+ def isModule(self):
+ return self.item.category.name in MODULE_CATS
+
+ @property
+ def isImplant(self):
+ return (
+ self.item.category.name == 'Implant' and (
+ 'implantness' in self.item.attributes or
+ 'boosterness' in self.item.attributes))
+
+
+class MultiItemSpec(BaseItemSpec):
+
+ def __init__(self, typeName):
+ super().__init__(typeName)
+ self.amount = 0
+
+ @property
+ def isDrone(self):
+ return self.item.category.name == 'Drone'
+
+ @property
+ def isFighter(self):
+ return self.item.category.name == 'Fighter'
+
+ @property
+ def isCargo(self):
+ return True
+
+
+class AbstractFit:
+
+ def __init__(self):
+ # Modules
+ self.modulesHigh = []
+ self.modulesMed = []
+ self.modulesLow = []
+ self.rigs = []
+ self.subsystems = []
+ self.services = []
+ # Non-modules
+ self.implants = []
+ self.boosters = []
+ self.drones = {} # Format: {item: Drone}
+ self.fighters = []
+ self.cargo = {} # Format: {item: Cargo}
+ # Other stuff
+ self.mutations = {} # Format: {reference: (mutaplamid item, {attr ID: attr value})}
+
+ @property
+ def __slotContainerMap(self):
+ return {
+ Slot.HIGH: self.modulesHigh,
+ Slot.MED: self.modulesMed,
+ Slot.LOW: self.modulesLow,
+ Slot.RIG: self.rigs,
+ Slot.SUBSYSTEM: self.subsystems,
+ Slot.SERVICE: self.services}
+
+ def getContainerBySlot(self, slotType):
+ return self.__slotContainerMap.get(slotType)
+
+ def getSlotByContainer(self, container):
+ slotType = None
+ for k, v in self.__slotContainerMap.items():
+ if v is container:
+ slotType = k
+ break
+ return slotType
+
+ def addModules(self, itemSpecs):
+ modules = []
+ slotTypes = set()
+ for itemSpec in itemSpecs:
+ if itemSpec is None:
+ modules.append(None)
+ continue
+ m = self.__makeModule(itemSpec)
+ if m is None:
+ modules.append(None)
+ continue
+ modules.append(m)
+ slotTypes.add(m.slot)
+ _clearTail(modules)
+ # If all the modules have same slot type, put them to appropriate
+ # container with stubs
+ if len(slotTypes) == 1:
+ slotType = tuple(slotTypes)[0]
+ self.getContainerBySlot(slotType).extend(modules)
+ # Otherwise, put just modules
+ else:
+ for m in modules:
+ if m is None:
+ continue
+ self.getContainerBySlot(m.slot).append(m)
+
+ def addModule(self, itemSpec):
+ if itemSpec is None:
+ return
+ m = self.__makeModule(itemSpec)
+ if m is not None:
+ self.getContainerBySlot(m.slot).append(m)
+
+ def __makeModule(self, itemSpec):
+ # Mutate item if needed
+ m = None
+ if itemSpec.mutationIdx in self.mutations:
+ mutaItem, mutaAttrs = self.mutations[itemSpec.mutationIdx]
+ mutaplasmid = getDynamicItem(mutaItem.ID)
+ if mutaplasmid:
+ try:
+ m = Module(mutaplasmid.resultingItem, itemSpec.item, mutaplasmid)
+ except ValueError:
+ pass
+ else:
+ for attrID, mutator in m.mutators.items():
+ if attrID in mutaAttrs:
+ mutator.value = mutaAttrs[attrID]
+ # If we still don't have item (item is not mutated or we
+ # failed to construct mutated item), try to make regular item
+ if m is None:
+ try:
+ m = Module(itemSpec.item)
+ except ValueError:
+ return None
+
+ if itemSpec.charge is not None and m.isValidCharge(itemSpec.charge):
+ m.charge = itemSpec.charge
+ if itemSpec.offline and m.isValidState(State.OFFLINE):
+ m.state = State.OFFLINE
+ elif m.isValidState(State.ACTIVE):
+ m.state = State.ACTIVE
+ return m
+
+ def addImplant(self, itemSpec):
+ if itemSpec is None:
+ return
+ if 'implantness' in itemSpec.item.attributes:
+ self.implants.append(Implant(itemSpec.item))
+ elif 'boosterness' in itemSpec.item.attributes:
+ self.boosters.append(Booster(itemSpec.item))
+ else:
+ pyfalog.error('Failed to import implant: {}', itemSpec.typeName)
+
+ def addDrone(self, itemSpec):
+ if itemSpec is None:
+ return
+ if itemSpec.item not in self.drones:
+ self.drones[itemSpec.item] = Drone(itemSpec.item)
+ self.drones[itemSpec.item].amount += itemSpec.amount
+
+ def addFighter(self, itemSpec):
+ if itemSpec is None:
+ return
+ fighter = Fighter(itemSpec.item)
+ fighter.amount = itemSpec.amount
+ self.fighters.append(fighter)
+
+ def addCargo(self, itemSpec):
+ if itemSpec is None:
+ return
+ if itemSpec.item not in self.cargo:
+ self.cargo[itemSpec.item] = Cargo(itemSpec.item)
+ self.cargo[itemSpec.item].amount += itemSpec.amount
diff --git a/service/port/esi.py b/service/port/esi.py
new file mode 100644
index 000000000..f1e02d13a
--- /dev/null
+++ b/service/port/esi.py
@@ -0,0 +1,208 @@
+# =============================================================================
+# Copyright (C) 2014 Ryan Holmes
+#
+# This file is part of pyfa.
+#
+# pyfa is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# pyfa is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with pyfa. If not, see .
+# =============================================================================
+
+
+import collections
+import json
+
+from logbook import Logger
+
+from eos.saveddata.cargo import Cargo
+from eos.saveddata.citadel import Citadel
+from eos.saveddata.drone import Drone
+from eos.saveddata.fighter import Fighter
+from eos.saveddata.fit import Fit
+from eos.saveddata.module import Module, State, Slot
+from eos.saveddata.ship import Ship
+from service.fit import Fit as svcFit
+from service.market import Market
+
+
+class ESIExportException(Exception):
+ pass
+
+
+pyfalog = Logger(__name__)
+
+INV_FLAGS = {
+ Slot.LOW: 11,
+ Slot.MED: 19,
+ Slot.HIGH: 27,
+ Slot.RIG: 92,
+ Slot.SUBSYSTEM: 125,
+ Slot.SERVICE: 164
+}
+
+INV_FLAG_CARGOBAY = 5
+INV_FLAG_DRONEBAY = 87
+INV_FLAG_FIGHTER = 158
+
+
+def exportESI(ofit):
+ # A few notes:
+ # max fit name length is 50 characters
+ # Most keys are created simply because they are required, but bogus data is okay
+
+ nested_dict = lambda: collections.defaultdict(nested_dict)
+ fit = nested_dict()
+ sFit = svcFit.getInstance()
+
+ # max length is 50 characters
+ name = ofit.name[:47] + '...' if len(ofit.name) > 50 else ofit.name
+ fit['name'] = name
+ fit['ship_type_id'] = ofit.ship.item.ID
+
+ # 2017/03/29 NOTE: "<" or "<" is Ignored
+ # fit['description'] = "" % ofit.ID
+ fit['description'] = ofit.notes[:397] + '...' if len(ofit.notes) > 400 else ofit.notes if ofit.notes is not None else ""
+ fit['items'] = []
+
+ slotNum = {}
+ charges = {}
+ for module in ofit.modules:
+ if module.isEmpty:
+ continue
+
+ item = nested_dict()
+ slot = module.slot
+
+ if slot == Slot.SUBSYSTEM:
+ # Order of subsystem matters based on this attr. See GH issue #130
+ slot = int(module.getModifiedItemAttr("subSystemSlot"))
+ item['flag'] = slot
+ else:
+ if slot not in slotNum:
+ slotNum[slot] = INV_FLAGS[slot]
+
+ item['flag'] = slotNum[slot]
+ slotNum[slot] += 1
+
+ item['quantity'] = 1
+ item['type_id'] = module.item.ID
+ fit['items'].append(item)
+
+ if module.charge and sFit.serviceFittingOptions["exportCharges"]:
+ if module.chargeID not in charges:
+ charges[module.chargeID] = 0
+ # `or 1` because some charges (ie scripts) are without qty
+ charges[module.chargeID] += module.numCharges or 1
+
+ for cargo in ofit.cargo:
+ item = nested_dict()
+ item['flag'] = INV_FLAG_CARGOBAY
+ item['quantity'] = cargo.amount
+ item['type_id'] = cargo.item.ID
+ fit['items'].append(item)
+
+ for chargeID, amount in list(charges.items()):
+ item = nested_dict()
+ item['flag'] = INV_FLAG_CARGOBAY
+ item['quantity'] = amount
+ item['type_id'] = chargeID
+ fit['items'].append(item)
+
+ for drone in ofit.drones:
+ item = nested_dict()
+ item['flag'] = INV_FLAG_DRONEBAY
+ item['quantity'] = drone.amount
+ item['type_id'] = drone.item.ID
+ fit['items'].append(item)
+
+ for fighter in ofit.fighters:
+ item = nested_dict()
+ item['flag'] = INV_FLAG_FIGHTER
+ item['quantity'] = fighter.amountActive
+ item['type_id'] = fighter.item.ID
+ fit['items'].append(item)
+
+ if len(fit['items']) == 0:
+ raise ESIExportException("Cannot export fitting: module list cannot be empty.")
+
+ return json.dumps(fit)
+
+
+def importESI(str_):
+
+ sMkt = Market.getInstance()
+ fitobj = Fit()
+ refobj = json.loads(str_)
+ items = refobj['items']
+ # "<" and ">" is replace to "<", ">" by EVE client
+ fitobj.name = refobj['name']
+ # 2017/03/29: read description
+ fitobj.notes = refobj['description']
+
+ try:
+ ship = refobj['ship_type_id']
+ try:
+ fitobj.ship = Ship(sMkt.getItem(ship))
+ except ValueError:
+ fitobj.ship = Citadel(sMkt.getItem(ship))
+ except:
+ pyfalog.warning("Caught exception in importESI")
+ return None
+
+ items.sort(key=lambda k: k['flag'])
+
+ moduleList = []
+ for module in items:
+ try:
+ item = sMkt.getItem(module['type_id'], eager="group.category")
+ if not item.published:
+ continue
+ if module['flag'] == INV_FLAG_DRONEBAY:
+ d = Drone(item)
+ d.amount = module['quantity']
+ fitobj.drones.append(d)
+ elif module['flag'] == INV_FLAG_CARGOBAY:
+ c = Cargo(item)
+ c.amount = module['quantity']
+ fitobj.cargo.append(c)
+ elif module['flag'] == INV_FLAG_FIGHTER:
+ fighter = Fighter(item)
+ fitobj.fighters.append(fighter)
+ else:
+ try:
+ m = Module(item)
+ # When item can't be added to any slot (unknown item or just charge), ignore it
+ except ValueError:
+ pyfalog.debug("Item can't be added to any slot (unknown item or just charge)")
+ continue
+ # Add subsystems before modules to make sure T3 cruisers have subsystems installed
+ if item.category.name == "Subsystem":
+ if m.fits(fitobj):
+ fitobj.modules.append(m)
+ else:
+ if m.isValidState(State.ACTIVE):
+ m.state = State.ACTIVE
+
+ moduleList.append(m)
+
+ except:
+ pyfalog.warning("Could not process module.")
+ continue
+
+ # Recalc to get slot numbers correct for T3 cruisers
+ svcFit.getInstance().recalc(fitobj)
+
+ for module in moduleList:
+ if module.fits(fitobj):
+ fitobj.modules.append(module)
+
+ return fitobj
diff --git a/service/port/multibuy.py b/service/port/multibuy.py
new file mode 100644
index 000000000..2bf2d7a8a
--- /dev/null
+++ b/service/port/multibuy.py
@@ -0,0 +1,68 @@
+# =============================================================================
+# Copyright (C) 2014 Ryan Holmes
+#
+# This file is part of pyfa.
+#
+# pyfa is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# pyfa is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with pyfa. If not, see .
+# =============================================================================
+
+
+from service.fit import Fit as svcFit
+from service.port.eft import SLOT_ORDER as EFT_SLOT_ORDER
+
+
+def exportMultiBuy(fit):
+ export = "%s\n" % fit.ship.item.name
+ stuff = {}
+ sFit = svcFit.getInstance()
+ for module in fit.modules:
+ slot = module.slot
+ if slot not in stuff:
+ stuff[slot] = []
+ curr = "%s\n" % module.item.name if module.item else ""
+ if module.charge and sFit.serviceFittingOptions["exportCharges"]:
+ curr += "%s x%s\n" % (module.charge.name, module.numCharges)
+ stuff[slot].append(curr)
+
+ for slotType in EFT_SLOT_ORDER:
+ data = stuff.get(slotType)
+ if data is not None:
+ # export += "\n"
+ for curr in data:
+ export += curr
+
+ if len(fit.drones) > 0:
+ for drone in fit.drones:
+ export += "%s x%s\n" % (drone.item.name, drone.amount)
+
+ if len(fit.cargo) > 0:
+ for cargo in fit.cargo:
+ export += "%s x%s\n" % (cargo.item.name, cargo.amount)
+
+ if len(fit.implants) > 0:
+ for implant in fit.implants:
+ export += "%s\n" % implant.item.name
+
+ if len(fit.boosters) > 0:
+ for booster in fit.boosters:
+ export += "%s\n" % booster.item.name
+
+ if len(fit.fighters) > 0:
+ for fighter in fit.fighters:
+ export += "%s x%s\n" % (fighter.item.name, fighter.amountActive)
+
+ if export[-1] == "\n":
+ export = export[:-1]
+
+ return export
diff --git a/service/port/port.py b/service/port/port.py
new file mode 100644
index 000000000..560af14ea
--- /dev/null
+++ b/service/port/port.py
@@ -0,0 +1,277 @@
+# =============================================================================
+# Copyright (C) 2014 Ryan Holmes
+#
+# This file is part of pyfa.
+#
+# pyfa is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# pyfa is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with pyfa. If not, see .
+# =============================================================================
+
+
+import re
+import os
+import threading
+import xml.dom
+import xml.parsers.expat
+from codecs import open
+
+from bs4 import UnicodeDammit
+from logbook import Logger
+
+from eos import db
+from eos.saveddata.fit import ImplantLocation
+from service.fit import Fit as svcFit
+from service.port.dna import exportDna, importDna
+from service.port.eft import exportEft, importEft, importEftCfg
+from service.port.esi import exportESI, importESI
+from service.port.multibuy import exportMultiBuy
+from service.port.shared import IPortUser, UserCancelException, processing_notify
+from service.port.xml import importXml, exportXml
+
+
+pyfalog = Logger(__name__)
+
+# 2017/04/05 NOTE: simple validation, for xml file
+RE_XML_START = r'<\?xml\s+version="1.0"\s*\?>'
+
+
+class Port(object):
+ """Service which houses all import/export format functions"""
+ instance = None
+ __tag_replace_flag = True
+
+ @classmethod
+ def getInstance(cls):
+ if cls.instance is None:
+ cls.instance = Port()
+
+ return cls.instance
+
+ @classmethod
+ def set_tag_replace(cls, b):
+ cls.__tag_replace_flag = b
+
+ @classmethod
+ def is_tag_replace(cls):
+ # might there is a person who wants to hold tags.
+ # (item link in EVE client etc. When importing again to EVE)
+ return cls.__tag_replace_flag
+
+ @staticmethod
+ def backupFits(path, iportuser):
+ pyfalog.debug("Starting backup fits thread.")
+
+ def backupFitsWorkerFunc(path, iportuser):
+ success = True
+ try:
+ iportuser.on_port_process_start()
+ backedUpFits = Port.exportXml(iportuser,
+ *svcFit.getInstance().getAllFits())
+ backupFile = open(path, "w", encoding="utf-8")
+ backupFile.write(backedUpFits)
+ backupFile.close()
+ except UserCancelException:
+ success = False
+ # Send done signal to GUI
+ # wx.CallAfter(callback, -1, "Done.")
+ flag = IPortUser.ID_ERROR if not success else IPortUser.ID_DONE
+ iportuser.on_port_processing(IPortUser.PROCESS_EXPORT | flag,
+ "User canceled or some error occurrence." if not success else "Done.")
+
+ threading.Thread(
+ target=backupFitsWorkerFunc,
+ args=(path, iportuser)
+ ).start()
+
+ @staticmethod
+ def importFitsThreaded(paths, iportuser):
+ # type: (tuple, IPortUser) -> None
+ """
+ :param paths: fits data file path list.
+ :param iportuser: IPortUser implemented class.
+ :rtype: None
+ """
+ pyfalog.debug("Starting import fits thread.")
+
+ def importFitsFromFileWorkerFunc(paths, iportuser):
+ iportuser.on_port_process_start()
+ success, result = Port.importFitFromFiles(paths, iportuser)
+ flag = IPortUser.ID_ERROR if not success else IPortUser.ID_DONE
+ iportuser.on_port_processing(IPortUser.PROCESS_IMPORT | flag, result)
+
+ threading.Thread(
+ target=importFitsFromFileWorkerFunc,
+ args=(paths, iportuser)
+ ).start()
+
+ @staticmethod
+ def importFitFromFiles(paths, iportuser=None):
+ """
+ Imports fits from file(s). First processes all provided paths and stores
+ assembled fits into a list. This allows us to call back to the GUI as
+ fits are processed as well as when fits are being saved.
+ returns
+ """
+
+ sFit = svcFit.getInstance()
+
+ fit_list = []
+ try:
+ for path in paths:
+ if iportuser: # Pulse
+ msg = "Processing file:\n%s" % path
+ pyfalog.debug(msg)
+ processing_notify(iportuser, IPortUser.PROCESS_IMPORT | IPortUser.ID_UPDATE, msg)
+ # wx.CallAfter(callback, 1, msg)
+
+ with open(path, "rb") as file_:
+ srcString = file_.read()
+ dammit = UnicodeDammit(srcString)
+ srcString = dammit.unicode_markup
+
+ if len(srcString) == 0: # ignore blank files
+ pyfalog.debug("File is blank.")
+ continue
+
+ try:
+ _, fitsImport = Port.importAuto(srcString, path, iportuser=iportuser)
+ fit_list += fitsImport
+ except xml.parsers.expat.ExpatError:
+ pyfalog.warning("Malformed XML in:\n{0}", path)
+ return False, "Malformed XML in %s" % path
+
+ # IDs = [] # NOTE: what use for IDs?
+ numFits = len(fit_list)
+ for idx, fit in enumerate(fit_list):
+ # Set some more fit attributes and save
+ fit.character = sFit.character
+ fit.damagePattern = sFit.pattern
+ fit.targetResists = sFit.targetResists
+ if len(fit.implants) > 0:
+ fit.implantLocation = ImplantLocation.FIT
+ else:
+ useCharImplants = sFit.serviceFittingOptions["useCharacterImplantsByDefault"]
+ fit.implantLocation = ImplantLocation.CHARACTER if useCharImplants else ImplantLocation.FIT
+ db.save(fit)
+ # IDs.append(fit.ID)
+ if iportuser: # Pulse
+ pyfalog.debug("Processing complete, saving fits to database: {0}/{1}", idx + 1, numFits)
+ processing_notify(
+ iportuser, IPortUser.PROCESS_IMPORT | IPortUser.ID_UPDATE,
+ "Processing complete, saving fits to database\n(%d/%d) %s" % (idx + 1, numFits, fit.ship.name)
+ )
+
+ except UserCancelException:
+ return False, "Processing has been canceled.\n"
+ except Exception as e:
+ pyfalog.critical("Unknown exception processing: {0}", path)
+ pyfalog.critical(e)
+ # TypeError: not all arguments converted during string formatting
+# return False, "Unknown Error while processing {0}" % path
+ return False, "Unknown error while processing %s\n\n Error: %s" % (path, e.message)
+
+ return True, fit_list
+
+ @staticmethod
+ def importFitFromBuffer(bufferStr, activeFit=None):
+ # type: (str, object) -> object
+ # TODO: catch the exception?
+ # activeFit is reserved?, bufferStr is unicode? (assume only clipboard string?
+ sFit = svcFit.getInstance()
+ _, fits = Port.importAuto(bufferStr, activeFit=activeFit)
+ for fit in fits:
+ fit.character = sFit.character
+ fit.damagePattern = sFit.pattern
+ fit.targetResists = sFit.targetResists
+ if len(fit.implants) > 0:
+ fit.implantLocation = ImplantLocation.FIT
+ else:
+ useCharImplants = sFit.serviceFittingOptions["useCharacterImplantsByDefault"]
+ fit.implantLocation = ImplantLocation.CHARACTER if useCharImplants else ImplantLocation.FIT
+ db.save(fit)
+ return fits
+
+ @classmethod
+ def importAuto(cls, string, path=None, activeFit=None, iportuser=None):
+ # type: (Port, str, str, object, IPortUser) -> object
+ # Get first line and strip space symbols of it to avoid possible detection errors
+ firstLine = re.split("[\n\r]+", string.strip(), maxsplit=1)[0]
+ firstLine = firstLine.strip()
+
+ # If XML-style start of tag encountered, detect as XML
+ if re.search(RE_XML_START, firstLine):
+ return "XML", cls.importXml(string, iportuser)
+
+ # If JSON-style start, parse as CREST/JSON
+ if firstLine[0] == '{':
+ return "JSON", (cls.importESI(string),)
+
+ # If we've got source file name which is used to describe ship name
+ # and first line contains something like [setup name], detect as eft config file
+ if re.match("\[.*\]", firstLine) and path is not None:
+ filename = os.path.split(path)[1]
+ shipName = filename.rsplit('.')[0]
+ return "EFT Config", cls.importEftCfg(shipName, string, iportuser)
+
+ # If no file is specified and there's comma between brackets,
+ # consider that we have [ship, setup name] and detect like eft export format
+ if re.match("\[.*,.*\]", firstLine):
+ return "EFT", (cls.importEft(string),)
+
+ # Use DNA format for all other cases
+ return "DNA", (cls.importDna(string),)
+
+ # EFT-related methods
+ @staticmethod
+ def importEft(eftString):
+ return importEft(eftString)
+
+ @staticmethod
+ def importEftCfg(shipname, contents, iportuser=None):
+ return importEftCfg(shipname, contents, iportuser)
+
+ @classmethod
+ def exportEft(cls, fit, options):
+ return exportEft(fit, options)
+
+ # DNA-related methods
+ @staticmethod
+ def importDna(string):
+ return importDna(string)
+
+ @staticmethod
+ def exportDna(fit):
+ return exportDna(fit)
+
+ # ESI-related methods
+ @staticmethod
+ def importESI(string):
+ return importESI(string)
+
+ @staticmethod
+ def exportESI(fit):
+ return exportESI(fit)
+
+ # XML-related methods
+ @staticmethod
+ def importXml(text, iportuser=None):
+ return importXml(text, iportuser)
+
+ @staticmethod
+ def exportXml(iportuser=None, *fits):
+ return exportXml(iportuser, *fits)
+
+ # Multibuy-related methods
+ @staticmethod
+ def exportMultiBuy(fit):
+ return exportMultiBuy(fit)
diff --git a/service/port/shared.py b/service/port/shared.py
new file mode 100644
index 000000000..a21a81d63
--- /dev/null
+++ b/service/port/shared.py
@@ -0,0 +1,70 @@
+# =============================================================================
+# Copyright (C) 2014 Ryan Holmes
+#
+# This file is part of pyfa.
+#
+# pyfa is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# pyfa is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with pyfa. If not, see .
+# =============================================================================
+
+
+from abc import ABCMeta, abstractmethod
+
+
+class UserCancelException(Exception):
+ """when user cancel on port processing."""
+ pass
+
+
+class IPortUser(metaclass=ABCMeta):
+
+ ID_PULSE = 1
+ # Pulse the progress bar
+ ID_UPDATE = ID_PULSE << 1
+ # Replace message with data: update messate
+ ID_DONE = ID_PULSE << 2
+ # open fits: import process done
+ ID_ERROR = ID_PULSE << 3
+ # display error: raise some error
+
+ PROCESS_IMPORT = ID_PULSE << 4
+ # means import process.
+ PROCESS_EXPORT = ID_PULSE << 5
+ # means import process.
+
+ @abstractmethod
+ def on_port_processing(self, action, data=None):
+ """
+ While importing fits from file, the logic calls back to this function to
+ update progress bar to show activity. XML files can contain multiple
+ ships with multiple fits, whereas EFT cfg files contain many fits of
+ a single ship. When iterating through the files, we update the message
+ when we start a new file, and then Pulse the progress bar with every fit
+ that is processed.
+
+ action : a flag that lets us know how to deal with :data
+ None: Pulse the progress bar
+ 1: Replace message with data
+ other: Close dialog and handle based on :action (-1 open fits, -2 display error)
+ """
+
+ """return: True is continue process, False is cancel."""
+ pass
+
+ def on_port_process_start(self):
+ pass
+
+
+def processing_notify(iportuser, flag, data):
+ if not iportuser.on_port_processing(flag, data):
+ raise UserCancelException
diff --git a/service/port/xml.py b/service/port/xml.py
new file mode 100644
index 000000000..54d5a98eb
--- /dev/null
+++ b/service/port/xml.py
@@ -0,0 +1,326 @@
+# =============================================================================
+# Copyright (C) 2014 Ryan Holmes
+#
+# This file is part of pyfa.
+#
+# pyfa is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# pyfa is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with pyfa. If not, see .
+# =============================================================================
+
+import re
+import xml.dom
+import xml.parsers.expat
+
+from logbook import Logger
+
+from eos.saveddata.cargo import Cargo
+from eos.saveddata.citadel import Citadel
+from eos.saveddata.drone import Drone
+from eos.saveddata.fighter import Fighter
+from eos.saveddata.fit import Fit
+from eos.saveddata.module import Module, State, Slot
+from eos.saveddata.ship import Ship
+from service.fit import Fit as svcFit
+from service.market import Market
+from utils.strfunctions import sequential_rep, replace_ltgt
+
+from service.port.shared import IPortUser, processing_notify
+
+
+pyfalog = Logger(__name__)
+
+# -- 170327 Ignored description --
+RE_LTGT = "&(lt|gt);"
+L_MARK = "<localized hint=""
+# <localized hint="([^"]+)">([^\*]+)\*<\/localized>
+LOCALIZED_PATTERN = re.compile(r'([^\*]+)\*')
+
+
+def _extract_match(t):
+ m = LOCALIZED_PATTERN.match(t)
+ # hint attribute, text content
+ return m.group(1), m.group(2)
+
+
+def _resolve_ship(fitting, sMkt, b_localized):
+ # type: (xml.dom.minidom.Element, service.market.Market, bool) -> eos.saveddata.fit.Fit
+ """ NOTE: Since it is meaningless unless a correct ship object can be constructed,
+ process flow changed
+ """
+ # ------ Confirm ship
+ # Maelstrom
+ shipType = fitting.getElementsByTagName("shipType").item(0).getAttribute("value")
+ anything = None
+ if b_localized:
+ # expect an official name, emergency cache
+ shipType, anything = _extract_match(shipType)
+
+ limit = 2
+ ship = None
+ while True:
+ must_retry = False
+ try:
+ try:
+ ship = Ship(sMkt.getItem(shipType))
+ except ValueError:
+ ship = Citadel(sMkt.getItem(shipType))
+ except Exception as e:
+ pyfalog.warning("Caught exception on _resolve_ship")
+ pyfalog.error(e)
+ limit -= 1
+ if limit is 0:
+ break
+ shipType = anything
+ must_retry = True
+ if not must_retry:
+ break
+
+ if ship is None:
+ raise Exception("cannot resolve ship type.")
+
+ fitobj = Fit(ship=ship)
+ # ------ Confirm fit name
+ anything = fitting.getAttribute("name")
+ # 2017/03/29 NOTE:
+ # if fit name contained "<" or ">" then reprace to named html entity by EVE client
+ # if re.search(RE_LTGT, anything):
+ if "<" in anything or ">" in anything:
+ anything = replace_ltgt(anything)
+ fitobj.name = anything
+
+ return fitobj
+
+
+def _resolve_module(hardware, sMkt, b_localized):
+ # type: (xml.dom.minidom.Element, service.market.Market, bool) -> eos.saveddata.module.Module
+ moduleName = hardware.getAttribute("type")
+ emergency = None
+ if b_localized:
+ # expect an official name, emergency cache
+ moduleName, emergency = _extract_match(moduleName)
+
+ item = None
+ limit = 2
+ while True:
+ must_retry = False
+ try:
+ item = sMkt.getItem(moduleName, eager="group.category")
+ except Exception as e:
+ pyfalog.warning("Caught exception on _resolve_module")
+ pyfalog.error(e)
+ limit -= 1
+ if limit is 0:
+ break
+ moduleName = emergency
+ must_retry = True
+ if not must_retry:
+ break
+ return item
+
+
+def importXml(text, iportuser):
+ from .port import Port
+ # type: (str, IPortUser) -> list[eos.saveddata.fit.Fit]
+ sMkt = Market.getInstance()
+ doc = xml.dom.minidom.parseString(text)
+ # NOTE:
+ # When L_MARK is included at this point,
+ # Decided to be localized data
+ b_localized = L_MARK in text
+ fittings = doc.getElementsByTagName("fittings").item(0)
+ fittings = fittings.getElementsByTagName("fitting")
+ fit_list = []
+ failed = 0
+
+ for fitting in fittings:
+ try:
+ fitobj = _resolve_ship(fitting, sMkt, b_localized)
+ except:
+ failed += 1
+ continue
+
+ # -- 170327 Ignored description --
+ # read description from exported xml. (EVE client, EFT)
+ description = fitting.getElementsByTagName("description").item(0).getAttribute("value")
+ if description is None:
+ description = ""
+ elif len(description):
+ # convert ]
to "\n" and remove html tags.
+ if Port.is_tag_replace():
+ description = replace_ltgt(
+ sequential_rep(description, r"<(br|BR)>", "\n", r"<[^<>]+>", "")
+ )
+ fitobj.notes = description
+
+ hardwares = fitting.getElementsByTagName("hardware")
+ moduleList = []
+ for hardware in hardwares:
+ try:
+ item = _resolve_module(hardware, sMkt, b_localized)
+ if not item or not item.published:
+ continue
+
+ if item.category.name == "Drone":
+ d = Drone(item)
+ d.amount = int(hardware.getAttribute("qty"))
+ fitobj.drones.append(d)
+ elif item.category.name == "Fighter":
+ ft = Fighter(item)
+ ft.amount = int(hardware.getAttribute("qty")) if ft.amount <= ft.fighterSquadronMaxSize else ft.fighterSquadronMaxSize
+ fitobj.fighters.append(ft)
+ elif hardware.getAttribute("slot").lower() == "cargo":
+ # although the eve client only support charges in cargo, third-party programs
+ # may support items or "refits" in cargo. Support these by blindly adding all
+ # cargo, not just charges
+ c = Cargo(item)
+ c.amount = int(hardware.getAttribute("qty"))
+ fitobj.cargo.append(c)
+ else:
+ try:
+ m = Module(item)
+ # When item can't be added to any slot (unknown item or just charge), ignore it
+ except ValueError:
+ pyfalog.warning("item can't be added to any slot (unknown item or just charge), ignore it")
+ continue
+ # Add subsystems before modules to make sure T3 cruisers have subsystems installed
+ if item.category.name == "Subsystem":
+ if m.fits(fitobj):
+ m.owner = fitobj
+ fitobj.modules.append(m)
+ else:
+ if m.isValidState(State.ACTIVE):
+ m.state = State.ACTIVE
+
+ moduleList.append(m)
+
+ except KeyboardInterrupt:
+ pyfalog.warning("Keyboard Interrupt")
+ continue
+
+ # Recalc to get slot numbers correct for T3 cruisers
+ svcFit.getInstance().recalc(fitobj)
+
+ for module in moduleList:
+ if module.fits(fitobj):
+ module.owner = fitobj
+ fitobj.modules.append(module)
+
+ fit_list.append(fitobj)
+ if iportuser: # NOTE: Send current processing status
+ processing_notify(
+ iportuser, IPortUser.PROCESS_IMPORT | IPortUser.ID_UPDATE,
+ "Processing %s\n%s" % (fitobj.ship.name, fitobj.name)
+ )
+
+ return fit_list
+
+
+def exportXml(iportuser, *fits):
+ doc = xml.dom.minidom.Document()
+ fittings = doc.createElement("fittings")
+ # fit count
+ fit_count = len(fits)
+ fittings.setAttribute("count", "%s" % fit_count)
+ doc.appendChild(fittings)
+ sFit = svcFit.getInstance()
+
+ for i, fit in enumerate(fits):
+ try:
+ fitting = doc.createElement("fitting")
+ fitting.setAttribute("name", fit.name)
+ fittings.appendChild(fitting)
+ description = doc.createElement("description")
+ # -- 170327 Ignored description --
+ try:
+ notes = fit.notes # unicode
+
+ if notes:
+ notes = notes[:397] + '...' if len(notes) > 400 else notes
+
+ description.setAttribute(
+ "value", re.sub("(\r|\n|\r\n)+", "
", notes) if notes is not None else ""
+ )
+ except Exception as e:
+ pyfalog.warning("read description is failed, msg=%s\n" % e.args)
+
+ fitting.appendChild(description)
+ shipType = doc.createElement("shipType")
+ shipType.setAttribute("value", fit.ship.name)
+ fitting.appendChild(shipType)
+
+ charges = {}
+ slotNum = {}
+ for module in fit.modules:
+ if module.isEmpty:
+ continue
+
+ slot = module.slot
+
+ if slot == Slot.SUBSYSTEM:
+ # Order of subsystem matters based on this attr. See GH issue #130
+ slotId = module.getModifiedItemAttr("subSystemSlot") - 125
+ else:
+ if slot not in slotNum:
+ slotNum[slot] = 0
+
+ slotId = slotNum[slot]
+ slotNum[slot] += 1
+
+ hardware = doc.createElement("hardware")
+ hardware.setAttribute("type", module.item.name)
+ slotName = Slot.getName(slot).lower()
+ slotName = slotName if slotName != "high" else "hi"
+ hardware.setAttribute("slot", "%s slot %d" % (slotName, slotId))
+ fitting.appendChild(hardware)
+
+ if module.charge and sFit.serviceFittingOptions["exportCharges"]:
+ if module.charge.name not in charges:
+ charges[module.charge.name] = 0
+ # `or 1` because some charges (ie scripts) are without qty
+ charges[module.charge.name] += module.numCharges or 1
+
+ for drone in fit.drones:
+ hardware = doc.createElement("hardware")
+ hardware.setAttribute("qty", "%d" % drone.amount)
+ hardware.setAttribute("slot", "drone bay")
+ hardware.setAttribute("type", drone.item.name)
+ fitting.appendChild(hardware)
+
+ for fighter in fit.fighters:
+ hardware = doc.createElement("hardware")
+ hardware.setAttribute("qty", "%d" % fighter.amountActive)
+ hardware.setAttribute("slot", "fighter bay")
+ hardware.setAttribute("type", fighter.item.name)
+ fitting.appendChild(hardware)
+
+ for cargo in fit.cargo:
+ if cargo.item.name not in charges:
+ charges[cargo.item.name] = 0
+ charges[cargo.item.name] += cargo.amount
+
+ for name, qty in list(charges.items()):
+ hardware = doc.createElement("hardware")
+ hardware.setAttribute("qty", "%d" % qty)
+ hardware.setAttribute("slot", "cargo")
+ hardware.setAttribute("type", name)
+ fitting.appendChild(hardware)
+ except Exception as e:
+ pyfalog.error("Failed on fitID: %d, message: %s" % e.message)
+ continue
+ finally:
+ if iportuser:
+ processing_notify(
+ iportuser, IPortUser.PROCESS_EXPORT | IPortUser.ID_UPDATE,
+ (i, "convert to xml (%s/%s) %s" % (i + 1, fit_count, fit.ship.name))
+ )
+ return doc.toprettyxml()
diff --git a/service/prereqsCheck.py b/service/prereqsCheck.py
index f0e064796..159468591 100644
--- a/service/prereqsCheck.py
+++ b/service/prereqsCheck.py
@@ -1,7 +1,6 @@
-import sys
-import inspect
-import re
import platform
+import re
+import sys
version_block = ''
@@ -10,7 +9,7 @@ class PreCheckException(Exception):
pass
-class PreCheckMessage():
+class PreCheckMessage:
def __init__(self, msg):
# wx may not be installed, in which case print to console. For all other prechecks, should pop up a MessageDialog
try:
diff --git a/service/price.py b/service/price.py
index 2b8cd474b..ebefe15a1 100644
--- a/service/price.py
+++ b/service/price.py
@@ -18,18 +18,17 @@
# =============================================================================
-import time
-import threading
import queue
-from xml.dom import minidom
+import threading
+import time
-from logbook import Logger
import wx
+from logbook import Logger
from eos import db
-from service.network import Network, TimeoutError
from service.fit import Fit
from service.market import Market
+from service.network import TimeoutError
pyfalog = Logger(__name__)
@@ -235,4 +234,5 @@ class PriceWorkerThread(threading.Thread):
self.wait[x.typeID].append(callback)
-from service.marketSources import evemarketer, evemarketdata # noqa: E402
+# Import market sources only to initialize price source modules, they register on their own
+from .marketSources import *
diff --git a/service/update.py b/service/update.py
index 246b520fd..a2f4cf730 100644
--- a/service/update.py
+++ b/service/update.py
@@ -17,21 +17,19 @@
# along with pyfa. If not, see .
# =============================================================================
-import threading
-import json
import calendar
+import threading
-# noinspection PyPackageRequirements
-import wx
# noinspection PyPackageRequirements
import dateutil.parser
+# noinspection PyPackageRequirements
+import wx
+from logbook import Logger
+from packaging.version import Version
import config
from service.network import Network
from service.settings import UpdateSettings
-from logbook import Logger
-from packaging.version import Version
-
pyfalog = Logger(__name__)
diff --git a/tests/test_locale/file_dialog.py b/tests/test_locale/file_dialog.py
index 357037265..f72dccf8c 100644
--- a/tests/test_locale/file_dialog.py
+++ b/tests/test_locale/file_dialog.py
@@ -1,9 +1,9 @@
# noinspection PyPackageRequirements
-import wx
-import sys
import os
import sys
+import wx
+
script_dir = os.path.dirname(os.path.abspath(__file__))
# Add root to python paths, this allows us to import submodules
sys.path.append(os.path.realpath(os.path.join(script_dir, '..', '..')))
diff --git a/tests/test_modules/test_eos/test_gamedata.py b/tests/test_modules/test_eos/test_gamedata.py
index 4a8674339..73aac3945 100644
--- a/tests/test_modules/test_eos/test_gamedata.py
+++ b/tests/test_modules/test_eos/test_gamedata.py
@@ -6,8 +6,6 @@ script_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.realpath(os.path.join(script_dir, '..', '..', '..')))
# noinspection PyPackageRequirements
-from _development.helpers import DBInMemory as DB, Gamedata, Saveddata
-from _development.helpers_fits import RifterFit, KeepstarFit
def test_race(DB, RifterFit, KeepstarFit):
"""
diff --git a/tests/test_modules/test_eos/test_modifiedAttributeDict.py b/tests/test_modules/test_eos/test_modifiedAttributeDict.py
index 649cfaee8..71bc5d892 100644
--- a/tests/test_modules/test_eos/test_modifiedAttributeDict.py
+++ b/tests/test_modules/test_eos/test_modifiedAttributeDict.py
@@ -9,8 +9,6 @@ print(script_dir)
sys.path.append(script_dir)
# noinspection PyPackageRequirements
-from _development.helpers import DBInMemory as DB, Gamedata, Saveddata
-from _development.helpers_fits import RifterFit
def test_multiply_stacking_penalties(DB, Saveddata, RifterFit):
"""
diff --git a/tests/test_modules/test_eos/test_saveddata/test_booster.py b/tests/test_modules/test_eos/test_saveddata/test_booster.py
index 05576c3fc..11df6280d 100644
--- a/tests/test_modules/test_eos/test_saveddata/test_booster.py
+++ b/tests/test_modules/test_eos/test_saveddata/test_booster.py
@@ -7,9 +7,6 @@ script_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.realpath(os.path.join(script_dir, '..', '..', '..', '..')))
# noinspection PyPackageRequirements
-from _development.helpers import DBInMemory as DB, Gamedata, Saveddata
-from _development.helpers_fits import RifterFit, KeepstarFit
-from _development.helpers_items import StrongBluePillBooster
def test_itemModifiedAttributes(DB, StrongBluePillBooster):
diff --git a/tests/test_modules/test_eos/test_saveddata/test_fit_2.py b/tests/test_modules/test_eos/test_saveddata/test_fit_2.py
index e60d43088..894a3e103 100644
--- a/tests/test_modules/test_eos/test_saveddata/test_fit_2.py
+++ b/tests/test_modules/test_eos/test_saveddata/test_fit_2.py
@@ -4,14 +4,11 @@
# This must be done on every test in order to pass in Travis
import os
import sys
-from copy import deepcopy
script_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.realpath(os.path.join(script_dir, '..', '..', '..', '..')))
# noinspection PyPackageRequirements
-from _development.helpers import DBInMemory as DB, Gamedata, Saveddata
-from _development.helpers_fits import RifterFit, KeepstarFit, HeronFit
def test_calculateModifiedAttributes(DB, RifterFit, KeepstarFit):
diff --git a/tests/test_modules/test_service/test_fit.py b/tests/test_modules/test_service/test_fit.py
index b110dd2da..18f5a9e52 100644
--- a/tests/test_modules/test_service/test_fit.py
+++ b/tests/test_modules/test_service/test_fit.py
@@ -6,9 +6,7 @@ script_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.realpath(os.path.join(script_dir, '..', '..', '..')))
# noinspection PyPackageRequirements
-from _development.helpers import DBInMemory as DB, Gamedata, Saveddata
# noinspection PyPackageRequirements
-from _development.helpers_fits import RifterFit, KeepstarFit
from service.fit import Fit
diff --git a/tests/test_unread_desc.py b/tests/test_unread_desc.py
index 5fc54fd14..824475d4f 100644
--- a/tests/test_unread_desc.py
+++ b/tests/test_unread_desc.py
@@ -64,8 +64,8 @@ def print_db_info():
import eos
print()
print("------------ data base connection info ------------")
- print((eos.db.saveddata_engine))
- print((eos.db.gamedata_engine))
+ print(eos.db.saveddata_engine)
+ print(eos.db.gamedata_engine)
print()
diff --git a/utils/deprecated.py b/utils/deprecated.py
new file mode 100644
index 000000000..b3433515e
--- /dev/null
+++ b/utils/deprecated.py
@@ -0,0 +1,17 @@
+import warnings
+import functools
+
+
+def deprecated(func):
+ """This is a decorator which can be used to mark functions
+ as deprecated. It will result in a warning being emitted
+ when the function is used."""
+ @functools.wraps(func)
+ def new_func(*args, **kwargs):
+ warnings.simplefilter('always', DeprecationWarning) # turn off filter
+ warnings.warn("Call to deprecated function {}.".format(func.__name__),
+ category=DeprecationWarning,
+ stacklevel=2)
+ warnings.simplefilter('default', DeprecationWarning) # reset filter
+ return func(*args, **kwargs)
+ return new_func
diff --git a/utils/strfunctions.py b/utils/strfunctions.py
index 8532d9c18..833277d17 100644
--- a/utils/strfunctions.py
+++ b/utils/strfunctions.py
@@ -1,6 +1,6 @@
-'''
+"""
string manipulation module
-'''
+"""
import re