Modular Fall from Heaven

Hmm, that makes a lot more sense than it did when I read an earlier version of that you posted in a modder's thread somewhere. Thank's for clarifying (; I'm not running that test tonight - but I will, and I'll post what results I find.

For reference, the only things I changed were X/Y grid positions, and it broke pre-reqs randomly, to the point of causing CTDs if you clicked on specific techs.

Using your technique, you can identify non-modular fields... but if you modify even a single field, don't you have to include all fields in a modular XML entry? That said, if the non-modular fields are required for an item (like Prereqs for techs) wouldn't that make all mods of that item nonmodular by default?

I haven't touched Technologies yet, except having them enable things, which is fairly indirect. So I can't say for certain. But I can tell you the quick way to check what does and doesn't load.

Every element in the XML is <something></something>. Many of them are not used in each item, so will be either <something>0</something> or <something>NONE</something>. By changing all of the >0< & >NONE< to just ><, you can create a "Dummy Index" entry. It should basically say nothing about nothing.

Now, form a dummy index as a standalone module, then load the game. In some certain cases the system absolutely REFUSES to have a blank space, so will yell at you. Fill that one in, then load again and repeat that until it doesn't yell at you anymore. Then go back and copy your properly (minimally) filled Dummy Index about 10 times (really 2 is sufficient, but I like lots, just in case).

Now load the game again, and check the Civlopedia for the relevant section. Look at the first few entries and see if there are any random blanks popping up (ie - A Pre-req or "leads to" space that shows up on mouseover as a nameless, pictureless tech, or "Technology enables____". Those are your entries which aren't loading properly for Modular Files.
 
It just means you cannot use that field and that each module must contain few enough items that you line up with the main module to only overwrite others who also don't use the field.

A good example is the Improvements. For them the Upgrading function is one of the problem fields, and the first actual entry to use this field is the Cottage (5th entry I believe). Thus any modular Improvement change must either contain:
  1. Fewer than 5 total entries (you can just split it into multiple modules of 4 entries each if you need more)
  2. The cottage (even if unchanged) as your 5th entry (and then whatever uses the field next in the appropriate spot if you keep going)
  3. The data for those fields which aren't modular compatible in whatever your 5th element is (so if your 5th one is "Merri-go-round" then you just have to write it such that it will upgrade to a Hamlet in 13 turns or whatnot. Then that data gets re-assigned to the cottage, and your new item remains non-upgradeable)

As long as you do one of those you can still use a module. I typically aim for 1 or 2, since option 3 winds up being more compact, but harder to edit since you can easily forget what you had done to make it work (If you delete one of the first 5 you have to remember to find and move the data inserted).
 
Ok, running with the tech example. Again, I haven't run the test - something about needing to sleep and work.

95% of technologies require the use of the OR_PREREQ fields. Let's say that field is non-modular. If I make changes to existing technologies (COST, for example,) but do not change the OR_PREREQ fields, just leave them at their static settings, all should be good assuming I also didn't change the order of the technologies?

Aka the non-modular fields are a problem only insomuch as you need to change them - using the same setting in the same place (vs. being blank) in a module is not a problem.

If so, interesting. And a pain...

It just means you cannot use that field and that each module must contain few enough items that you line up with the main module to only overwrite others who also don't use the field.

A good example is the Improvements. For them the Upgrading function is one of the problem fields, and the first actual entry to use this field is the Cottage (5th entry I believe). Thus any modular Improvement change must either contain:
  1. Fewer than 5 total entries (you can just split it into multiple modules of 4 entries each if you need more)
  2. The cottage (even if unchanged) as your 5th entry (and then whatever uses the field next in the appropriate spot if you keep going)
  3. The data for those fields which aren't modular compatible in whatever your 5th element is (so if your 5th one is "Merri-go-round" then you just have to write it such that it will upgrade to a Hamlet in 13 turns or whatnot. Then that data gets re-assigned to the cottage, and your new item remains non-upgradeable)

As long as you do one of those you can still use a module. I typically aim for 1 or 2, since option 3 winds up being more compact, but harder to edit since you can easily forget what you had done to make it work (If you delete one of the first 5 you have to remember to find and move the data inserted).
 
Sounds like you have it right, and in addition to not changing the order of them you have to make certain you didn't remove any from your list.

I should also mention that if you are changing the majority of the entries in one of the XMLs you should probably not bother being modular, as you then are not very compatible with other Modules, nor changes in the base Mod. It hadn't dawned on me earlier that you are most likely going to be changing EVERY technology if you are moving where they show up in the Tech Tree. This is one of the reasons I really wish that it was possible to set up a module that only contains the elements which you actually changed, instead of the entire entry.

EDIT: So I decided to play around with some things to see if altering your Schema would allow you to alter less in the actual file, and it works, but just as buggy as you can expect from a Module. If you replace all of the <element type="____"/> with <element type="____" minOccurs="0"/> in the large subset of the <ElementType name="TechInfo" content="eltOnly"> (NOTE: Except for the Type element. Leave that alone since it is what links you to the original data) then you are allowed to simply NOT have each element entered. So then you can just declare the Type and then the values that you desire to use. But of course this doesn't let you skip EVERYTHING. So far I see that the Button, Description, History, Strategy, PreReq-OR and Free Unit must also be included.

Spoiler Example of Code Change :

Changed Schema (important bit is in red, with the additions in blue
Code:
<!-- edited with XMLSPY v2004 rel. 2 U (http://www.xmlspy.com) by Alex Mantzaris (Firaxis Games) -->
<!-- Sid Meier's Civilization 4 -->
<!-- Copyright Firaxis Games 2005 -->
<!-- -->
<!-- Tech Schema -->
<Schema xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes">
	<ElementType name="Type" content="textOnly"/>
	<ElementType name="Description" content="textOnly"/>
	<ElementType name="Civilopedia" content="textOnly"/>
	<ElementType name="Help" content="textOnly"/>
	<ElementType name="Strategy" content="textOnly"/>
	<ElementType name="Advisor" content="textOnly"/>
	<ElementType name="iAIWeight" content="textOnly" dt:type="int"/>
	<ElementType name="iAITradeModifier" content="textOnly" dt:type="int"/>
	<ElementType name="iCost" content="textOnly" dt:type="int"/>
	<ElementType name="iAdvancedStartCost" content="textOnly" dt:type="int"/>
	<ElementType name="iAdvancedStartCostIncrease" content="textOnly" dt:type="int"/>
	<ElementType name="Era" content="textOnly"/>
	<ElementType name="FirstFreeUnitClass" content="textOnly"/>
	<ElementType name="iFeatureProductionModifier" content="textOnly" dt:type="int"/>
	<ElementType name="iWorkerSpeedModifier" content="textOnly" dt:type="int"/>
	<ElementType name="iTradeRoutes" content="textOnly" dt:type="int"/>
	<ElementType name="iHealth" content="textOnly" dt:type="int"/>
	<ElementType name="iHappiness" content="textOnly" dt:type="int"/>
	<ElementType name="iFirstFreeTechs" content="textOnly" dt:type="int"/>
	<ElementType name="iAsset" content="textOnly" dt:type="int"/>
	<ElementType name="iPower" content="textOnly" dt:type="int"/>
	<ElementType name="bRepeat" content="textOnly" dt:type="boolean"/>
	<ElementType name="bTrade" content="textOnly" dt:type="boolean"/>
	<ElementType name="bDisable" content="textOnly" dt:type="boolean"/>
	<ElementType name="bGoodyTech" content="textOnly" dt:type="boolean"/>
	<ElementType name="bExtraWaterSeeFrom" content="textOnly" dt:type="boolean"/>
	<ElementType name="bMapCentering" content="textOnly" dt:type="boolean"/>
	<ElementType name="bMapVisible" content="textOnly" dt:type="boolean"/>
	<ElementType name="bMapTrading" content="textOnly" dt:type="boolean"/>
	<ElementType name="bTechTrading" content="textOnly" dt:type="boolean"/>
	<ElementType name="bGoldTrading" content="textOnly" dt:type="boolean"/>
	<ElementType name="bOpenBordersTrading" content="textOnly" dt:type="boolean"/>
	<ElementType name="bDefensivePactTrading" content="textOnly" dt:type="boolean"/>
	<ElementType name="bPermanentAllianceTrading" content="textOnly" dt:type="boolean"/>
	<ElementType name="bVassalTrading" content="textOnly" dt:type="boolean"/>
	<ElementType name="bBridgeBuilding" content="textOnly" dt:type="boolean"/>
	<ElementType name="bIrrigation" content="textOnly" dt:type="boolean"/>
	<ElementType name="bIgnoreIrrigation" content="textOnly" dt:type="boolean"/>
	<ElementType name="bWaterWork" content="textOnly" dt:type="boolean"/>
	<ElementType name="iGridX" content="textOnly" dt:type="int"/>
	<ElementType name="iGridY" content="textOnly" dt:type="int"/>
	<ElementType name="DomainType" content="textOnly"/>
	<ElementType name="iExtraMoves" content="textOnly" dt:type="int"/>
	<ElementType name="DomainExtraMove" content="eltOnly">
		<element type="DomainType"/>
		<element type="iExtraMoves"/>
	</ElementType>
	<ElementType name="DomainExtraMoves" content="eltOnly">
		<element type="DomainExtraMove" minOccurs="0" maxOccurs="*"/>
	</ElementType>
	<ElementType name="bFlexible" content="textOnly" dt:type="boolean"/>
	<ElementType name="CommerceFlexible" content="eltOnly">
		<element type="bFlexible" minOccurs="0" maxOccurs="*"/>
	</ElementType>
	<ElementType name="bRiverTrade" content="textOnly" dt:type="boolean"/>
	<ElementType name="TerrainType" content="textOnly"/>
	<ElementType name="bTerrainTrade" content="textOnly" dt:type="boolean"/>
	<ElementType name="TerrainTrade" content="eltOnly">
		<element type="TerrainType"/>
		<element type="bTerrainTrade"/>
	</ElementType>
	<ElementType name="TerrainTrades" content="eltOnly">
		<element type="TerrainTrade" minOccurs="0" maxOccurs="*"/>
	</ElementType>
	<ElementType name="SpecialBuildingType" content="textOnly"/>
	<ElementType name="bSpecialBuilding" content="textOnly" dt:type="boolean"/>
	<ElementType name="SpecialBuilding" content="eltOnly">
		<element type="SpecialBuildingType"/>
		<element type="bSpecialBuilding"/>
	</ElementType>
	<ElementType name="FlavorType" content="textOnly"/>
	<ElementType name="iFlavor" content="textOnly" dt:type="int"/>
	<ElementType name="Flavor" content="eltOnly">
		<element type="FlavorType"/>
		<element type="iFlavor"/>
	</ElementType>
	<ElementType name="Flavors" content="eltOnly">
		<element type="Flavor" minOccurs="0" maxOccurs="*"/>
	</ElementType>
	<ElementType name="PrereqTech" content="textOnly"/>
	<ElementType name="OrPreReqs" content="eltOnly">
		<element type="PrereqTech" minOccurs="0" maxOccurs="*"/>
	</ElementType>
	<ElementType name="AndPreReqs" content="eltOnly">
		<element type="PrereqTech" minOccurs="0" maxOccurs="*"/>
	</ElementType>
	<ElementType name="Quote" content="textOnly"/>
	<ElementType name="Sound" content="textOnly"/>
	<ElementType name="SoundMP" content="textOnly"/>
	<ElementType name="Button" content="textOnly"/>
	<ElementType name="PrereqReligion" content="textOnly"/>
	<ElementType name="TechInfo" content="eltOnly">
		<element type="Type"/>
[COLOR="Red"]		<element type="Description" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="Civilopedia" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="Help" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="Strategy" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="Advisor" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="iAIWeight" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="iAITradeModifier" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="iCost" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="iAdvancedStartCost" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="iAdvancedStartCostIncrease" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="Era" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="FirstFreeUnitClass" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="iFeatureProductionModifier" minOccurs="0"/>
		<element type="iWorkerSpeedModifier" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="iTradeRoutes" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="iHealth" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="iHappiness" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="iFirstFreeTechs" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="iAsset" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="iPower" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="bRepeat" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="bTrade" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="bDisable" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="bGoodyTech" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="bExtraWaterSeeFrom" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="bMapCentering" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="bMapVisible" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="bMapTrading" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="bTechTrading" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="bGoldTrading" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="bOpenBordersTrading" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="bDefensivePactTrading" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="bPermanentAllianceTrading" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="bVassalTrading" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="bBridgeBuilding" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="bIrrigation" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="bIgnoreIrrigation" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="bWaterWork" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="iGridX" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="iGridY" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="DomainExtraMoves" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="CommerceFlexible" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="TerrainTrades" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="bRiverTrade" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="Flavors" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="OrPreReqs" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="AndPreReqs" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="Quote" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="Sound" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="SoundMP" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="Button" [COLOR="#00ffff"]minOccurs="0"[/COLOR]/>
		<element type="PrereqReligion" [COLOR="Cyan"]minOccurs="0"[/COLOR]/>
[/COLOR]	</ElementType>
	<ElementType name="TechInfos" content="eltOnly">
		<element type="TechInfo" maxOccurs="*"/>
	</ElementType>
	<ElementType name="Civ4TechInfos" content="eltOnly">
		<element type="TechInfos" minOccurs="0" maxOccurs="*"/>
	</ElementType>
</Schema>

Changed XML for Arcane Lore
Code:
<?xml version="1.0"?>
<!-- Created with the FfH editor by Kael -->
<!-- Sid Meier's Civilization 4 -->
<!-- Copyright Firaxis Games 2005 -->
<!-- -->
<!-- Tech Infos -->
<Civ4TechInfos xmlns="x-schema:Test_CIV4TechnologiesSchema.xml">
    <TechInfos>
        <TechInfo>
            <Type>TECH_ARCANE_LORE</Type>
            <iCost>6</iCost>
        </TechInfo>
    </TechInfos>
</Civ4TechInfos>

Doing this caused some pieces to be blipped out, as mentioned before, but it DID connect it to the original Arcane Lore entry and change the Cost :) So once you figure out what elements are required to be entered you can minimize how much you have to overwrite with the module.

If it wasn't for the PreReqOr also screwing up I would think that it was a matter of the order they are listed in the original Schema, but since that isn't the case you'll have to be very careful with this one, since a lot of the information isn't actually shown in the game anywhere (AI weights and Flavors and whatnot)
 
Yea I would love to make it modular but it does seem like doing it while changing the entire techtree wouldn't make much sense even if it worked as a module. I think it may actually make more sense *not* to be modular since then modules can load over the base changes. I already am maintaining two variants - a vanilla and one with Fall Further included.

However, the final changes are referencing other files (promotions, buildings) as I balance. I'm wondering if I can make those changes modular and not the core change to the tree... one way to find out (=

Thanks for your help, btw - that example below is useful, and I forgot about all the hidden entries. I don't think I'd want to risk that... 'Govannan, why are the Bannor focusing on Ashen Veil?' 'They just are, son, they just are.'... etc. (;

I should also mention that if you are changing the majority of the entries in one of the XMLs you should probably not bother being modular, as you then are not very compatible with other Modules, nor changes in the base Mod. It hadn't dawned on me earlier that you are most likely going to be changing EVERY technology if you are moving where they show up in the Tech Tree. This is one of the reasons I really wish that it was possible to set up a module that only contains the elements which you actually changed, instead of the entire entry.
 
Got a chance to play tonight and I was running all of my Modules under Fall Further, plus Mailbox's Improvements Module.

Turns out that the "More Animals" module isn't quite compatible with Mailbox's Improvements. You wind up with some odd things, like Lion Dens which upgrade to Sawmills and Ancient Towers which Upgrade to Metropoli. Meanwhile a Village doesn't upgrade at all, and Towns upgrade to Towns.

So, that's all I noticed, but it was enough to realize that you cannot quite run both at once. My advice for any interested in both modules is to just remove the Improvements section from More Animals. It should still work fine, there just won't be any Lairs for the new animal types, which isn't too much of an issue really. I'll probably nix them on my own if I cannot find an easy way to make them compatible, as I would like to allow all Modules to run at once (well, all of them which I like to use anyway ;P)
 
Could you list the modules you play (and have found to be compatible)?

And just curious: why do you think adding your Lairs to the Improvements file would mess up Mailbox's module? What if the two files were manually merged?
 
Manual merge of them should work decently well. But you have to add all of the lairs to the very end of the file or you risk messing things up.

Right now I am playing with all of my modules + Mailbox's Improvements Module. Haven't really had a chance to test the others, but there is NO chance for the Gamespeeds module to conflict with any others so far. Tarque's Modules ought to work fairly well with most other things as well, but I haven't tested them out quite yet.
 
Tarque's Modules ought to work fairly well with most other things as well, but I haven't tested them out quite yet.

I was thinking, btw, of starting a "no conflicts" pack. Mostly units and buildings, probably, since they generally won't conflict with anything if you avoid the need for a civilizationinfos file.

I'd include a version of "Holy Warriors", for example, that only added units rather than altering Paladins, Druids and Eidolons. And I'd include a version of the Elohim Griffons that made them built from buildings that are Elohim-only in unmodded FFH2.

The goal is that people could open up the file and just copy over the folders of the items they want without ever worrying about conflicts.

I'll have to see if I feel like making more units, though, and what others make available. I might look at past mods and see what could be used, too.
 
Tried it over the weekend and everything seems to work. Have not seen many Lairs, but there was a Wolf cave so that seems OK. No odd upgrades, but I still have not got to the point of having a Metropolis.
 
Xienwolf,

How serious is this problem with Vista? I'm getting a new PC and it will come with Vista already installed.
 
Xienwolf,

How serious is this problem with Vista? I'm getting a new PC and it will come with Vista already installed.

Hmm - have you asked them if you can upgrade it to XP?

The problems are numerous and as yet - mostly unsolved.
 
According to one guy it seemed that as long as you set your .ini to NOT use modular loading it works pretty much perfectly.

And of course that makes no sense.


Worst case scenario is that you would just have to manually merge changes into your main files. Shouldn't be too hard since it'll just be cut & paste for the most part thankfully. Art files might need retargeted, but should be fine if you don't move the new graphics at all.


Also most of the discussion about Vista not working were from before the UAC issue was fully discovered, so that might clear up the Module problem as well. We'd need someone to try it (and you just volunteered! :p)
 
The new PC came and Vista was already installed. My vendor said XP was no longer an option, so I guess I'm stuck. I'm slowing getting it beat into submission.

I have installed Microsoft's Vista updates, Civ, BtS, FFH .31e, and the Modular mod. When I set Modular XML Loading to '1' I cannot load FFH. With it set to '0' it works OK.

I don't know about the UAC issue or what needs to be done about it, but I am willing to try.

One other thing I encountered was that in setting up my map using Sto's Archipelago mapgen, I could only set a couple of options at a time. If I tried to set too many, the game terminated. But I could come back and find them set properly and then set some more. This also worked if I started the game and then exited to the Main Menu. I don't know what Sto's doing here but it could be a related problem.

I know my way around XML, so I'll have no problem incorporating the new features into the FFH XML files. I assume that I should also replace DLL as required by the Workers mod. But what should I do with the Schema changes and the additions to the base CIV4 files? And what do I do when more than one module has a replacement for the same file?
 
For Worker mod you will need the new DLL and the new Schema files. In that case though you can just overwrite the old Schema files and it will work fine. For Modules you are dealing with small bits of the total XML file, so you can just toss them all into the corresponding non-Module file and it'll work fine. If it alters something already existing in the game, overwrite the old entry. If it adds something new, place it at the end of the file as a new entry (or wherever you want really. Most of them are alphabetical at present).

You might also need to disable the UAC. This tells you about it
 
Thanks so much. As far as I can tell, my edits are working. I read about the UAC and that was helpful for dealing with Vista, but what's not clear is whether turning it off will make Module loading work again. Is that so?
 
One other thing I encountered was that in setting up my map using Sto's Archipelago mapgen, I could only set a couple of options at a time. If I tried to set too many, the game terminated. But I could come back and find them set properly and then set some more. This also worked if I started the game and then exited to the Main Menu. I don't know what Sto's doing here but it could be a related problem.

That's pretty common, actually. Any mapgen that provides a lot of options runs into this issue. Although, now that I think about it, it's more an issue of changing too many options, so I think it might happen for 'normal' maps too if you keep changing one option over and over again.
 
I'm not sure if this is the right place to post, but I am trying to make a modular mod and am having a problem.

I am adding a new civilization with a new units, wonder, techs, civics etc.
I have figured most of it out and managed to get almost everything in game. However, when the modular xml's load, it seems to not be able to find my modular text file or some of the custom art I added. It is finding the art_defines xml's because some of my additions work, but nothing with non-original art(I know they work though because I had everything working when they were merged with the original xml files).

Anyone help would be appreciated. Thanks.
 
Back
Top Bottom