• Which the release of FS2020 we see an explosition of activity on the forun and of course we are very happy to see this. But having all questions about FS2020 in one forum becomes a bit messy. So therefore we would like to ask you all to use the following guidelines when posting your questions:

    • Tag FS2020 specific questions with the MSFS2020 tag.
    • Questions about making 3D assets can be posted in the 3D asset design forum. Either post them in the subforum of the modelling tool you use or in the general forum if they are general.
    • Questions about aircraft design can be posted in the Aircraft design forum
    • Questions about airport design can be posted in the FS2020 airport design forum. Once airport development tools have been updated for FS2020 you can post tool speciifc questions in the subforums of those tools as well of course.
    • Questions about terrain design can be posted in the FS2020 terrain design forum.
    • Questions about SimConnect can be posted in the SimConnect forum.

    Any other question that is not specific to an aspect of development or tool can be posted in the General chat forum.

    By following these guidelines we make sure that the forums remain easy to read for everybody and also that the right people can find your post to answer it.

Attitude indicator locking knob

Messages
37
Country
hungary
Hi Folks

I need help... ☺️
I have a correct attitude indicator code, the instrument works well, but I need to make a lock lever/knob that locking the whole instrument independently from any circumstances such as battery voltage or suction.
For the attitude indicator I use the following code:

<UseTemplate Name="ASOBO_INSTRUMENT_AttitudeIndicator_Template">
<USE_FLAG/>
<HIGHLIGHT_NODE_ID>INSTRUMENT_AttitudeIndicator_Highlight_1</HIGHLIGHT_NODE_ID>
<USE_SUCTION_PRESSURE_CHECK/>
<USE_LINEAR_VALUES>True</USE_LINEAR_VALUES>
<NO_CAGE/>
<KNOB_HIGHLIGHT_NODE_ID>INSTRUMENT_AttitudeIndicator_Knob_Visual_1</KNOB_HIGHLIGHT_NODE_ID>
<BARS_INVERT_ANIM>False</BARS_INVERT_ANIM>
</UseTemplate>

Could someone please write me a short code for the locking lever? ☺️ Thanks in advance
 
I wasn't going to copy/paste CGPT on Discord, but I'll do it here. You're welcome to try this, I'd be curious if it worked. Generally, if I name all my nodes and animations, it gets me in the ballpark. CGPT has defined the nodes here. You can see that your attitude indicator component does not reference a locking lever or animation, so CGPT chose literal interpretations. I personally use exact matches for each for simplicity, you'll have to edit the component or your assigned names.

XML:
<Component ID="Locking_Lever" Node="Locking_Lever_Node">
    <UseTemplate Name="ASOBO_INSTRUMENT_AttitudeIndicator_Template">
        <USE_FLAG>False</USE_FLAG>
        <HIGHLIGHT_NODE_ID>Locking_Lever_Highlight</HIGHLIGHT_NODE_ID>
        <USE_SUCTION_PRESSURE_CHECK>False</USE_SUCTION_PRESSURE_CHECK>
        <USE_LINEAR_VALUES>True</USE_LINEAR_VALUES>
        <NO_CAGE>True</NO_CAGE>
        <KNOB_HIGHLIGHT_NODE_ID>Locking_Lever_Knob</KNOB_HIGHLIGHT_NODE_ID>
        <BARS_INVERT_ANIM>False</BARS_INVERT_ANIM>
    </UseTemplate>
    <UseTemplate Name="ASOBO_GT_Switch_Code">
        <ANIM_NAME>Locking_Lever_Anim</ANIM_NAME>
        <ANIM_LENGTH>100</ANIM_LENGTH>
        <ANIM_CODE>(L:Locking_Lever_State, bool) 100 *</ANIM_CODE>
        <LEFT_SINGLE_CODE>
            (L:Locking_Lever_State, bool) ! (>L:Locking_Lever_State, bool)
        </LEFT_SINGLE_CODE>
        <STATE1_TEST>(L:Locking_Lever_State, bool) 0 ==</STATE1_TEST>
        <STATE2_TEST>(L:Locking_Lever_State, bool) 1 ==</STATE2_TEST>
        <ANIMTIP_0>@TT_Package.TOOLTIPTEXT_LEVER_UNLOCKED</ANIMTIP_0>
        <ANIMTIP_1>@TT_Package.TOOLTIPTEXT_LEVER_LOCKED</ANIMTIP_1>
        <TOOLTIP_TITLE>@TT_Package.TOOLTIPTEXT_LOCKING_LEVER</TOOLTIP_TITLE>
    </UseTemplate>
