Inactive [ADMN/DEV] PermissionsEx (PEX) v1.19.5 - Tomorrow is Today! [1.4.6-R0.1]

Discussion in 'Inactive/Unsupported Plugins' started by t3hk0d3, May 21, 2011.

  1. Offline

    t3hk0d3

    [​IMG]
    Version: 1.19.5

    PLEASE USE BUKKIT-DEV FORUM FOR DISCUSSION/HELP
    http://dev.bukkit.org/server-mods/permissionsex/
    THANKS IN ADVANCE.

    PermissionsEx (PEX) is a new permissions plugin, based on Permissions ideas and supports all of its features. But PEX is more! It offers different backends, powerful ingame management, fine grained restrictions for world modification.

    [​IMG]

    Current features
    1. Bukkit Permissions (SuperPerms) compatible.
    2. Several backend support. Currently bundled backends is File (YAML) and SQL (MySQL, SQLite). Also it's possible to add your own.
    3. YAML backend, with new, fully rethinked, config schema. Now all user, groups and their permissions are stored in one file - permission.yml. BTW file name is adjustable too.
    4. SQL backend, most delicious. Currently MySQL and SQLite supported, but other DB (like Postgre) are possible too. PEX deploys the DB scheme (tables and initial data) automatically. This means, that you only need to provide data on how to connect to the db, everything else PEX will handle by itself.
    5. Flexible architecture and API - you can change a lot programmatically.
    6. Compatibility layer with TheYeti's Permissions (2.7.4) (as a separate part of the plugin). In most cases plugins, which use Permissions, will alsowork with PEX also.
    7. Rich chat/console command interface. You can do almost everything ingame. Command list below.
    8. Modifyworld - Embedded restrictions mechanism (we call it "modifyworld"), which provides the possibility to control players abilities, such as destroying/placing blocks, riding carts/boats or even getting spotted by mobs and much more. Disabled by default.
    9. Multigroup inheritance. User, as well as Group, can be member of several groups. And inherit their permissions, options and prefix/suffix.
    10. Permissions based upon Regular Expressions. This mean you can use regular expressions. Example: modifyworld.blocks.(destroy|place).(3|12) - this permission allow place or destroy only sand (12) or dirt (3) blocks. There is still limitation on dot usage in your regexps - dots are escaped by default.
    11. Multiworld permissions. Just don't specify world and permission would work in any world.
    12. Multiworld inheritance. You can inherit different groups in different worlds.
    13. Easy migration from Permissions 2.x. Converter for both YAML and SQL are embedded into PermissionsCompat. Just use simple instruction.
    14. Perfomance friendly. Low-level caching helps alot when you have 100+ online users :)
    15. Promotional/Demotional system. You can assign ranks to groups and promote/demote users to higher/lower ranked group.
    16. World-inheritance - permissions/option of one world can be inherited by another world.
    17. Timed Permissions - you can give user permission only for some amount of time.
    18. Chat Manager - small chat plugin, bundled with PEX. With prefixes/suffiex and colors. Check wiki for more details.


    Documentation
    Wiki

    Basic setup tutorial (Thanks to lycano)

    Nice tutorial made by Bennetman


    Download
    Stable version

    Development version (mostly stable) - always lastest dev build.

    Sources
    https://github.com/PEXPlugins

    Builds
    http://webbukkit.org:8080/

    Maven Repository
    http://repo.tehkode.ru/browse/ru.tehkode

    IRC
    Join us on #permissionsex, irc.esper.net. Feel free to ask any related questions.

    Tools !NEW!
    Pex Auto-Setup Tool - MySQL and FlatFile !


    Changelog
    Show Changelog (open)
    v1.19.5
    Proper intervals for timed commands (both group/permissions management), without pesky seconds calculations (like /pex user t3hk0d3 timed add cool.permission 10days)
    Bugfixes.
    1.4.6 compatibility.


    v1.19.4
    Built for Bukkit 1.4.2-R0.1
    Added inventory permissions (modifyworld.items.put/take.<item>.of.<chest>)
    Added item hold permission (modifyworld.items.hold.<item>)
    Sdded monster egg spawn permission (modifyworld.spawn.<creature>)
    Few other minor fixes
    v.1.19.3
    Modifyworld improvements (configurable messages, now independent from PEX)
    /pex help command
    Minor improvements and bugfixes
    v.1.19.2
    New modifyworld permissions
    Some bugfixes
    v.1.19.1
    Bugfix release
    v1.19
    Bukkit R6 compatible.
    Several bugfixes!
    Permissions now case-insensetive.
    v1.18
    Users logging and cleanup feature.
    Non-inheriting nodes feature.
    Several Bugfixes.
    PermissionsCompat is finally remove from default bundle.
    v1.17
    User/group specific management permissions (permissions.manage.group.Admin)
    Fixed some superperms compatibility issues
    Fixed several bugs
    v1.16
    SuperPerms compatbility bridge were rewritten - no lags anymore and now with debug output (now you can view superperms checks).
    Numerous of bugs were fixed (Thanks you guys for reporting them)
    Modifyworld were improved (modifyworld.item.use)
    v1.15
    Compatiblity for 1317+
    Fixed perfomance issues with SuperPerms (if you still experience they try to disable "raw-permissions" in config.yml)
    Fixed issue with prefix inheritance
    v1.14
    Improved Options mechanism.
    Auto saving new users feature, disabled by default.
    SuperPerms bridge improved - more permissions supported by wildcards.
    File backend dumping now fully functional. SQL dumping is still bogus (do not dump world-specific inheritance and prefixes), will be fixed soon.
    Many bugfixes and minor improvements.
    v1.13
    Superperms (BukkitPerms) support
    Multiworld inheritance and prefixes/suffixes
    Groups weighting
    ChatManager, chat plugin which bundled with PEX.
    Modifyworld now separate plugin, but still bundled with PEX.
    API changed slightly, CustomEvents (PermissionsEntityEvent, PermissionsSystemEvent) introduced.
    Many lesser improvements and tons of bugfixes.
    v1.12
    API get slightly improved
    Ranking ladders.
    User/group name case-insensetivity.
    World-inheritance.
    Timed permissions.
    Modifyworld rules are get improved.
    Tons of minor improvements and bugfixes.
    v1.11
    Many bugfixes and improvements.
    MySQL connection stability improved - reconnection mechanism.
    v1.10
    Promotional/Demotional system.
    Perfomance improvement, with new low-level caching system (thx Joy)
    Modifyworld improved.
    Many lesser improvements and bugfixes.
    v1.06
    New p2compat backend, for easy migration from Permissions 2.x to PEX.
    v1.05
    Users/Groups dumping (pex dump <backend> <file>).
    New commands pex promote/demote. Actually this is just aliases for "pex user group set/remove"
    Few bugfixes.
    v1.04
    Players now can be informed about changes (has been added to group, changed permission/option). Disabled by default - set "permissions.informplayers.changes" to "true"
    Config node "permissions.verbose", which responsible for player informing about modifyworld restrictions has been renamed to "permissions.infromplayers.modifyworld".
    Autocomplete has been improved.
    New command "pex config <node> [value]". This command help to manipulate configuration file (config.yml) from console/chat interface.
    Many bugfixes.
    v1.03
    Autocomplete for users (taken from registred users and online users) and groups names.
    New command for user removing (pex user <user> delete)
    Fixed several nasty bugs. Thanks for bugreports!
    v1.02
    Compatibility layer loading order issue fixed. Now most of plugins should work.
    Tested with new CB 803 build.
    v1.01
    Regular expression permissions support.
    Newer permissions now added above (bugfix).
    Several bugfixes.
    v1.00
    Initial public release.
     
    BRampersad, grid21, MrRazull and 71 others like this.
  2. Offline

    joshcvb

    Does anyone have a good example of their permissions.yml? I have around 5 user groups and over 300 permission nodes that i'm trying to write up now, I just wana compare mine to make sure i'm on the right track. I was using Permisions 3
     
  3. Offline

    GameCharmer

    Just installed this on a heavily modified server and it's running GREAT! Thanks for the most awesome permissions mod ever!
     
  4. Offline

    Terry Tibbs

    Code:
    08:33:13 [INFO] [Modifyworld] Modifyworld disabled. Check config.yml!
    08:33:13 [INFO] [Modifyworld] Modifyworld disabled!
    Why do I get this even though I have
    Code:
        permissions.modifyworld.enable: true
    set in my config.yml?
     
  5. Offline

    Ketrel

    Separate folder for ModifyWorld with it's own config.yml, enable it there.
     
    Terry Tibbs likes this.
  6. Offline

    Terry Tibbs

    Gah, I see it now. Pardon me for not doing my research.
     
  7. Offline

    Jekotia

    How would I use this with SuperPerms built-in commands? Specifically, I'm trying to grant craftbukkit.command.list and craftbukkit.command.ban to user groups.
     
  8. Offline

    Kane

    @t3hk0d3

    I have a big big request. More and More of my players would like to have a guest system on Godcraft. The problem is right now is we use a whitelist system with over 1500 on this list.

    This what we use: http://forums.bukkit.org/threads/admn-gen-whitelist-v2-7-935.587/

    Then we have a vip/donators permissions script that is over 1500 lines. Yes I know I could do sql for permissionsex but because of how complex the nature is and our limited php scripting we would have to remove and add vip members daily many times daily from sql and it's a pain in the ass since we have no way of generating a list of who to remove but only the full list of who there is.

    This means yaml is still our best thing yet.

    I was wondering if maybe there was a way to add a permissionsex special user list to a new yml file that admins could load and of course still loading permissions.yml. But let the admin decide to load what users first for example:

    Load groups
    Load common (whitelist users)
    Load the rest of the users.

    With yaml duplication is perfectly fine but it takes what was last used for that player into account.


    This seams to be a really easy and great solution but not sure if you be willing.

    Thanks,
    Kane



    PS: Or a whitelist module that works with permissionsex and rather then just being a whitelist on and off you can also set anyone in the whitelist to a certain group right away. Meaning all whitelist members = members unless stated in the permissions.yml and allow the admin to enable guest access or not.
     
  9. Offline

    Elerador

    Great plugin, but I have 2 simple ideas for the ingame-ui:
    1. Option for changing the color (/pex users, currently &2, I would prefer &6).
    2. Spout-support: little popups - [​IMG] , [​IMG], [​IMG], etc. .
     
  10. Thank you for a very nice plugin. Just switched from permissions 3
     
  11. Offline

    skeletonofchaos

    Now does this directly effect the super permissions od does it provide it's own permission structure?
     
  12. Offline

    suicidal_banana

    For that #1; its
    Code:
    /pex group [groupname] prefix &6
    /pex user [username] prefix &6
    Now, if you please, dear t3hk0d3, ive been running your plugin for a while, and really cant think of the words to express my gratitude, so uh, add a donate button! <3 you deserve beer! (if old enough ofc, else soda i guess)
     
  13. Offline

    Don Redhorse

    hmm and how do I do that if I have the xxx.* permission in a group?
     
  14. Offline

    Elerador

     
  15. Offline

    t3hk0d3


    There is already whitelist feature in modifyworld.
    Take a look on modifyworld.login permission.
    You have to enable whitelist: true property in plugins/Modifyworld/config.yml to make it work.

    https://github.com/t3hk0d3/PermissionsEx/wiki/Modifyworld

    This mean what specific negated nodes should be above related wildcard permissions

    both.

    haha, i prefer cognac or vodka :3

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: May 15, 2016
  16. Sorry to repost, but i am really having trouble with the multiworld support, what i want is different permissions in different worlds, e.g people can spawn in one world, but not the other,
    Is this possible?
    Thanks.
     
  17. Offline

    ereldak

    My problem is related to this one : I use MySQL to store perms. I'm trying to allow user Guest to interact with everything, except Chest, Dispenser and Furnace. I tried :
    -a lower id for the perms -modifyworld.blocks.interact.54 than the perms modifyworld.blocks.interact.*
    -A parent having modifyworld.blocks.interact.*, and Guest with the negate node.
    -Regex : modifyworld.blocks.interact.(!(54|62|23))

    Nothing work. Any idea?

    For the reste, thanks for this plugin, a really good wiki, very simple to use and to link with a website.


    RTFM guy ;)
    Found in the wiki, modifyWorld page :
    modifyworld.login Allow/disallow a user/group to join your server. You need whitelist: true to make it work.
    With the following command (found in wiki=>command=>groups commande) :
    pex group <group> add <permission> [world]

    So you can do :
    pex group Guest add modifyworld.login MyAllowWorld

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: May 15, 2016
  18. Is it possible for you to show me an example config, so you mean you do this in the actual permissions config or in-game?
    Thanks alot for replying btw :)
     
  19. Offline

    t3hk0d3

    -modifyworld.blocks.interact.(54|62|23)
    modifyworld.blocks.interact.*
     
  20. Offline

    ereldak

    Already tried, this is my log of the command pex user ereldak (If it can help you) :
    Code:
    [/FONT][/COLOR]
    21:29:17 [INFO] ereldak are member of:
    21:29:17 [INFO]    Visiteur (rank 100 @ default)
    21:29:17 [INFO] ereldak's permissions:
    21:29:17 [INFO]    -modifyworld.blocks.interact.(54|62|23) @common (from Visiteur)
    21:29:17 [INFO]    modifyworld.vehicle.destroy @common (from Visiteur)
    21:29:17 [INFO]    modifyworld.vehicle.enter @common (from Visiteur)
    21:29:17 [INFO]    modifyworld.tame.* @common (from Visiteur)
    21:29:17 [INFO]    modifyworld.mobtarget.* @common (from Visiteur)
    21:29:17 [INFO]    modifyworld.items.* @common (from Visiteur)
    21:29:17 [INFO]    modifyworld.usebeds @common (from Visiteur)
    21:29:17 [INFO]    modifyworld.chat.private @common (from Visiteur)
    21:29:17 [INFO]    modifyworld.chat @common (from Visiteur)
    21:29:17 [INFO]    essentials.spawn @common (from Visiteur)
    21:29:17 [INFO]    essentials.msg @common (from Visiteur)
    21:29:17 [INFO]    essentials.rules @common (from Visiteur)
    21:29:17 [INFO]    essentials.suicide @common (from Visiteur)
    21:29:17 [INFO]    PrressurePort.Use @common (from Visiteur)
    21:29:17 [INFO]    war.player @common (from Visiteur)
    21:29:17 [INFO]    modifyworld.login @common (from Visiteur)
    21:29:17 [INFO]    modifyworld.damage.* @common (from Visiteur)
    21:29:17 [INFO]    modifyworld.interact.* @common (from Visiteur)
    21:29:17 [INFO]    modifyworld.vehicle.collide @common (from Visiteur)
    21:29:17 [INFO]    modifyworld.blocks.interact.* @common (from Visiteur)
    21:29:17 [INFO] ereldak's options:
    
    [FONT=Georgia]
    [/CODE][/FONT]
     
  21. Offline

    t3hk0d3

    Oh sorry, my bad.

    -modifyworld.blocks.interact.(54|chest|62|furnace|23|dispenser)
     
  22. Offline

    ereldak

    Near of the perfect. The exact node is
    -modifyworld.blocks.interact.(54|chest|61|furnace|23|dispenser)
    But (of course^^), it allow guest to open Burning furnace (id 62). Do you have the response?

    EDIT : Auto-response, the string is simply burningfurnace
     
  23. Offline

    1hacker

    Um, I don't think I understand that. What I was trying to say was, you must put the negated permissions before the wildcard permission. The order is important.

    This will work:
    - -mychat.kick
    - mychat.*

    This will not work:
    - mychat.*
    - -mychat.kick
     
  24. Offline

    ereldak

    That's exactly it ihacker.

    Because, the plugin works (I think) as follow :
    Check, point by point, if the permissions allow the action (positive node) or forbid (neg node).
    So, in your first prop, you see firstly that's it's forbidden, it will forbid wuthout checking the rest.

    In the second, it will see that it's allow, and don't check the rest.
     
  25. Offline

    efstajas

    Oh wait... I can use this like permissions 3 but it supports the official SuperPerms? With * nodes and all?
     
  26. So very close to using this, if I can figure out what is causing this...
    Code:
    02:13:06 [SEVERE] Could not pass event BLOCK_BREAK to Permissions
    java.lang.NullPointerException
            at com.nijiko.permissions.Control.getGroups(Control.java:620)
            at com.nijikokun.bukkit.Permissions.Listener.onBlockBreak(Listener.java:61)
            at org.bukkit.plugin.java.JavaPluginLoader$37.execute(JavaPluginLoader.java:497)
            at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:58)
            at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:338)
            at net.minecraft.server.ItemInWorldManager.c(ItemInWorldManager.java:157)
            at net.minecraft.server.ItemInWorldManager.a(ItemInWorldManager.java:121)
            at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:481)
            at net.minecraft.server.Packet14BlockDig.a(SourceFile:42)
            at net.minecraft.server.NetworkManager.b(NetworkManager.java:226)
            at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:89)
            at net.minecraft.server.NetworkListenThread.a(SourceFile:105)
            at net.minecraft.server.MinecraftServer.h(MinecraftServer.java:454)
            at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:363)
            at net.minecraft.server.ThreadServerApplication.run(SourceFile:422)
    02:13:11 [SEVERE] Could not pass event BLOCK_PLACE to Permissions
    java.lang.NullPointerException
            at com.nijiko.permissions.Control.getGroups(Control.java:620)
            at com.nijikokun.bukkit.Permissions.Listener.onBlockPlace(Listener.java:43)
            at org.bukkit.plugin.java.JavaPluginLoader$29.execute(JavaPluginLoader.java:441)
            at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:58)
            at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:338)
            at org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(CraftEventFactory.java:90)
            at org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(CraftEventFactory.java:74)
            at net.minecraft.server.ItemBlock.a(ItemBlock.java:85)
            at net.minecraft.server.ItemStack.placeItem(ItemStack.java:56)
            at net.minecraft.server.ItemInWorldManager.interact(ItemInWorldManager.java:223)
            at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:573)
            at net.minecraft.server.Packet15Place.a(SourceFile:57)
            at net.minecraft.server.NetworkManager.b(NetworkManager.java:226)
            at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:89)
            at net.minecraft.server.NetworkListenThread.a(SourceFile:105)
            at net.minecraft.server.MinecraftServer.h(MinecraftServer.java:454)
            at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:363)
            at net.minecraft.server.ThreadServerApplication.run(SourceFile:422)
    Using the PermissionsEX.jar, Permissions.jar compatibility layer, and ModifyWorld.

    I seem to attract these errors that no one else in the forum seems to have reported. :p
     
  27. Offline

    efstajas

    Trying some things with this, I always get "Permissions manager is not accessable. Is the PermissionsEx plugin enabled?" errors. On page 3 or 4 it says that this is due a bad yaml... Here's my config:
    *snap*
    What's wrong?!
    Edit.: Oh, I see, there are four spaces too much in front of the nodes... sorry
    Edit 2: Still the same error, what's wrong? :/
    Code:
    groups:
        VIP:
            options:
                rank: '800'
        Gehilfe:
            options:
                rank: '1000'
        Builder:
            options:
                rank: '700'
            default: true
            permissions:
            - lockette.user.create.*
            - falsebook.blocks.gate
            - iConomyChestShop.shop.create
            - iConomyChestShop.shop.buy
            - iConomyChestShop.shop.sell
            - iConomyChestShop.command.iteminfo
            - falsebook.blocks.lift
            - warpz0r.warp
            - warpz0r.home
            - warpz0r.sethome
            - iConomy.payment
            - iConomy.rank
            - iConomy.top
            worlds:
                world:
                    permissions:
                    - *
                    - -logblock.*
                    - -iConomy.*
                    - -thunderjoin.join
                    - -colorme.*
                    - -worldguard.*
                    - -worldedit.*
                    - -falsebook.*
                    - worldedit.navigation.*
                    - -iWarning.*
                    - -bb.
                Sky:
                    permissions:
                    - *
                    - -iConomy.*
                    - -thunderjoin.join
                    - -colorme.*
                    - -worldguard.god
                    - warpz0r.*
                    - -worldedit.*
                    - worldedit.navigation.*
                    - -iWarning.*
                    - -bb.*
                    - -logblock.*
                    - -falsebook.*
        Imperator: {}
        Admin:
            options:
                rank: '900'
    
    The permissions listed under permissions should be for the main world and in the other worlds, the permissions under worlds: should be used.

    Is there a way to use one config per world? I think this would be much easier.
     
  28. Offline

    mdt7734

    Using the modifyworld plugin itself, can you set an option to disable the damage that creepers do to blocks, but still allow them to damage players?

    If so, I can get rid of my anticreeper plugin.
     
  29. Offline

    Don Redhorse

    Or I do... you don't :)

    but is more a hypothetical (?) question...

    Group1:
    - -mychat.kick

    Group2:
    - mychat.*

    user:
    - Group1
    - Group2
    OR

    user:
    - Group2
    - Group1

    will that work? How will it work if I specify the wildcard at user level and the negate at group or vice versa?

    BTW: Thanks to both for your replies
     
  30. Offline

    Julianoz1224

    Whenever I use a command I get "An Internal Error Occurred while attempting this command"
    and if I do the command in the console I get:
    >pex backend file
    13:51:38 [INFO] Error during backend initialization.
    13:51:38 [SEVERE] java.lang.RuntimeException: Permissions manager is not accessa
    ble. Is the PermissionsEx plugin enabled?
    13:51:38 [SEVERE] at ru.tehkode.permissions.bukkit.PermissionsEx.getPermis
    sionManager(PermissionsEx.java:140)
    13:51:38 [SEVERE] at ru.tehkode.permissions.bukkit.commands.UtilityCommand
    s.setBackend(UtilityCommands.java:104)
    13:51:38 [SEVERE] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native M
    ethod)
    13:51:38 [SEVERE] at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown S
    ource)
    13:51:38 [SEVERE] at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unkno
    wn Source)
    13:51:38 [SEVERE] at java.lang.reflect.Method.invoke(Unknown Source)
    13:51:38 [SEVERE] at ru.tehkode.permissions.commands.CommandsManager$Comma
    ndBinding.call(CommandsManager.java:291)
    13:51:38 [SEVERE] at ru.tehkode.permissions.commands.CommandsManager.execu
    te(CommandsManager.java:120)
    13:51:38 [SEVERE] at ru.tehkode.permissions.bukkit.PermissionsEx.onCommand
    (PermissionsEx.java:123)
    13:51:38 [SEVERE] at org.bukkit.command.PluginCommand.execute(PluginComman
    d.java:35)
    13:51:38 [SEVERE] at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCo
    mmandMap.java:129)
    13:51:38 [SEVERE] at org.bukkit.craftbukkit.CraftServer.dispatchCommand(Cr
    aftServer.java:344)
    13:51:38 [SEVERE] at net.minecraft.server.MinecraftServer.b(MinecraftServe
    r.java:489)
    13:51:38 [SEVERE] at net.minecraft.server.MinecraftServer.h(MinecraftServe
    r.java:468)
    13:51:38 [SEVERE] at net.minecraft.server.MinecraftServer.run(MinecraftSer
    ver.java:363)
    13:51:38 [SEVERE] at net.minecraft.server.ThreadServerApplication.run(Sour
    ceFile:422)
    >

    Can someone please help me?
     
  31. Offline

    oglop

    Hello, I tried this plugin bcz of Permissons are now inactive I'm new in MC servers but I think Permissions was easier to understad.
    I don't know how the users are stored in permissions.yml file ..
    I tried it in with default config and I though it will write new users automaticly into that file but nothing happed.
    I don't want to use ingame commands, bcz I it is slow for me
    Do I have to add users by my own?
    Thank you
     

Share This Page