a
    
i}                     @   sd   d Z ddlZddlZG dd dZG dd dZdd Zd	d
 Zdd Zdd Zdd Z	dd Z
dS )a3  
Job Management Module

This module contains all job and occupation-related classes and functions for the BaoLife game.
It handles job creation, assignment, performance tracking, promotions, and terminations.

Classes:
    - JobLevel: Represents a level/position within an occupation
    - OccupationClass: Represents a specific occupation with multiple levels

Functions:
    - getOccupations(): Returns all available occupations in the game
    - randomJob(player, person): Assigns a random job to a person
    - setJob(person, jobClass, date): Sets a specific job for a person
    - handleJob(player, person): Updates job performance and handles promotions/terminations
    - applyForJob(player, jobID): Allows player to apply for a specific job
    - quitJob(player, jobID): Allows player to quit their current job
    Nc                   @   s   e Zd ZdZdd ZdS )JobLevelaU  
    Represents a specific level/position within an occupation.

    Attributes:
        id (str): Unique identifier for the job level
        level (str): Name of the position (e.g., "Junior Software Engineer")
        salary (int): Monthly salary for this position
        energy_modifier (int): Energy cost modifier for this position
    c                 C   s"   t  j| _|| _|| _|| _d S )N)uuiduuid4hexidlevelsalaryenergy_modifier)selfr   r   r	    r   1/var/www/lichun.app/lichun/ws/jobs/job_manager.py__init__#   s    zJobLevel.__init__N__name__
__module____qualname____doc__r   r   r   r   r   r      s   	r   c                   @   s   e Zd ZdZdddZdS )OccupationClassa  
    Represents an occupation/job with multiple career levels.

    This class inherits from locationClass as occupations are also locations
    where characters spend their time.

    Attributes:
        title (str): Name of the occupation
        description (str): Description of the occupation
        shifts (str): Type of work shifts (e.g., "Day shift", "Rotating shifts")
        hourType (str): Full-time or part-time (default: "full-time")
        requirements (str): Education requirement (e.g., "bachelors_degree", "high_school", "none")
        type (str): Set to "job"
        levels (list): List of JobLevel instances representing career progression
        image (str): URL to occupation image
    Nc                 C   sX   ddl m} t j| _d| _|| _|| _|| _	|| _
d| _|| _d| _|| _g | _d S )Nr   )locationClass
occupationz	full-timejob)core.modelsr   r   r   r   r   typeimagetitledescriptionshiftshourTyperequirementslevelspeople)r
   r   r   r   r   r   r   r   r   r   r   r   ;   s    zOccupationClass.__init__)Nr   r   r   r   r   r   *   s   r   c               *   C   s  t ddddtdddtddd	td