</Component>

lever.png
 
Thank you very much, I'll try it as soon as I can (tomorrow morning at the earliest, unfortunately - I'm working until then).
This surprised me, but it's good to know that CGPT can do this! 🙂
 
Well let's not give it too much credit, I liken it to a word processor. Basically it mines all the published examples and uses the thinnest of "logic" algorithms to distill the most appealing result. So by "getting me into the ballpark," it will come up with a component that mostly works that I can maybe tweak just a bit to my liking. I think wording the question is important, terms like "MSFS 2020" or "flight simulator" are irrelevant because it's unique enough, but you have to be precise and carefully check each line, because CGPT will just start riffing off key without warning if you let it.
 
I wasn't going to copy/paste CGPT on Discord, but I'll do it here. You're welcome to try this, I'd be curious if it worked. Generally, if I name all my nodes and animations, it gets me in the ballpark. CGPT has defined the nodes here. You can see that your attitude indicator component does not reference a locking lever or animation, so CGPT chose literal interpretations. I personally use exact matches for each for simplicity, you'll have to edit the component or your assigned names.

XML:
<Component ID="Locking_Lever" Node="Locking_Lever_Node">
    <UseTemplate Name="ASOBO_INSTRUMENT_AttitudeIndicator_Template">
        <USE_FLAG>False</USE_FLAG>
        <HIGHLIGHT_NODE_ID>Locking_Lever_Highlight</HIGHLIGHT_NODE_ID>
        <USE_SUCTION_PRESSURE_CHECK>False</USE_SUCTION_PRESSURE_CHECK>
        <USE_LINEAR_VALUES>True</USE_LINEAR_VALUES>
        <NO_CAGE>True</NO_CAGE>
        <KNOB_HIGHLIGHT_NODE_ID>Locking_Lever_Knob</KNOB_HIGHLIGHT_NODE_ID>
        <BARS_INVERT_ANIM>False</BARS_INVERT_ANIM>
    </UseTemplate>
    <UseTemplate Name="ASOBO_GT_Switch_Code">
        <ANIM_NAME>Locking_Lever_Anim</ANIM_NAME>
        <ANIM_LENGTH>100</ANIM_LENGTH>
        <ANIM_CODE>(L:Locking_Lever_State, bool) 100 *</ANIM_CODE>
        <LEFT_SINGLE_CODE>
            (L:Locking_Lever_State, bool) ! (>L:Locking_Lever_State, bool)
        </LEFT_SINGLE_CODE>
        <STATE1_TEST>(L:Locking_Lever_State, bool) 0 ==</STATE1_TEST>
        <STATE2_TEST>(L:Locking_Lever_State, bool) 1 ==</STATE2_TEST>
        <ANIMTIP_0>@TT_Package.TOOLTIPTEXT_LEVER_UNLOCKED</ANIMTIP_0>
        <ANIMTIP_1>@TT_Package.TOOLTIPTEXT_LEVER_LOCKED</ANIMTIP_1>
        <TOOLTIP_TITLE>@TT_Package.TOOLTIPTEXT_LOCKING_LEVER</TOOLTIP_TITLE>
    </UseTemplate>
</Component>
It does not seem to work unfortunately. The button animation runs all the way through, but the attitude indicator does not lock in his base point.
 

Attachments

  • Képernyőkép 2024-06-28 113523.png
    Képernyőkép 2024-06-28 113523.png
    629.1 KB · Views: 19
Awesome, I'm pretty sure the Cabri G2 SDK project has the exact same component, you could try that.
 
Awesome, I'm pretty sure the Cabri G2 SDK project has the exact same component, you could try that.
If I remember correctly I've already checked the Cabri's cage button, but the problem is that button only "resets" the animation, not locks it in his default position continously. I want the additude indicator to reset when the cage button is pulled out and stay that way until the cage button is pushed in again.

Of course I could be wrong about the Cabri, I'll have another look and check.
 
Simple attitude indicator template, which Cabri uses locks the animation at its position. You can try this edited version if you want.

