From 485838ffe21c858a6e3a4b1b4bd215df7cfb501a Mon Sep 17 00:00:00 2001
From: Griatch
aliases = ['ls', 'l']¶aliases = ['l', 'ls']¶
aliases = ['batchcommand', 'batchcmd']¶aliases = ['batchcmd', 'batchcommand']¶
aliases = ['parent', 'swap', 'type', 'update']¶aliases = ['swap', 'update', 'type', 'parent']¶
aliases = ['exam', 'ex']¶aliases = ['ex', 'exam']¶
aliases = ['search', 'locate']¶aliases = ['locate', 'search']¶
aliases = ['chanalias', 'aliaschan']¶aliases = ['aliaschan', 'chanalias']¶
aliases = ['delaliaschan', 'delchanalias']¶aliases = ['delchanalias', 'delaliaschan']¶
aliases = ['chanlist', 'channellist', 'clist', 'all channels', 'comlist']¶aliases = ['channellist', 'all channels', 'comlist', 'clist', 'chanlist']¶
aliases = ['ls', 'l']¶aliases = ['l', 'ls']¶
aliases = ['nicks', 'nickname']¶aliases = ['nickname', 'nicks']¶
aliases = ['"', "'"]¶aliases = ["'", '"']¶
aliases = ['listobjs', 'db', 'stats', 'listobjects']¶aliases = ['stats', 'db', 'listobjs', 'listobjects']¶
aliases = ['serverload', 'serverprocess']¶aliases = ['serverprocess', 'serverload']¶
aliases = ['con', 'conn', 'co']¶aliases = ['co', 'con', 'conn']¶
aliases = ['cr', 'cre']¶aliases = ['cre', 'cr']¶
aliases = ['?', 'h']¶aliases = ['h', '?']¶
aliases = ['deal', 'offers']¶aliases = ['offers', 'deal']¶
aliases = ['ls', 'l']¶aliases = ['l', 'ls']¶
aliases = ['con', 'conn', 'co']¶aliases = ['co', 'con', 'conn']¶
aliases = ['cr', 'cre']¶aliases = ['cre', 'cr']¶
aliases = ['?', 'h']¶aliases = ['h', '?']¶
aliases = ['ls', 'l']¶aliases = ['l', 'ls']¶
aliases = ['@callback', '@callbacks', '@calls']¶aliases = ['@callbacks', '@callback', '@calls']¶
aliases = ['"', "'"]¶aliases = ["'", '"']¶
aliases = ['wait', 'hold']¶aliases = ['hold', 'wait']¶
aliases = ['wait', 'hold']¶aliases = ['hold', 'wait']¶
aliases = ['wait', 'hold']¶aliases = ['hold', 'wait']¶
aliases = ['wait', 'hold']¶aliases = ['hold', 'wait']¶
aliases = ['wait', 'hold']¶aliases = ['hold', 'wait']¶
aliases = ['push', 'press button', 'press']¶
aliases = ['open button', 'open']¶
aliases = ['feel', 'ex', 'listen', 'l', 'get', 'examine']¶
aliases = ['pull', 'move', 'shiftroot', 'push']¶aliases = ['shiftroot', 'pull', 'push', 'move']¶
aliases = ['press button', 'push button', 'button']¶aliases = ['button', 'press button', 'push button']¶
aliases = ['fight', 'stab', 'pierce', 'bash', 'chop', 'thrust', 'kill', 'slash', 'parry', 'hit', 'defend']¶aliases = ['slash', 'bash', 'chop', 'kill', 'defend', 'fight', 'stab', 'hit', 'parry', 'thrust', 'pierce']¶
aliases = ['ls', 'l']¶aliases = ['l', 'ls']¶
aliases = ['?', 'h']¶aliases = ['h', '?']¶
aliases = ['fiddle', 'feel around', 'feel', 'l', 'search']¶aliases = ['feel', 'feel around', 'fiddle', 'search', 'l']¶
aliases = [':dd', ':I', '::', ':DD', ':y', ':fd', ':S', ':!', ':i', ':s', ':::', ':A', ':<', ':', ':UU', ':h', ':u', ':wq', ':uu', ':fi', ':echo', ':q', ':w', ':>', ':f', ':p', ':r', ':j', ':x', ':=', ':dw', ':q!']¶aliases = [':y', ':fd', ':r', ':', ':s', '::', ':u', ':echo', ':fi', ':=', ':::', ':uu', ':A', ':f', ':wq', ':p', ':UU', ':I', ':<', ':S', ':h', ':w', ':dw', ':>', ':!', ':x', ':q!', ':i', ':q', ':dd', ':DD', ':j']¶
aliases = ['a', 'top', 't', 'end', 'b', 'quit', 'abort', 'back', 'q', 'n', 'e', 'next']¶aliases = ['next', 't', 'abort', 'n', 'back', 'top', 'q', 'b', 'end', 'e', 'quit', 'a']¶
search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n look while out-of-character\n\n Usage:\n look\n\n Look in the ooc state.\n '}¶search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n look while out-of-character\n\n Usage:\n look\n\n Look in the ooc state.\n '}¶
search_index_entry = {'aliases': 'remit pemit', 'category': 'admin', 'key': 'emit', 'tags': '', 'text': '\n admin command for emitting message to multiple objects\n\n Usage:\n emit[/switches] [<obj>, <obj>, ... =] <message>\n remit [<obj>, <obj>, ... =] <message>\n pemit [<obj>, <obj>, ... =] <message>\n\n Switches:\n room - limit emits to rooms only (default)\n accounts - limit emits to accounts only\n contents - send to the contents of matched objects too\n\n Emits a message to the selected objects or to\n your immediate surroundings. If the object is a room,\n send to its contents. remit and pemit are just\n limited forms of emit, for sending to rooms and\n to accounts respectively.\n '}¶search_index_entry = {'aliases': 'pemit remit', 'category': 'admin', 'key': 'emit', 'tags': '', 'text': '\n admin command for emitting message to multiple objects\n\n Usage:\n emit[/switches] [<obj>, <obj>, ... =] <message>\n remit [<obj>, <obj>, ... =] <message>\n pemit [<obj>, <obj>, ... =] <message>\n\n Switches:\n room - limit emits to rooms only (default)\n accounts - limit emits to accounts only\n contents - send to the contents of matched objects too\n\n Emits a message to the selected objects or to\n your immediate surroundings. If the object is a room,\n send to its contents. remit and pemit are just\n limited forms of emit, for sending to rooms and\n to accounts respectively.\n '}¶
search_index_entry = {'aliases': 'delete del', 'category': 'building', 'key': 'destroy', 'tags': '', 'text': '\n permanently delete objects\n\n Usage:\n destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]\n\n Switches:\n override - The destroy command will usually avoid accidentally\n destroying account objects. This switch overrides this safety.\n force - destroy without confirmation.\n Examples:\n destroy house, roof, door, 44-78\n destroy 5-10, flower, 45\n destroy/force north\n\n Destroys one or many objects. If dbrefs are used, a range to delete can be\n given, e.g. 4-10. Also the end points will be deleted. This command\n displays a confirmation before destroying, to make sure of your choice.\n You can specify the /force switch to bypass this confirmation.\n '}¶search_index_entry = {'aliases': 'del delete', 'category': 'building', 'key': 'destroy', 'tags': '', 'text': '\n permanently delete objects\n\n Usage:\n destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]\n\n Switches:\n override - The destroy command will usually avoid accidentally\n destroying account objects. This switch overrides this safety.\n force - destroy without confirmation.\n Examples:\n destroy house, roof, door, 44-78\n destroy 5-10, flower, 45\n destroy/force north\n\n Destroys one or many objects. If dbrefs are used, a range to delete can be\n given, e.g. 4-10. Also the end points will be deleted. This command\n displays a confirmation before destroying, to make sure of your choice.\n You can specify the /force switch to bypass this confirmation.\n '}¶
search_index_entry = {'aliases': 'type parent update swap', 'category': 'building', 'key': 'typeclass', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object.\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}¶search_index_entry = {'aliases': 'parent swap update type', 'category': 'building', 'key': 'typeclass', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object.\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}¶
search_index_entry = {'aliases': 'exam ex', 'category': 'building', 'key': 'examine', 'tags': '', 'text': '\n get detailed information about an object\n\n Usage:\n examine [<object>[/attrname]]\n examine [*<account>[/attrname]]\n\n Switch:\n account - examine an Account (same as adding *)\n object - examine an Object (useful when OOC)\n\n The examine command shows detailed game info about an\n object and optionally a specific attribute on it.\n If object is not specified, the current location is examined.\n\n Append a * before the search string to examine an account.\n\n '}¶search_index_entry = {'aliases': 'ex exam', 'category': 'building', 'key': 'examine', 'tags': '', 'text': '\n get detailed information about an object\n\n Usage:\n examine [<object>[/attrname]]\n examine [*<account>[/attrname]]\n\n Switch:\n account - examine an Account (same as adding *)\n object - examine an Object (useful when OOC)\n\n The examine command shows detailed game info about an\n object and optionally a specific attribute on it.\n If object is not specified, the current location is examined.\n\n Append a * before the search string to examine an account.\n\n '}¶
search_index_entry = {'aliases': 'chanalias aliaschan', 'category': 'comms', 'key': 'addcom', 'tags': '', 'text': '\n add a channel alias and/or subscribe to a channel\n\n Usage:\n addcom [alias=] <channel>\n\n Joins a given channel. If alias is given, this will allow you to\n refer to the channel by this alias rather than the full channel\n name. Subsequent calls of this command can be used to add multiple\n aliases to an already joined channel.\n '}¶search_index_entry = {'aliases': 'aliaschan chanalias', 'category': 'comms', 'key': 'addcom', 'tags': '', 'text': '\n add a channel alias and/or subscribe to a channel\n\n Usage:\n addcom [alias=] <channel>\n\n Joins a given channel. If alias is given, this will allow you to\n refer to the channel by this alias rather than the full channel\n name. Subsequent calls of this command can be used to add multiple\n aliases to an already joined channel.\n '}¶
search_index_entry = {'aliases': 'delchanalias delaliaschan', 'category': 'comms', 'key': 'delcom', 'tags': '', 'text': "\n remove a channel alias and/or unsubscribe from channel\n\n Usage:\n delcom <alias or channel>\n delcom/all <channel>\n\n If the full channel name is given, unsubscribe from the\n channel. If an alias is given, remove the alias but don't\n unsubscribe. If the 'all' switch is used, remove all aliases\n for that channel.\n "}¶search_index_entry = {'aliases': 'delaliaschan delchanalias', 'category': 'comms', 'key': 'delcom', 'tags': '', 'text': "\n remove a channel alias and/or unsubscribe from channel\n\n Usage:\n delcom <alias or channel>\n delcom/all <channel>\n\n If the full channel name is given, unsubscribe from the\n channel. If an alias is given, remove the alias but don't\n unsubscribe. If the 'all' switch is used, remove all aliases\n for that channel.\n "}¶
aliases = ['all channels', 'comlist', 'chanlist', 'clist', 'channellist']¶aliases = ['clist', 'chanlist', 'comlist', 'all channels', 'channellist']¶
search_index_entry = {'aliases': 'all channels comlist chanlist clist channellist', 'category': 'comms', 'key': 'channels', 'tags': '', 'text': "\n list all channels available to you\n\n Usage:\n channels\n clist\n comlist\n\n Lists all channels available to you, whether you listen to them or not.\n Use 'comlist' to only view your current channel subscriptions.\n Use addcom/delcom to join and leave channels\n "}¶search_index_entry = {'aliases': 'clist chanlist comlist all channels channellist', 'category': 'comms', 'key': 'channels', 'tags': '', 'text': "\n list all channels available to you\n\n Usage:\n channels\n clist\n comlist\n\n Lists all channels available to you, whether you listen to them or not.\n Use 'comlist' to only view your current channel subscriptions.\n Use addcom/delcom to join and leave channels\n "}¶
search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look <obj>\n look *<account>\n\n Observes your location or objects in your vicinity.\n '}¶search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look <obj>\n look *<account>\n\n Observes your location or objects in your vicinity.\n '}¶
search_index_entry = {'aliases': ': emote', 'category': 'general', 'key': 'pose', 'tags': '', 'text': "\n strike a pose\n\n Usage:\n pose <pose text>\n pose's <pose text>\n\n Example:\n pose is standing by the wall, smiling.\n -> others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n "}¶search_index_entry = {'aliases': 'emote :', 'category': 'general', 'key': 'pose', 'tags': '', 'text': "\n strike a pose\n\n Usage:\n pose <pose text>\n pose's <pose text>\n\n Example:\n pose is standing by the wall, smiling.\n -> others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n "}¶
search_index_entry = {'aliases': 'serverprocess serverload', 'category': 'system', 'key': 'server', 'tags': '', 'text': "\n show server load and memory statistics\n\n Usage:\n server[/mem]\n\n Switches:\n mem - return only a string of the current memory usage\n flushmem - flush the idmapper cache\n\n This command shows server load statistics and dynamic memory\n usage. It also allows to flush the cache of accessed database\n objects.\n\n Some Important statistics in the table:\n\n |wServer load|n is an average of processor usage. It's usually\n between 0 (no usage) and 1 (100% usage), but may also be\n temporarily higher if your computer has multiple CPU cores.\n\n The |wResident/Virtual memory|n displays the total memory used by\n the server process.\n\n Evennia |wcaches|n all retrieved database entities when they are\n loaded by use of the idmapper functionality. This allows Evennia\n to maintain the same instances of an entity and allowing\n non-persistent storage schemes. The total amount of cached objects\n are displayed plus a breakdown of database object types.\n\n The |wflushmem|n switch allows to flush the object cache. Please\n note that due to how Python's memory management works, releasing\n caches may not show you a lower Residual/Virtual memory footprint,\n the released memory will instead be re-used by the program.\n\n "}¶search_index_entry = {'aliases': 'serverload serverprocess', 'category': 'system', 'key': 'server', 'tags': '', 'text': "\n show server load and memory statistics\n\n Usage:\n server[/mem]\n\n Switches:\n mem - return only a string of the current memory usage\n flushmem - flush the idmapper cache\n\n This command shows server load statistics and dynamic memory\n usage. It also allows to flush the cache of accessed database\n objects.\n\n Some Important statistics in the table:\n\n |wServer load|n is an average of processor usage. It's usually\n between 0 (no usage) and 1 (100% usage), but may also be\n temporarily higher if your computer has multiple CPU cores.\n\n The |wResident/Virtual memory|n displays the total memory used by\n the server process.\n\n Evennia |wcaches|n all retrieved database entities when they are\n loaded by use of the idmapper functionality. This allows Evennia\n to maintain the same instances of an entity and allowing\n non-persistent storage schemes. The total amount of cached objects\n are displayed plus a breakdown of database object types.\n\n The |wflushmem|n switch allows to flush the object cache. Please\n note that due to how Python's memory management works, releasing\n caches may not show you a lower Residual/Virtual memory footprint,\n the released memory will instead be re-used by the program.\n\n "}¶
search_index_entry = {'aliases': 'co conn con', 'category': 'general', 'key': 'connect', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect "account name" "pass word"\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}¶search_index_entry = {'aliases': 'con conn co', 'category': 'general', 'key': 'connect', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect "account name" "pass word"\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}¶
search_index_entry = {'aliases': 'cr cre', 'category': 'general', 'key': 'create', 'tags': '', 'text': '\n create a new account account\n\n Usage (at login screen):\n create <accountname> <password>\n create "account name" "pass word"\n\n This creates a new account account.\n\n If you have spaces in your name, enclose it in double quotes.\n '}¶search_index_entry = {'aliases': 'cre cr', 'category': 'general', 'key': 'create', 'tags': '', 'text': '\n create a new account account\n\n Usage (at login screen):\n create <accountname> <password>\n create "account name" "pass word"\n\n This creates a new account account.\n\n If you have spaces in your name, enclose it in double quotes.\n '}¶
search_index_entry = {'aliases': 'look l', 'category': 'general', 'key': '__unloggedin_look_command', 'tags': '', 'text': '\n look when in unlogged-in state\n\n Usage:\n look\n\n This is an unconnected version of the look command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}¶search_index_entry = {'aliases': 'l look', 'category': 'general', 'key': '__unloggedin_look_command', 'tags': '', 'text': '\n look when in unlogged-in state\n\n Usage:\n look\n\n This is an unconnected version of the look command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}¶
search_index_entry = {'aliases': 'deal offers', 'category': 'trading', 'key': 'status', 'tags': '', 'text': "\n show a list of the current deal\n\n Usage:\n status\n deal\n offers\n\n Shows the currently suggested offers on each sides of the deal. To\n accept the current deal, use the 'accept' command. Use 'offer' to\n change your deal. You might also want to use 'say', 'emote' etc to\n try to influence the other part in the deal.\n "}¶search_index_entry = {'aliases': 'offers deal', 'category': 'trading', 'key': 'status', 'tags': '', 'text': "\n show a list of the current deal\n\n Usage:\n status\n deal\n offers\n\n Shows the currently suggested offers on each sides of the deal. To\n accept the current deal, use the 'accept' command. Use 'offer' to\n change your deal. You might also want to use 'say', 'emote' etc to\n try to influence the other part in the deal.\n "}¶
search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n ooc look\n\n Usage:\n look\n look <character>\n\n This is an OOC version of the look command. Since an Account doesn\'t\n have an in-game existence, there is no concept of location or\n "self".\n\n If any characters are available for you to control, you may look\n at them with this command.\n '}¶search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n ooc look\n\n Usage:\n look\n look <character>\n\n This is an OOC version of the look command. Since an Account doesn\'t\n have an in-game existence, there is no concept of location or\n "self".\n\n If any characters are available for you to control, you may look\n at them with this command.\n '}¶
search_index_entry = {'aliases': 'co conn con', 'category': 'general', 'key': 'connect', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect <email> <password>\n\n Use the create command to first create an account before logging in.\n '}¶search_index_entry = {'aliases': 'con conn co', 'category': 'general', 'key': 'connect', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect <email> <password>\n\n Use the create command to first create an account before logging in.\n '}¶
search_index_entry = {'aliases': 'cr cre', 'category': 'general', 'key': 'create', 'tags': '', 'text': '\n Create a new account.\n\n Usage (at login screen):\n create "accountname" <email> <password>\n\n This creates a new account account.\n\n '}¶search_index_entry = {'aliases': 'cre cr', 'category': 'general', 'key': 'create', 'tags': '', 'text': '\n Create a new account.\n\n Usage (at login screen):\n create "accountname" <email> <password>\n\n This creates a new account account.\n\n '}¶
search_index_entry = {'aliases': 'look l', 'category': 'general', 'key': '__unloggedin_look_command', 'tags': '', 'text': '\n This is an unconnected version of the `look` command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}¶search_index_entry = {'aliases': 'l look', 'category': 'general', 'key': '__unloggedin_look_command', 'tags': '', 'text': '\n This is an unconnected version of the `look` command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}¶
search_index_entry = {'aliases': 'chicken out quit q abort', 'category': 'evscaperoom', 'key': 'give up', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}¶search_index_entry = {'aliases': 'abort chicken out quit q', 'category': 'evscaperoom', 'key': 'give up', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}¶
search_index_entry = {'aliases': 'ls l', 'category': 'evscaperoom', 'key': 'look', 'tags': '', 'text': '\n Look at the room, an object or the currently focused object\n\n Usage:\n look [obj]\n\n '}¶search_index_entry = {'aliases': 'l ls', 'category': 'evscaperoom', 'key': 'look', 'tags': '', 'text': '\n Look at the room, an object or the currently focused object\n\n Usage:\n look [obj]\n\n '}¶
search_index_entry = {'aliases': 'shout ; whisper', 'category': 'general', 'key': 'say', 'tags': '', 'text': '\n Perform an communication action.\n\n Usage:\n say <text>\n whisper\n shout\n\n '}¶search_index_entry = {'aliases': 'shout whisper ;', 'category': 'general', 'key': 'say', 'tags': '', 'text': '\n Perform an communication action.\n\n Usage:\n say <text>\n whisper\n shout\n\n '}¶
search_index_entry = {'aliases': ': pose', 'category': 'general', 'key': 'emote', 'tags': '', 'text': '\n Perform a free-form emote. Use /me to\n include yourself in the emote and /name\n to include other objects or characters.\n Use "..." to enact speech.\n\n Usage:\n emote <emote>\n :<emote\n\n Example:\n emote /me smiles at /peter\n emote /me points to /box and /lever.\n\n '}¶search_index_entry = {'aliases': 'pose :', 'category': 'general', 'key': 'emote', 'tags': '', 'text': '\n Perform a free-form emote. Use /me to\n include yourself in the emote and /name\n to include other objects or characters.\n Use "..." to enact speech.\n\n Usage:\n emote <emote>\n :<emote\n\n Example:\n emote /me smiles at /peter\n emote /me points to /box and /lever.\n\n '}¶
search_index_entry = {'aliases': 'examine ex unfocus e', 'category': 'evscaperoom', 'key': 'focus', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus <obj>\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}¶search_index_entry = {'aliases': 'e examine unfocus ex', 'category': 'evscaperoom', 'key': 'focus', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus <obj>\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}¶
search_index_entry = {'aliases': '@dig @open', 'category': 'general', 'key': 'open', 'tags': '', 'text': '\n Interact with an object in focus.\n\n Usage:\n <action> [arg]\n\n '}¶search_index_entry = {'aliases': '@open @dig', 'category': 'general', 'key': 'open', 'tags': '', 'text': '\n Interact with an object in focus.\n\n Usage:\n <action> [arg]\n\n '}¶
search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n look\n\n Usage:\n look\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects in your vicinity.\n '}¶search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'tags': '', 'text': '\n look\n\n Usage:\n look\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects in your vicinity.\n '}¶
search_index_entry = {'aliases': '@callbacks @callback @calls', 'category': 'building', 'key': '@call', 'tags': '', 'text': '\n Command to edit callbacks.\n '}¶search_index_entry = {'aliases': '@callback @callbacks @calls', 'category': 'building', 'key': '@call', 'tags': '', 'text': '\n Command to edit callbacks.\n '}¶
To access and manipulate traits on an object, its Typeclass needs to have a +
To access and manipulate traits on an entity, its Typeclass needs to have a TraitHandler assigned it. Usually, the handler is made available as .traits -(in the same way as .tags or .attributes).
+(in the same way as .tags or .attributes). It’s recommended to do this +using Evennia’s lazy_property (which basically just means it’s not +initialized until it’s actually accessed).Here’s an example for adding the TraitHandler to the base Object class:
---# mygame/typeclasses/objects.py +-# mygame/typeclasses/objects.py from evennia import DefaultObject from evennia.utils import lazy_property @@ -70,8 +71,6 @@ a server reload/reboot). return TraitHandler(self)After a reload you can now try adding some example traits:
Using traits¶
@@ -79,6 +78,7 @@ a server reload/reboot). as a property on the handler (similarly to how you can do .db.attrname for Attributes in Evennia).# this is an example using the "static" trait, described below + >>> obj.traits.add("hunting", "Hunting Skill", trait_type="static", base=4) >>> obj.traits.hunting.value 4 @@ -150,23 +150,18 @@ that varies slowly or not at all, and which may be modified in-place.+Counter¶
----
-- min/unset base base+mod max/unset
- -
-
-- |--------------|——–|---------X--------X------------|
- -
-
-- current value
- -
= current -+ mod
-A counter describes a value that can move from a base. The current property -is the thing usually modified. It starts at the base. One can also add a modifier, -which will both be added to the base and to current (forming .value). -The min/max of the range are optional, a boundary set to None will remove it.
+++min/unset base base+mod max/unset +|--------------|--------|---------X--------X------------| + current value + = current + + mod +A counter describes a value that can move from a base. The .current property +is the thing usually modified. It starts at the .base. One can also add a +modifier, which will both be added to the base and to current (forming +.value). The min/max of the range are optional, a boundary set to None will +remove it. A suggested use for a Counter Trait would be to track skill values.
>>> obj.traits.add("hunting", "Hunting Skill", trait_type="counter", base=10, mod=1, min=0, max=100) >>> obj.traits.hunting.value @@ -182,12 +177,14 @@ The min/max of the range are optional, a boundary set to None will remove it.Counters have some extra properties:
-descs is a dict {upper_bound:text_description}. This allows for easily +
+.descs¶
+The descs property is a dict {upper_bound:text_description}. This allows for easily storing a more human-friendly description of the current value in the interval. Here is an example for skill values between 0 and 10:
--+{0: “unskilled”, 1: “neophyte”, 5: “trained”, 7: “expert”, 9: “master”}
-+{0: "unskilled", 1: "neophyte", 5: "trained", 7: "expert", 9: "master"} +The keys must be supplied from smallest to largest. Any values below the lowest and above the highest description will be considered to be included in the closest description slot. By calling .desc() on the Counter, will you get the text matching the current value @@ -206,15 +203,16 @@ value.
"expert"-.rate¶
The rate property defaults to 0. If set to a value different from 0, it allows the trait to change value dynamically. This could be used for example for an attribute that was temporarily lowered but will gradually (or abruptly) -recover after a certain time. The rate is given as change of the current -per-second, and the .value will still be restrained by min/max boundaries, if -those are set.
-It is also possible to set a “.ratetarget”, for the auto-change to stop at +recover after a certain time. The rate is given as change of the current +.value per-second, and this will still be restrained by min/max boundaries, +if those are set.
+It is also possible to set a .ratetarget, for the auto-change to stop at (rather than at the min/max boundaries). This allows the value to return to a previous value.
->>> obj.traits.hunting.value @@ -237,16 +235,19 @@ a previous value. >>> obj.traits.hunting.rate = 0 # disable auto-changeNote that if rate is a non-integer, the resulting .value (at least until it -reaches the boundary) will likely also come out a float. If you expect an -integer, you must run run int() on the result yourself.
+Note that if .rate is a non-integer, the resulting .value (at least until it +reaches a boundary or rate-target) will also come out a float (so you can get a +very exact value at the current time). If you expect an integer, you must run +int() (or something like round()) on the result yourself.
-.percentage()¶
-If both min and max are defined, the .percentage() method of the trait will +
+.percent()¶
+If both min and max are defined, the .percent() method of the trait will return the value as a percentage.
-@@ -254,23 +255,18 @@ return the value as a percentage.>>> obj.traits.hunting.percentage() +>>> obj.traits.hunting.percent() "71.0%" +>>> obj.traits.hunting.percent(formatting=None) +71.0Gauge¶
This emulates a [fuel-] gauge that empties from a base+mod value.
----
-- min/0 max=base+mod
- -
-
-- |-----------------------X---------------------------|
- -
--value
-= current
-The ‘current’ value will start from a full gauge. The .max property is -read-only and is set by .base + .mod. So contrary to a Counter, the modifier -only applies to the max value of the gauge and not the current value. The -minimum bound defaults to 0. This trait is useful for showing resources that -can deplete, like health, stamina and the like.
+++min/0 max=base+mod + |-----------------------X---------------------------| + value + = current +The .current value will start from a full gauge. The .max property is +read-only and is set by .base + .mod. So contrary to a Counter, the +.mod modifier only applies to the max value of the gauge and not the current +value. The minimum bound defaults to 0 if not set explicitly.
+This trait is useful for showing commonly depletable resources like health, +stamina and the like.
->>> obj.traits.add("hp", "Health", trait_type="gauge", base=100) >>> obj.traits.hp.value # (or .current) 100 @@ -282,19 +278,22 @@ can deplete, like health, stamina and the like. 80Same as Counters, Gauges can also have descs to describe the interval and can also -have rate and ratetarget to auto-update the value. The rate is particularly useful -for gauges, for everything from poison slowly draining your health, to resting gradually -increasing it. You can also use the .percentage() function to show the current value -as a percentage.
+The Gauge trait is subclass of the Counter, so you have access to the same +methods and properties where they make sense. So gauges can also have a +.descs dict to describe the intervals in text, and can use .percent() to +get how filled it is as a percentage etc.
+The .rate is particularly relevant for gauges - useful for everything +from poison slowly draining your health, to resting gradually increasing it.
Trait¶
A single value of any type.
-This is the ‘base’ Trait, meant to inherit from if you want to make your own -trait-types (see below). Its .value can be anything (that can be stored in an Attribute) -and if it’s a integer/float you can do arithmetic with it, but otherwise it -acts just like a glorified Attribute.
+This is the ‘base’ Trait, meant to inherit from if you want to invent +trait-types from scratch (most of the time you’ll probably inherit from some of +the more advanced trait-type classes though). A Trait**s **.value can be +anything (that can be stored in an Attribute) and if it’s a integer/float you +can do arithmetic with it, but otherwise it acts just like a glorified +Attribute.
>>> obj.traits.add("mytrait", "My Trait", trait_type="trait", value=30) >>> obj.traits.mytrait.value 30 @@ -307,32 +306,37 @@ acts just like a glorified Attribute.Expanding with your own Traits¶
-A Trait is a class inhering from evennia.contrib.traits.Trait (or -from one of the existing Trait classes).
+A Trait is a class inhering from evennia.contrib.traits.Trait (or from one of +the existing Trait classes).
# in a file, say, 'mygame/world/traits.py' -from evennia.contrib.traits import Trait +from evennia.contrib.traits import StaticTrait -class RageTrait(Trait): +class RageTrait(StaticTrait): trait_type = "rage" default_keys = { "rage": 0 } + + def berserk(self): + self.mod = 100 + + def sedate(self): + self.mod = 0Above is an example custom-trait-class “rage” that stores a property “rage” on -itself, with a default value of 0. This has all the -functionality of a Trait - for example, if you do del on the rage property, it will be -set back to its default (0). If you wanted to customize what it does, you -just add rage property get/setters/deleters on the class.
+itself, with a default value of 0. This has all the functionality of a Trait - +for example, if you do del on the rage property, it will be set back to its +default (0). Above we also added some helper methods.To add your custom RageTrait to Evennia, add the following to your settings file (assuming your class is in mygame/world/traits.py):
--+TRAIT_CLASS_PATHS = [“world.traits.RageTrait”]
-+TRAIT_CLASS_PATHS = ["world.traits.RageTrait"] +Reload the server and you should now be able to use your trait:
->>> obj.traits.add("mood", "A dark mood", rage=30) +@@ -587,7 +591,7 @@ with no concept of a ‘current’ value. current value. The value can also be reset to the base value.>>> obj.traits.add("mood", "A dark mood", rage=30, trait_type='rage') >>> obj.traits.mood.rage 30diff --git a/docs/1.0-dev/api/evennia.contrib.tutorial_examples.red_button.html b/docs/1.0-dev/api/evennia.contrib.tutorial_examples.red_button.html index 6619433954..93d924f702 100644 --- a/docs/1.0-dev/api/evennia.contrib.tutorial_examples.red_button.html +++ b/docs/1.0-dev/api/evennia.contrib.tutorial_examples.red_button.html @@ -432,7 +432,7 @@ be mutually exclusive.
- min/unset base base+mod max/unset
-
diff --git a/docs/1.0-dev/api/evennia.contrib.turnbattle.tb_range.html b/docs/1.0-dev/api/evennia.contrib.turnbattle.tb_range.html index e2534cbfb4..8e6c82d133 100644 --- a/docs/1.0-dev/api/evennia.contrib.turnbattle.tb_range.html +++ b/docs/1.0-dev/api/evennia.contrib.turnbattle.tb_range.html @@ -1020,7 +1020,7 @@ if there are still any actions you can take.- |--------------|——–|---------X--------X------------|
+
diff --git a/docs/1.0-dev/api/evennia.contrib.turnbattle.tb_magic.html b/docs/1.0-dev/api/evennia.contrib.turnbattle.tb_magic.html index 81434b90e3..fc652d3b9b 100644 --- a/docs/1.0-dev/api/evennia.contrib.turnbattle.tb_magic.html +++ b/docs/1.0-dev/api/evennia.contrib.turnbattle.tb_magic.html @@ -593,7 +593,7 @@ if there are still any actions you can take.- |--------------|——–|---------X--------X------------|
- current value
- @@ -733,7 +737,7 @@ describe the interval.
= current + mod
This emulates a gauge-meter that empties from a base+mod value.
diff --git a/docs/1.0-dev/api/evennia.contrib.turnbattle.tb_items.html b/docs/1.0-dev/api/evennia.contrib.turnbattle.tb_items.html index c7258234b9..4ffb1a91f4 100644 --- a/docs/1.0-dev/api/evennia.contrib.turnbattle.tb_items.html +++ b/docs/1.0-dev/api/evennia.contrib.turnbattle.tb_items.html @@ -721,7 +721,7 @@ if there are still any actions you can take.
- min/0 max=base+mod
-
diff --git a/docs/1.0-dev/api/evennia.contrib.turnbattle.tb_equip.html b/docs/1.0-dev/api/evennia.contrib.turnbattle.tb_equip.html index 42a3a58f2c..5b9cd7b127 100644 --- a/docs/1.0-dev/api/evennia.contrib.turnbattle.tb_equip.html +++ b/docs/1.0-dev/api/evennia.contrib.turnbattle.tb_equip.html @@ -687,7 +687,7 @@ if there are still any actions you can take.- |-----------------------X---------------------------|
+- |-----------------------X---------------------------|
value
= current
@@ -868,8 +872,9 @@ returned.- Trait types
- Static trait
- Counter
- Gauge
diff --git a/docs/1.0-dev/api/evennia.contrib.turnbattle.tb_basic.html b/docs/1.0-dev/api/evennia.contrib.turnbattle.tb_basic.html index bc64ccbc3a..2fb1ae32c2 100644 --- a/docs/1.0-dev/api/evennia.contrib.turnbattle.tb_basic.html +++ b/docs/1.0-dev/api/evennia.contrib.turnbattle.tb_basic.html @@ -570,7 +570,7 @@ if there are still any actions you can take.@@ -591,7 +591,7 @@ if there are still any actions you can take.
- -
+search_index_entry= {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶search_index_entry= {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶@@ -708,7 +708,7 @@ if there are still any actions you can take.
- -
+search_index_entry= {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶search_index_entry= {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶@@ -742,7 +742,7 @@ if there are still any actions you can take.
- -
+search_index_entry= {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶search_index_entry= {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶@@ -614,7 +614,7 @@ if there are still any actions you can take.
- -
+search_index_entry= {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶search_index_entry= {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶@@ -1041,7 +1041,7 @@ if there are still any actions you can take.
- -
+search_index_entry= {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶search_index_entry= {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶+
aliases= ['ex', 'listen', 'get', 'examine', 'l', 'feel']¶@@ -458,7 +458,7 @@ be mutually exclusive.
diff --git a/docs/1.0-dev/api/evennia.contrib.tutorial_world.objects.html b/docs/1.0-dev/api/evennia.contrib.tutorial_world.objects.html index 4683cc487f..ce25e9df60 100644 --- a/docs/1.0-dev/api/evennia.contrib.tutorial_world.objects.html +++ b/docs/1.0-dev/api/evennia.contrib.tutorial_world.objects.html @@ -361,7 +361,7 @@ of the object. We overload it with our own version.+
search_index_entry= {'aliases': 'ex listen get examine l feel', 'category': 'general', 'key': 'look', 'tags': '', 'text': "\n Looking around in darkness\n\n Usage:\n look <obj>\n\n ... not that there's much to see in the dark.\n\n "}¶@@ -388,7 +388,7 @@ to sit on a “lightable” object, we operate only on self.obj.
@@ -492,7 +492,7 @@ shift green root up/down
- -
+search_index_entry= {'aliases': 'burn light', 'category': 'tutorialworld', 'key': 'on', 'tags': '', 'text': '\n Creates light where there was none. Something to burn.\n '}¶search_index_entry= {'aliases': 'light burn', 'category': 'tutorialworld', 'key': 'on', 'tags': '', 'text': '\n Creates light where there was none. Something to burn.\n '}¶@@ -528,7 +528,7 @@ yellow/green - horizontal roots
@@ -545,7 +545,7 @@ yellow/green - horizontal roots
- -
+search_index_entry= {'aliases': 'shiftroot pull push move', 'category': 'tutorialworld', 'key': 'shift', 'tags': '', 'text': '\n Shifts roots around.\n\n Usage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n '}¶search_index_entry= {'aliases': 'shiftroot push move pull', 'category': 'tutorialworld', 'key': 'shift', 'tags': '', 'text': '\n Shifts roots around.\n\n Usage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n '}¶
- -
+aliases= ['push button', 'press button', 'button']¶aliases= ['push button', 'button', 'press button']¶@@ -571,7 +571,7 @@ yellow/green - horizontal roots
@@ -715,7 +715,7 @@ parry - forgoes your attack but will make you harder to hit on next
- -
+search_index_entry= {'aliases': 'push button press button button', 'category': 'tutorialworld', 'key': 'press', 'tags': '', 'text': '\n Presses a button.\n '}¶search_index_entry= {'aliases': 'push button button press button', 'category': 'tutorialworld', 'key': 'press', 'tags': '', 'text': '\n Presses a button.\n '}¶
- -
+aliases= ['defend', 'pierce', 'chop', 'slash', 'bash', 'parry', 'stab', 'thrust', 'hit', 'kill', 'fight']¶aliases= ['kill', 'bash', 'thrust', 'pierce', 'parry', 'slash', 'chop', 'hit', 'defend', 'fight', 'stab']¶@@ -741,7 +741,7 @@ parry - forgoes your attack but will make you harder to hit on next
diff --git a/docs/1.0-dev/api/evennia.contrib.tutorial_world.rooms.html b/docs/1.0-dev/api/evennia.contrib.tutorial_world.rooms.html index 1726c15489..48a1ce50bd 100644 --- a/docs/1.0-dev/api/evennia.contrib.tutorial_world.rooms.html +++ b/docs/1.0-dev/api/evennia.contrib.tutorial_world.rooms.html @@ -184,7 +184,7 @@ code except for adding in the details.
- -
+search_index_entry= {'aliases': 'defend pierce chop slash bash parry stab thrust hit kill fight', 'category': 'tutorialworld', 'key': 'attack', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}¶search_index_entry= {'aliases': 'kill bash thrust pierce parry slash chop hit defend fight stab', 'category': 'tutorialworld', 'key': 'attack', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}¶@@ -199,7 +199,7 @@ code except for adding in the details.
@@ -865,7 +865,7 @@ to find something.
- -
+search_index_entry= {'aliases': 'ls l', 'category': 'tutorialworld', 'key': 'look', 'tags': '', 'text': '\n looks at the room and on details\n\n Usage:\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects\n in your vicinity.\n\n Tutorial: This is a child of the default Look command, that also\n allows us to look at "details" in the room. These details are\n things to examine and offers some extra description without\n actually having to be actual database objects. It uses the\n return_detail() hook on TutorialRooms for this.\n '}¶search_index_entry= {'aliases': 'l ls', 'category': 'tutorialworld', 'key': 'look', 'tags': '', 'text': '\n looks at the room and on details\n\n Usage:\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects\n in your vicinity.\n\n Tutorial: This is a child of the default Look command, that also\n allows us to look at "details" in the room. These details are\n things to examine and offers some extra description without\n actually having to be actual database objects. It uses the\n return_detail() hook on TutorialRooms for this.\n '}¶
- -
+aliases= ['fiddle', 'feel', 'l', 'search', 'feel around']¶aliases= ['feel around', 'fiddle', 'l', 'search', 'feel']¶@@ -893,7 +893,7 @@ random chance of eventually finding a light source.
diff --git a/docs/1.0-dev/api/evennia.html b/docs/1.0-dev/api/evennia.html index 79e286a4bb..a6a1583b5b 100644 --- a/docs/1.0-dev/api/evennia.html +++ b/docs/1.0-dev/api/evennia.html @@ -214,8 +214,9 @@ with ‘q’, remove the break line and restart server when finished.
- -
+search_index_entry= {'aliases': 'fiddle feel l search feel around', 'category': 'tutorialworld', 'key': 'look', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}¶search_index_entry= {'aliases': 'feel around fiddle l search feel', 'category': 'tutorialworld', 'key': 'look', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}¶- Trait types
- Static trait
- Counter
- Gauge
diff --git a/docs/1.0-dev/api/evennia.utils.eveditor.html b/docs/1.0-dev/api/evennia.utils.eveditor.html index bb17cc7d7f..da77b8506f 100644 --- a/docs/1.0-dev/api/evennia.utils.eveditor.html +++ b/docs/1.0-dev/api/evennia.utils.eveditor.html @@ -274,7 +274,7 @@ indentation.
- -
+aliases= [':>', ':', ':j', ':w', ':I', ':wq', ':DD', ':fd', ':uu', ':dw', ':dd', ':S', ':echo', ':i', ':=', ':!', ':<', ':fi', ':UU', ':p', ':f', ':x', ':h', ':y', ':::', ':u', ':q', '::', ':q!', ':r', ':A', ':s']¶aliases= [':A', ':!', ':dw', ':w', ':u', ':DD', ':<', ':>', ':y', ':S', ':j', ':echo', ':h', ':=', '::', ':wq', ':', ':uu', ':dd', ':UU', ':fi', ':q!', ':r', ':fd', ':x', ':::', ':i', ':s', ':p', ':q', ':I', ':f']¶@@ -302,7 +302,7 @@ efficient presentation.
diff --git a/docs/1.0-dev/api/evennia.utils.evmenu.html b/docs/1.0-dev/api/evennia.utils.evmenu.html index 179871e7c1..3a049a00a9 100644 --- a/docs/1.0-dev/api/evennia.utils.evmenu.html +++ b/docs/1.0-dev/api/evennia.utils.evmenu.html @@ -920,7 +920,7 @@ single question.
- -
+search_index_entry= {'aliases': ':> : :j :w :I :wq :DD :fd :uu :dw :dd :S :echo :i := :! :< :fi :UU :p :f :x :h :y ::: :u :q :: :q! :r :A :s', 'category': 'general', 'key': ':editor_command_group', 'tags': '', 'text': '\n Commands for the editor\n '}¶search_index_entry= {'aliases': ':A :! :dw :w :u :DD :< :> :y :S :j :echo :h := :: :wq : :uu :dd :UU :fi :q! :r :fd :x ::: :i :s :p :q :I :f', 'category': 'general', 'key': ':editor_command_group', 'tags': '', 'text': '\n Commands for the editor\n '}¶+
aliases= ['yes', 'n', 'y', 'a', 'no', '__nomatch_command', 'abort']¶@@ -946,7 +946,7 @@ single question.
@@ -1008,41 +1008,43 @@ the system to pause and wait for input from the player.+
search_index_entry= {'aliases': 'yes n y a no __nomatch_command abort', 'category': 'general', 'key': '__noinput_command', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶- Parameters
- +marker {options} which will be filled with ‘Y/N’, ‘[Y]/N’ or +‘Y/[N]’ depending on the setting of default. If allow_abort is set, +then the ‘A(bort)’ option will also be available.
prompt (str) – The yes/no question to ask. This takes an optional formatting -marker {suffix} which will be filled with ‘Y/N’, [Y]/N or Y/[N] -depending on the setting of default. If allow_abort, then the -A(bort) will also be available.
yes_action (callable or str) – If a callable, this will be called -with **(caller, *args, **kwargs) when the yes-choice is made. +with (caller, *args, **kwargs) when the Yes-choice is made. If a string, this string will be echoed back to the caller.
- -
no_action (callable or str) – If a callable, this will be called -with (caller, *args, **kwargs) when the no-choice is made. +with (caller, *args, **kwargs) when the No-choice is made. If a string, this string will be echoed back to the caller.
- -
default (str optional) – One of “N”, “Y”, “A” or None for no default. -If “A” is given, allow_abort is assumed set. The user can choose -the default option just by pressing return.
- +
allow_abort (bool, optional) – If set, the Q(uit) option is available, -which is neither yes or no.
- +
default (str optional) – This is what the user will get if they just press the +return key without giving any input. One of ‘N’, ‘Y’, ‘A’ or ‘None’ +for no default. If ‘A’ is given, allow_abort is auto-set.
allow_abort (bool, optional) – If set, the ‘A(bort)’ option is available +(a third option meaning neither yes or no but just exits the prompt).
- -
session (Session, optional) – This allows to specify the session to send the prompt to. It’s usually only needed if caller is an Account in multisession modes greater than 2. The session is then updated by the command and is available (for example in callbacks) through caller.ndb._yes_no_question.session.
- -
*args – These are passed into the callables, if any.
**kwargs –
These are passed into the callables, if any.
+- +
*args – These are passed into the callables.
**kwargs –
These are passed into the callables.
- Raises
-RuntimeError – If default and allow_abort clashes.
+RuntimeError, FooError – If default and allow_abort clashes.
Example
--
+- ask_yes_no(caller, “Are you happy {suffix}?”,
- -
“you answered yes”, “you answered no”)
-- ask_yes_no(caller, “Are you sad {suffix}?”,
- -
_callable_yes, _callable_no, allow_abort=True)
-+# just returning strings +ask_yes_no(caller, "Are you happy {options}?", + "you answered yes", "you answered no") +# trigger callables +ask_yes_no(caller, "Are you sad {options}?", + _callable_yes, _callable_no, allow_abort=True) +diff --git a/docs/1.0-dev/api/evennia.utils.evmore.html b/docs/1.0-dev/api/evennia.utils.evmore.html index 4b5921efef..67ea94b4eb 100644 --- a/docs/1.0-dev/api/evennia.utils.evmore.html +++ b/docs/1.0-dev/api/evennia.utils.evmore.html @@ -75,7 +75,7 @@ the caller.msg() construct every time the page is updated.
- -
+aliases= ['a', 'abort', 'e', 'quit', 'end', 'n', 'b', 't', 'next', 'q', 'top', 'back']¶aliases= ['back', 'end', 'top', 'b', 't', 'n', 'e', 'a', 'next', 'abort', 'q', 'quit']¶@@ -101,7 +101,7 @@ the caller.msg() construct every time the page is updated.
diff --git a/docs/1.0-dev/objects.inv b/docs/1.0-dev/objects.inv index f9e821f382d76710f83346d83548250d486ac0f4..f735c19f9242e4aaef8cc7ff6bf7db81f0e9be82 100644 GIT binary patch delta 34752 zcmXteV{|5Mux)JHwr$(CZBMK>wr$%^CYso`F|lpk`OZ1_Uw7A9y=!&VuG;lfU!;IP zq<}X}4FZCukc1X!$y3FRnPb<`t6nOsey(=6Z@pTkk#@&ag57Z@z}O&SEkP6(Qv71X ze-+Ymj+f=TdK{Qa={`s3k!HZ5ejRS;dArp{jgZCXvA~~!Ovs3p$UfIY?<(Q+yLQSH zRwAw}MCH-?qhF}5>^K^XO`jgAHfk5uj&7jT&;$B6Oz84tvtMwkbgRci7x3|5$)fKQ zKUYKK+*>Ss(sVdMFp^7S4SHye
- -
+search_index_entry= {'aliases': 'a abort e quit end n b t next q top back', 'category': 'general', 'key': '__noinput_command', 'tags': '', 'text': '\n Manipulate the text paging\n '}¶search_index_entry= {'aliases': 'back end top b t n e a next abort q quit', 'category': 'general', 'key': '__noinput_command', 'tags': '', 'text': '\n Manipulate the text paging\n '}¶Iao0LX)Ym+;BglJ9so!aMOJ=m~H8HzN?0;R<>>5?x$r3sc zcLJ @j5?~5mb!x%*o2jX_~sl3#9|7 zJphYs=DFlvQ}G=@E!xRYom=@C{cDWw=I i|yjsieE- zk~7)h^=e~2k{PMORlx99p@PCX=V-w3KHss)dcxKv;&|bF?`Q*SO&@fgeKs<4JAkC@ z)l}BBskk1*`z&L*)sICF6EQ1tYC{@@teNaCZk=>IT$4lLg!?zU%z^%D+q0sroO2;J z^N>>- D-(D;N zZG1~UmDq<|_0+oim`&@!=a{8FQXq|Yl&_CjXlB%12w1}dHj%*rgC+2r9L*mEjBi^K zANEjt(V5FewK}|C@(arhl)sku*3ye)-14jLyUbZ=r!36~TSF1iME{d-3;^z(IqxZx zMXx+F9!P06zF9`g@ )wPWDs^ofVTLR`EbEvxhkiEdN8dPJd7vfOulr>wctdx z&19VEEfN%P`+(~kBmI{n3LtieL~mDev_L6up-Q392b79+L!2b1HlDrvMam!V$`{sh zR!@{9Ohi(o-MF%N{`wfo&-j9 |*rAjH^ zp9aP2KATO#U1XKKwLKrV2Qe>5qG`YVkOpMWJ(JdNSJ(TsdWG6Uh~aN*Or= _tjMa^vR{ti+tsd! Lf<+cF)^ zuo{v~(Qh7Nd@F3F%^fQgYzXZvB9Do8&4EWs;>k}J1WU%G4|?ff#5nm!71s%+b9L}o znl<0eEx?Q7S|E1Kohd9UkF0$;6hD&8N-C=61(>gQG&5+vDE=$U*$Bz`7BXxMIDr73 zs3XAxzO$&Wo>u#;ELwav_Mlsd^V=I!V+u#=QfodA*{2}1xkaUB67ksv4I7L4$L%Q? zF~3Hoz~}^65B|h~YhKpRIwgk*{bF}{2HWjJ_DZroC+!M)g1NV?e^qSgtI3=5XY#!t zo9MK=3^QQ{{Op(XYLQOPek0>L;tHUkt(tDw(yW?}g%p-nzXaivA(Gk4mO=8M(ivx) zTr<}z(8!|VE*6TTS }_lNppUT+Ca*R0m!)h?J-yr>bU?teq?cn;LZ@=yA-<3|MqD3<3hh&H@lQ^-0mL zfM%sf3(Sy$6+E)b>JzPN@`dGRQR1=ivgZD`OgV4a^6oHX8ho5 X0Q@9u(jP)yBpH_P-Q}5DkHe7KQp}m{kJsWpCfv8UJ$+$&fEt z?@o_CNsCMoehPJH;SdJJfjEi|2WaP1J!4y#81u~aj9Qyl?%5ypgR;p6xI;q4)Eyz5 zU)ni1i-Hz*vnrmwY}?D!N76Xa6sONYqXgvdBXnuH>neN$1Yk9`5oA@~)Z!ly(C#vP z$^D9avy{o=)*xOWynI|=zeU>E6rxjzl94+YupR|-I1dRYFA3*=!AKx=Ng&0LxvZ)h zd7=^^6AFhzj)}vbGP+D$|J#KGb+;x~H2f -Q&2V7P%4D!-+(3RFoYMjO8YrKY10@7$G$g)GTO?ls z o@z?` z(pez+f`Jg~Qm+{Vk<{NY|GnSYTA9mZDqfNJm*gsLG`*7+<|9J~eN>KKH^^MfsCL9| zzH0d>DQU!ZVl0U1cR{80-!lQ0ts_4)kI(|SR{@2DU+yu -F(FoVJ z3X6I8%DR**u^~}d9HY>@1pxr43gpwFM42v9pD5HtRBWGUrYodjg)iy3Z`8pu)GrM9 zr)QMCG?Whkl&53lY`k6-5E;gHcCu_;tuvBpj4nnqc8PQ-EstTQ)r=ey(0I5U3rrxC zdg(TKR6Bi?1~hBKP*z4Ro;v1%bo6Q3NTBugLa7=b!r!SI>~vE=1lRzsSc3#DxA7At zC;2Ns{jBTjtPJX8IuQBS#K_f@bL3` zrhG0x0=tUXV!#b4z(pPh{qbQ*VF4s*)zGJk@JpKFz*QEQNA7|0H>)Up@89G#Z7Z{5 zO>d1_qw@{!J&;IxZmBj~V}F7gc!o23pnu;sd0W&}U4j#S4z~3{kyz*&rOn$C`d=|K zTQ+f9l!_gf=D%ba9zhg2PJ=j^`ZJsXDTx8^-hTQAO<9NmFt<(tnZO&7yMs-(B!!Iq zyVl`!U0$KUsqUOazt~~fEYZ~du8U(aT?~ionbVI=vO_A0f^`rH797K`4mgGlPo`c@ zt4tx0Xzz2h#GlDenCrmoS@V$)oT>+ mSlj 1z*__m!t%`Nz+P z3H+%r@T|fd!{05_>`@|g+^N3BcTM%+qwy|LE>3Pq_0S{m#+%HZry@(@g-oguYRlqZ ztE72CvMGs(*$R79Tw5-c3i_q2SzIEXHl&JcK42XIz~ESL$wc98utu3M3XoA@xt_j# z{XvwaAs1CwDK%o1H9O`k@vRcd^~IhOC;3iITD+bzK+>SWj9>!wG}~h<@g1sCa7R2U zIIF9PZ#zW6bu*EU`0t(A$?MH$DALA#GIE;z;~eK;GuJ%Hp#S ?YLq>Z*7f~^Gb-^AOo>t@zk%Bx%$F>gx-k# QrIv%^ z*=ToAMwwbWFaIDfN)tR*1^$=xOM{a9Qe-%>uv1iR {XW`Tp5`(7c5;J%A;wnK}S BfL$ }^MDk8AH3CYm z-d0r-_rF@S9~Oq)#zW3XAHCQc^JemI`*oj%-V{TY7HuwDBLFzTAmUFVsUIOCiCKet z652HUAKanrrX@PV `)-Gr0*)4MJhmz3F>r4k_Dk&?Hr=9}WKhM3 zU*NIFT?B9wEh2E)#CZwNMhJLp463jFY}er5_EGVGS*9^j^qFD(wDz#lvB*pmO|Yz6 zQq=l|9-8CIVnDeO!@w=pTgH6u*~*Y?nGK{A1V`Oi+2CnRB}%TSnUZGXS5RJ$npBz1 z=>NB5{Ii(;XBlZ98k4$;@iOIxiTsy*B^SES%t(3)nkOr+|A@fye?(YZYd%Yo`bPu; z)<-jWVs;hEM2NFQQvQ7ARM27oLna&)9i>VSdkhNP;mT@c?OH{23`??w_^^RojJTNw z-%?Fkppj#NRM0v6?hWaNU;znuAB-%#|G(+|p9XnE$f;K9bb&joNv?G~DM6HgICB3Z zM{>Hw${gG%sS|xe8i-L|Np|kX`P8@2g4fJ8J+E41_@TLe{>iEJuY~}rF{1xa*gV!H z8DUbj^)`^R=ISmvN>kIZ-06H8`MXX2)AA&4#TLk>DZo}YH76diF~{E;gl_C{WAIAv5(}aL~}Io z22R;E;%T466cfJ0z&wB{*e2onKq6I9dI8w~(U{4ilrU@xsX*K0QSdHhv%#*<-tA)= zMCZ|D@@FtL%@D}Q6lI(qs_4JZ+K(#*z{~hFP~YWUz-Y)Epk1X`sfWiG46(7ZqN1y8 znPC1+aX>d2-VCNf9+3g7zK-P{!Pm>{kP;FO)rfYCFTgX}0Q|#N0jzWV0zX-V!hgg$ z2fvuq1945mI@>AJ(8dr>(6ndEtzS*D8FNj31<^vR0zxzTX<}Tg;rfjHYMzd28*zW+ z*o*MzO-Ij8Z>r`rTRl6jn^IN#nUz;=BP-~+QT;BLkF9DVCS>W33Dsi(d7gbv7VC4J zSA1 z1#F=FWNVV8I> us1Q>V=$xh4U9}G5_IK%P%*r zc*!~Ki5e@pZLjn0FC%-IucIU6IDGtRa@ZbnPN@|Ftiz=I4DSPwZ#n7u$fzZy^^p)) zsiZj{huB%Nmpi13sK_9pCp1LfY63Z>O?IV~2q~|JKcpVyqx{$dS(OhEWE 1!t`m)jP!aQlAF(4FvkJy&ml~_Xk!a|0o9{ zz`)?GrRt0B+C#3eNsJ%AFl-9ig|Nhi30#*GGca1{!pu?HKe#_2Mp2>Zg2BaeE|^*Z zux%cvk<3ZO8>LBh`A{X3!m6q!cjtQDFo%S#Y^jA9%nxm!=SV0 n}K>E1lxmwKGIrwl4M^VGnN2Pm4kj4f7XH+d<%y z*2+J?{)lG9c7}X!Ys2<$T1;!GssWAwuID5l9>g5tUDr-Tl>2`R)g=(kkWK_$;i+}h zJ5^ zS6_HC!{N{RyEIo_ofJ2JeckVx;?hRT;PK;oN*i}=15Zd?zOVnvGcY`j%5S41f%8>a zSxGO^N4{&rSMJT=*sK|anrqHEfGDpg43yy`$*D6X)Pjlh%q5V>3kz&o9ZzIosH4k* z#<_Hi-ncbQ>u!E4utlEg65x9PFy2o&y{!rl5I9qHn+D5z%G2fNgtw9LJvtb(FDL3s z>&P{-*L!gpPC)}beZHh!*P#(`*;#VvhYPhS*PMQ~N5X(laL6CZebjDu1f_}jP5RVq zDQU>Pz^pe(8&ToG7U*M?sqo{N6r;!hZ=y6=55Gb>8ZPcKkNm`xSFDEs?KB ZkD;vQ z^T{p|d_saF`B{aDSe|kLCfr||$f-6_R@I|ip!c&*yJ#?6qPg{W^5t++sojyi2iGgu#FQZK)MJ*W^us1Q`kGq zpcpLZA&?Dj5{8Sf;C^xl>;AvQuKY4LSluIJ4Sv|JHHN;5Msul*eze9ruzlD9iD=m_ zI}CGl{0B4xCC|nI{_!6~?&W`9b#d}Ll81NyT_FEx!hh>xFf2)-Vl2bfsXj5wj9J2p ziyY5cD +E*$Txg!%~!UXjI-4ogx0SnPHB|0dJ>yy8Ym z`rdaJ>$o~=3v$S2)0L3CPgv-ADp)^EYLkC{ajhB7v(o}-CUkeom?BDKTLe;ZwSgoa zmJ9iAKHQIy?u-kG7xGTqXbfjh<8!CjWrU-g6+8^eqA&?LGC#U2%#@XU?5Ao(N@1&; zC?@d +;6;QW)=(N0&FAx;dWyXDUW zw86m=(5_<_onm@V#PdMrG}x8lAzl0{M;cSq)Rtq-WOA+z?}|P~z1WjQ9xRn3&ofJ& zlX~1K9QY5#8>0ZRxsBp+H=6L?-8w_yZ8C`8f l(PGK{ z;bejfhnBO3-_)w;x9u8mjiGUk#qi)aXxgki=ca=RCXKy+L1 8vT2ggS!%swR+W(yn31SbB#ZOG&~lr zl|i)l5V;>du1hWRAcudTp(;^*@n{kx2B+u&lASnr-Kcz=Y)d8am%~P=k$900Qvxz= z u#OiaABLKzUrp9OA(TTZE-oNR(Hn*59=m2 zL*k~2D~@EwV_z2`*IlS%yRJMtw5~!6tag*SWSx?DDafiDIk;!e&{9VPvQac@B^7G` z%bD*3rJg|vrCsl`7nm{w5?kBzLuOmCMR7nysnUh64U~HEkm#BX^l;QbpB>*KGk~V+5*UR6(p}i z-%6qkS3LNv3jZsRWO+C@s8~Pl!0r?PM)L9F<8IE$`?v55$?DuoW4qs_EO<#A!HYkE zou3CeYy6teHz;J2=ZDbFx%RLn*@ayDyz;mg5u-X@rhIVI7@^>{0 v&U8jED z75hi_@(`Tp#0bHGL|A$DYQ0y2hEjCZG$Jzg2w#kQGvRtnkojPb4$;Wgw-AIfVsRsR zaLUW-uG2H3hI{sRjnxL(EPgW}0s6>Uo5Q7B5pOmnedtj>#OK;PFk`Y3bNh7H&e}IE zo9!EZv r^qZt18__$hzP+b~V`0m>}m@-mZCH%uC1|D1j><(O# 6tLenL?!6n+&adm~VN>!`zc;elGG$;hX)U_niR4yP#9>Jo*H$Rw zQLNz`EEW07zK-SsrE^sP23oatvqR aX7dMSDyyZqlyFD7zVM~ntu=+h98AVOjV-LyFKPv9L7s@key~P Iv{4uw+ej+33zlS#^F-5Ym2{i7=#x_a z%yLp2-s0O_^Ji69Zl Zq#C@BX!|2} uCvxw2anR0MzDZvj0f5<+}HYZdNP C||zB10k z*t8$c1|o0oBVAs6Z?eWKUFc7?T`&RF!D`49FA10^@< `re0_}r z!%-$rH`(#FI9YIgeO>Q3eXQnM%}5!oxr5Jvx@! pM>bf~+#v&F0;@M;B{XZq(kBA+#o+_o^}H1l#>p~=D%bi;;qI2x zcv#U9)?YFviv87g3ed1@r;{A-kj&=e#WX0OM|;IEpzOc3mMN+g3Ui$d7IrIX5abW; ziZbegod4ZL(yUmwavOja((V6Lejd43JjDTyBvZ&g1v7WIR7Rtjl%9toUHBSNEvbl8 zG_mlUaRf&(S77q|bQdXTjrqtu>#+giyOdQQ7sei%9O}ElzD*3#k3Zw(kvivoodV+U z&@)lrois-K1p!<6_ry|dhp06#ka-N@x&>%B!2`hM;<=Qsw{t6bE)l_Sf@=wVMzw$; zox~>)r1T(9*wLU%yxbwwaL Cg zI9|aMe+bbNi(dQvkh8t89Px5^eV)EICI!v!n(V{+Kg66R_a|MJ{C~gRv#GmF{ZrKs zH`Hia6hSJ4(b3fW^iw~im#oVA=$w%ytT@&se%OK|;F38es4^Y;ES#kWEtvok8IMM` zyunaYD450}6pRGTG>+%_#2o!_0*#|sP?4Cw#DKR>1w{c2xxbL_n29fjf>)2rfZcQZ zVZKH}a5l}CgPWzny7j{d)IhY&E$;kHL9&>WTr!hF%{xsfGChD38U{Kdnc@rjE?2v* zFEyhbEY5VrV`((Ap*An p z#=mK9sb%j?09GSh)5VX{ZO(-^IO`0)5y02fvrhcZ&l_`6enp@rz;A$f)kj6p`D`hT zO0D3)eE~32?jfd<$~+0fuFa|Ug6$IyjGm9~=lo@4frBqHb^aav=X+dD+DeChZbH-h z3m=9B{oXu1e6!;vhyyrHh};y1_Ss9cwoGX_q)Xqnv&h@OKH%ntR=7Ggo2^vncI7Jj z3Jjf6!oA)glCd5BS9^dd%fW}5Y*37k@q= $k=pl|IRO@7LcG z1Wk;IhkKct{8TJnH)|izS)*{-6CZ Y~{xTnBONg%DN@lpwev9^hlF>LfsuQsj(ii|AQ5de!V~h6d>QS3t z&|ltpG>*`3xqOWh;}aSuRk44~y}jv}!7L}bqH8t?NwwKQAhzYa7L#hr4^6SUX-8_# zMyHJ0X5zC(?ND2K6^gC1+Z3@2ww4i-J@-DV-;IIhy`ZcV`yjeX)!wD`X5eR~);P^e zY#9+(@6G&FFZu!X@JgSZVHa>g%L?j597yYJ@eIjN3TRh%k{U6cg)QM9_5@WlvLq`d z5Lnf6tr|sDbPae%2b>@IPy4 2SUXU(wK?JP6VW+8`wbV@(m$^5X!dQoA z6Ij&*ml;SpMg`J6`=N;eFj>KczeRvv=OFAJvW1*mueSl_p{TjHzp@;;)$lmmDY)=* zc?+fr>TahT#zX?c(h1n_@v#;52I}Bo^N?P(yy7&rS2+rZK631h6gM+{q3-p4d;3s3 zY-!3TjRmQ~_o;6rKMQ#F@HjfVEpN)B5#rMAvI$_a`bMXHRAo%%tfPrCd!P2+B8{uD zapkEg)|dg<=@0gp 1s-Adv${I z$M?E1ye{*S4i^FF6d6H<9kyt5)}9c@e_3lJGv6?yZX^l|rygYyr)6>2Ulz)ubG(dU zqJTsbzxISg7H6jC&Qm8()@U0v d8QZfLMQ6h%Gc+n-}6r*XRwRy!u8Qd@- zeOEvefn0=Uw^Bud%1gd9`1iufxGrg9zN4bh&RV7kzqymJ5!t$tI(|VqL_8DQJ|ev^ zIMP%^zHVx+wf3+)`(olE*MIDZ>Qvd?kVRJ*S9W3f=Y4p?L9}HC1Y&O6blxSyomKVw z7$O2PT@i=Q#1xg)2S X?3TOQ5RH84#zF83V>L}D$V8U(K#*;Z7Z{EeQ4Z8= zOpbXonHNqvUQ>r3&z(zPZ$0KT9PBE!5s =QF$`(=3bR!I9BZk*eHWWk|{-3%P>GM={&sX%Vi zM4sB#2Nwwb_QIimc1g$UJ_ 5iT8AR{3Wb}_siSynnOoJYF2+;7aJbTXM zs343otdZVeLyZJj%!5aGpo@HYfMt@4%K$NA3Rq+;L`p`3)ooyKpL;*C^n^g|Ib55k z$*t#Q4ID2}?}Egtm09PWQDx1M7bfl0IBYRmiVFrOW1`CEWEzB^yHGUQy*VSjVI{PSl(xZM9b{~-%e`WN 6ZryCXh @*S1UEkuyqOk@8lIql~UjZ?A z^TZ7Xw*O;??Qgt>UZQl!HxXyY!5Fx}bo@g2Aw!Y9IviiIeRt+KK+y>O=r@|$FKY#B zuLzu7LP!&2F~l)#$6tP@CymZxnjo3f%(lf~6^H9FM+pyaH&Ev>-YF78%=|Zn;8x8~ zrr7c!l!E|Zrc v0M;%tl!xgbB>q8y$@k{$we3TfjWY} z@o_{*pra2<@Bohg#TB!@(M!@*Q`V$Og(wci6yt3%44Vt8)55(Mw#+4so!o%d#3ZIO z=s=%5I+Emln8|p@^S;xes-ONNP6t&u&a!sc^(_3+Y4Mf;pg*Ybo*zC4-Pz4%K*oxI z-*GAW^mZuEgy%bKob;RzH>3ZHktbHCyl)X|ZI2ho59D?CalRO;PeePqogPR~n2n*| zOUY>kq*djuVb+mifpm_!9$2OwXadN{B)A>;wHN2>;JDuUPRU=L@}p+sh#le)?@Wou zhK&=rLPr}2aHiMGnDpxtJy`q+>fQU2TG?$s&);6~#TmeDw%LDmgiyi#Lis%xo=j1K z@0`S73l_|#eI=CasVv`Zjo2bND!dAG=@n5$e{z}nwg$QE7wXIUdtJENz4{@YAVGHI zh74iUW91vith;ED%fRpgp0Vso6@u!D=^4s}H|Ht ew3H6xiwpS>oLsnvvK`x&fCs)CDReawmWv>%9F+A+r zW(L`&+x_UX^z9UsV25dL0PYeKsYK|~@Y(}Tkc~c1=+JPdnjh 0x6;y;tdKt9 zv=--Y7sV#{wP* vUY#h{f{IcqKt7VQCYPsqbl~tfWu`mR)MsZDmg#0< z8n|0ZWlf4Rc)QgDUGL2qlxFYXmi+o&C))OnEg+UKS#kY=4dk {H1W%HUh|otAUL&+l*n4onisaQdOGj&nAv2zPZ=7PQM5gBRTVHVr zbQwXT4fFN;YT>AIRlRrg>LuIG_p`mIS^k8snY6bQcF(k-w_;s&0P-NB2G-`eWaxe? z^kC7iC7%0`U~X{E)s`pjQ8!6_S*fBQkOmQ=93z6SBBC5~ALcouPaq=2a0{2;q2MwT ziCK`Gy=V|U2~?v9ay4*>15H-*vbeY-TNnDAH>nOgBRLt8;+(^QSq5&6eRkNw#?;j( zM3`nQ7jGG3C4_Hhy_EjUdO5LCHp?h+OzAfP1=2)L1op8OMI$JzrOY4NMc_>bn5rS{ zGEdCodfe*Bwo&Z`9=d3SKQ)!WEVuVccK~4ICKQrSM+f>F$^v!r5(l+FOpx?dA3bfp zFk(6a4Coyh>i-py9a>4lpy`%pD0w+i*Jz;Ls p(6X30G512;rV8V?vjELr+ zk;1c;eU`_ww~d?FhXrG9U2SAyH1Jb6kf-U|+A`+QOQEM5+mf$7KIBfn3$;}twB5Nh z=n?Aarf5iXAc}?BQ#;(zUf!yr504(;@R}2?H#wXg_bTA}T8EEiNy_{I)U^?us^%>u zXIjwoQ^MZ&>+E%3mw^oESmgsoa~L4cPM9&-#1Qoq-+io!jc)U;I<0>YndM6=zSOe> z(atcM#Y+!=@+ep`VRFMm6rfZSd&UXHiD=Z}g8a~iiK2~B>KU2|Q{%;Gm~{?dHMn z8|D8dBy0M0Q}`j3XJRG*h!K;C`}>LRYrh+hs7NhfrpLsOhhvTU&-?~Dru`ArFEs>1 z9LwuPv<-`8*Ekey^H^M0!g?c-<`k^J6V|wxNv1J7s^#gy+a>x3l=o_+{1$10ViTc# zD9txeB^j;n6E5ayQfNgw+^#}$GvUNQOVx;xQbr{H;vHU$$8@U#ZrN^fg@RA}LL-IB z_FYd|=5BeE&gkji-c>C${HY#z@o|v?|FmoPP~~@HF(8F0;2PQbWe==y*ySQw_;?TH zn!~eMhV#f;G=n1X#mza`5G_NzuN6X9`|McqJ<&fgNSe4)?C3nKkS7dY?+l3}36NRQ ziHgVT!|`cT>U5w3ZdT=-vxa1%C{4h=kOnWK#kC*`L{&K6zWg-Ik(i{O@p%L(nfn*L z|I(GM-<%p%X%Mwqy( 01G!4ce5G8UY;73 ;amS4u xE29lC&pNy||Xe%G@{_xD K|M_Z7>w$@EQ%Do*>gc^( zgb-UqyMny~_-{HQB6cn$*S`%$|FBCp4RIQ+azQWyer%p){vZK<+cFj!UW)$SHXG*f zV?dn8>@a`8`O`hj=ntb3m_2c=; e2tSs+DD zD~*E?4$ ~%N&+vWxXl!GJThev eO0RKRz>KarN?nr?+&R_v?G>EnURJyghe?g~Pw~Q!uG^Y1bzVZuov1vH&(>4EI z4V6i=rwT`HTH)rtLr_nEoV_IL4_?H)(MUJh1Wg;4+4lZE`H2!besHs;d&oB1fE*EI zj&LQxKkqjh gsx~pPdENy#U9Z=FHv)YDED)p< z!RGJ8El+YpyLDynLY_cPyL#e4j#^l##!boXhGDVlV-JsXa=nIG3=To`-^EKa=rmN% zG}JPRsszu_c9DUwuhjE8i7s{Er}M6fa+arKvo3OvwA(ij8)Qg!tRn6dPEcTA9;3z_ zNkWbk7Uve8?pNKopvnevW@Q}!h)r1jq%G>$4(Z!Pmh`QSSV_rGN%0erI5g}O^Hm-8 zkT4!h>X={9{n+{Pl+EF&x?)H>=tzO4unYQF9c2pQk(ry`EB413LfQv(2#ya4%B#%f z+n}U;>!JRbu=C?J;XG3hqAg+j7b1Zc!hYk-0;0>EZ2uCGz5Wsr)J4GqkYRFRCpkR) z*@u)96|R)8gx@-^hg9Sf80mO4T3bTPn2Osjg_~pPV Z6{F0{MR-#a1hBFC+Tnxoe`ucaEoL_Mi_d zt1xi-(A0G{h?2yFjcfifcXR|nX*} iZ|Z6VLtIJL@9fp5OSC5-x`LUMx(_)~LGRpGJw8XBvH z1&%-lB# X~YXX~Jn;5=CW$qtm^!fn@b z`z$r^0S&Kd5dS`# DWDbanTt? z6z)K4;R(%_)swvy@L;>pFGYQol4a+8-T#1s>(}VI!Z9yMu4!zAtvjfu@zFHo0u555 z(!$8&We+~rW3%D#XR-SC)z!ty6HUnFvhhpXO1yQdz59AyP2L&C`UR*sD)pFy#}zO& zM3aw^rso8Dp39MwcBHwNhr8y{`qwjdn}LyHN-$|iQc>d(;NykSOCe`UeLN9gef0B) z$yaxB(4mKOliT_0Qczc8O?Kpfv^D&x9Y;qlfTBw$*RadXK9nUGMBRkaiO4&LA-)?(@^D-XW((Y%0#alp)#KiqJ(-rD z1fEn3-}>o*s#(Ci)qAm#_wt2J9l{(d8?sr;B&?}+eWEXL!4E(J$CYiTYc`Dqp6?b7 z=mz=;^6 Bo8AejoSJEk~Qa=JE;L*yA9KkP0tAe&;)aB+NV%jQHf`oyy;S zekmvea4g*ik 0AFz2xJ2f!mHbd$A(wSvJnowq`&_9(?P%k zkNApwZ&Ct%6C_-L*!U_4vfnZ _OSPOH=Yu+H(3qoSgtoo++K#gUgb zW*wQ6w$`CV-~stpOUzkn=rZG1vUp0~*>DPWqaO^fm|Li@hbTu-PLU@IemIy@WPyh% z6h`o8a obDJR`BpIO=&K`1yR>Vz zy7NsE6G1v`lB32{WB&ZO!D}Vq%Z!CJIxqkRc(?tQa?%z7DU*4d;$^pV_v?Ne`VqRQ zbJc!@al96(``zJgTXB~gq?!>6aDaGnKAw%Cav&AlNl$o=`A+^%>-9(9NLsOH0~KSL z&r8N7i^gFksO|$TQmpspRYxSCkx+~1Xa%98)a*HhG|+QLnvD+ 1$*uv|Xi&j*JnbCfN (|E_xTo_Sq7|2B`e4QcOm{DPQLWCaV FO__5IVns1e!7P)62o!{qI=`#9A=>OQ H^`kWy zWxk5kkE{jplnxgFD6OMttV4(H-Egf_kV_RDp+hh(M5YXVn1Vr~YQoO&`Bu|$i~@4x zB5~z+-5P>Q+`)JoD_e_I*nD>fpclq_luTE%Q2P8bKWlK%F6UWc4(bNrgw<~cQbYw! zonNP*v-YO9g4BbYaYfp_UxS-1=^0_ZZXsXaL_KD4Ht9|QH%RYB>C6E$96bich+hgG z97dNHy9<0n!f8#(Z>7p1g4X|*pOK>6dX zC8GkmIkb5L>+J^a@i9&p98N5xYe4Z1G~sjY p-zy&ggx+k*SQeBU_1hZ5w5lI_GxcIkS`HCK!CEE}?&$(VC)o%#bS&)B?Q4Kn z (i6wNnI^2&VnoB|6RHiPmOE_NgDb zmND%Hl+23C%{6E2bQ`axP1V5-K*eUMldRrOys?Nu_{ei;_vB3+t?94Ng35gi?tXK$ z5~F9^zVikcoH $l4tEe=q8tB7I}o**uy5Nfn;p6Ea)}=n zCOWYZ>$uxTIH&S>YVXW`;NCR;RIz_hI?9d&s2DxzGAY5EY=QOtKLB??h`)#Q?87_8 z2PN$72JxHg IHh^mO0%rShEa94K2&-0{31Q@EbSC7u~x= ^u zw3~9`J dx%5yRR%F| zwx0Ap!@Sx~vE40Ttnl*?)1fNv(x%x?d)6JZTk~;{hTRTkb=6J18SC3F-T?QZ$iED) z`}kR1yAS&Fvb(y|V|v0DdEpDoG(_Z>eKa2(8XkY2iYo@}TdcBmz7N+TTeMs+U?ZNG zEqX{EIy REu+1s9+)|rK!=)e7!@kKf2$&}87qmQ6-cKqyVW<`cY!eZT^I;B; zDp 6r%=g6}ncpZ7=+o9`^c^9?$8~BOdT%5%JQpkupZB4vHn(=qIX#s59bu zihh5iH2=*Hnq+Tbw=9`S3n)471ImgfO|nbua!wt?{$K`m5k)>$fNfbofb9_{&;hLk z;5d19A%_*1W8wlF^s^0W@W3YLeb`|gxbqfMg-StSEun_hINg$d%AWOWX){?GZo|dQ zq~gX0s~3!_4C-wZ`A7kxyyL=3BVFM(&qaT_%V94k4bJr-)XsTBCF%qF@IBAgGM3lF z*3RTN)EGm&bYZXX*su=vET76PX6$P|%)!Utw!+DrUAmvj=YdW5 J?Wk?*O4lA&s17_TeHe3K0+sFW| z8?c7`X2Z{Xl2%z7D*KA;N1u8{ATPbxgL16*$W#rkrFA?RVY7ieK%PI>=oqgJ6#^xf zRHGId?!fnwVKl5oGH37dA`f5xkP3f;#MYN>v=QdfmLN9kD1V^zDECmx5lPiLmv(MzxUhhOAc{ua7q4dTLwC7WO=SFrH6*y zYB9%+%8JYvL1dqde%cv7pFWQ=%5)JB`Imz?n5YlQJ^!Ws>_a|0ppS3W)GvQ{kDmVi z3r2;EVmdr1wwFDAO6*^TvAs&T>4FYim2I=oMvA@!ZVI7;D26XRXhWoBv3=%;L*J+E zjmVQk01!VW`hIN#y^LTR5{a&=`iLGUtTCh8BxUFgs}C!&ei_0Y)8MHiOj)Y$Uxb+~ zt6x`?v2>p!d-t{GWrsvZaPohUcpB&xlt~@hl1*MsQ%fUCLQsP6atPm}$F>%6b!8i# znp{cga|n6*-HQZmvt 09kWFcFp&`JsgD%<8&iz+e+@ H zVsYTixA4CQ2ZC}(!QhGS%EtE&n)0rbb8mugv @O-@cYz?zBRmQno 2^-z6BgB?eb4DALPcTzfx0 z?n}UZ;T#@elkKZ)orYb;J(L(BlR>a+&;t3(2#ZJ9Q(6_FRoj0qznuG#{ uC`tjfa!PEVKBC-4=Ec Sj12VDaBZI(6!mvkWESEh{ z86A$1@6%@en9bl8!#?#j{nBRMl*QP+D^ZB##B=%7M#62WNEF#)lh^uoPs-b7Zw%ad zu-m4aKMBBt!GnLwYBNS>EGS$MSgd*=zmtxe?y}Q(m$RL RmVwl6&sb{no~W38&0#A{vFo)0I7a*|Bedn;nUmGKb@$ zehq_JoOnn#pCP==MvvG^@SXl h+Atb)i+89Qa{UWX7{yf`lOIgs?2aJb25URkRa8bzm#zPfa}b9Gl8`!@Ka z?mVv#%_yolZzZ2vIKe#PJ)}_ba2HMA<6Aud8pX2beUMKE$DN)$gN=5%?i%PGDYy`o zyX;91jI)0q{rK)=rX=wyRIb2Y<&84-$r92|dT{+JWKbHObPX%;0h)1WYxdPk4f7$z zS55M%D4&wA_2WZdpI`)~2eg~=8{JoVhUlUXRl3_ji>h>u{q<1Wld40Z-^DPQ@K3R- zVb-KjjRIPwA9DHzfH211l)4A?tQ=BZ$v|n&(3F3=pMaCKFsA}x$=YSW1H+}b43;8P zRY;&)oqU~;-}1K!1e8e9oqnrrIa6k$$30aMUlCXZ2+GdTP#?KUcZxBgyo7n_D!8@^ zE`16H3$c4njMMhv{+@z@bx<&jQ}a&~OR{^GVjwcbChL?2<3}}89IfTLtL4(K#a|}O zdHH`_9w@q!J{w{6U;W lO=0wVQn1o7iIxx_jMh==w< zpN|>PCpA833aT*8I^ulnqy6q7(_?~7)|qdTqX?xN3jOhS`u$edx_1L9_R2$d#^p8t zYBK8KDg4*5#rT2!0D2vBdzSs^fHc&l8ODDwCz($c0Y+LywjHvUQ}}Po*5}>Rv*wem zKaNExt3m0UX0UPubNI#qBR+%vSVP(~Ghip1YV`ls>LDMzyzsOB*E;{PyJw|m0%y=4 z$B;h^n#wtH*qZP12i#yjU@fQcU&pqas$vkOo9ZIznOkJvs&E^Q&!9inaG&potl)oV z{m(hSf>>A0VC|W6 *NWSi{g5zHRKB<&41%NWHG|{UE!XfqxuBuJj>G zIfedO+a_Os8h6Ep03KIL_9k8Q`2PvO6gt#nuit<6d1lSTNPSIr^aX2s_r2w$p-qw@! zV1YRHp+CCWWNmm7M_e?Ji($%f&D1I9cu$^LvN)ME4rrmg>;aF9aU ^3bR49mmtb6&6IzU>MDzU|RZdtfnjp>hZg4Sy9@n!=i}Zm^^hMueC|K+|dj|}0 z;sldUK}_nQ3+7dbR0ay8vh{yh73ce@$J3wui4)2w%0ap50kaqzOhfIm^`qJ3bCy;+ z @*l&MQ4hyJ9QBRLq0sd{JCly0Lu#2Vyjhq_+O G;v?F2{8^K zI|ssy`$d{K;t&Zm5KFuV>=99t4`BLB6sa*x=%+;g)CVo#xqzCmQxm*b#*=^1&txF% zrX=20LJ;o)6c?Y-JD{&=U*V1vygFv)1mAkQ5;JbWYR(4wt|@;kc2F$h7^N22N~QNL z0V@QCH(;tP@bw%y{Zbjv3SD-63f+A?^v}WTPuDqz2*WkM?_x@1K$Qh$A9A<^DO?4P zNJg79Z$?#Ie7 RV_`6F}?}G_7(8%T`AMt+ks$A@;~pzr_I5# z4jXx?30RN(z%hUJP{Dr5ds|CT&7L4RLmClE0hH2Erq1vZQ`DSQ9HmEV1M`d9v~FPL zd}DHP>u$1s8&ti0x&fJhq5uVE>^C+e_g)FgDnN93Eku2B)PR)t=#0_d;N;hWMzD*< z7~KlYl8+cBy7KF?+-}OJLYC(fIpC)wqa~lyTCq1!=8k`n(?XQcdhWsHrv_y+nA-qW zz&k&1NXJnceEip=+?xXp9L~}^aKEIj2SZH>nVqv4_W;D!wj_%l+yL=G-;Pbbt-sS< ztn~ToZzeGx^z9DD3XOrd3m0NW$3!O{@`MtLsV(r!E?9_F?r%8|Puhht_qUuDqIB*n ztda=@b?$#EHofkGg;;SI)$;Cm($@$3)z0OKmx5!emUoH9qn^Bb1KdW@4vFS)C}5_$ z)s!H|TxSG&?yupDDd$)zAX#_nDJhS6hhQNH^fq2Vrwn==wc9smX+j@# k_ z{+Qxz+1F?(o0SMh0ghQjt)88@;=@FKd15WLabkbkAm+xWQ~X3b{Ytujj_)J&Nex23 zqjVJn_lq& 0rDeRIs$Dsp)^UM#ujLgDs&TWlE0Z2JO z(Br|`DFj+Xu=zw5CRjq0ltMx BZxjd&Nw93#(igB3kH9qyukYZ;PnYgwgKVsxG4gq3l_*l9QA;9 zSrN+X9>f&AvhbAGUB!0MsZSBs)j2VoUU67gM@uW`;?hIWUYqdgvN;~0Y#3s-AC-JW zl)=DNTnw~|7|Q_ofE<(HcyO*XB&2uTEO}YLFu8uG;sCer5im@v?Qo2Xb{7svn5uu< z=FtYYNvz$LPasx)=&%;(>ymceA%;=Y1QF1sMO($Tw;iw%T7IO!n|U%VHy~(x+W{M< z#T3%XE^8jk%~V>nRcw3P0SnWjx8qZW-jPXDJ(Gj$6ms-#e9F)xQ)vWpxg}4=9xw|r ziv}>$omEv?nHJKlO~BE?KJht&TmXN_1%k91NkalZIYa*;o)LX~>-uBqM5y9N!q_`m z@=QpbumU3)76ItkBn2MK d}RNHz6swa7@p^ z^aGe$Uq$8GF9Gn}9vG(2c84v^NXzR5`VD3IiCXeZ%h=|hAlVHVy{P>C(jk9=hQTap zLGMK~&`U%!C}7ZI9+ZVE?MBpv74=p`y#i5hLDV7vvKKe+uSN>VD6jzq4kvhcazVV{ zMk0WNNrEQBg7CF)pYHN)o>mEFOPDMN-wT4F7z1AluLSt^(eaLPrR)y%BTM p8s6$Q~!*lE9-yi!|IJIi{RAf+UCHf6dwpS#x|@~LhM0G%!HS)x!@E| zMG8Jqvqbm Mc@?{t zZtnGxagBZ!Wd9CKSz%Cu)7^7sJf+WK8t9P`P46~bI-(XmQOA{(lEyvk{(+^WP0A0u z@e-1l*H_1v4$~d!U$)~f^ss&aQ4Df!0b@0|jkcRmLQa@3Y>a=p)uj8VV~ZeL11i`7 zs^3_<{8;I-VE_=7i})r$6)V+vQ_>y9Yh(KK-F&ger4lh^K@KsmJaiYIU+JHY6C89u zJ4P{q`X#&0Xrr28gTkL5b}#;XC?0l0bG>nDVGo3E7XZx6_`dT|#OkAjqv`f6F}16q z@tz8%c%C9y@Rfh5X9wOC;k{8|s{Hj;Pep8*_PZk 2C}^KlX_qOyp$0jg-JdFJVz>y|wYr39EHJJ0(4ba;QEI0utkl(6(kFbBCfl4{Y} zt>LcbNpx(SKR;ABZGyK+Kh-0Z; mBv#-C<@Pv(f=#Z@p ~7-O+bCX^jj_u(d5`lT-&J`A`Ehm-G{bu#VLz~< ztZcpK7Oj=BUUcAws5ypLDm!zhQFBPIR5s*FNUwiXcH>4->!bT^>ff>)!EMZ!UBD=I z$QLz}8BLci&?qByt@KmB-_IbWUYc%TwDqzBH$;u$!r86)zIr;K#m8NVgS i5#x`rd($$bb{2z*`Gf9IsSGDeDLBJu5 z-jjd4&6?kS{d)^?h#xK (1GxDVj5L(BIL%n;rFfDyxB=U7udWawu#iB$tY zQDIk_0l4mi4r#z(>sbTYZRb7t7{?s}?6ZH{2OZOZUOv7&nKAt6JH*DfZLl$3ik39L z=xE }Rrxt1zc5KlFil0N7=(Wu&jjSw4=#G(e fp~Yl z46y9=U_SZ7St3q7j{yfx9~s!HKPd6$LDOr-`{>{eFn@2EpL!A2N0`4i%xHSecprZq zyaDDvo+XspNcicUy_qE8kBTxJi4eiKW`++wh5=E3I@6=+^2rGsyPYQJPm1j&67817 zXyjEFIV|Ldvjpa*wPuKK(_l=u2{L|AFb}Qk1ES%O^);cs>7e>0NLKquN;#ccqQH%g z+hAnsYOp)uVZiM!G6`mkp WcFQJ9B@lM1*1JwCal1j3_vk-0LQHzn2){^ zq@{zj1Y_3)f &6GP3A874}^G;vH5G>s5R!2!1cZ^3_2RhVg& z%oeI4|5+5G{dRO6rHNzZvjs9aAA- p$f&kHe;~>qrx*0WvhfU2G6y}l;O~zrzc_hrPA`jtp$gaCr z$=RJ0L#bbYO_Ej*2ij4fFJN)l-32E5#zg>}GH`IW2;6djYgDM&QZ}%Mazvc0rW%Ng z4(6x`Nz^c3gQRQ_gx7y<#8Cy9Z}1oa2w?f&w(v&j#U;bJhSMb&zYYuXzK1(1MdFxA z!(%MJg{BAk1Q<&PQXcG~XOgdH)mKM=duJmHzJq~9S(fV=(nibs%OMB%!1-4m0qm9k zsf9O6UuWC{q=tFoUfkTR|D;YpQ&|4@77i<1@A^`83Lhvoe2amGv*$k24hD3{YBS z{o95nr2ItVBFpNNiQOl=&yRT&8IboX^Covk>mc7mxlI+?^fO5$!+i8$vmlw80cFh} zUYK};1nwr(Hq!*bnE{#50gW1qw*D#cpzUSXHWLLrHxQzVQ)&k4;Ar*qSi<}AF>mJT zG(%1ZDWu`x-3)(lulzJ|8rk&^mZjFaO`V}Tsl?BjDU|*FV8Mzo-566>1B7vs!4!f= z4Q&mLkqP=Vj@=mgz5^U5$D8;oUWJ%TCNM9j8K~)(!1@#ZDBERI3PY}IFG_<6i~5s6 zYVDa#F*3O#xP?&QD(eLto1rf_?>$)>AsJO4ooVj~LAHP4C=y@7g=wN}t5NX4-Dxfg z9=6Ae! N(m zN8M74q!{UK3pid7x1JD42)ah_FqVfpJ4P8do&pIEBtmk#`5%_*4IGcxx keR%sgYgoptbRP)-)~1(%wjb j?hlarpA#Q zhg5PdfqxjI_m{+pR}LLSrwON>T`@PXw91M$mv?_#ZvirmH*XrNCn_44>zyP>aEzYz z1aPdJ@D}|^Y8YnOhV^TqL{j>u%c>kBs1;=s&L+^2ao#ePplTLjVLwN)>+acpn|(?6 z`%DFlA_rmXor@Z&L}v5mtFQ=mZZM8rl6*;i)8p!c!A){iL8EhR7S$>BbFbnb9iJv^ z|4M(AL(fWwm%J9xm!ry_O8rXx?z``1Y9P-D^crET*FEe*ORBbm>0Go_djxiW&kn zQ&0g|X3nYx(zkMEuK5>INN5F6NEDDLCQ%N_>q(lTiV1(8VfaVs R>ml>ZNp;~tAyk+>d^Mnl_3GuoN2fk8; zV==B{V#(wK-~o!v(VwbRf)8bal5~V5?>qb#ZT^X+q0E C&gomg8Q^XYoYF&K{t?_i=yX z_Pz7Giqu`}zgacE!pJ^hm}#Wo8*(f&I+!Fb;4}@}@}WLj1ArthV59~oS@wJlZpLjF zFjB))b~m3}8$*7&Xf7D>9l?gfNCNRQV#;J}!EHsHrQ-io76}dGKS#a5-wK$M$6U4o z5h6q G&lH`K{`N?57G_~SPLO{wt>YZlF{%6PS0ck78b$Mdp!j8n0c|qSq9Jq# zc{#*;tp1;)=Rl{*?@ot$SSN^wPETG)=aWMi9(P9=NbLR^$O|viB&ki6LP0nA(F!$^ z5~K^nUDCG+dQ4mgcpvjsxqF6voo4PU= QJF*$BZqsg9RE6-zuVvPhH| z2U8?XSl;*Rr(8UkfXT^=V(^!PtNa0FlCnp<*N)RBd4dG(%Eu9@&t!kxJG$OX`n`VI zy@_>JL13D7=H8OgeddrhM0D>$le93v6{$7ejl-`j%8#SR`dl9Ln;^qS=CRz;HkMkC zEI0o&TZzV0fQkM=8k4;H0TY&GLv((@9P3u{h&Lt`?!?jAbqHt15G|}pCNLkf?Y4|w zJs!~}6OIVVE66fa`Nn?|P1S0$=fKWMbftz|O5}fkq+*j}2cgm7Kf}h`Cfn(fPE}92 z8%%CoTm+{qF1ibS*k&iVCkzE;>ctgtN+u%|mt!I(mx_Z%AFrK(`0rF5JZ{6F>kY*H z{pz7g_mBCy{_1#bJYK_S>;SF=TLx&B_P1aEOMd+A*S}9L1xA1I#)R7Y=M(5Qa7x2n zx!_Zk(M|FM*#h+=(4ZqXU9eD`@M%)%HU)fm_!{&sCkw=X->1K}^pgu?MtkUvawyiJ z(8UuAVMdtfkRrJ6y>wGWOOJ=EJ)Fy8nr883W@3gFfBtKiY`WsQCKoYh_lp$&B+?PT zz4gZ8Uk}nxEsTGp`@^SP1M&Od=t4+3Kx|iFYdPVrymXUAoBjSJJ*NX{swT=d!2n8n z*$DEgOW96a<(JN*Se(u &%_q0x7)R=g|Bm{k97$$Kx~ zWZCk%{D(*n^GXxGJV6oS2Yh3CqlSJ1N?^AU#1AQx2XObK=?VVv#}nwo-As_JL;*fe ziAasYekKZF=B4)+hPItKeuri>!>AbZBiB!FmaZSUQ$Ajhm4S7g5zTOhr-=ny0XDs2 z?7$|>A6b8r9r!ZQ(Mhj&zji?5J$uf}{L04>sgKR>o|AN&r*V_Oer+u4?pX=as*62c zlPvU}LY2X?y39iIWM!MXD!V^{D#BT{aVM+!ls%t73!toA%*i@nJ8|T2VN8sHTJ_K; z%L-*Lo+t@nteo5QVfr0C7!hWw9w!)#5!DF+6Q_R++Byh?5Z$vGk_Ja1=7OYT^Ds;n zM{EAn9Dm2PdAv$;GvGyLMqPC{-@BZ#x}*C70fjL=fF3LES%!Y@T_zj3DR0eO8Tg`y zF7;g|8^tkg4sBZYFa?Cla0tITLEdq?B|@Co l* zLPLKjhFBz5AI=#sPC$`>14i8S@v#?*?H5IIfuEvyw^?07uc5q8D86H&lHa=#9)CYm z5Celxr!V;9Tg!VbyubbW-)=0(-+uj{s3O2RA;!Hjj;PeM3`d5KC<6F=W4JBxMdgOf z2^+r}<&G;tFWTVObTz)2E4>?mkS{_%2w{KnHP!z&Q9`*Dhm|Evy^HHT^CYr611u !g;^}K zk00C`JPa|~WKQcvl853bkBgGYGlF>EhKy2CB=TAMQuBlq29vvOFeiO&p}~J9Mvzf6 zONOzQ!;>gs&DAu`^XtM?1gy21_W RP}_@q^c>4ydJ+<~7XFZ L+DRL!AZ%%)Ep$x3KNH^D< z9p{(}q(^q>WCszYPpX%JAyte~e9L4IaQYa{RSLV%PAeBNt xT=p7a>2k{L4~L-H!Vz%VYwOi-Kr{yxJDwfbKUK~sK| zI??9O{QD^`F3j=a1%-h!CX_PVO1S010yY1fEGoW$gPPy;HBW!8oeACQvBE~qg$#&U zn@w0X+`@NN`6(-Y#I-Xlq&`+<`!uhz%_*+V+Uy9c;mIR9T*AX^aR-S;i7i?Bl`VbB zjxF|MzS(32Y@~x1Hgrm;3M4`$oRGDDK6zb`2H5Tga;dwN7ACGG{GPeLb}PtNhUH)x z=G7X+K-yQjmD_)24;c> ?Wt$gGXcW0gG|wrK^kDbJX0Wm}iz>A1~zc_R?I zu>15bhgh8_t6YfgWTh&RD*N_j_bOxx$2S5?RV-D3RC3p3sj4fLE<&eDUj75BWY)D3 ze1yggea$24&75@W5YS!!3{k!*X*1+(##1x!i`te?w10n!_9Fn~sjiPyGuAL}6$5z+ z7HI4sm*gpkPfiJ_A^$X x1$^$=UD-W;9K+%`S6n)lpfY<=F^c3=#RSHLbl`{ zSn%`ipnC*xDhwFXq~2$1m;?LjDNFZd@l~R`wi^l^rI}834WMs>(oFt#kcO44NE& mE zHpGf!Vdkv~!W8jKazSnzv@rRBh0&`M{e`sX^M8Lxap%-J-2WIu5(A0hTzGkZpI{U| z-2;aws@gwD9$$EB(oY#Ucsz4l_!Ct!Jlz=M62qP0bg N zd6Rz%vr6?$5jwXrFr#dWJ9s#3m&!C{xqF5>|0^`RDctsO_w%eeU6LQ+_oBo{K)1wV zlw$Jh6V@9D#7Ge^GuRRccNPeQw+sqYJVkGByrNX3&)B4xuv=>Qh|<3wDE(0vL%%wT z2YuSN3Fl )^8x`T%}(4*d^4Lo3Z;k*)5g69?}5krsZdk60q-8NHVBixfyXDK*jo~+(6ue}zB zH3vfp5(l@ied*zuD2;-prO)()WaKPLn~7K%RsHd0{@5?` W` 0W{QK=hg{d zBHy|xydFNCt{V6r^RCbW6PJEe(5!+M`Z2G{Lydh^>QBj*I`>Vad%6!9M2l*4f2D3} z8S_f-7aL<}d2tAhd)BLRU!SUyL?!mqsq4s{dH0=!B9#>>gMK*|-$Wo%u}FUm-c5Jc zKs}tFpdMyj8+07D89rb-^N??wQ&lQDE1P^DII#-wl&?NOJ-HnDJ&oge?gaNM^NeDO z^NHV5+g*PGMx@>70X>{?&oe6EUYj+#dQUT%oZr)Y1wTc&x0)wOQ<^}fouD9y>WBov z>JCjGfj=+{f|Z)onHxH`eA9pHx3=9 a7umv~j{Ok2PVEq9$X zH#e2|^w$l>C)0z3;*(@xNj|4~aCV}~#SOin1*(~~NY_x;E4PT)*r9(GeHv(yBrXcI zK&_spP?M{3r~5E8(dx#2)V&{A;dFLFf4%>_KS}pl6RIAeB0^_-w9 *glC@;-1aVK=y94JDp|K^z5QD@Ep4czL$((emgyvBhPdhOI@g(IUh zKcV{pu1(`gHI4$&$pe3gV04n^$;y#~>(YHWi_0J9mQt2SoHlh|LX4vW@;eU<_z&vV zw#c?L8~Qm ci3(-EkNCsX|*|}lZLDjIWH3ss(L~(%peQJk((AO@zX#k z&CYd%N-h6`t7Gm}l9gJz_I8v+ZX?-=onhz|k2j+ozzJ2dij;pex2$%kTw$;~eJQfy zzN{cJC`8T1**tNe)(0LBJKaM=gI!v~wK-vJ*y#Wi19zW@!C2ooZ^>fd0E!_479;g_ zf?`dt(P$s_(dvkCSRYVgvQ(Q)c)JW9pL}iof1qb#JJR5=zyaM3>vfiGaA0 JE?EY+jS zeOBqa31?Vfs`bYN6C@^8R_{|-IKtT~Ol6hVWpVQQHJYFeB~8jmQYeX1HY!#`vvQb< z3k0<**jvKuZV7*Cm+-b-!g+OUW^8Ea*Hjr!9DKsYUL1dg9LIl%c9VVCL%uFp_|Y#D zJ>;p%&-z>lTar`!|E$P%=u=jg+m_3qK1XK0PqfgFSH( dRs zwx_oBIjq#ACPSspP@daA45w_ADo{#SF{(x`ZH-(^uaW7ODsPA5cjpPJ^uBTOZ=B{G zlD7l&yYn2t=OhNv?}#bl<`o@lzD@C|fCYJo=JS7; k&-VLI_a6CqDfgzRE4K3 AI0*)tovLfU)mB12Vm>eVmFU8ut%trJ~FJ}9u zKS_bw9Gsrh-r@m~ttdI)pV`>K{;)pZe-nQpwG}hx`*ym3KzN_;O&1^(=I8rwq6#2U zq2LOU;+cXa3KZNCEb*;_O`3d?es}?kAx(oXdwOL{;#1w<(IwKOkUyN+d?aNd%e)bZ zNPl>-P%8oFkZx{bRK*PH4sVSHX21|%toYaEfb{6sq))@9EWT=VtMeK5gTgDTfB|b0vn41fX#+Qd0!($N zp 3JNx9^g2{FZC;0JqE!3n oLl5s#Iq?6)a5W%$60@U>=_wV)|#R`l{$9@6{6T!ig_xXRN-)#GoqYI zu9K`Be`E9uOL}8T=M}*HT>{QvN!VHXL?s!Kkz5YTm{&H)LkteO%#j!ORa!UIVci_6 zlU*Yw5l7(;$@?J*^Gfv(xX;|1YxIt4b&!4-?cx3KO@zu;hv|o?9^Mb5J-mM(zVR0T zwwmLfgAKg;@4!_@njH8RpV{q)7q=E_Nl>d+YlDXj-m;B9PaU|;<|%|XjZN|vDboPk zyvPB@iNdol`?N603#G+8R<%LJH>99m__!wOmGtG%zH+78$QQJK;#l!QfvdbOx!Ki` zydPCDu~@Va7~OCT7l76$ohE;y9&9s$qByB0l#aGGRYyzXM4E6|Aa8ptQ)TKOaEH;R zb1jY*8(_rX7tF|y;cDPbI3S#xL~~Ogub5k5gLvEJ2x(+P7y(m?pxvQ efnu;Fd{+L2A`rm$)0KjWz%>GbFX3Zrd6te2h{NRS(BF?PUTf#XKcG~t z4IH*KJjx#$NRJl+!r^}ln7u}D^rTmaX|O2f3JJ@FqrqMu`1OdZgU(>Thvod=gZK86 zc{#7kDm&p5M6o!)X#rTwE0$Q^fQa9I{crdkb`SN1%q^ZXr36*Dfe5~b`};)E%ZOr| zo%p@z%sRm}+>{DA%>f~FW})D64rrTOdb~GJ+;T$+7!y?2N40<1weIaeTaYzPRCbtX zl?1E|@QR35{C%$8h9_p_{e3dM46FqBwoNo!FWgAF680Fll zI6B+&NAGOUpI(2Yn~mK~1THd9*`3CGfM|9byDtd*Ve~Hv{4!dEKfPFlP$jNi;OAr! zBAu$<1bNDmsBzt>W)qz%QwX?h6HL_yc7S`L8U J$QZ)epU21l*7r_lsJ zpytEPTfdIh1N5iS2k1}VMCfWgK!1vQfc`Y}05P+_08oEs!8%L1>4=_A_|uDz+Fqz6 zKNPi424s=EMAY{K69^q466b-o!B=I`;JxrwP1%p<$TATraKk=8; 74ACGZ9`NnNuOHAP=fKQ zjTxZ=+RT6Gj8;AgE?T00HqQc+n`b9|c+egA8bZOro+ Rwn7*izMb zV|OU*V` Vz$%gd+nzb~}foQJCe9=N1p*EF*`pxml z8UpyXMsP!#Io?&(JY^ZSe7ML3JA<6-B|l2PD{X&<>*!X%FvY+M&hLoy&{?Hoj%hX$ zH1Ep&oIU32ZB|1+1kQw9wYcecSlD0K%ycwB0%X5s+eH^G$ZO^{a3f^}p6_AriU7Zv zzrcN(fFb@A%Mf}{PgXQpC23{0S^8O8E3%FkB|x|zkAcXG8G$YadBXC{($WMa#>Om6 z1@V7j+8}Q*633J~045~zMv>VY2O~(dEooYN1AffB025sB46rhW0u03~E`;$mgdWtx z(;W6bL64z$Ej(pm??AM_@}UMbn07*rOyKXK*=9gaWZpvo@mU*Qw_KN7NTQfN=q8}3 zb06b}mcbGYAib_+y3|&ScdN@Nc>GQ&e_?-*i|L2XAa$^z=@BfDlHmE60~lzy(>W%P z5xz}ODLj{7^fS8q{!jlpU7&P?Q7E(k2I@jsP$;ncJO4DMul0jllatkjD3X?$Q;TEL z=2w)l?9_t9U30oy6fkY5%k`0sy8Wy+RKllq`&-Z-^Q~K*VW?bskD$*qjF@AW&!B(X zXXeh8UH9Vq*dUYBHVp5)OJ|En38O`!7jp`s{?_S!jhXxSLs@ionjBX&>J+39vXBUr zFu}l}y-B83R7c`+alL%A&=UE>ki@Z~^IXNQ+`#_z$>rgh2{z|>i7WgT$*f1|^Lf#j zS@keKmJ 2-F`G;nVI6 zz{mbO;lo_!PBH$9^}H87D}8_dzj^e$#`B|!_x)MYy05|2uei@24wcLgY_d(hPGMGT z^VhU^DCgbzSk&)T>j40_J;TKj?U+ju7d|4ZsXEV%&ZsK*;Vj`^Dh}MKZ`zbNi01J0 za|-)|;vOkZ6i`33DRID#s4M1PSZ?lgI^1Iguy2tgA58<~KAyJ@`h H!Q_ z3UooIsetM7(~K-a6gY=I;A7afL(k{dWWH60ujJu@rYjJ7qMo_^09QxmUtI6i-%)o0 z7&qk__?*|hteu^g>jP}2pt9i!W<_t~{?=A*k<9Ew`|Kh79Zr5`_-?9$xNw#-XI;5A zzuV^Ptf*n8-h67~yp?~$Jh^AiGCydH;!}NgU!}XuGeh|ne&y92d&(>Gk |RN*Y2P`iH{ZM-e_80K2P-*qFp z&ITxPl7>?~LJd3S%9_8AVqr=9=jO4*K<{Ocm(Edm&NZEXsXsG9^O#o~T)loaRd;A0 zFIAq=r5!JsgJJ5^VBj5OF>W2ci(x)dSeDxXZv6EY{{Nls@7eanoV %VE3{mY wP9Gvo7>xK@#tH+CwRrJ%l$K_hTP=$&*XoN^H|nRq$;rIl$2mk-aTl) z^dSG`&HL4@S4UR-wS11`q;oIee?OKiJ!ETWFZKJnF4vzR7R`)mH*PNorVLo8@-Lz| zy>i9nffmLwGn4Lg)n}0c#oGbRDP0tp8?T2htXBhf_~BapT-V!3YPN!FufXcEjWWvg zR6pc1sL+4xvV-F#gCF-*`NiCbR5&;@k{9?8L2hy=s3L>`^q?9l@#=uB z49kC&Hk7ie!RBdc)XICe3=>sL8%z1!5SCgU*hTEXUJlXQ62+B4o9Lr@Nb|#7xmuhc zTw2i8Pk1Owgv@jG3WLw{iyegM+1$<4ClheJ8l}cUz%NInV7u|+3eG-%Ib14g*Ipzu zb+>g vEh*jU3C63bgp<8+{K7Z1}BRPu3 b z72u9(_OL(Ye@iRx-Ni3G@_4 zfSfWs26pQWGn1*^k9S2-W LGQDxW3=$r9 zvAfn&E;0p~)nnm@GAVj{tVXFRpsXHkKa>j1KMLOKGI 2ft0w@!;;6{*Dtd2xNdaAPT()ThqEA@^1E#)}bK70GcZx+|c mPy z6tO8`Q%q((+F?~;g_>8S`QsGL{tDr*vikCMiTM!I?KiPSY~v}hPxxHE4U@0m3$W-Y zpD?Qd_dBJg^r1%gH5-^|<87$82g@HCfMvCzE-ch7LA7_JBA$%^ {-hcxN9e~Zz1>Dd?RZc;g9 z1`D^2(GQB3taq~1I>H`Z4t}F%`}zpM0HO#4-l*tUCEW>Ux=ZWVH*!_N#6$WyOZ{D! z%a*}{4ESbbt0ny%WVp`@bmR$?Y=8wVxj3&Z${?G$9kOb7_%eTy&|GgamWz9fUt?%7 znM` (&cJfA{j-Ec>quIM;nu=#w1OF(mlCZQ=Ce z^w;qooPl!sZrXn^*a5T#OZjWl=X?8WWwFK19(*}lZ_C5xfBWd((`oocW=HYdCI0b( zQM(HK=rs(@d3k7RNS_zSU;xNX8QvHIundFyw19I4oVzX8`i^;q)Izk#w|)LGP7EU` zMu2Qbf}mf#Ve}z2)OV|=2@s< *{&m#3|Ay3bLJ%$=j^Km?0PR-OHhS?zn#%wh2UXunF#x!%f%*z{fye!V@)p z0@pmDpIc52ZFqETfeG%&TZZ#zqrrP??8C0I2Z#VswIZ{&rj|E(r60JmdXD3E0PP%i zYc|&c-uTEbyySj=?c3}#q!R&86dGMog@OxYwF@q0`$Q8G`n%9Di&idOq#L1It==Xy z=0XVcvgDKeGVvjhhd)vfK3-yT(}M7kIIj`hSc QDdawJ^?!aqcIHuPbnh+^Z6f*DFat^ z-Rj5b?>^9*)vDi*gLB<}oIc4x9YccO+ZN6PsK1W);|!GZuxZ0!KTe g%@vufZM oH5D{z{ OndSYh5 2lOmv2-q)oB46I5ij!jcnF>d-u3|Or{rsE-#bN z*vv^xZ0=!~ #CI*@&TZF(&sI3T<@v!Q z)SGdC=27*uVk>ov`*aS)@pnIYTH9zs8*D2&&j79vn;Q3Xj~0Nkl-?(KLMi&5pv(Sy z+-} K^8DI4j%$`$4313*Q1oPzW|xiks-J_6luzy9~z#qGuF_P1aEM`i+WK`L*a zDQ=}?Vyz!>Z03`-Vgn~Cr6hH&A8~X?VJJI)P+huBUSk42=Mj6c$?gsh4 @hAgBIy`FR*4_y@Q({&cF3LU9*Ptls5hd{gRl*0x#;#Im220s7UhMtw0 z2Bqt?icmr@ss%%jWzE?Y0Om~$Syv(C$fj$&EgvE-6`W5u3ZDOOE%Pq8d>Dr{XUgG! zK2!re)ik-+qxPqOV?h_QfsSvgjLE7C(q++g2d?zsUr<4R6IOVG J1y28O3ekly`N}pgu9-A%9griza7!28LXJ)3A%VhO| zpEXDPZ4HY2QuNspAGkL*a>qq}{0Gc`uFU>(kpyTXK6kGj06&H6Hj?~vA}`fQGS^y( z?WGrTkRAin9qI;xaqxUpJy8Qji9rZ6{Z+dYrd@cy9-AHk9u5e#ncruzN^A-Qc-A0{ zCm7pA2n_jFA8oOtM+3gO&)7vj|62wD&9Wy?#C@0lCu1pfA?6TBEqkIU`j P;YatlS$QM8liHWNU)HHv9eHjn`$g0OW@v05^W%kd8Vt6ZPR%-^Z^FWy>rYuG&Ch zKDZ6+fhmM-D88fYfgmNGjR{#M-%!+_#5^i;H?4YbA!0g*T?FDeiH)5CuxWlLAi{*I z;L`G@Lc5C%`v=$wx;O6*J(gd8XLapg)y3kd6=2a;#Ln(D0fZsA*@9&N7e3yLE^kma zhvXUR9s1>Qd>zvtY~cjy^bjz6K!5z;B29qLTGCq0t2R=Q@l#H%@7L(5`~p0G%VPWd z%>-(OP~__jp1**Q{F@-7xATiDK@Li(vb*qFcYxd4+{mW^{DEKtL42`)x#@%y@Zs0S zKRzB`Y;NRJ5Wjvr(5biv7tbMf7*;u1xhP>SZu-hS$5NQW*G1zN2~Ol{9OfNyxEP{! zy)8^iinhCjm$W(5yaTTrSY(V-Tk=jnZMkYAg&CiVCjF9RRaNRv(1v=OTX01mnV1Uc zKs-fwitrTRwdSB!F|5BfYs$47uSkET&>pwt8h$&I-;FXk lB delta 34723 zcmXt8V{jl*vyH8dZEoyjW82tdW83D$wryi$+qRvJZEXDZ``&w1^Jk{3y64_LJ?C`a zxle*TPlBwS8~_T09| yZe@F=GU^#i%O=(x z6Rlry969+z8ckwHvw<-tT7|3D;^)Z Z^*;3lRjD9Qn zUngyQ&n5gOmmf#L+D5wk7?~97o>laH>!?-q!+ULw9zacgds752`Bq<@U_CX_7$7%l z{AST?R_;QkbwA!q)~iEZX81D%KWEl4!V1*Sk|6)&d?DUTIbI>q1oADB|u$E?{n! z1f7#QR~y5Qd5OKg%Rib{IoKyPSYw_irJ$x> GsC~ne-=yuK^%djYp9g6&;s(HyJ)AW8kU*%xm>-zDj1~$0ChDDT$zN0mvvOqKF za;6y;RDtsGU(VKvSA#f!k)yp0qB(k)SviSn;8a7PBJ>QBvO$gsxv#Ps)evZ#M~b+= zdkU^F`zkLFjLXdhF~*UmxT9wU>4X+~21J_UGpCK#vSz}_J1?AICVP0^#78(z)Q92E z5=P@MGVTx){}d(Xyn2TsiXUXzA8soBbU1bj8QpAYUAV(!dxB_y=g*&;xxEKTK28Yc zgwsY0DTrfJpQ3oUmtF`w_HbFdYlK+eoM;Ur1e)0>c}l @k+e33R_NR+do}qsI+XlsieU zl>5||)=#V0|H)rYVG*$bDZ;|>{S_eJza$ 1cGAt?L6_AXmaO^7~lN8 b>Jvo(nD_ zen%vK2HETvE;3VE8jWJ8Aeyi7o|>ol5U GkJ8j0oeHFLp%U>knmqSUg9Nl=G?9(rezbvOU$GVv!j!C4#B6QN!)pX zgXX$th{}x*A>;ZuvDDCn71J$DY~3N^;?lB16Z+_=r!Pq{>8$buY)}Ccb)7ksre}i{ zx`>HD?dYJDZ2hSXJERk;skcpZHQQKD59hE@y#GR$>4%mz*kK;5hM26{kcLS~p*= 8J89Q~Td%qq)N|G2`mzVcY%ESei|%SuE;+k^Lk{hbnXH!x}tko-7g|?#hS4C>23x zyVo0O%&BdZOpyBvT#f-Wp6@Z(i#mu5Mr->F2zRW3kSd$ b&SM#r%sKy0qU$^tBNNpRG${#&&v))cx$HXE303PJfRqqqeW^HEIn?E}&h z4naf%O>26a6Zu*hh?>tg8sd4!@+}sV%op(xP+D&FTmBivxpn0=yo$ti=uFK5k5M;G zKju>-*!Blx8pruo#z?R^xtUv)Ckf?J%+Se;WZ!g6|1z@bJ~z#*F+kJO12=bSp_?3s zroysOA*$mUqeQxA42t9TXvx4qX*z0jq SWP23s( ?pZ5pA6HYw9_rA#Mr z;uoif+;>=}%?pc2Xuz4j#WexKp{Htl>Z{(@9t!41%_(G&lhCX7d{Y^wnfryzQy_cU z<#(A|oVD+flcWETQx4uEV<@|wF)` x~oQ7lRO%^ak7oWa!5g!j$&EqLZ z72f>P7oR*2IWE tOcq^S=i?ZUv&m3}|x z7^8 =O)NoJ3lyxd4mLM%uw%K0Nzf=tj)N0eWW;walN1@OBabu10%P&bFLqi1}RCabdt zbokb$;gjzmzzPhcX(>uC1#0XYUoAUn3gyo@dw3<|IglIin*IwUxHeg{1wn!U`e>xS zf222B0J?{g-@k_f)+T$*x=1u*>c*?3LCPvHh&4m}llNyNIp&xO_&r1&TU)^Ye*FA6 zJuyt(6i3B==y*ymBPDk241R`J{Q~(NznGRiU;rp6Z|0SZjrTX78AV&TZLe-CX&j_M z)n;Op`*HaQpHghOfLHao7*+MUETsM02Z3HU7x3~ {gyA2A1*3LUR5 Fct4GS1yBdsn!!D6xOUkKv~~Yw=h7oe=>Jb!)xWe2 zK-nY1h9&MKm`PmEaS>xF%hV!dvi2Yw>S+HMg?vq(%SvgK> t*GcWg9WH3mbF!}OmT0I zMR4;V8qy)5M(d76JIEr~CvQ8L5WJW}mT<1RtA{j0YH2xuZUIx0Ahux=m^iEYjd4?2 zEZoY?Z#uI~-`Q@C=@t{M^B}6;ah+hFmWVN5-JRn;CL?`%Dc0jwHjUEh5KpGr$&lHf zEGk}kP1eT*%#dq!@d0;Hr4Maw*n3(q77()#&jo>R84HbO5{t{>E@b(nAyW?hNYun& zmJmN2isr9IbM^)wM2ELYWqCyFQ~=b*uff_=(H=38t}cky;=%4%(Jqfc%Fvo5zxfFp z#IYkx_4d( 8?5 z8xyg6X;MK~S8CMrZ3)|AS44PLKM5%LLM(E1ojY!HZ51!Q)RK-4O4D)j$p3OFd$H$W zm6R*;5%C4{SOc5I#CpnFU_Q&O$bUhZsm-L6=MVsKLVgQ-DQGvmEq@xqzbN?)r%jF@ zyTMAE3Fzf6i$vcE%}6?Vnc9iI^H+|zN?_nb*d1|IF^d(6MxSHbeGAi06o>raZAxtP zJ9u2lIg
gP2MJHo@WnG l_lq zMi5#oo{-xd5~PL_j@+5D!G#}8`;!B-an+{Ct`*XJLH`vCBp+z5E;I?d+KWrn7V#9f zi{k0_xCOz{joKxHNY)uaEZBJoNl{*`yq{kK3DRSV$*MG~lc?!0h%~w16{+-~oa4iQ z;)6z>2CSguaY)ih5JDU-L>i*Hio`7uZu559^FsQzLGf%2)c^V%HU^%o+eMYJYf%@} z?CYa{_&0P+ANWa5n8@Zm`8I!x%0$II^s|Q-M@C)WTsm}ENT^1t;x3P#u!J-DTXX5x zLgB9E-*V{w6GXY`pk92Lw~r%(w~yr4>OT+iZTbsGu>PR57Ku8xawP1^RPj)!@nn3t z%*o(|4Cx3k-$S!PlmH5sKsx#({Zi>G6w9KpsLc>(h1Dgg)Ls0=copMO!xrwBe(7ZQ zZ>Auz2w5S00_t ZGG(5${v7m0S^%RIN|$b<^;F8l%6Y+i0f-wXuDA66E7`Lo1>2$M zU|e>ElI-epb41LDye#gwR>l$@Y;HhCpGuOBn)xFhAF8aVO0s3FezTZKjl#`Xe?P+d z2LgW@tx|^}Lc3^{30XwH>NWO~Es~hK@q&R%l*L;(+@hRy@+Fa@b1KQl<2tKIvPzLY ztBmmxXRA?#AaIF*Gb?5onBWQ6J%KhTQRMz#xUPTU%KwE6y4tT+QgMCUUgnCjQG+Ga z(l{;f*nJMi4x~bNTqH~{n$x^ Tv=H-e|tF UxB0SDcXwo8?c*Xfmoz2?WZxhPb zK@ g~0B?JAF{I@ `z_Jmv}30m8)9Jmwu z-v+D;{P=s)Z+wv-=f>w7+^2!@LTy`&i7-E&WhVjsi}>ZeH_5yqi|^r{J92!rZ1f{^ za!wCPCo7+7%|E^n|CdAdYQk~5D#=$NBdQs#$7GK&AGMU>B4s-<1=94kSke+}CAZ2n z2eC~+)_KlfbjS+ZdX^+~qRG~DnT=$?Lti18kYea?8$VUc6uDi&+9XSxs92fV+eEj3 z=(HdS4g!#xv^Q>*e?TPj8H0dnln%t&q_m2s0K&pq^d$X|?gOl6t%ye#6(eW tvoN6C;#~PjWh6# z2_HWvb!d-j T$U~JZjj}` z?;wz?Jr@&fv`B#Amvuuybsa$$B3HrAw8_v>@x>Y9noD~d?LGR^my-&RL=S6z{g(7) zp;B03JsOI@Xhf14<@eF>LH> j*=tI1?4DVTef!tifi2-k*ejyK~`Nnri;> z_tfT9G_3p|eFm}AZj*KZ($euM_8A|QXALO}&3kpFZY|B2Pb2L_C?fYqPn8y@1HK8Z zVl&tw;P6)u;vEs5Norh48EbHWU3wmo&mnr!l-)Lg8g5J|pgviV-)dJbVbu+FaU|U9 zmVe$m(NIrrS9Y;=K-t>$Bu13vFs_+F{sF>Z0!32FbmvKzRzDhG(OvgialYqTc_2b_ zU!ZKQ;x)PCv+-R=YT;UYur|ZPgIq&JS$}#Y=Crg=Bs6rR!`mbzJY}ABFVjrc{G&k= z1{Y9&snm>cs19zIu*hznXf4W6YnT1}Z2rZx)o-B^?B6_=0(u);(gJppnPXf~?M?nn zURX*kMU-e5tE>(9-3X{zRTb;G)0K#dZapdO$oDx{y+@1i-^x1#rll^$PeRX9;!Ms6 zjkO%0!r0snZAggeFFYi5wptO#GeCn7jOc_w&i!mbgAX760Y| 6&;##> Y1V95LSNG3&Tb$5)CrTD z`^|$tD%I+4o;(MRGx&n6BNCyWe3dl69UfM&UB9a3univFMNzk7>3>Xm^9Em9(I!zw z0WG4RDWFC$yekpJhC+i1#q9!SWDPsqJkr`2H)#Sq0z!YG_xXE+%J5fz#l3;r+7S<< zI#KRDRuNOi!d^*VIzrqT64~&GdI^Lo-{$+Qv`D}G{yo;gm8;WPRd`ruAu?iQXL0fT zYqu>dtEa;~F;eEkLB$PH6g2ib?k`jqnF3#Rk?*YyA-EhG25T6NnS!buMYR^t5Goi5 z# r)dnXGJ&B5rV4;%8q)ga;xwq)8^|C_*X&VZCwCW$2DL;JQ~4F#=(3UmSYoW zsWa$p6CZm&CB*1_R#29V#b#Ps50{oA6j}$KBrin4{hi^B(4|AkCKE}=^giPvj^6P} z7%n`$O+AQ|l3Z|atKn>?EwcqO;-W9q?nS{Hk5F9Muk<&eC%?VGhj}aN+M%mFS(<-} z7uGe?El(ks%ZqQ8bZJXWiM}&RkQhz7&1ZA5B0a%v@fdS>5j`_^Gy9!8JneP6ear%) zADIc0c?4sBWZjcmyw=c-q3Q=8sb)}{pudDbMTs) #a6vyp zDR4?GH~eWIP%DK?6meJHYgAJ*l>H9uLvaqep0Z7=53bE~eR;*O8vJm*7(_hvR%S^U zHesohvTG8onm3$kG^bkSwTM$g9N9u@b$*a{XaQ$%AgBKVd$vr^k*XLcz(F)naC7Oq z4 WeX0+B zsRe$e1jDn>2Z=ofoU8goq28?t$H#FyuP+Qh9y0Jad$Toe#UX0o_*5Sr`Zs#Csv79c zD)5BwOEN2u_u#bt)? 4A1D86 z9Rgui3!y7Jv4Q5)*S%PcR9QTEHIZCl_A&P-&D|yi{auv~a}}X{ yALPJQ4iwmjcWk||6gV~KZhPhO13 zV$uGvHDyPBMIT9Pssz)E*+PWi*Bp(oTaCFvdYHx=Hq8sWdBbp|Gk=0_Ha|4Gnt|B7 z%F;+L;RSEBM4cmxCIl2mQ{|X0$Vszo8uZpkeMTxsrmrV*Gm4?OdpFAvzZVJSHhv>x zALL%tVk@;stiR5{M1FnE#A(`kZ)1rW9!IpA!Ok$h!gU2X|A}3xd0YGCcj&Y*)ttE+ zES*VYo^MF3M-lVPid0PZ$8q2Jk9OGT5dZom#E7K$HiENVNGI_0U}s!VrMLX{?K*}aaBAPdLW^vq(A8RjtGkx x^)YxH4W*ibiZn_`&&$vD{Z};i!(}pSfzGO zy7QhAJe{MLA6Ej(&FxFqu@NyiIu*Opp+d)>gaqt1jUX>}V8Uk*M4@m+b4*SX@xR4+ zuOVg-5!p}4yqH%-NhS7p8)6e|?ndR2Iqbno(zy{fCHuix j#Jf2S*I{lo@exl7+wtp1{@WD*amSe*^9)B2_kgf*hZ%nL z4ccTdiQ`z@QyWaVZ6u)p4uj_VQ+mS}m+E!xx5bv6)2@K>)Y0{fA0CsqbIx-_mNbj6 zDY#MV-!X&P<>@p~;&@QU(lR&-O$g`k&prThJaSdpuY)-TO}09&(LEMmzBQGVi=Npx z*`(@X$7BYu#+_NTQl&i+YDO0&
y&?MqfbtBYWVzJNyJZTYFs4LKekzpJlu`(9ptPR{T~5 zlfaf Kgz92iGhIdEv&$z0m36hElyw^I-2dBJc b }#e_105OEy1N ze2qk!v;ZPjz!}3=k`&dmkF-( lv4e?* zJwdAmAjvF() ag7V}RjMJ%4Yo0|j~Mi?lc_JH6fw696^%M4gGhsxwUpijNRao!P!qhF zV^aPxQqPc{2^ys>*Rh{x?UdYkUp>t&TDEv&^J3R;G)z8wvTB#*bP_*Z6b6^&*yYBW zr!|_TlQvl2O29}-U~N$KLGu6;mq{_cVdufgOOIO5gzR%hR#0Ow*f<}9NQk=b>j{Xs z(cEM!NJtf2DQvqkD`w}Pr=uC_hy1 )dL-?zu>Lbyk6o#=S6P 7dYn9$+v5>XG$1GPZWe&Kio>WUb$SU06vMn{#$czu9vE6+*zRJ>+V1!N_5$_dVs z4#cxL=-C6mRgRgY@c_mrPBC-r=4NUBNA14M%-+ihk45l|^532@juU?tU%AmvGGQik z1G-;v%%mlqRh@8@oi(qU594P?$~ol&GKSkaqAY)3&(1P8=iPzeDNE~i<)da!T`?+i z$M#oBemPxDG$LxMuLc(ak%_9j(}cRSwkvYqW`3i;;tfp8QWqFU{wYLIV)0Lkzpj;- zb$GkuFD>Zr>aEX8q@TwL2W28ZTbYb`Sxd>E&^yPEl4=D5yR8cW6qOX-3Q}f8B>oB} z#l%Q8oBA{Kby(n-;v>6aZ z%Lb*n70uf;mmZhsOG#No0Xu?|T=|-pLq<9^|pe=L|U=;%dLc`4ye8C`b z^bf-6U^>RmKRA41-0_}pR+l}dvfbtaI$L3O6l8fvL(kvM?|)SV{*4oNI$6Fdj2zlf z1_S*Y4-B;x>K=Q{yStqt*M>PkYtS}#pOJ;EHS95kBhQ3xo*T$+Q(Sa)Zc+NF!LV z>eRD!kbgKQ4cV^`)p5|ipbw7J-aB2HF*(~FZD7i$A=!>