ddtdddtdddgddt ddddtdddtddd	tdddtdddtdddgddt d d!ddtd"d#dtd d$d	td%d&dtd'ddtd(ddgd)dt d*d+dd,td*d-dtd.d/d	td0d1dtd2d3dtd4ddgd5dt d6d7ddtd8d9dtd6d:d	td;ddtd<d=dtd>ddgd?dt d@dAdBd,tdCd#dtdDd$d	tdEd-dtdFdGdtdHddgdIdt dJdKdBdLtdMddtdNdd	tdOddtdPdQdtdRddgdSdt dTdUdd,tdVd#dtdTdWd	tdXd9dtdYd-dtdZd:dgd[t d\d]dBd,td^dWdtd\d&d	td_d:dtd`dadtdbd1dgdct dddeddtdfd-dtddd/d	tdgd1dtdhd3dtdiddgdjt dkdlddLtdmddtdkd3d	tdndodtdpdqdtdrdsdgdtt dudvddLtdwd/dtdud=d	tdxddtdydzdtd{d|dgd}t d~ddBdLtdd:dtd~dd	tdd3dtdddtddzdgdt ddddtddWdtdd-d	tdd/dtdd1dtdd3dgdt dddBdtdd$dtddd	tddadtdddtdddgdt ddddtdd&dtddGd	tdddtdddtdddgdt ddddLtdd/dtdd1d	tdd3dtdddtdddgdt dddd,tdd$dtddd	tddadtdddtdddgdt dddBd,tdd9dtdd:d	tdddtdd=dtdddgdt ddddtdd-dtdd/d	tdd1dtdd3dtdddgdt dddBdtdddtdd#d	tddWdtdd9dtdd-dgdŃt dddBdtdddtddd	tdddtdd#dtdddgdσt dddBdtdddtddd	tdd#dtdddtddWdgdփt ddddtdd#dtddWd	tdd9dtdd-dtdd:dgd݃t dddBdtdddtdd9d	tdddtdd/dtdddgdt ddddtdddtddd	tdd$dtdd&dtdddgdt ddddtdd#dtddWd	tdd9dtdd-dtdd:dgdt ddddtdddtddd	tdd$dtdd&dtdddgdt dddBdtdddtdd#d	tddWdtdd9dtdd-dgd t dddBdtdddtddd	tdddtddWdtdd	dgd
g} | S (  an  
    Returns a list of all available occupations in the game.

    Each occupation includes:
        - Job title and description
        - Education requirements
        - Career progression levels with salaries
        - Work shift types
        - Associated imagery

    Returns:
        list: List of OccupationClass instances representing all available jobs
    zSoftware Engineerz1Develop, test, and maintain software applicationsz	Day shiftbachelors_degreezJunior Software Engineeri     i  (   zSenior Software Engineeri  2   zSoftware Engineering Managerip  <   ZCTOi'  F   a  https://cdn.discordapp.com/attachments/1106614533402931284/1218751308442501290/craig_vg_software_engineer_corporate_office_cartoon_style_82738406-5fab-4a50-a27f-863601e08dd3.png?ex=6608cd9b&is=65f6589b&hm=8565ea7c04f1de8ab02531da9a3c79607e5915b3a3d4f270594a450b21aad93e&)r   zRegistered NursezAProvide patient care and educate patients about health conditionszRotating shiftszJunior Registered Nursei  zSenior Registered Nursei	  zNurse ManagerzDirector of Nursingi  a  https://cdn.discordapp.com/attachments/1106614533402931284/1218753226258518136/craig_vg_registered_nurse_office_cozy_cartoon_style_androgynous_01b66f1d-c3af-42a9-b475-66d76a6dc286.png?ex=6608cf64&is=65f65a64&hm=4a7fc03f67c83781ac2b7be760b8312c8ef8cd90ac7cf4d8acad8da0ceb360fa&zElementary School Teacherz)Teach students in a specific subject areazAssistant Teacheri   iL  z Senior Elementary School Teacheri  zHead TeacherZ	Principala  https://cdn.discordapp.com/attachments/1106614533402931284/1218754314999431309/craig_vg_elementary_school_teacher_classroom_cute_cozy_cartoon__b098c603-5958-4ce5-9e08-a8f66dac7d21.png?ex=6608d068&is=65f65b68&hm=48e12924c07a2619796effe2809ce1ab6bc85b596e0c272591c5668565e2de01&zPolice Officerz'Maintain public safety and enforce lawshigh_schoolix  ZSergeanti  Z
Lieutenanti  ZCaptaini(
  zChief of Policea  https://cdn.discordapp.com/attachments/1106614533402931284/1218755582559911936/craig_vg_police_officer_at_work_cozy_cartoon_style_9c15e689-4dfd-4aa5-9239-f751124cb27a.png?ex=6608d196&is=65f65c96&hm=721d09d328b54239e7376ad531546153d017b0d73435d5d508caa3765c53e149&
Accountantz%Prepare and examine financial recordszJunior Accountanti  i@  zSenior AccountantzAccounting Manageri`	  zChief Financial Officera  https://cdn.discordapp.com/attachments/1106614533402931284/1218756621971488858/craig_vg_corporate_accountant_office_cozy_cartoon_style_4a49f16b-6796-4d52-aad8-5011adb7090d.png?ex=6608d28e&is=65f65d8e&hm=d507d0ece82ff2310889659ad7d1da427691c2519198ab9142936d7663a928de&Chefz&Prepare and cook meals in a restaurantzVariable shiftsz	Line Cookz	Sous Chefz	Head ChefzExecutive Chefi  zMaster Chefzhttps://cdn.discordapp.com/attachments/1106614533402931284/1218756781694652496/craig_vg_chef_kitchen_cartoon_style_972262c1-9427-423c-9dc0-7048bfcabaac.png?ex=6608d2b4&is=65f65db4&hm=e2d358babeccde4c88184cbe7d42dabc03f5b1fa0e0ef7e2353225edd0e52e57&Lawyerz&Represent clients in legal proceedingsdoctorate_degreeZ	AssociatezSenior AssociatePartnerzSenior Partneri  zManaging Partnera  https://cdn.discordapp.com/attachments/1106614533402931284/1218758065491284038/craig_vg_lawyer_office_cute_cozy_cartoon_style_075eff79-b3b4-49ff-93a7-a555999f205e.png?ex=6608d3e6&is=65f65ee6&hm=2788d48cf6991bcd5986d945f8baa6766b39bae4619bebddb2bc7ecb21fd028b&zAutomotive MechaniczRepair and maintain vehicleszApprentice Mechanici  zMaster MechaniczShop ForemanzService Managera  https://cdn.discordapp.com/attachments/1106614533402931284/1218758042624196718/craig_vg_automotove_mechanic_shop_cute_cozy_cartoon_style_0b0eb986-dcc5-4d8e-9d41-76b56f0e84bc.png?ex=6608d3e0&is=65f65ee0&hm=56e4cf50ab694e4f80425bfb46581a355db6f15bf7a217ec6477a91dc387e871&zSales Representativez1Sell goods or services to businesses or consumerszJunior Sales RepresentativezSenior Sales RepresentativezSales Manageril  zDirector of Salesa  https://cdn.discordapp.com/attachments/1106614533402931284/1218953374079258644/craig_vg_sales_sleek_corporate_office_cozy_cartoon_style_95ad0a28-f265-43f9-899c-24aee7e3398c.png?ex=660989cb&is=65f714cb&hm=cf971f79b3f32f518fe117cfa88fb5c673a1ca8f964b461226f673a811bab0ed&	Architectz/Design buildings and oversee their constructionzJunior ArchitectzSenior ArchitectzPrincipal ArchitectzChief Architecta  https://cdn.discordapp.com/attachments/1106614533402931284/1218758567411322900/craig_vg_architect_corporate_office_cute_cozy_cartoon_style_ebcb7626-07c9-4a00-8b28-9b4710817ff5.png?ex=6608d45d&is=65f65f5d&hm=47264f737b42a371241ac8f76807dbcb9edb1e1efc998c8b973a3c636db5fcae&	Physicianz<Examine patients, diagnose illnesses, and provide treatmentszResident PhysicianzSenior Physiciani  zDepartment Headi  zChief Medical Officeri0  zhttps://cdn.discordapp.com/attachments/1106614533402931284/1218953997801750579/craig_vg_doctor_office_cozy_cartoon_style_183f5128-9ddd-46f6-ad7e-5f611e87cfbd.png?ex=66098a60&is=65f71560&hm=9994300ede63da767872bb02cd02f91ee6543d36dc788ea8599352bc8bdad782&Dentistz.Diagnose and treat issues with patients' teethzJunior DentistzSenior DentistzHead of Dentistryi  zChief Dental Officerih  a  https://cdn.discordapp.com/attachments/1106614533402931284/1218954312642854912/craig_vg_dentist_ofice_cute_cozy_cartoon_style_0930e6ae-e85a-4472-995b-a121aa93e320.png?ex=66098aab&is=65f715ab&hm=3b6814d4b032980dc11dfd7a538ec9913b9ce59cb89f9eee6f954f6f7b86a74b&
PharmacistzDProvide prescription medications to patients and offer health advicezJunior Pharmacisti4  zSenior PharmacistzPharmacy Manageri  zDirector of Pharmacya  https://cdn.discordapp.com/attachments/1106614533402931284/1218954456482185276/craig_vg_Pharmacist_office_cute_cozy_cartoon_style_9505ece8-fd4d-456b-ae52-88892ad09071.png?ex=66098acd&is=65f715cd&hm=8c5b0cb7a48ffd823ad963c77614234d973a80dc704552639d517e21bedea1a6&	Librarianz2Help patrons find information and conduct researchzAssistant LibrarianzSenior LibrarianzLibrary ManagerzDirector of Library Servicesa  https://cdn.discordapp.com/attachments/1106614533402931284/1218954416086843483/craig_vg_library_desk_cute_cozy_cartoon_style_f349682a-bd39-4011-9658-2cb982c4e50a.png?ex=66098ac3&is=65f715c3&hm=e62fd84ea784e97201f2149a99394ddfbc6feb12da8e7e1d0c3d510ae0071234&
Journalistz<Report news stories for newspapers, magazines, or televisionzJunior JournalistzSenior JournalistZEditori  zEditor in Chiefi
  a  https://cdn.discordapp.com/attachments/1106614533402931284/1218954911094407329/craig_vg_journalist_office_cute_cozy_cartoon_style_8b0f9fb3-640b-4b5d-abc8-8561a8e2abe3.png?ex=66098b39&is=65f71639&hm=ceb148f7a309769b7e93be4df2dc9f5468cfdbba57e8f0c5d45a2ff50bf542c5&	Counselorz;Help people manage and overcome mental and emotional issueszJunior CounselorzSenior CounselorzCounseling Services ManagerzDirector of Counseling ServicesiT  a  https://cdn.discordapp.com/attachments/1106614533402931284/1218954956317528104/craig_vg_counselor_office_cute_cozy_cartoon_style_4926711f-1ca8-49dd-bc87-0ad5185421c1.png?ex=66098b44&is=65f71644&hm=42dee89643da1ac89dd6cdb6070c805d3383ce6d6f8c96d27ae709894b6b2e4b&Veterinarianz>Diagnose, treat, and research diseases and injuries in animalszVeterinary InternzSenior VeterinarianzVeterinary Services ManagerzDirector of Veterinary ServicesiH  a	  https://cdn.discordapp.com/attachments/1106614533402931284/1218955149238866061/craig_vg_Veterinarian_office_cute_cozy_cartoon_style_97327cf0-0a74-42c0-91c3-06ceaf207777.png?ex=66098b72&is=65f71672&hm=5ed90f867b15fd2a375332da1828f36afdd5625c949adb788bb36948ee634d81&ZElectricianz>Install, maintain, and repair electrical systems and equipmentzApprentice ElectricianzMaster ElectricianzElectrical SupervisorzElectrical Contractora  https://cdn.discordapp.com/attachments/1106614533402931284/1218955096830902333/craig_vg_Electrician_workspace_cute_cozy_cartoon_style_4e6bfd04-02a2-49bb-a3c1-0c149292e6ca.png?ex=66098b66&is=65f71666&hm=34e72f86570769f336a0606ded7cef2cb2ad87df0d7c344d0457de9cd3e77117&zReal Estate Agentz'Rent, buy, or sell property for clientszJunior Real Estate AgentzSenior Real Estate AgentzReal Estate BrokerzReal Estate Agency Owneri
  a  https://cdn.discordapp.com/attachments/1106614533402931284/1218955487027134504/craig_vg_real_estate_sales_office_sleek_cute_cozy_cartoon_style_74a66733-7b67-4a53-91df-862b4b132f58.png?ex=66098bc3&is=65f716c3&hm=5f221635151613847ac14cca1b5621506ae48d30cb36248e388467673337252a&zGraphic Designerz+Create visual concepts to communicate ideaszJunior Graphic DesignerzSenior Graphic DesignerzArt DirectorzCreative Directora  https://cdn.discordapp.com/attachments/1106614533402931284/1218955697534926898/craig_vg_graphic_designer_workspace_cute_cozy_cartoon_style_9199c766-61be-4c2c-8743-75c43cd7763c.png?ex=66098bf5&is=65f716f5&hm=2cf933b8153b1e6d6e7659c87520ce4ed2434be3066259211b552ffb165ce948&ZJanitorz%Perform general cleaning of buildingsnonezJanitorial AssistantiX  zSenior JanitorzJanitorial SupervisorzJanitorial Managera  https://cdn.discordapp.com/attachments/1106614533402931284/1218956044907184228/craig_vg_janitor_workspace_hallway_cute_cozy_cartoon_style_7833142d-090e-40fe-a18b-cb80c2cac6f0.png?ex=66098c48&is=65f71748&hm=82e0c829876ccabbe1712d4edc601205d91d81e090e8fe53864fcf4e6d76d845&zFast Food WorkerzServe food to customerszFast Food Associatei  zFast Food Shift Leaderi  zFast Food ManagerzFast Food General Manageri  a	  https://cdn.discordapp.com/attachments/1106614533402931284/1218956084396429493/craig_vg_fast_food_workspace_cute_cozy_cartoon_style_dc2c1155-6230-4aea-9c49-7577b8226e5b.png?ex=66098c51&is=65f71751&hm=b2a2a78a2e9422f7efadf746d677ffba7470411c49fc71c636a0b3a101eaaf16&zRetail Workerz"Assist customers in a retail storezSales AssociatezSenior Sales AssociatezRetail ManagerzStore Ownera  https://cdn.discordapp.com/attachments/1106614533402931284/1218956885718204657/craig_vg_retail_sales_workspace_cute_cozy_cartoon_style_29a7c377-8dc7-43f4-a095-5003e5c12f21.png?ex=66098d10&is=65f71810&hm=876e10137422615e4bf13cc95ce5d79dab1d56976ed8427040c3be61841d4776&zConstruction Laborerz,Perform physical labor at construction siteszJunior Construction LaborerzSenior Construction LaborerzConstruction ForemanzConstruction Managera  https://cdn.discordapp.com/attachments/1106614533402931284/1218956900909973585/craig_vg_construction_site_cute_cozy_cartoon_style_bf1bdff6-6327-45ae-ab81-25df751d0a52.png?ex=66098d14&is=65f71814&hm=fa32a7967dd3ef8678ec362511fd914f883e7aaa26967b54e6c77d5ff17d31f5&zTruck Driverz7Drive a truck or other large vehicle to transport goodszJunior Truck DriverzSenior Truck DriverzTruck Fleet SupervisorzTruck Fleet Managera  https://cdn.discordapp.com/attachments/1106614533402931284/1218957188031053844/craig_vg_semi_truck_driver_cabin_cute_cozy_cartoon_style_666a5835-e588-4f40-9b6c-f6fe9527a3fa.png?ex=66098d58&is=65f71858&hm=abdaff2cac295a2b13c9bc5d1ccffc2faddc3f4a31ee02eca04d5113af320566&zFarm Workerz0Plant, cultivate, and harvest agricultural cropszFarm HelperzSenior Farm WorkerzFarm SupervisorzFarm Managerzhttps://cdn.discordapp.com/attachments/1106614533402931284/1218957775200059442/craig_vg_farm_yard_cute_cozy_cartoon_style_55c20653-9e3d-4885-9e57-ac0d34013cb6.png?ex=66098de4&is=65f718e4&hm=eb60818cac6ffaf993d9feb85867ab9695f4c0e61f98e414a38f8cf712ddce1e&Z
Landscaperz7Maintain the appearance of outdoor areas and structureszJunior LandscaperzSenior LandscaperzLandscaping SupervisorzLandscaping Managera  https://cdn.discordapp.com/attachments/1106614533402931284/1218958478345900122/craig_vg_Landscaper_yard_cute_cozy_cartoon_style_98448b52-a2e2-4959-abda-e31a9e6e0227.png?ex=66098e8c&is=65f7198c&hm=15cd527a14f7a2184656a5cd32f910b248f3e2574231adc2406368af06a78df6&zHome Health AidezIAssist people with disabilities, chronic illness, or cognitive impairmentzJunior Home Health AidezSenior Home Health AidezHome Health Care SupervisorzHome Health Care Managera  https://cdn.discordapp.com/attachments/1106614533402931284/1218957917450141806/craig_vg_Home_Health_Aide_space_cute_cozy_cartoon_style_2b783342-6816-4a6f-a26e-98b1db93c6c3.png?ex=66098e06&is=65f71906&hm=3c43be6946b62a5be34fae42214bdfc15ff7ce13187e436e2bdbb5daeb8342b9&zRestaurant Serverz7Take orders and serve food and beverages at restaurantszJunior ServerzSenior ServerzRestaurant Shift ManagerzRestaurant Managera  https://cdn.discordapp.com/attachments/1106614533402931284/1218958313438576661/craig_vg_Restaurant_Server_space_cute_cozy_cartoon_style_b69b355a-c9f3-498f-a8b5-086d7f1ea43a.png?ex=66098e65&is=65f71965&hm=18265011fe826031f60dbf9b2d9cf93c1f991e637edabd68cfea66a11dcc3434&ZCashierz6Handle customer payments in a retail or other businesszJunior Cashieri&  zSenior CashieriR  zShift SupervisorzStore Manageri~  a  https://cdn.discordapp.com/attachments/1106614533402931284/1218958572419940472/craig_vg_cashier_space_cute_cozy_cartoon_style_decf1bb6-a748-4db2-9c7f-4f73544c9dae.png?ex=66098ea2&is=65f719a2&hm=7be215b18f07093c17201c0b747ec0e4ca9a565b2744c84f7f66e5654196d970&)r   r   )occupationsr   r   r   getOccupationsL   s   
















































































































































      *r7   c                 C   s(   |j dkr$t| j}t||| j |S )a  
    Assigns a random job to a person if they are old enough.

    Args:
        player: The player object containing available occupations
        person: The person object to assign a job to

    Returns:
        person: The person object with job assigned (if age > 22)
       )ageYearsrandomchoicer6   setJobdate)playerpersonr   r   r   r   	randomJob  s    
r@   c                 C   sP   ddl m} || _| j| j || jj| jj|}|jd |_| j	| dS )a  
    Sets a specific job for a person and creates an activity record.

    This function:
    - Assigns the job to the person
    - Adds the job to their activities list
    - Creates an activity record starting at the first level

    Args:
        person: The person object to assign the job to
        jobClass: The OccupationClass instance to assign
        date: The date when the job starts
    r   )ActivityRecordN)
r   rA   r   
activitiesappendr   r   r   r   activityRecords)r?   ZjobClassr=   rA   recordr   r   r   r<     s    r<   c                 C   s  ddl m} | jjD ]}|jdkrt|jD ]\}}|j|jkr.|}d}|jdkr`|d7 }n|jdkrr|d7 }t	
d| d| }|j| jjkrtd	t|j| j d
 t|  |j|  j|7  _|jdkrd|_|jdk rd|_|jdkrt|jD ]\}	}