XML:
<Component ID="Attitude">
    <UseTemplate Name="ASOBO_INSTRUMENT_AttitudeIndicator_Simple_Template">
        <ID>1</ID>
        <PITCH_DEGREES_NODE_ID>INSTRUMENT_AttitudeIndicator_Pitch_1</PITCH_DEGREES_NODE_ID>
        <PITCH_DEGREES_ANIM_NAME>INSTRUMENT_AttitudeIndicator_Pitch_1</PITCH_DEGREES_ANIM_NAME>
        <BANK_DEGREES_NODE_ID>INSTRUMENT_AttitudeIndicator_Bank_1</BANK_DEGREES_NODE_ID>
        <BANK_DEGREES_ANIM_NAME>INSTRUMENT_AttitudeIndicator_Bank_1</BANK_DEGREES_ANIM_NAME>
        <PITCH_MIN_VALUE>-60</PITCH_MIN_VALUE>
        <PITCH_MAX_VALUE>60</PITCH_MAX_VALUE>
        <USE_FLAG>True</USE_FLAG>
        <FLAG_NODE_ID>INSTRUMENT_AttitudeIndicator_Flag_1</FLAG_NODE_ID>
        <NO_BARS_POSITION_ANIMATION>True</NO_BARS_POSITION_ANIMATION>
        <USE_SUCTION_PRESSURE_CHECK>True</USE_SUCTION_PRESSURE_CHECK>
    </UseTemplate>
    <UseTemplate Name="ASOBO_INSTRUMENT_Knob_AttitudeCage_Template">
        <CAGE_ONLY_TRIGGER>True</CAGE_ONLY_TRIGGER>
        <NODE_ID>INSTRUMENT_AttitudeIndicator_Knob_1</NODE_ID>
        <ANIM_NAME_PULL>INSTRUMENT_AttitudeIndicator_Knob_Pull_1</ANIM_NAME_PULL>
        <ANIM_CODE>
            (L:AttitudeIndicator_Caged, bool)
            if{
                0 (>L:AttitudeIndicator_Pitch, degrees)
                0 (>L:AttitudeIndicator_Bank, degrees)
            }
        </ANIM_CODE>
    </UseTemplate>
</Component>
 
Simple attitude indicator template, which Cabri uses locks the animation at its position. You can try this edited version if you want.

XML:
<Component ID="Attitude">
    <UseTemplate Name="ASOBO_INSTRUMENT_AttitudeIndicator_Simple_Template">
        <ID>1</ID>
        <PITCH_DEGREES_NODE_ID>INSTRUMENT_AttitudeIndicator_Pitch_1</PITCH_DEGREES_NODE_ID>
        <PITCH_DEGREES_ANIM_NAME>INSTRUMENT_AttitudeIndicator_Pitch_1</PITCH_DEGREES_ANIM_NAME>
        <BANK_DEGREES_NODE_ID>INSTRUMENT_AttitudeIndicator_Bank_1</BANK_DEGREES_NODE_ID>
        <BANK_DEGREES_ANIM_NAME>INSTRUMENT_AttitudeIndicator_Bank_1</BANK_DEGREES_ANIM_NAME>
        <PITCH_MIN_VALUE>-60</PITCH_MIN_VALUE>
        <PITCH_MAX_VALUE>60</PITCH_MAX_VALUE>
        <USE_FLAG>True</USE_FLAG>
        <FLAG_NODE_ID>INSTRUMENT_AttitudeIndicator_Flag_1</FLAG_NODE_ID>
        <NO_BARS_POSITION_ANIMATION>True</NO_BARS_POSITION_ANIMATION>
        <USE_SUCTION_PRESSURE_CHECK>True</USE_SUCTION_PRESSURE_CHECK>
    </UseTemplate>
    <UseTemplate Name="ASOBO_INSTRUMENT_Knob_AttitudeCage_Template">
        <CAGE_ONLY_TRIGGER>True</CAGE_ONLY_TRIGGER>
        <NODE_ID>INSTRUMENT_AttitudeIndicator_Knob_1</NODE_ID>
        <ANIM_NAME_PULL>INSTRUMENT_AttitudeIndicator_Knob_Pull_1</ANIM_NAME_PULL>
        <ANIM_CODE>
            (L:AttitudeIndicator_Caged, bool)
            if{
                0 (>L:AttitudeIndicator_Pitch, degrees)
                0 (>L:AttitudeIndicator_Bank, degrees)
            }
        </ANIM_CODE>
    </UseTemplate>
