From b033f7954bd518b825b82a1db0684eb4cf3028cc Mon Sep 17 00:00:00 2001 From: Loki Date: Sun, 25 Sep 2011 21:28:46 +0300 Subject: [PATCH] RAV lands --- .../mage/sets/planechase/BorosGarrison.java | 24 ++---- .../src/mage/sets/ravnika/DimirAqueduct.java | 82 +++++++++++++++++++ .../sets/ravnika/DuskmantleHouseOfShadow.java | 71 ++++++++++++++++ .../src/mage/sets/ravnika/GolgariRotFarm.java | 82 +++++++++++++++++++ .../mage/sets/ravnika/SelesnyaSanctuary.java | 82 +++++++++++++++++++ .../sets/ravnika/VituGhaziTheCityTree.java | 70 ++++++++++++++++ 6 files changed, 392 insertions(+), 19 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/ravnika/DimirAqueduct.java create mode 100644 Mage.Sets/src/mage/sets/ravnika/DuskmantleHouseOfShadow.java create mode 100644 Mage.Sets/src/mage/sets/ravnika/GolgariRotFarm.java create mode 100644 Mage.Sets/src/mage/sets/ravnika/SelesnyaSanctuary.java create mode 100644 Mage.Sets/src/mage/sets/ravnika/VituGhaziTheCityTree.java diff --git a/Mage.Sets/src/mage/sets/planechase/BorosGarrison.java b/Mage.Sets/src/mage/sets/planechase/BorosGarrison.java index ca67ad1a2e4..6b2be0e672f 100644 --- a/Mage.Sets/src/mage/sets/planechase/BorosGarrison.java +++ b/Mage.Sets/src/mage/sets/planechase/BorosGarrison.java @@ -28,6 +28,8 @@ package mage.sets.planechase; import java.util.UUID; + +import mage.Constants; import mage.Constants.CardType; import mage.Constants.Rarity; import mage.Mana; @@ -39,6 +41,7 @@ import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.BasicManaEffect; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.abilities.mana.BasicManaAbility; +import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.filter.Filter; import mage.filter.common.FilterControlledPermanent; @@ -58,13 +61,13 @@ public class BorosGarrison extends CardImpl { } public BorosGarrison(UUID ownerId) { - super(ownerId, 131, "Boros Garrison", Rarity.COMMON, new CardType[]{CardType.LAND}, ""); + super(ownerId, 131, "Boros Garrison", Rarity.COMMON, new CardType[]{CardType.LAND}, null); this.expansionSetCode = "HOP"; this.addAbility(new EntersBattlefieldTappedAbility()); Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect()); ability.addTarget(new TargetControlledPermanent(filter)); this.addAbility(ability); - this.addAbility(new BorosGarrisonAbility()); + this.addAbility(new SimpleManaAbility(Constants.Zone.BATTLEFIELD, new BasicManaEffect(new Mana(1, 0, 0, 1, 0, 0, 0)), new TapSourceCost())); } public BorosGarrison(final BorosGarrison card) { @@ -76,20 +79,3 @@ public class BorosGarrison extends CardImpl { return new BorosGarrison(this); } } - -class BorosGarrisonAbility extends BasicManaAbility { - public BorosGarrisonAbility() { - super(new BasicManaEffect(new Mana(1, 0, 0, 1, 0, 0, 0))); - this.netMana.setRed(1); - this.netMana.setWhite(1); - } - - public BorosGarrisonAbility(final BorosGarrisonAbility ability) { - super(ability); - } - - @Override - public BorosGarrisonAbility copy() { - return new BorosGarrisonAbility(this); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/ravnika/DimirAqueduct.java b/Mage.Sets/src/mage/sets/ravnika/DimirAqueduct.java new file mode 100644 index 00000000000..ead5bee5f93 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ravnika/DimirAqueduct.java @@ -0,0 +1,82 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.ravnika; + +import java.util.UUID; + +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.Mana; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTappedAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.abilities.mana.SimpleManaAbility; +import mage.cards.CardImpl; +import mage.filter.Filter; +import mage.filter.common.FilterControlledPermanent; +import mage.target.common.TargetControlledPermanent; + +/** + * @author Loki + */ +public class DimirAqueduct extends CardImpl { + private final static FilterControlledPermanent filter = new FilterControlledPermanent("land you control"); + + static { + filter.getCardType().add(CardType.LAND); + filter.setScopeCardType(Filter.ComparisonScope.Any); + } + + + public DimirAqueduct(UUID ownerId) { + super(ownerId, 276, "Dimir Aqueduct", Rarity.COMMON, new CardType[]{CardType.LAND}, null); + this.expansionSetCode = "RAV"; + + // Dimir Aqueduct enters the battlefield tapped. + this.addAbility(new EntersBattlefieldTappedAbility()); + // When Dimir Aqueduct enters the battlefield, return a land you control to its owner's hand. + Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect()); + ability.addTarget(new TargetControlledPermanent(filter)); + this.addAbility(ability); + // {tap}: Add {U}{B} to your mana pool. + this.addAbility(new SimpleManaAbility(Constants.Zone.BATTLEFIELD, new BasicManaEffect(new Mana(0, 0, 1, 0, 1, 0, 0)), new TapSourceCost())); + } + + public DimirAqueduct(final DimirAqueduct card) { + super(card); + } + + @Override + public DimirAqueduct copy() { + return new DimirAqueduct(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ravnika/DuskmantleHouseOfShadow.java b/Mage.Sets/src/mage/sets/ravnika/DuskmantleHouseOfShadow.java new file mode 100644 index 00000000000..5c958f1f4dd --- /dev/null +++ b/Mage.Sets/src/mage/sets/ravnika/DuskmantleHouseOfShadow.java @@ -0,0 +1,71 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.ravnika; + +import java.util.UUID; + +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.PutLibraryIntoGraveTargetEffect; +import mage.abilities.mana.ColorlessManaAbility; +import mage.cards.CardImpl; +import mage.target.TargetPlayer; + +/** + * + * @author Loki + */ +public class DuskmantleHouseOfShadow extends CardImpl { + + public DuskmantleHouseOfShadow(UUID ownerId) { + super(ownerId, 277, "Duskmantle, House of Shadow", Rarity.UNCOMMON, new CardType[]{CardType.LAND}, null); + this.expansionSetCode = "RAV"; + + // {tap}: Add {1} to your mana pool. + this.addAbility(new ColorlessManaAbility()); + // {U}{B}, {tap}: Target player puts the top card of his or her library into his or her graveyard. + Ability ability = new SimpleActivatedAbility(Constants.Zone.BATTLEFIELD, new PutLibraryIntoGraveTargetEffect(1), new ManaCostsImpl("{U}{B}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetPlayer()); + this.addAbility(ability); + } + + public DuskmantleHouseOfShadow(final DuskmantleHouseOfShadow card) { + super(card); + } + + @Override + public DuskmantleHouseOfShadow copy() { + return new DuskmantleHouseOfShadow(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ravnika/GolgariRotFarm.java b/Mage.Sets/src/mage/sets/ravnika/GolgariRotFarm.java new file mode 100644 index 00000000000..2ccee386691 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ravnika/GolgariRotFarm.java @@ -0,0 +1,82 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.ravnika; + +import java.util.UUID; + +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.Mana; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTappedAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.abilities.mana.SimpleManaAbility; +import mage.cards.CardImpl; +import mage.filter.Filter; +import mage.filter.common.FilterControlledPermanent; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author Loki + */ +public class GolgariRotFarm extends CardImpl { + private final static FilterControlledPermanent filter = new FilterControlledPermanent("land you control"); + + static { + filter.getCardType().add(CardType.LAND); + filter.setScopeCardType(Filter.ComparisonScope.Any); + } + + public GolgariRotFarm(UUID ownerId) { + super(ownerId, 278, "Golgari Rot Farm", Rarity.COMMON, new CardType[]{CardType.LAND}, null); + this.expansionSetCode = "RAV"; + + // Golgari Rot Farm enters the battlefield tapped. + this.addAbility(new EntersBattlefieldTappedAbility()); + // When Golgari Rot Farm enters the battlefield, return a land you control to its owner's hand. + Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect()); + ability.addTarget(new TargetControlledPermanent(filter)); + this.addAbility(ability); + // {tap}: Add {B}{G} to your mana pool. + this.addAbility(new SimpleManaAbility(Constants.Zone.BATTLEFIELD, new BasicManaEffect(new Mana(0, 1, 0, 0, 1, 0, 0)), new TapSourceCost())); + } + + public GolgariRotFarm(final GolgariRotFarm card) { + super(card); + } + + @Override + public GolgariRotFarm copy() { + return new GolgariRotFarm(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ravnika/SelesnyaSanctuary.java b/Mage.Sets/src/mage/sets/ravnika/SelesnyaSanctuary.java new file mode 100644 index 00000000000..1508f4c5bc6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ravnika/SelesnyaSanctuary.java @@ -0,0 +1,82 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.ravnika; + +import java.util.UUID; + +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.Mana; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTappedAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.abilities.mana.SimpleManaAbility; +import mage.cards.CardImpl; +import mage.filter.Filter; +import mage.filter.common.FilterControlledPermanent; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author Loki + */ +public class SelesnyaSanctuary extends CardImpl { + private final static FilterControlledPermanent filter = new FilterControlledPermanent("land you control"); + + static { + filter.getCardType().add(CardType.LAND); + filter.setScopeCardType(Filter.ComparisonScope.Any); + } + + public SelesnyaSanctuary(UUID ownerId) { + super(ownerId, 281, "Selesnya Sanctuary", Rarity.COMMON, new CardType[]{CardType.LAND}, null); + this.expansionSetCode = "RAV"; + + // Selesnya Sanctuary enters the battlefield tapped. + this.addAbility(new EntersBattlefieldTappedAbility()); + // When Selesnya Sanctuary enters the battlefield, return a land you control to its owner's hand. + Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect()); + ability.addTarget(new TargetControlledPermanent(filter)); + this.addAbility(ability); + // {tap}: Add {G}{W} to your mana pool. + this.addAbility(new SimpleManaAbility(Constants.Zone.BATTLEFIELD, new BasicManaEffect(new Mana(0, 1, 0, 1, 0, 0, 0)), new TapSourceCost())); + } + + public SelesnyaSanctuary(final SelesnyaSanctuary card) { + super(card); + } + + @Override + public SelesnyaSanctuary copy() { + return new SelesnyaSanctuary(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ravnika/VituGhaziTheCityTree.java b/Mage.Sets/src/mage/sets/ravnika/VituGhaziTheCityTree.java new file mode 100644 index 00000000000..f0b866548f6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ravnika/VituGhaziTheCityTree.java @@ -0,0 +1,70 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.ravnika; + +import java.util.UUID; + +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.mana.ColorlessManaAbility; +import mage.cards.CardImpl; +import mage.game.permanent.token.SaprolingToken; + +/** + * + * @author Loki + */ +public class VituGhaziTheCityTree extends CardImpl { + + public VituGhaziTheCityTree(UUID ownerId) { + super(ownerId, 285, "Vitu-Ghazi, the City-Tree", Rarity.UNCOMMON, new CardType[]{CardType.LAND}, ""); + this.expansionSetCode = "RAV"; + + // {tap}: Add {1} to your mana pool. + this.addAbility(new ColorlessManaAbility()); + // {2}{G}{W}, {tap}: Put a 1/1 green Saproling creature token onto the battlefield. + Ability ability = new SimpleActivatedAbility(Constants.Zone.BATTLEFIELD, new CreateTokenEffect(new SaprolingToken()), new ManaCostsImpl("{2}{G}{W}")); + ability.addCost(new TapSourceCost()); + this.addAbility(ability); + } + + public VituGhaziTheCityTree(final VituGhaziTheCityTree card) { + super(card); + } + + @Override + public VituGhaziTheCityTree copy() { + return new VituGhaziTheCityTree(this); + } +}