|
j|jjkr|	t|jd k r|j|	d  |_d|_d|j|	d  j d |j d }| j| | j|d|| dd|jdddd
  qq|jdk r.td d|_| jd|j d   qq.qdS )a+  
    Updates job performance and handles promotions/terminations.

    This function:
    - Updates performance based on focus level (Work Hard, Balanced, Slack Off)
    - Handles promotions when performance > 90
    - Handles terminations when performance < 10
    - Adds appropriate messages to player's message queue

    Performance modifiers:
    - Work Hard: +2
    - Balanced: 0
    - Slack Off: -1

    Args:
        player: The player object (for message queue and occupations list)
        person: The person whose job performance to update
    r   )messageFunctionr   z	Work Hard   z	Slack Off   zupdating performance: z - d   Z   z*You have been promoted to the position of z at .Z	promotionTZ	Promotion
   ZfiredFz%You have been fired from your job as N)eventsrF   crB   r   	enumeraterD   r   focusr:   randintprintstrperformancer   r   lenr   messageQueuerC   r   r   )r>   r?   rF   r   indexitemrE   Zperf_modifierZperf_updateir   messager   r   r   	handleJob,  sD    



$

"$

r\   c                 C   sV   | j D ]J}|j|krt| j|| j | jd|j d  ddlm	} || |} qdS )aY  
    Allows the player to apply for a specific job.

    This function:
    - Finds the job by ID in available occupations
    - Sets the job for the player's character
    - Creates coworkers for the new job
    - Adds a confirmation message

    Args:
        player: The player object
        jobID: The unique ID of the job to apply for
    z%You have applied for the position of rL   r   )create_coworkersN)
r6   r   r<   rO   r=   rW   rC   r   character.character_managerr]   )r>   jobIDr   r]   r   r   r   applyForJobj  s    

r`   c                 C   s   | j D ]|}|j|kr| jjD ]}|j|jkr| jj| q| jjD ]}|j|jkrD| jj| qDd| j_| jd|j	 d  qdS )aQ  
    Allows the player to quit their current job.

    This function:
    - Finds the job by ID
    - Removes it from activities list
    - Removes the activity record
    - Sets occupation to 'unemployed'
    - Adds a confirmation message

    Args:
        player: The player object
        jobID: The unique ID of the job to quit
    Z
unemployedzYou have quit your job as rL   N)
r6   r   rO   rB   removerD   r   rW   rC   r   )r>   r_   r   activityrE   r   r   r   quitJob  s    

rc   )r   r:   r   r   r   r7   r@   r<   r\   r`   rc   r   r   r   r   <module>   s   "   ;>