</Component>
You're awesome! A million thanks, it works! :cool:
There is only one thing to do: define a starting position for the cage knob and the instrument itself. Currently, the knob is in the pressed-in position when loaded the sim and the instrument is fully pitch down, which is not correct.
I have played with these codes but they don't work for some reason:

<!-- ATTITUDE INSTRUMENT DEFAULT POSITION -->
<UseTemplate Name="ASOBO_GT_Update">
<FREQUENCY>18</FREQUENCY>
<UPDATE_ONCE>True</UPDATE_ONCE>
<UPDATE_CODE>
50 (&gt;L:INSTRUMENT_AttitudeIndicator_Pitch_1,number)
</UPDATE_CODE>
</UseTemplate>

<!-- ATTITUDE CAGE KNOB DEFAULT POSITION -->
<UseTemplate Name="ASOBO_GT_Update">
<FREQUENCY>18</FREQUENCY>
<UPDATE_ONCE>True</UPDATE_ONCE>
<UPDATE_CODE>
100 (&gt;L:INSTRUMENT_AttitudeIndicator_Knob_Pull_1,number)
</UPDATE_CODE>
</UseTemplate>

Have you any idea how can I solve this?
 
It seems odd that there would be a professional CGPT negotiator. When I work with it, there's no semblance of conversation, language allows me to assemble my thoughts and I'll cut it off instantly if it sidetracks. I recommend the subscription as it really speeds up answers and also to remind it to check the chat buffer so it remains consistent with your direction of development and status.

Notice how I just used your comment above edited for literal clarity.


neutral.png



XML:
<Component ID="Attitude">
    <UseTemplate Name="ASOBO_INSTRUMENT_AttitudeIndicator_Simple_Template">
        <ID>1</ID>
        <PITCH_DEGREES_NODE_ID>INSTRUMENT_AttitudeIndicator_Pitch_1</PITCH_DEGREES_NODE_ID>
        <PITCH_DEGREES_ANIM_NAME>INSTRUMENT_AttitudeIndicator_Pitch_1</PITCH_DEGREES_ANIM_NAME>
        <BANK_DEGREES_NODE_ID>INSTRUMENT_AttitudeIndicator_Bank_1</BANK_DEGREES_NODE_ID>
        <BANK_DEGREES_ANIM_NAME>INSTRUMENT_AttitudeIndicator_Bank_1</BANK_DEGREES_ANIM_NAME>
        <PITCH_MIN_VALUE>-60</PITCH_MIN_VALUE>
        <PITCH_MAX_VALUE>60</PITCH_MAX_VALUE>
        <USE_FLAG>True</USE_FLAG>
        <FLAG_NODE_ID>INSTRUMENT_AttitudeIndicator_Flag_1</FLAG_NODE_ID>
        <NO_BARS_POSITION_ANIMATION>True</NO_BARS_POSITION_ANIMATION>
        <USE_SUCTION_PRESSURE_CHECK>True</USE_SUCTION_PRESSURE_CHECK>
    </UseTemplate>
    <UseTemplate Name="ASOBO_INSTRUMENT_Knob_AttitudeCage_Template">
        <CAGE_ONLY_TRIGGER>True</CAGE_ONLY_TRIGGER>
        <NODE_ID>INSTRUMENT_AttitudeIndicator_Knob_1</NODE_ID>
        <ANIM_NAME_PULL>INSTRUMENT_AttitudeIndicator_Knob_Pull_1</ANIM_NAME_PULL>
        <ANIM_CODE>
            (L:AttitudeIndicator_Caged, bool)
            if{
                0 (>L:AttitudeIndicator_Pitch, degrees)
                0 (>L:AttitudeIndicator_Bank, degrees)
            }
        </ANIM_CODE>
    </UseTemplate>
    <!-- Set initial states when the aircraft is loaded -->
    <Component ID="SetInitialStates">
        <UseTemplate Name="ASOBO_GT_Update">
            <UPDATE_CODE>
                0 (>L:AttitudeIndicator_Pitch, degrees)
                0 (>L:AttitudeIndicator_Bank, degrees)
                0 (>L:AttitudeIndicator_Caged, bool)
            </UPDATE_CODE>
            <UPDATE_ONCE>True</UPDATE_ONCE>
        </UseTemplate>
    </Component>
