fix path select
This commit is contained in:
@@ -10,7 +10,10 @@ import ru.trader.core.Order;
|
|||||||
import ru.trader.core.Profile;
|
import ru.trader.core.Profile;
|
||||||
import ru.trader.core.Vendor;
|
import ru.trader.core.Vendor;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
|
||||||
@@ -319,7 +322,7 @@ public class VendorsGraph extends ConnectibleGraph<Vendor> {
|
|||||||
public Path<Vendor> getPath(double fuel){
|
public Path<Vendor> getPath(double fuel){
|
||||||
Path<Vendor> res = null;
|
Path<Vendor> res = null;
|
||||||
for (Path<Vendor> p : paths) {
|
for (Path<Vendor> p : paths) {
|
||||||
if ((fuel > p.getMinFuel() || getSource().getEntry().canRefill()) && fuel <= p.getMaxFuel()) {
|
if ((fuel > p.getMinFuel() || getSource().getEntry().canRefill() && getShip().getRoundFuel(p.getMaxFuel()) >= p.getMinFuel()) && fuel <= p.getMaxFuel()) {
|
||||||
if (getProfile().getPathPriority().equals(Profile.PATH_PRIORITY.FAST)) {
|
if (getProfile().getPathPriority().equals(Profile.PATH_PRIORITY.FAST)) {
|
||||||
if (res == null || (p.getSize() < res.getSize() || p.getSize() == res.getSize() && p.getFuelCost() < res.getFuelCost()) && p.getRefillCount(fuel) <= res.getRefillCount(fuel)) {
|
if (res == null || (p.getSize() < res.getSize() || p.getSize() == res.getSize() && p.getFuelCost() < res.getFuelCost()) && p.getRefillCount(fuel) <= res.getRefillCount(fuel)) {
|
||||||
res = p;
|
res = p;
|
||||||
|
|||||||
@@ -7,7 +7,10 @@ import org.slf4j.LoggerFactory;
|
|||||||
import org.xml.sax.SAXException;
|
import org.xml.sax.SAXException;
|
||||||
import ru.trader.analysis.AnalysisCallBack;
|
import ru.trader.analysis.AnalysisCallBack;
|
||||||
import ru.trader.analysis.TransitPath;
|
import ru.trader.analysis.TransitPath;
|
||||||
import ru.trader.core.*;
|
import ru.trader.core.Market;
|
||||||
|
import ru.trader.core.Profile;
|
||||||
|
import ru.trader.core.Ship;
|
||||||
|
import ru.trader.core.Vendor;
|
||||||
import ru.trader.store.simple.Store;
|
import ru.trader.store.simple.Store;
|
||||||
|
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
@@ -228,4 +231,41 @@ public class PathTest extends Assert {
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* TODO: check paths
|
||||||
|
|
||||||
|
ERROR: 18.12.2016 20:14:37 (TransitPath.java:48) - Incorrect path, path = {Marley City - null(5.650000063702464 - 32.0) -> Transit Col 285 Sector JY-S a33-0, Transit Col 285 Sector JY-S a33-0 - null(2.9400001242756844 - 32.0) -> Transit LP 91-140, Transit LP 91-140 - null(6.830000037327409 - 32.0) -> Transit Shui Wei Sector FH-U b3-4, Transit Shui Wei Sector FH-U b3-4 - null(8.040000010281801 - 31.938907065299873) -> Transit Shui Wei Sector JN-S b4-3, Transit Shui Wei Sector JN-S b4-3 - null(8.480000000447035 - 9.481771344586832) -> Wales City}, fuel = -1.3063401932628143, ship = Ship{cargo=384, engine=7C {optMass=1800.0, fuelPJ=8.5}, tank=32.0, mass=760.3, jumpRange=19.285799993506345, maxDist=19.678943903852804, fullTankDist=76.16151750390145}
|
||||||
|
ERROR: 18.12.2016 20:14:37 (VendorsCrawler.java:95) - Wrong path, entry {head=[Poindexter Horizons - 0.9589628706630414 -> Anning Enterprise], edge=Anning Enterprise - 0.3624985921259898 -> Marley City}, fuel = 19.302461271880986
|
||||||
|
ERROR: 18.12.2016 20:14:37 (TransitPath.java:48) - Incorrect path, path = {Marley City - null(5.650000063702464 - 32.0) -> Transit Col 285 Sector JY-S a33-0, Transit Col 285 Sector JY-S a33-0 - null(2.9400001242756844 - 32.0) -> Transit LP 91-140, Transit LP 91-140 - null(6.830000037327409 - 32.0) -> Transit Shui Wei Sector FH-U b3-4, Transit Shui Wei Sector FH-U b3-4 - null(8.040000010281801 - 31.938907065299873) -> Transit Shui Wei Sector JN-S b4-3, Transit Shui Wei Sector JN-S b4-3 - null(8.480000000447035 - 9.481771344586832) -> Wales City}, fuel = -1.3063401932628143, ship = Ship{cargo=384, engine=7C {optMass=1800.0, fuelPJ=8.5}, tank=32.0, mass=760.3, jumpRange=19.285799993506345, maxDist=19.678943903852804, fullTankDist=76.16151750390145}
|
||||||
|
ERROR: 18.12.2016 20:14:37 (VendorsCrawler.java:95) - Wrong path, entry {head=[Poindexter Horizons - 1.0645592731448934 -> Waldrop Gateway], edge=Waldrop Gateway - 0.5196667298732823 -> Marley City}, fuel = 11.649596203747677
|
||||||
|
ERROR: 18.12.2016 20:14:37 (TransitPath.java:48) - Incorrect path, path = {Marley City - null(5.650000063702464 - 32.0) -> Transit Col 285 Sector JY-S a33-0, Transit Col 285 Sector JY-S a33-0 - null(2.9400001242756844 - 32.0) -> Transit LP 91-140, Transit LP 91-140 - null(6.830000037327409 - 32.0) -> Transit Shui Wei Sector FH-U b3-4, Transit Shui Wei Sector FH-U b3-4 - null(8.040000010281801 - 31.938907065299873) -> Transit Shui Wei Sector JN-S b4-3, Transit Shui Wei Sector JN-S b4-3 - null(8.480000000447035 - 9.481771344586832) -> Wales City}, fuel = -1.3063401932628143, ship = Ship{cargo=384, engine=7C {optMass=1800.0, fuelPJ=8.5}, tank=32.0, mass=760.3, jumpRange=19.285799993506345, maxDist=19.678943903852804, fullTankDist=76.16151750390145}
|
||||||
|
ERROR: 18.12.2016 20:14:37 (VendorsCrawler.java:95) - Wrong path, entry {head=[Poindexter Horizons - 1.022834181578632 -> Malenchenko Dock], edge=Malenchenko Dock - 0.8421773536261806 -> Marley City}, fuel = 19.40800122650537
|
||||||
|
ERROR: 18.12.2016 20:14:37 (TransitPath.java:48) - Incorrect path, path = {Marley City - null(5.650000063702464 - 32.0) -> Transit Col 285 Sector JY-S a33-0, Transit Col 285 Sector JY-S a33-0 - null(2.9400001242756844 - 32.0) -> Transit LP 91-140, Transit LP 91-140 - null(6.830000037327409 - 32.0) -> Transit Shui Wei Sector FH-U b3-4, Transit Shui Wei Sector FH-U b3-4 - null(8.040000010281801 - 31.938907065299873) -> Transit Shui Wei Sector JN-S b4-3, Transit Shui Wei Sector JN-S b4-3 - null(8.480000000447035 - 9.481771344586832) -> Wales City}, fuel = -1.3063401932628143, ship = Ship{cargo=384, engine=7C {optMass=1800.0, fuelPJ=8.5}, tank=32.0, mass=760.3, jumpRange=19.285799993506345, maxDist=19.678943903852804, fullTankDist=76.16151750390145}
|
||||||
|
ERROR: 18.12.2016 20:14:37 (VendorsCrawler.java:95) - Wrong path, entry {head=[Poindexter Horizons - 1.059486010716856 -> Arnold Hub], edge=Arnold Hub - 0.5363394599627498 -> Marley City}, fuel = 9.01892987314588
|
||||||
|
ERROR: 18.12.2016 20:14:37 (TransitPath.java:48) - Incorrect path, path = {Fung Station - null(7.730000017210841 - 32.0) -> Transit Col 285 Sector JY-S a33-0, Transit Col 285 Sector JY-S a33-0 - null(2.9400001242756844 - 32.0) -> Transit LP 91-140, Transit LP 91-140 - null(6.830000037327409 - 32.0) -> Transit Shui Wei Sector FH-U b3-4, Transit Shui Wei Sector FH-U b3-4 - null(8.040000010281801 - 31.938907065299873) -> Transit Shui Wei Sector JN-S b4-3, Transit Shui Wei Sector JN-S b4-3 - null(8.480000000447035 - 9.481771344586832) -> Wales City}, fuel = -1.3063401932628143, ship = Ship{cargo=384, engine=7C {optMass=1800.0, fuelPJ=8.5}, tank=32.0, mass=760.3, jumpRange=19.285799993506345, maxDist=19.678943903852804, fullTankDist=76.16151750390145}
|
||||||
|
ERROR: 18.12.2016 20:14:37 (VendorsCrawler.java:95) - Wrong path, entry {head=[Poindexter Horizons - 1.059486010716856 -> Arnold Hub], edge=Arnold Hub - 0.7340450745407797 -> Fung Station}, fuel = 9.58410781172928
|
||||||
|
ERROR: 18.12.2016 20:14:37 (TransitPath.java:48) - Incorrect path, path = {Marley City - null(5.650000063702464 - 32.0) -> Transit Col 285 Sector JY-S a33-0, Transit Col 285 Sector JY-S a33-0 - null(2.9400001242756844 - 32.0) -> Transit LP 91-140, Transit LP 91-140 - null(6.830000037327409 - 32.0) -> Transit Shui Wei Sector FH-U b3-4, Transit Shui Wei Sector FH-U b3-4 - null(8.040000010281801 - 31.938907065299873) -> Transit Shui Wei Sector JN-S b4-3, Transit Shui Wei Sector JN-S b4-3 - null(8.480000000447035 - 9.481771344586832) -> Wales City}, fuel = -1.3063401932628143, ship = Ship{cargo=384, engine=7C {optMass=1800.0, fuelPJ=8.5}, tank=32.0, mass=760.3, jumpRange=19.285799993506345, maxDist=19.678943903852804, fullTankDist=76.16151750390145}
|
||||||
|
ERROR: 18.12.2016 20:14:37 (VendorsCrawler.java:95) - Wrong path, entry {head=[Poindexter Horizons - 1.114615867252881 -> Kaku City], edge=Kaku City - 0.507413400537874 -> Marley City}, fuel = 10.494978262690863
|
||||||
|
ERROR: 18.12.2016 20:14:37 (TransitPath.java:48) - Incorrect path, path = {Fung Station - null(7.730000017210841 - 32.0) -> Transit Col 285 Sector JY-S a33-0, Transit Col 285 Sector JY-S a33-0 - null(2.9400001242756844 - 32.0) -> Transit LP 91-140, Transit LP 91-140 - null(6.830000037327409 - 32.0) -> Transit Shui Wei Sector FH-U b3-4, Transit Shui Wei Sector FH-U b3-4 - null(8.040000010281801 - 31.938907065299873) -> Transit Shui Wei Sector JN-S b4-3, Transit Shui Wei Sector JN-S b4-3 - null(8.480000000447035 - 9.481771344586832) -> Wales City}, fuel = -1.3063401932628143, ship = Ship{cargo=384, engine=7C {optMass=1800.0, fuelPJ=8.5}, tank=32.0, mass=760.3, jumpRange=19.285799993506345, maxDist=19.678943903852804, fullTankDist=76.16151750390145}
|
||||||
|
ERROR: 18.12.2016 20:14:37 (VendorsCrawler.java:95) - Wrong path, entry {head=[Poindexter Horizons - 1.12967434055453 -> Windt Terminal], edge=Windt Terminal - 0.21019712790181494 -> Fung Station}, fuel = 19.185052069305907
|
||||||
|
ERROR: 18.12.2016 20:14:37 (TransitPath.java:48) - Incorrect path, path = {Marley City - null(5.650000063702464 - 32.0) -> Transit Col 285 Sector JY-S a33-0, Transit Col 285 Sector JY-S a33-0 - null(2.9400001242756844 - 32.0) -> Transit LP 91-140, Transit LP 91-140 - null(6.830000037327409 - 32.0) -> Transit Shui Wei Sector FH-U b3-4, Transit Shui Wei Sector FH-U b3-4 - null(8.040000010281801 - 31.938907065299873) -> Transit Shui Wei Sector JN-S b4-3, Transit Shui Wei Sector JN-S b4-3 - null(8.480000000447035 - 9.481771344586832) -> Wales City}, fuel = -1.3063401932628143, ship = Ship{cargo=384, engine=7C {optMass=1800.0, fuelPJ=8.5}, tank=32.0, mass=760.3, jumpRange=19.285799993506345, maxDist=19.678943903852804, fullTankDist=76.16151750390145}
|
||||||
|
ERROR: 18.12.2016 20:14:37 (VendorsCrawler.java:95) - Wrong path, entry {head=[Poindexter Horizons - 1.12967434055453 -> Windt Terminal], edge=Windt Terminal - 0.4253810806857503 -> Marley City}, fuel = 21.335282458210564
|
||||||
|
ERROR: 18.12.2016 20:14:37 (TransitPath.java:48) - Incorrect path, path = {Packard Goose - null(0.7500001732259989 - 32.0) -> Transit Col 285 Sector SJ-W b16-3, Transit Col 285 Sector SJ-W b16-3 - null(2.160000141710043 - 32.0) -> Transit Core Sys Sector ZJ-R a4-2, Transit Core Sys Sector ZJ-R a4-2 - null(6.700000040233135 - 32.0) -> Transit LFT 69, Transit LFT 69 - null(6.7200000397861 - 32.0) -> Transit Zhi, Transit Zhi - null(4.670000085607171 - 32.0) -> Transit Pantaa Cezisa, Transit Pantaa Cezisa - null(8.450000001117587 - 10.998717639182587) -> Walker City}, fuel = -0.39807008884942263, ship = Ship{cargo=384, engine=7C {optMass=1800.0, fuelPJ=8.5}, tank=32.0, mass=760.3, jumpRange=19.285799993506345, maxDist=19.678943903852804, fullTankDist=76.16151750390145}
|
||||||
|
ERROR: 18.12.2016 20:14:37 (VendorsCrawler.java:95) - Wrong path, entry {head=[Poindexter Horizons - 1.12967434055453 -> Windt Terminal], edge=Windt Terminal - 0.4839466057667837 -> Packard Goose}, fuel = 22.101436205250103
|
||||||
|
ERROR: 18.12.2016 20:14:37 (TransitPath.java:48) - Incorrect path, path = {Highbanks - null(0.7500001732259989 - 32.0) -> Transit Col 285 Sector SJ-W b16-3, Transit Col 285 Sector SJ-W b16-3 - null(2.160000141710043 - 32.0) -> Transit Core Sys Sector ZJ-R a4-2, Transit Core Sys Sector ZJ-R a4-2 - null(6.700000040233135 - 32.0) -> Transit LFT 69, Transit LFT 69 - null(6.7200000397861 - 32.0) -> Transit Zhi, Transit Zhi - null(4.670000085607171 - 32.0) -> Transit Pantaa Cezisa, Transit Pantaa Cezisa - null(8.450000001117587 - 10.998717639182587) -> Walker City}, fuel = -0.39807008884942263, ship = Ship{cargo=384, engine=7C {optMass=1800.0, fuelPJ=8.5}, tank=32.0, mass=760.3, jumpRange=19.285799993506345, maxDist=19.678943903852804, fullTankDist=76.16151750390145}
|
||||||
|
ERROR: 18.12.2016 20:14:37 (VendorsCrawler.java:95) - Wrong path, entry {head=[Poindexter Horizons - 1.12967434055453 -> Windt Terminal], edge=Windt Terminal - 0.4853098357040021 -> Highbanks}, fuel = 22.101435846439685
|
||||||
|
ERROR: 18.12.2016 20:14:37 (TransitPath.java:48) - Incorrect path, path = {Marley City - null(5.650000063702464 - 32.0) -> Transit Col 285 Sector JY-S a33-0, Transit Col 285 Sector JY-S a33-0 - null(2.9400001242756844 - 32.0) -> Transit LP 91-140, Transit LP 91-140 - null(6.830000037327409 - 32.0) -> Transit Shui Wei Sector FH-U b3-4, Transit Shui Wei Sector FH-U b3-4 - null(8.040000010281801 - 31.938907065299873) -> Transit Shui Wei Sector JN-S b4-3, Transit Shui Wei Sector JN-S b4-3 - null(8.480000000447035 - 9.481771344586832) -> Wales City}, fuel = -1.3063401932628143, ship = Ship{cargo=384, engine=7C {optMass=1800.0, fuelPJ=8.5}, tank=32.0, mass=760.3, jumpRange=19.285799993506345, maxDist=19.678943903852804, fullTankDist=76.16151750390145}
|
||||||
|
ERROR: 18.12.2016 20:14:37 (VendorsCrawler.java:95) - Wrong path, entry {head=[Poindexter Horizons - 1.1685569334619363 -> Sullivan Dock], edge=Sullivan Dock - 0.40942306598203076 -> Marley City}, fuel = 11.918362887905289
|
||||||
|
ERROR: 18.12.2016 20:14:37 (TransitPath.java:48) - Incorrect path, path = {Packard Goose - null(0.7500001732259989 - 32.0) -> Transit Col 285 Sector SJ-W b16-3, Transit Col 285 Sector SJ-W b16-3 - null(2.160000141710043 - 32.0) -> Transit Core Sys Sector ZJ-R a4-2, Transit Core Sys Sector ZJ-R a4-2 - null(6.700000040233135 - 32.0) -> Transit LFT 69, Transit LFT 69 - null(6.7200000397861 - 32.0) -> Transit Zhi, Transit Zhi - null(4.670000085607171 - 32.0) -> Transit Pantaa Cezisa, Transit Pantaa Cezisa - null(8.450000001117587 - 10.998717639182587) -> Walker City}, fuel = -0.39807008884942263, ship = Ship{cargo=384, engine=7C {optMass=1800.0, fuelPJ=8.5}, tank=32.0, mass=760.3, jumpRange=19.285799993506345, maxDist=19.678943903852804, fullTankDist=76.16151750390145}
|
||||||
|
ERROR: 18.12.2016 20:14:37 (VendorsCrawler.java:95) - Wrong path, entry {head=[Poindexter Horizons - 1.209403569396717 -> Faber Terminal], edge=Faber Terminal - 0.19651840170950163 -> Packard Goose}, fuel = 22.09682950919931
|
||||||
|
ERROR: 18.12.2016 20:14:37 (TransitPath.java:48) - Incorrect path, path = {Highbanks - null(0.7500001732259989 - 32.0) -> Transit Col 285 Sector SJ-W b16-3, Transit Col 285 Sector SJ-W b16-3 - null(2.160000141710043 - 32.0) -> Transit Core Sys Sector ZJ-R a4-2, Transit Core Sys Sector ZJ-R a4-2 - null(6.700000040233135 - 32.0) -> Transit LFT 69, Transit LFT 69 - null(6.7200000397861 - 32.0) -> Transit Zhi, Transit Zhi - null(4.670000085607171 - 32.0) -> Transit Pantaa Cezisa, Transit Pantaa Cezisa - null(8.450000001117587 - 10.998717639182587) -> Walker City}, fuel = -0.39807008884942263, ship = Ship{cargo=384, engine=7C {optMass=1800.0, fuelPJ=8.5}, tank=32.0, mass=760.3, jumpRange=19.285799993506345, maxDist=19.678943903852804, fullTankDist=76.16151750390145}
|
||||||
|
ERROR: 18.12.2016 20:14:37 (VendorsCrawler.java:95) - Wrong path, entry {head=[Poindexter Horizons - 1.209403569396717 -> Faber Terminal], edge=Faber Terminal - 0.19707197468372828 -> Highbanks}, fuel = 22.09682909861441
|
||||||
|
ERROR: 18.12.2016 20:14:37 (TransitPath.java:48) - Incorrect path, path = {Fung Station - null(7.730000017210841 - 32.0) -> Transit Col 285 Sector JY-S a33-0, Transit Col 285 Sector JY-S a33-0 - null(2.9400001242756844 - 32.0) -> Transit LP 91-140, Transit LP 91-140 - null(6.830000037327409 - 32.0) -> Transit Shui Wei Sector FH-U b3-4, Transit Shui Wei Sector FH-U b3-4 - null(8.040000010281801 - 31.938907065299873) -> Transit Shui Wei Sector JN-S b4-3, Transit Shui Wei Sector JN-S b4-3 - null(8.480000000447035 - 9.481771344586832) -> Wales City}, fuel = -1.3063401932628143, ship = Ship{cargo=384, engine=7C {optMass=1800.0, fuelPJ=8.5}, tank=32.0, mass=760.3, jumpRange=19.285799993506345, maxDist=19.678943903852804, fullTankDist=76.16151750390145}
|
||||||
|
ERROR: 18.12.2016 20:14:37 (VendorsCrawler.java:95) - Wrong path, entry {head=[Poindexter Horizons - 1.2402503460630483 -> Berezovoy Gateway], edge=Berezovoy Gateway - 0.22224602681914715 -> Fung Station}, fuel = 18.361482828396284
|
||||||
|
ERROR: 18.12.2016 20:14:37 (TransitPath.java:48) - Incorrect path, path = {Alkaabi - null(1.4300001580268145 - 32.0) -> Transit Col 285 Sector SJ-W b16-3, Transit Col 285 Sector SJ-W b16-3 - null(2.160000141710043 - 32.0) -> Transit Core Sys Sector ZJ-R a4-2, Transit Core Sys Sector ZJ-R a4-2 - null(6.700000040233135 - 32.0) -> Transit LFT 69, Transit LFT 69 - null(6.7200000397861 - 32.0) -> Transit Zhi, Transit Zhi - null(4.670000085607171 - 32.0) -> Transit Pantaa Cezisa, Transit Pantaa Cezisa - null(8.450000001117587 - 10.998717639182587) -> Walker City}, fuel = -0.39807008884942263, ship = Ship{cargo=384, engine=7C {optMass=1800.0, fuelPJ=8.5}, tank=32.0, mass=760.3, jumpRange=19.285799993506345, maxDist=19.678943903852804, fullTankDist=76.16151750390145}
|
||||||
|
ERROR: 18.12.2016 20:14:37 (VendorsCrawler.java:95) - Wrong path, entry {head=[Poindexter Horizons - 1.209403569396717 -> Faber Terminal], edge=Faber Terminal - 0.26566672776028033 -> Alkaabi}, fuel = 23.19443648025583
|
||||||
|
ERROR: 18.12.2016 20:14:37 (TransitPath.java:48) - Incorrect path, path = {Harry Moore & Co - null(1.4300001580268145 - 32.0) -> Transit Col 285 Sector SJ-W b16-3, Transit Col 285 Sector SJ-W b16-3 - null(2.160000141710043 - 32.0) -> Transit Core Sys Sector ZJ-R a4-2, Transit Core Sys Sector ZJ-R a4-2 - null(6.700000040233135 - 32.0) -> Transit LFT 69, Transit LFT 69 - null(6.7200000397861 - 32.0) -> Transit Zhi, Transit Zhi - null(4.670000085607171 - 32.0) -> Transit Pantaa Cezisa, Transit Pantaa Cezisa - null(8.450000001117587 - 10.998717639182587) -> Walker City}, fuel = -0.39807008884942263, ship = Ship{cargo=384, engine=7C {optMass=1800.0, fuelPJ=8.5}, tank=32.0, mass=760.3, jumpRange=19.285799993506345, maxDist=19.678943903852804, fullTankDist=76.16151750390145}
|
||||||
|
ERROR: 18.12.2016 20:14:37 (VendorsCrawler.java:95) - Wrong path, entry {head=[Poindexter Horizons - 1.209403569396717 -> Faber Terminal], edge=Faber Terminal - 0.2695206964507874 -> Harry Moore & Co}, fuel = 23.194436510089336
|
||||||
|
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user