</Component>
 
It seems odd that there would be a professional CGPT negotiator. When I work with it, there's no semblance of conversation, language allows me to assemble my thoughts and I'll cut it off instantly if it sidetracks. I recommend the subscription as it really speeds up answers and also to remind it to check the chat buffer so it remains consistent with your direction of development and status.

Notice how I just used your comment above edited for literal clarity.


View attachment 93039


XML:
<Component ID="Attitude">
    <UseTemplate Name="ASOBO_INSTRUMENT_AttitudeIndicator_Simple_Template">
        <ID>1</ID>
        <PITCH_DEGREES_NODE_ID>INSTRUMENT_AttitudeIndicator_Pitch_1</PITCH_DEGREES_NODE_ID>
        <PITCH_DEGREES_ANIM_NAME>INSTRUMENT_AttitudeIndicator_Pitch_1</PITCH_DEGREES_ANIM_NAME>
        <BANK_DEGREES_NODE_ID>INSTRUMENT_AttitudeIndicator_Bank_1</BANK_DEGREES_NODE_ID>
        <BANK_DEGREES_ANIM_NAME>INSTRUMENT_AttitudeIndicator_Bank_1</BANK_DEGREES_ANIM_NAME>
        <PITCH_MIN_VALUE>-60</PITCH_MIN_VALUE>
        <PITCH_MAX_VALUE>60</PITCH_MAX_VALUE>
        <USE_FLAG>True</USE_FLAG>
        <FLAG_NODE_ID>INSTRUMENT_AttitudeIndicator_Flag_1</FLAG_NODE_ID>
        <NO_BARS_POSITION_ANIMATION>True</NO_BARS_POSITION_ANIMATION>
        <USE_SUCTION_PRESSURE_CHECK>True</USE_SUCTION_PRESSURE_CHECK>
    </UseTemplate>
    <UseTemplate Name="ASOBO_INSTRUMENT_Knob_AttitudeCage_Template">
        <CAGE_ONLY_TRIGGER>True</CAGE_ONLY_TRIGGER>
        <NODE_ID>INSTRUMENT_AttitudeIndicator_Knob_1</NODE_ID>
        <ANIM_NAME_PULL>INSTRUMENT_AttitudeIndicator_Knob_Pull_1</ANIM_NAME_PULL>
        <ANIM_CODE>
            (L:AttitudeIndicator_Caged, bool)
            if{
                0 (>L:AttitudeIndicator_Pitch, degrees)
                0 (>L:AttitudeIndicator_Bank, degrees)
            }
        </ANIM_CODE>
    </UseTemplate>
    <!-- Set initial states when the aircraft is loaded -->
    <Component ID="SetInitialStates">
        <UseTemplate Name="ASOBO_GT_Update">
            <UPDATE_CODE>
                0 (>L:AttitudeIndicator_Pitch, degrees)
                0 (>L:AttitudeIndicator_Bank, degrees)
                0 (>L:AttitudeIndicator_Caged, bool)
            </UPDATE_CODE>
            <UPDATE_ONCE>True</UPDATE_ONCE>
        </UseTemplate>
    </Component>
</Component>
Unfortunately, this is not working for some reason. :(
Maybe I pasted it in the wrong place, I don't know. I had to split the previous xml code into two parts because of the electrical supply. Otherwise the locking button would only work when the power was on.

So the part with power ON:

<Component ID="INSTRUMENTS_Electrical">
<DefaultTemplateParameters>
<FAILURE>(B:ELECTRICAL_Avionics_Bus_1, Bool) 100 *</FAILURE>
<ANIM_LAG>100</ANIM_LAG>
</DefaultTemplateParameters>
.
.
.
<!-- ATTITUDE INDICATOR -->
<Component ID="Attitude">
<UseTemplate Name="ASOBO_INSTRUMENT_AttitudeIndicator_Simple_Template">
<ID>1</ID>
<PITCH_DEGREES_NODE_ID>INSTRUMENT_AttitudeIndicator_Pitch_1</PITCH_DEGREES_NODE_ID>
<PITCH_DEGREES_ANIM_NAME>INSTRUMENT_AttitudeIndicator_Pitch_1</PITCH_DEGREES_ANIM_NAME>
<BANK_DEGREES_NODE_ID>INSTRUMENT_AttitudeIndicator_Bank_1</BANK_DEGREES_NODE_ID>
<BANK_DEGREES_ANIM_NAME>INSTRUMENT_AttitudeIndicator_Bank_1</BANK_DEGREES_ANIM_NAME>
<PITCH_MIN_VALUE>-60</PITCH_MIN_VALUE>
<PITCH_MAX_VALUE>60</PITCH_MAX_VALUE>
<USE_FLAG>True</USE_FLAG>
<FLAG_NODE_ID>INSTRUMENT_AttitudeIndicator_Flag_1</FLAG_NODE_ID>
<NO_BARS_POSITION_ANIMATION>True</NO_BARS_POSITION_ANIMATION>
<USE_SUCTION_PRESSURE_CHECK>True</USE_SUCTION_PRESSURE_CHECK>
<KNOB_HIGHLIGHT_NODE_ID>INSTRUMENT_AttitudeIndicator_Knob_Visual_1</KNOB_HIGHLIGHT_NODE_ID>
</UseTemplate>
</Component>
.
.
.
etc etc.

And in the part without power (outside of INSTRUMENTS_Electrical component):

<!-- ATTITUDE INDICATOR CAGING -->
<UseTemplate Name="ASOBO_INSTRUMENT_Knob_AttitudeCage_Template">
<CAGE_ONLY_TRIGGER>True</CAGE_ONLY_TRIGGER>
<NODE_ID>INSTRUMENT_AttitudeIndicator_Knob_1</NODE_ID>
<ANIM_NAME_PULL>INSTRUMENT_AttitudeIndicator_Knob_Pull_1</ANIM_NAME_PULL>
<ANIM_CODE>
(L:AttitudeIndicator_Caged, bool)
if{
0 (>L:AttitudeIndicator_Pitch, degrees)
0 (>L:AttitudeIndicator_Bank, degrees)
}
</ANIM_CODE>
<!-- Set initial states when the aircraft is loaded -->
<Component ID="SetInitialStates">
<UseTemplate Name="ASOBO_GT_Update">
<UPDATE_CODE>
0 (>L:AttitudeIndicator_Pitch, degrees)
0 (>L:AttitudeIndicator_Bank, degrees)
0 (>L:AttitudeIndicator_Caged, bool)
</UPDATE_CODE>
<UPDATE_ONCE>True</UPDATE_ONCE>
</UseTemplate>
</Component>
</UseTemplate>

But the new code, wherever I copy it, has no effect. :confused:
I also tried CHATGPT but he doesn't undertand my wishes because produced a whole different thing that I wanted... o_O
 
It may represent the limits of the simple attitude indicator template. There is a complex attitude indicator template and there is also WASM to allow you to create an entire attitude indicator gauge logic and implement than through the AI model mesh.
 
It may represent the limits of the simple attitude indicator template. There is a complex attitude indicator template and there is also WASM to allow you to create an entire attitude indicator gauge logic and implement than through the AI model mesh.
Yes, maybe you have right. Unfortunately I have no experience in xml programming/coding therefore I must use templates and scanning forums and topics for help... :) :(
Thanks for all of your kind help!
 
You get tremendous support on the Discord channel. When I ask for help, I like to bring some scrap of production to the conversation. This is another way I use CGPT because it helps me articulate my ideas. Once I have a component that even closely matches my intention, I'll post it up there and ask what I did wrong. See, I'm exactly like you and I use CGPT to bridge that gap in skills. Additionally, because CGPT tends to lose focus, I have to proof read everything. I can read simple XML no problem for syntax and it's only the RPN and the function arguments I don't understand, but without having to directly learn RPN, it is coming to me through repetition. So besides just using CGPT to make my components, it is also teaching me to compose components.

All I am saying is try. Once you get a scrap of code you can take it to the experts.
 
Yes, you may be right. Thanks for the advice, it may indeed be more useful and quicker to solve the problem if I ask my question with a half-finished code.
So far, I have no experience in asking questions to ChatGPT in a way that actually creates FS-related code, not just some generic xml. But thanks to you, I'm starting to understand that now.
So it's not out of the question that we'll meet again here, or on that Discord channel ;)😁
 
Back
Top