+
    Ô·cj�D ã                   óü  € R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t
^ RIt
^ RIt
^ RIHtHtHt ^ RIHt ^ RIt^ RIHtHtHtHtHt ^ RIHt ^ RIHtHt ^ RIHtH t H!t!H"t"H#t#H$t$H%t%H&t&H't'H(t(H)t)H*t*H+t+H,t,H-t- ]P\                  ! ]/4      t0]! R]/4      t1R	]&R
](R])R]'R]%R]Pd                  Pf                  /t40 Rémt50 Rêmt6RR0t70 Rëmt8Rs9]Pt                  ! 4       t;]<! 4       t=]Pt                  ! 4       t>]<! 4       t?/ t@^tA^tBRtCR tDR tER tFR tGR tHR tIR tJRìR ltKR tLRtMR tNR tORíR ltPR  tQRíR! ltRR" tSR# tTR$ tUR% tVR& tWR' tXR( tYR) tZR* t[RîR+ lt\R, t]R- t^R.t_]`! R/R004      ta]`! R104      tbRïtcRðtd]`! 0 Rñm4      teR2RòR3RóR4RôR5RõR6RöR7R÷/tfR8 tgR9 thRøR: ltiR; tjR< tkR= tlRùR> ltmR? tnR@ toRA tpRB tqRC trRD tsRE ttRF tuRG tvRH twRI txRúRJ ltyRK tzRøRL lt{RM t|RN t}RùRO lt~RûRP ltRùRQ lt€RR t�RS t‚RúRT ltƒRúRU lt„RV t…RüRW lt†R]B3RX lt‡RýRY ltˆRZ t‰^2tŠR[ t‹R\ tŒR] t�R^ tŽR_ t�R` t�Ra t‘Rb t’Rc t“Rd t”Re t•Rf t–Rg t—Rh t˜Ri t™Rj tšRk t›RþRl ltœRm t�RîRn ltžRþRo ltŸRp t Rq t¡RúRr lt¢Rs t£]A3Rt lt¤Ru t¥Rv t¦Rw t§RýRx lt¨Ry t©Rz tªR{ t«R| t¬R} t­R~ t®R t¯RùR€ lt°R� t±RùR‚ lt²Rƒ t³R„ t´R… tµR† t¶R‡ t·Rˆ t¸RþR‰ lt¹RŠ tºR‹ t»RŒ t¼]1EPz                  R� 4       t¾]1EP                  RŽ4      R� 4       tÀ]1EP                  R�R‘.R’7      R“ 4       tÁ]1EP                  R�R”.R’7      R• 4       tÂ]1EP                  R–R‘.R’7      R— 4       tÃ]1EP                  R˜R‘.R’7      R™ 4       tÄ]1EP                  R˜Rš.R’7      R› 4       tÅ]1EP                  RœR”.R’7      R� 4       tÆ]1EP                  RœRž.R’7      RŸ 4       tÇ]1EP                  R R‘.R’7      R¡ 4       tÈ]1EP                  R¢R‘.R’7      R£ 4       tÉ]1EP                  R¤R‘.R’7      R¥ 4       tÊ]1EP                  R Rš.R’7      R¦ 4       tË]1EP                  R¤R”.R’7      R§ 4       tÌ]1EP                  R¨Rš.R’7      R© 4       tÍ]1EP                  R¤Rž.R’7      Rª 4       tÎ]1EP                  R«R‘.R’7      R¬ 4       tÏ]1EP                  R«Rš.R’7      R­ 4       tÐ]1EP                  R®R”.R’7      R¯ 4       tÑ]1EP                  R®Rž.R’7      R° 4       tÒ]1EP                  R±4      R² 4       tÓ]1EP                  R³4      R´ 4       tÔ]1EP                  RµR‘.R’7      R¶ 4       tÕ]1EP                  RµRš.R’7      R· 4       tÖ]1EP                  R¸R‘.R’7      R¹ 4       t×]1EP                  RºRš.R’7      R» 4       tØ]1EP                  R¼Rš.R’7      R½ 4       tÙ]1EP                  R¾Rš.R’7      R¿ 4       tÚ]1EP                  R¾Rž.R’7      RÀ 4       tÛ]1EP                  RÁRÂRš.R’7      RÃ 4       tÜ]1EP                  R¸R”.R’7      RÄ 4       tÝ]1EP                  R¸Rž.R’7      RÅ 4       tÞ]1EP                  RÆRÂ.R’7      RÇ 4       tß]1EP                  RÈR‘.R’7      RÉ 4       tà]1EP                  RÈRš.R’7      RÊ 4       tá]1EP                  RËR”.R’7      RÌ 4       tâ]1EP                  RËRž.R’7      RÍ 4       tã]1EP                  RÎR‘.R’7      RÏ 4       tä]1EP                  RÎRš.R’7      RÐ 4       tå]1EP                  RÑR‘.R’7      RÒ 4       tæ]1EP                  RÑRš.R’7      RÓ 4       tç]1EP                  RÔR”.R’7      RÕ 4       tè]1EP                  RÔRž.R’7      RÖ 4       té]1EP                  R×Rš.R’7      RØ 4       tê]1EP                  RÙ4      RÚ 4       të]1EP                  RÛ4      RÜ 4       tì]1EP                  RÝ4      RÞ 4       tí]1EP                  Rß4      Rà 4       tî]1EP                  Rá4      Râ 4       tï]1EP                  RãRäRå/Ræ7      ]1EP                  Rç4      Rè 4       4       tðR# )ÿzFGarden Tracker: plants, seeds, schedules, hydro tanks, planting guide.N)ÚdateÚdatetimeÚ	timedelta)ÚDecimal)Ú	BlueprintÚResponseÚjsonifyÚrequestÚsend_from_directory)Úsecure_filename)Úensure_alert_state_tableÚsend_sms_alert_detailed)ÚGARDEN_CLIENT_DISTÚ
GARDEN_LATÚ
GARDEN_LONÚGARDEN_LOCATION_LABELÚGARDEN_REMINDER_CHECK_MINUTESÚ
GARDEN_ZIPÚMYSQL_DATABASEÚ
MYSQL_HOSTÚMYSQL_PASSWORDÚ
MYSQL_PORTÚ
MYSQL_USERÚPARTSINV_IMAGE_SEARCH_API_KEYÚPARTSINV_IMAGE_SEARCH_CXÚWEATHER_LATÚWEATHER_LONÚgardentrackerÚhostÚportÚuserÚpasswordÚdatabaseÚcursorclassÚseedÚstore_boughtFÚgardentracker_seed_uploadsc                  ó6   € \         P                  ! R/ \        B # )N© )ÚpymysqlÚconnectÚ	DB_CONFIGr(   ó    Ú@/workplace/Workspace/Software/Server/blueprints/gardentracker.pyÚget_dbr.   Q   s   € Ü�?Š?Ñ'œYÑ'Ð'r,   c                 ó2  € \        V \        4      '       d   V P                  4       # \        V \        4      '       d   V P                  4       # \        V \        4      '       d   \        V 4      # \        V \        4      '       d   V P                  R RR7      # V # )úutf-8Úreplace©Úerrors)Ú
isinstancer   Ú	isoformatr   r   ÚfloatÚbytesÚdecode©Úvalues   &r-   Ú
_serializer;   U   sr   € Ü�%œ×"Ò"Ø�‰Ó Ð Ü�%œ×ÒØ�‰Ó Ð Ü�%œ×!Ò!Ü�U‹|ÐÜ�%œ×ÒØ�|‰|˜G¨Iˆ|Ó6Ð6Ø€Lr,   c                 ó~   € V '       g   V # V P                  4        UUu/ uF  w  rV\        V4      bK  	  upp# u uppi ©N)Úitemsr;   )ÚrowÚkÚvs   &  r-   Ú_serialize_rowrB   a   s3   € ßØˆ
Ø),¯©¬Ô5©¡ ˆAŒz˜!‹}Ò©Ò5Ð5ùÓ5s   ž9c                 óB   € V  Uu. uF  p\        V4      NK  	  up# u upi r=   )rB   )ÚrowsÚrs   & r-   Ú_serialize_rowsrF   g   s   € Ù'+Ó,¡t !ŒN˜1Ö¡tÑ,Ð,ùÒ,s   …c                 óì   € V e   V R8X  d   R # \        V \        4      '       d   V #  \        P                  ! \	        V 4      P                  RR4      4      P                  4       #   \         d     R # i ; i©NÚ ÚZz+00:00)r4   r   r   ÚfromisoformatÚstrr1   Ú
ValueErrorr9   s   &r-   Ú_parse_daterN   k   sd   € Ø‚}˜ œÙÜ�%œ×ÒØˆðÜ×%Ò%¤c¨%£j×&8Ñ&8¸¸hÓ&GÓH×MÑMÓOÐOøÜô Úðús   §<A$ Á$A3Á2A3c                 óÐ   € V e   V R8X  d   R # \        V \        4      '       d   V #  \        P                  ! \        V 4      P	                  RR4      4      #   \
         d     R # i ; irH   )r4   r   rK   rL   r1   rM   r9   s   &r-   Ú_parse_datetimerP   v   s[   € Ø‚}˜ œÙÜ�%œ×"Ò"ØˆðÜ×%Ò%¤c¨%£j×&8Ñ&8¸¸hÓ&GÓHÐHøÜô Úðús   §.A ÁA%Á$A%c           
      óp  € V P                  4       ;_uu_ 4       pVP                  R 4       VP                  R4       R F  p VP                  V4       K  	   VP                  R4       VP                  R4       R F  p VP                  V4       K  	  VP                  R4       VP                  R4       VP                  R4       VP                  R4       VP                  R4       VP                  R	4       VP                  R
4       R F  p VP                  V4       K  	  VP                  R4       VP                  R4       \	        VP                  4       ;'       g    / P                  R4      ;'       g    ^ 4      ^ 8X  d1   \        \        4       F  w  pw  rEpVP                  RWEWc34       K  	  VP                  R4       VP                  4       '       g"   VP                  R\        \        \        34       RRR4       V P                  4        \        V 4       \        V 4       R#   \        P                   d     EK  i ; i  \        P                   d     ELþi ; i  \        P                   d     EK  i ; i  \        P                   d     EK“  i ; i  + '       g   i     L«; i)aý  
            CREATE TABLE IF NOT EXISTS GardenSettings (
                id INT PRIMARY KEY DEFAULT 1,
                zip_code VARCHAR(10) NOT NULL DEFAULT '39429',
                lat DECIMAL(10, 6) DEFAULT NULL,
                lng DECIMAL(10, 6) DEFAULT NULL,
                notifications_enabled TINYINT(1) NOT NULL DEFAULT 1,
                low_seed_threshold INT NOT NULL DEFAULT 5,
                updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
            )
            a+  
            CREATE TABLE IF NOT EXISTS GardenPlant (
                id INT AUTO_INCREMENT PRIMARY KEY,
                name VARCHAR(120) NOT NULL,
                variety VARCHAR(120) DEFAULT NULL,
                location VARCHAR(120) DEFAULT NULL,
                status VARCHAR(20) NOT NULL DEFAULT 'active',
                planted_date DATE DEFAULT NULL,
                moisture_device_id VARCHAR(16) DEFAULT NULL,
                seed_id INT DEFAULT NULL,
                source_type VARCHAR(20) NOT NULL DEFAULT 'store_bought',
                label_id VARCHAR(16) DEFAULT NULL,
                notes TEXT DEFAULT NULL,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
            )
            zGCREATE UNIQUE INDEX idx_garden_plant_label_id ON GardenPlant (label_id)aS  
            CREATE TABLE IF NOT EXISTS GardenPlantEvent (
                id INT AUTO_INCREMENT PRIMARY KEY,
                plant_id INT NOT NULL,
                event_type VARCHAR(32) NOT NULL,
                event_date DATE NOT NULL,
                notes TEXT DEFAULT NULL,
                qty DECIMAL(10, 2) DEFAULT NULL,
                unit VARCHAR(32) DEFAULT NULL,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                INDEX idx_plant (plant_id),
                FOREIGN KEY (plant_id) REFERENCES GardenPlant(id) ON DELETE CASCADE
            )
            aF  
            CREATE TABLE IF NOT EXISTS GardenSchedule (
                id INT AUTO_INCREMENT PRIMARY KEY,
                plant_id INT DEFAULT NULL,
                tank_id INT DEFAULT NULL,
                task_type VARCHAR(32) NOT NULL,
                title VARCHAR(120) NOT NULL,
                interval_days INT NOT NULL DEFAULT 14,
                next_due DATETIME NOT NULL,
                enabled TINYINT(1) NOT NULL DEFAULT 1,
                notes TEXT DEFAULT NULL,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
                INDEX idx_next_due (next_due),
                INDEX idx_plant (plant_id),
                FOREIGN KEY (plant_id) REFERENCES GardenPlant(id) ON DELETE CASCADE
            )
            aµ  
            CREATE TABLE IF NOT EXISTS GardenTaskCompletion (
                id INT AUTO_INCREMENT PRIMARY KEY,
                schedule_id INT NOT NULL,
                completed_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
                notes TEXT DEFAULT NULL,
                INDEX idx_schedule (schedule_id),
                FOREIGN KEY (schedule_id) REFERENCES GardenSchedule(id) ON DELETE CASCADE
            )
            a!  
            CREATE TABLE IF NOT EXISTS GardenSeedInventory (
                id INT AUTO_INCREMENT PRIMARY KEY,
                crop_name VARCHAR(120) NOT NULL,
                variety VARCHAR(120) DEFAULT NULL,
                qty DECIMAL(10, 2) NOT NULL DEFAULT 0,
                unit VARCHAR(32) NOT NULL DEFAULT 'seeds',
                source VARCHAR(120) DEFAULT NULL,
                purchase_date DATE DEFAULT NULL,
                expiry_date DATE DEFAULT NULL,
                location VARCHAR(120) DEFAULT NULL,
                low_stock_threshold INT DEFAULT NULL,
                notes TEXT DEFAULT NULL,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
            )
            a  
            CREATE TABLE IF NOT EXISTS GardenTank (
                id INT AUTO_INCREMENT PRIMARY KEY,
                name VARCHAR(120) NOT NULL,
                volume_gal DECIMAL(10, 2) DEFAULT NULL,
                solution_type VARCHAR(120) DEFAULT NULL,
                target_ph_min DECIMAL(4, 2) DEFAULT NULL,
                target_ph_max DECIMAL(4, 2) DEFAULT NULL,
                target_ec_min DECIMAL(6, 2) DEFAULT NULL,
                target_ec_max DECIMAL(6, 2) DEFAULT NULL,
                test_interval_days INT NOT NULL DEFAULT 7,
                notes TEXT DEFAULT NULL,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
            )
            af  
            CREATE TABLE IF NOT EXISTS GardenTankReading (
                id INT AUTO_INCREMENT PRIMARY KEY,
                tank_id INT NOT NULL,
                ph DECIMAL(4, 2) DEFAULT NULL,
                ec DECIMAL(6, 2) DEFAULT NULL,
                temp_f DECIMAL(5, 2) DEFAULT NULL,
                volume_gal DECIMAL(10, 2) DEFAULT NULL,
                notes TEXT DEFAULT NULL,
                recorded_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
                INDEX idx_tank (tank_id),
                FOREIGN KEY (tank_id) REFERENCES GardenTank(id) ON DELETE CASCADE
            )
            a!  
            CREATE TABLE IF NOT EXISTS GardenExternalCache (
                cache_key VARCHAR(128) PRIMARY KEY,
                payload JSON NOT NULL,
                fetched_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                expires_at TIMESTAMP NOT NULL
            )
            aÆ  
            CREATE TABLE IF NOT EXISTS GardenSeedTypeInfo (
                cache_key VARCHAR(256) PRIMARY KEY,
                crop_name VARCHAR(120) NOT NULL,
                variety VARCHAR(120) DEFAULT NULL,
                summary TEXT DEFAULT NULL,
                wikipedia_title VARCHAR(256) DEFAULT NULL,
                wikipedia_url VARCHAR(512) DEFAULT NULL,
                info_source VARCHAR(32) DEFAULT NULL,
                source_url VARCHAR(512) DEFAULT NULL,
                source_name VARCHAR(120) DEFAULT NULL,
                images JSON DEFAULT NULL,
                planting JSON DEFAULT NULL,
                fetched_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
            )
            a)  
            CREATE TABLE IF NOT EXISTS GardenSeedCompany (
                id INT AUTO_INCREMENT PRIMARY KEY,
                name VARCHAR(120) NOT NULL,
                base_url VARCHAR(512) NOT NULL,
                search_url_template VARCHAR(512) DEFAULT NULL,
                enabled TINYINT(1) NOT NULL DEFAULT 1,
                sort_order INT NOT NULL DEFAULT 0,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
            )
            z-SELECT COUNT(*) AS cnt FROM GardenSeedCompanyÚcntz±
                    INSERT INTO GardenSeedCompany (name, base_url, search_url_template, enabled, sort_order)
                    VALUES (%s, %s, %s, 1, %s)
                    z*SELECT id FROM GardenSettings WHERE id = 1z|
                INSERT INTO GardenSettings (id, zip_code, lat, lng)
                VALUES (1, %s, %s, %s)
                N)z;ALTER TABLE GardenPlant ADD COLUMN seed_id INT DEFAULT NULLzZALTER TABLE GardenPlant ADD COLUMN source_type VARCHAR(20) NOT NULL DEFAULT 'store_bought'zDALTER TABLE GardenPlant ADD COLUMN label_id VARCHAR(16) DEFAULT NULL)zIALTER TABLE GardenPlantEvent ADD COLUMN days_since_start INT DEFAULT NULLzRALTER TABLE GardenPlantEvent ADD COLUMN days_since_anchor VARCHAR(16) DEFAULT NULLzJALTER TABLE GardenPlantEvent ADD COLUMN location VARCHAR(120) DEFAULT NULLzJALTER TABLE GardenPlantEvent ADD COLUMN height DECIMAL(10, 2) DEFAULT NULL)zNALTER TABLE GardenSeedTypeInfo ADD COLUMN info_source VARCHAR(32) DEFAULT NULLzNALTER TABLE GardenSeedTypeInfo ADD COLUMN source_url VARCHAR(512) DEFAULT NULLzOALTER TABLE GardenSeedTypeInfo ADD COLUMN source_name VARCHAR(120) DEFAULT NULLz[ALTER TABLE GardenSeedTypeInfo ADD COLUMN images_user_managed TINYINT(1) NOT NULL DEFAULT 0)ÚcursorÚexecuter)   ÚOperationalErrorÚintÚfetchoneÚgetÚ	enumerateÚDEFAULT_SEED_COMPANIESr   r   r   Úcommitr   Ú_backfill_plant_label_ids)ÚconnÚcurÚcol_sqlÚidxÚnameÚbase_urlÚtemplates   &      r-   Úensure_garden_tablesrd   �   sƒ  € Ø	�‰�Œ˜#Ø�‰ð
ô	
ð 	�‰ðô	
ó&
ˆGð
Ø—‘˜GÖ$ñ
ð	Ø�K‰KÐaÔbð 	�‰ðô	
ó 
ˆGðØ—‘˜GÖ$ñ
ð 	�‰ðô	
ð( 	�‰ð	ô	
ð 	�‰ðô	
ð& 	�‰ðô	
ð$ 	�‰ðô	
ð  	�‰ðô		
ð 	�‰ðô	
ó$
ˆGðØ—‘˜GÖ$ñ
ð 	�‰ðô	
ð 	�‰ÐCÔDÜ�—‘“×$Ð$ "×)Ñ)¨%Ó0×5Ð5°AÓ6¸!Ô;Ü3<Ô=SÖ3TÑ/�Ñ/�d hØ—‘ðð  XÐ3öñ 4Uð 	�‰Ð@ÔAØ�|‰|�~Š~Ø�K‰Kðô œZ¬Ð4ô÷{ 
ðH 	‡K�K„MÜ˜TÔ"Ü˜dÖ#øô} ×+Ñ+ô Ûðûô ×'Ñ'ô 	Úð	ûô4 ×+Ñ+ô Ûðûôv ×+Ñ+ô Ûðú÷C 
�ús°   ™(J%ÁH2ÁJ%ÁIÁ)J%Â I+ÂB J%ÄJÄ#AJ%Å%J%Å>A"J%Ç!!J%È2I	ÉJ%ÉI	ÉJ%ÉI(É$J%É'I(É(J%É+J	Ê J%ÊJ	ÊJ%ÊJ"	ÊJ%Ê!J"	Ê"J%Ê%J5	c                 óà   € V P                  R 4       V P                  4       p\        VR,          ;'       g    ^ 4      ^,           p\        W3V,           4       Uu. uF	  pRVR 2NK  	  up# u upi )z†
        SELECT MAX(CAST(SUBSTRING(label_id, 3) AS UNSIGNED)) AS n
        FROM GardenPlant
        WHERE label_id LIKE 'P-%'
        ÚnzP-Ú05d)rT   rW   rV   Úrange)r^   Úcountr?   ÚstartÚis   &&   r-   Ú_allocate_plant_label_idsrl   k  sd   € Ø‡K�Kð	ôð �,‰,‹.€CÜ��C•—�˜AÓ Õ"€EÜ"'¨°u­}Ô"=Ó>Ñ"=˜Qˆb��3�‹LÑ"=Ñ>Ð>ùÒ>s   ÁA+c           	      ó|  € V P                  4       ;_uu_ 4       pVP                  R 4       VP                  4       pV'       g    RRR4       R# \        V\	        V4      4      p\        W#4       F  w  rEVP                  RWTR,          34       K!  	  RRR4       V P                  4        R#   + '       g   i     L"; i)zNSELECT id FROM GardenPlant WHERE label_id IS NULL OR label_id = '' ORDER BY idNz2UPDATE GardenPlant SET label_id = %s WHERE id = %sÚid)rS   rT   Úfetchallrl   ÚlenÚzipr[   )r]   r^   rD   Úlabelsr?   Úlabels   &     r-   r\   r\   x  s‹   € Ø	�‰�Œ˜#Ø�‰Ø\ô	
ð �|‰|‹~ˆßØ÷ 
‰ô +¨3´°D³	Ó:ˆÜ˜dÖ+‰JˆCØ�K‰KÐLÈuÐZ^ÕV_ÐN`Öañ ,÷ 
ð 	‡K�K†M÷ 
�ús   ™+B+ÁAB+Â+B;	a¸  
    SELECT p.*,
        s.crop_name AS seed_crop_name,
        s.variety AS seed_variety,
        s.location AS seed_bin,
        s.source AS seed_source,
        EXISTS (
            SELECT 1
            FROM GardenPlantEvent dead_event
            WHERE dead_event.plant_id = p.id
              AND dead_event.event_type = 'died'
        ) AS has_died_event
    FROM GardenPlant p
    LEFT JOIN GardenSeedInventory s ON s.id = p.seed_id
c                 óN  € V '       g   R# V P                  R4      ;'       g    V P                  R4      ;'       g    RP                  4       pV P                  R4      ;'       g    V P                  R4      ;'       g    RP                  4       ;'       g    R pT;'       g    R V3# )NÚseed_crop_namera   rI   Úseed_varietyÚvariety©NN©rX   Ústrip)r?   Úcroprw   s   &  r-   Ú_plant_type_crop_varietyr|   —  s„   € ßØÐØ�G‰GÐ$Ó%×>Ð>¨¯©°«×>Ð>¸B×EÑEÓG€DØ�w‰w�~Ó&×BÐB¨#¯'©'°)Ó*<×BÐBÀ×IÑIÓK×SÐSÈt€GØ�<ˆ<�4˜Ð Ð r,   c                 óŠ   € \        WV4      pT;'       g    / P                  R 4      ;'       g    . pV'       d
   V^ ,          # R# )ÚimagesN)Ú_get_seed_type_inforX   )r]   Ú	crop_namerw   Ú	type_infor~   s   &&&  r-   Ú_get_primary_type_imager‚   Ÿ  s=   € Ü# D°WÓ=€IØ�oˆo˜2×"Ñ" 8Ó,×2Ð2°€Fßˆ6�!�9Ð( DÐ(r,   c                 ó  € V '       g   V # \        V 4      pVP                  R 4      R8X  d&   VP                  R4      '       d   \        V 4      VR&   V'       d)   Ve%   \        V 4      w  rEV'       d   \	        WV4      VR&   V# )Úsource_typer$   Úseed_idÚ
seed_labelÚprimary_image)rB   rX   Ú_seed_display_labelr|   r‚   )r?   r]   Úinclude_primary_imageÚoutr€   rw   s   &&&   r-   Ú_serialize_plantr‹   ¥  sp   € ßØˆ
Ü
˜Ó
€CØ
‡w�wˆ}Ó Ô'¨C¯G©G°I×,>Ò,>Ü/°Ó4ˆˆLÑß Ò!1Ü5°cÓ:Ñˆ	ßÜ#:¸4ÈGÓ#TˆC�Ñ Ø€Jr,   c                 ó¬  € . pV P                  R 4      '       d   VP                  RV R ,           24       V P                  R4      ;'       g    V P                  R4      pV'       d   VP                  V4       V P                  R4      ;'       g    V P                  R4      pV'       d   VP                  V4       V'       d   RP                  V4      # R# )Úseed_binzbin #ru   r€   rv   rw   u    Â· N)rX   ÚappendÚjoin)r?   Úpartsr{   rw   s   &   r-   rˆ   rˆ   ²  s¡   € Ø€EØ
‡w�wˆz×ÒØ�‰�u˜S �_Ð-Ð.Ô/Ø�7‰7Ð#Ó$×<Ð<¨¯©°Ó(<€DßØ�‰�TÔØ�g‰g�nÓ%×;Ð;¨¯©°Ó);€GßØ�‰�WÔß!&ˆ6�;‰;�uÓÐ0¨DÐ0r,   c           	      óF   € V  Uu. uF  p\        W1VR 7      NK  	  up# u upi )©r]   r‰   )r‹   )rD   r]   r‰   rE   s   &&& r-   Ú_serialize_plantsr“   ¿  s&   € ÙaeÓfÑaeÐ\]Ô˜QÐAV×WÑaeÑfÐfùÒfs   …c                 ó    € V f   R # \        V \        4      '       d   V P                  4       # \        V \        4      '       d   V # \        V 4      # r=   )r4   r   r   rN   r9   s   &r-   Ú_as_dater•   Ã  s@   € Ø‚}ÙÜ�%œ×"Ò"Ø�z‰z‹|ÐÜ�%œ×ÒØˆÜ�uÓÐr,   c                ó&  € \        V4      pV'       g   R	# . p\        V'       d   VP                  R4      MR4      pV'       d   WS8:  d   VP                  V4       V P                  RW34       V P	                  4        F8  p\        VP                  R4      4      pV'       g   K'  VP                  V4       K:  	  V'       dP   \        V4      pW7,
          P                  pT;'       g    / P                  R4      R8X  d   RMRp	\        ^ V4      V	3# R	# )
z/Days from seed start or planting to event_date.NÚplanted_datez×
        SELECT event_date FROM GardenPlantEvent
        WHERE plant_id = %s AND event_type IN ('seed_start', 'seeded', 'transplanted')
          AND event_date <= %s
        ORDER BY event_date ASC, id ASC
        Ú
event_dater„   r$   Ú
seed_startÚplantingrx   )r•   rX   rŽ   rT   ro   ÚminÚdaysÚmax)
r^   Úplant_idÚplantr˜   ÚanchorsÚplantedr?   Úanchorrœ   Úanchor_types
   &&&&      r-   Ú_compute_days_since_startr¤   Í  sç   € ä˜*Ó%€JßØÐà€GÜ·E�u—y‘y Ô0¸tÓD€Gß�7Ô(Ø�‰�wÔØ‡K�Kð	ð 
Ðôð �|‰|Ž~ˆÜ˜#Ÿ'™' ,Ó/Ó0ˆß‰6Ø�N‰N˜6Ö"ñ ÷ Ü�W“ˆØÕ#×)Ñ)ˆØ',§{ {°×&7Ñ&7¸Ó&FÈ&Ô&P‘lÐV`ˆÜ�1�d‹|˜[Ð(Ð(ØÐr,   c                 ó,  € V'       g   V# \        V4      pVP                  R 4      eC   VP                  R4      '       g*   \        WW#P                  R4      4      w  rVV'       d   WdR&   V# \        WW#P                  R4      4      w  rvVe	   WtR &   WdR&   V# )Údays_since_startÚdays_since_anchorr˜   )rB   rX   r¤   )r^   rž   rŸ   ÚeventrŠ   Ú_r¢   rœ   s   &&&&    r-   Ú_enrich_eventrª   ì  s‘   € ßØˆÜ
˜Ó
€CØ
‡w�wÐ!Ó"Ò.Ø�w‰wÐ*×+Ò+Ü1°#ÀÏ	É	ÐR^ÓH_Ó`‰IˆAßØ+1Ð'Ñ(Øˆ
Ü,¨S¸EÇ9Á9È\ÓCZÓ[�L€DØÒØ"&ÐÑØ#)ÐÑ Ø€Jr,   c           	      óD   € V Uu. uF  p\        WW$4      NK  	  up# u upi r=   )rª   )r^   rž   rŸ   ÚeventsÚevs   &&&& r-   Ú_enrich_eventsr®   ý  s!   € Ù>DÓE¹f¸ŒM˜#¨Ö3¹fÑEÐEùÒEs   …c                 óX   € V f   R # \        V 4      P                  4       pT;'       g    R # r=   )rL   rz   )r:   Úlocs   & r-   Ú_normalize_locationr±     s(   € Ø‚}ÙÜ
ˆe‹*×
Ñ
Ó
€CØ�;ˆ;�$Ðr,   c                 ód   € V e   V R8X  d   R #  \        V 4      #   \        \        3 d     R # i ; i)NrI   )r6   Ú	TypeErrorrM   r9   s   &r-   Ú_optional_floatr´     s6   € Ø‚}˜ œÙðÜ�U‹|ÐøÜ”zÐ"ô Úðús   �
 š/®/c                 óR   € VR 8w  d   R# V P                  R\        V4      V34       R# )ÚtransplantedNz2UPDATE GardenPlant SET location = %s WHERE id = %s)rT   r±   )r^   rž   Ú
event_typeÚlocations   &&&&r-   Ú_sync_transplant_locationr¹     s)   € Ø�^Ô#ÙØ‡K�KØ<Ü	˜XÓ	&¨Ð1ör,   c                 ó²   € V P                  4       ;_uu_ 4       pVP                  R 4       VP                  4       uuRRR4       #   + '       g   i     R# ; i)z)SELECT * FROM GardenSettings WHERE id = 1N)rS   rT   rW   ©r]   r^   s   & r-   Ú_get_settingsr¼     s1   € Ø	�‰�Œ˜#Ø�‰Ð?Ô@Ø�|‰|‹~÷ 
��‹ús   ™!AÁA	c                 ó  € \         P                  ! 4       pVP                  R 4       VP                  R\        P                  ! 4       P                  4        R24       VP                  R4       V P                  4       ;_uu_ 4       pVP                  R4       VP                  4        Uu. uF  q3R,          NK  	  ppV EFs  pVP                  RV R24       VP                  4       pV'       d   VP                  R4      MR	pV'       g   KN  VP                  R
V R24       VP                  RV R24       VP                  V R24       VP                  RV R24       VP                  4       pV'       g   K»  \        V^ ,          P                  4       4      p	RP                  V	 U
u. uF	  p
RV
 R2NK  	  up
4      pV F\  pRP                  V	 U
u. uF"  q P                  VP                  V
4      4      NK$  	  up
4      pVP                  RV RV RV R24       K^  	  VP                  R4       EKv  	  R	R	R	4       VP                  R4       VP                  4       # u upi u up
i u up
i   + '       g   i     L@; i)z-- Garden Tracker backup
z-- Generated at z

zSET FOREIGN_KEY_CHECKS = 0;

zú
            SELECT TABLE_NAME
            FROM information_schema.TABLES
            WHERE TABLE_SCHEMA = DATABASE()
              AND TABLE_TYPE = 'BASE TABLE'
              AND TABLE_NAME LIKE 'Garden%'
            ORDER BY TABLE_NAME
            Ú
TABLE_NAMEzSHOW CREATE TABLE `Ú`zCreate TableNz
-- Table: Ú
zDROP TABLE IF EXISTS `z`;
z;

zSELECT * FROM `z, zINSERT INTO `z` (z
) VALUES (z);
zSET FOREIGN_KEY_CHECKS = 1;
)ÚioÚStringIOÚwriter   Únowr5   rS   rT   ro   rW   rX   ÚlistÚkeysr�   ÚliteralÚgetvalue)r]   rŠ   r^   r?   Útable_namesÚ
table_nameÚ
create_rowÚ
create_sqlrD   ÚcolumnsÚcr_   Úvalss   &            r-   Ú_sql_dump_garden_tablesrÐ      s	  € Ü
�+Š+‹-€CØ‡I�IÐ*Ô+Ø‡I�IÐ ¤§¢£×!9Ñ!9Ó!;Ð <¸DÐAÔBØ‡I�IÐ/Ô0à	�‰�Œ˜#Ø�‰ðô		
ð 58·L±L´NÓC±N¨S˜<×(Ð(±NˆÐCä%ˆJØ�K‰KÐ-¨j¨\¸Ð;Ô<ØŸ™›ˆJß;E˜Ÿ™¨Ô7È4ˆJßÙØ�I‰I˜
 : ,¨bÐ1Ô2Ø�I‰IÐ.¨z¨l¸$Ð?Ô@Ø�I‰I˜˜ EÐ*Ô+à�K‰K˜/¨*¨°QÐ7Ô8Ø—<‘<“>ˆDßÙÜ˜4 �7Ÿ<™<›>Ó*ˆGØ—i‘i±7Ó ;±7¨a 1 Q C q£±7Ñ ;Ó<ˆGÛ�Ø—y‘yÁGÓ!LÁG¸q§,¡,¨s¯w©w°q«zÖ":ÁGÑ!LÓM�Ø—	‘	˜M¨*¨°S¸¸	ÀÈDÈ6ÐQUÐVÖWñ ð �I‰I�d�Oñ' &÷ 
ðD ‡I�IÐ-Ô.Ø�<‰<‹>Ðùò1 Dùò" !<ùâ!L÷= 
�úsD   Â$I/Â*I Â;AI/ÄA,I/Å81I/Æ)I%Æ8I/Ç(I*Ç;<I/É I/É/I?	c                 ó:  € \         P                  P                  V R R/R7      p\         P                  P                  W!R7      ;_uu_ 4       p\        P
                  ! VP                  4       P                  4       4      uuRRR4       #   + '       g   i     R# ; i)ú
User-AgentzGardenTracker/1.0©Úheaders©ÚtimeoutN)Úurllibr	   ÚRequestÚurlopenÚjsonÚloadsÚreadr8   ©ÚurlrÖ   ÚreqÚresps   &&  r-   Ú_fetch_json_urlrá   L  se   € Ü
�.‰.×
 Ñ
  ¨|Ð=PÐ.QÐ
 Ó
R€CÜ	�‰×	Ñ	 Ð	×	5Ô	5¸Ü�zŠz˜$Ÿ)™)›+×,Ñ,Ó.Ó/÷ 
6×	5×	5Ó	5ús   Á2B	Â	B	c                 óÒ  € V P                  4       ;_uu_ 4       pVP                  R V34       VP                  4       pV'       g    RRR4       R# VR,          '       dm   VR,          \        P                  ! 4       8”  dL   VR,          p\        V\        4      '       d!   \        P                  ! V4      uuRRR4       # VuuRRR4       # RRR4       R#   + '       g   i     R# ; i)zHSELECT payload, expires_at FROM GardenExternalCache WHERE cache_key = %sNÚ
expires_atÚpayload)	rS   rT   rW   r   Úutcnowr4   rL   rÚ   rÛ   )r]   Úkeyr^   r?   rä   s   &&   r-   Ú
_cache_getrç   R  s¦   € Ø	�‰�Œ˜#Ø�‰ØVØˆFô	
ð �l‰l‹nˆßØ÷ 
‰ð ˆ|×Ô  \Õ!2´X·_²_Ó5FÔ!FØ˜)•nˆGÜ˜'¤3×'Ò'Ü—z’z 'Ó*÷ 
Šð ÷ 
�Šñ ÷ 
Žñ ús   ™-CÁCÁACÂ?CÃC&	c           	      ó,  € \         P                  ! 4       \        VR 7      ,           pV P                  4       ;_uu_ 4       pVP	                  RV\
        P                  ! V4      V34       RRR4       V P                  4        R#   + '       g   i     L"; i))Úhoursa	  
            INSERT INTO GardenExternalCache (cache_key, payload, expires_at)
            VALUES (%s, %s, %s)
            ON DUPLICATE KEY UPDATE payload = VALUES(payload), fetched_at = CURRENT_TIMESTAMP,
                expires_at = VALUES(expires_at)
            N)r   rå   r   rS   rT   rÚ   Údumpsr[   )r]   ræ   rä   Ú	ttl_hoursÚexpiresr^   s   &&&&  r-   Ú
_cache_setrí   c  sc   € Ü�oŠoÓ¤)°)Ô"<Õ<€GØ	�‰�Œ˜#Ø�‰ðð ”$—*’*˜WÓ% wÐ/ô	
÷ 
ð 	‡K�K†M÷ 
�ús   ¿*BÂB	zhttps://en.wikipedia.orgzupload.wikimedia.orgzcommons.wikimedia.orgúcdn.commercev3.netÚarugulaÚcornÚeggplantÚcilantroÚscallionÚzucchinic                 óÜ   € T ;'       g    R P                  4       pV'       g   R # VP                  R4      '       d
   RV,           # VP                  R4      '       d   RVR,          ,           # V# )rI   z//zhttps:úhttp://úhttps://:é   NN)rz   Ú
startswith©rÞ   Úus   & r-   Ú_normalize_image_urlrü   Ž  sX   € Ø	�ˆ�×ÑÓ€AßÙØ‡|�|�D×ÒØ˜!�|ÐØ‡|�|�I×ÒØ˜A˜b�EÕ!Ð!Ø€Hr,   c                óÔ  € \        V 4      p V '       g   R# \        P                  P                  V 4      P                  pRV9   d]   VP                  R^4      ^,          pVP                  R4      p\        V4      ^8¼  d#   RP                  VRR 4      P                  4       # R F2  pWA9   g   K  VP                  V^4      ^,          P                  4       u # 	  VP                  4       # )zKCanonical identity for deduping the same file at different thumbnail sizes.rI   z/thumb/Ú/Néÿÿÿÿ)z/wikipedia/commons/z/wikipedia/en/z	/commons/)	rü   r×   ÚparseÚurlparseÚpathÚsplitrp   r�   Úlower)rÞ   r  Úrestr�   Úmarkers   &    r-   Ú_wikimedia_image_identityr  ™  s¼   € ä
˜sÓ
#€CßÙÜ�<‰<× Ñ  Ó%×*Ñ*€DØ�DÔØ�z‰z˜) QÓ'¨Õ*ˆØ—
‘
˜3“ˆÜˆu‹:˜Œ?Ø—8‘8˜E # 2˜JÓ'×-Ñ-Ó/Ð/ÛHˆØŽ>Ø—:‘:˜f aÓ(¨Õ+×1Ñ1Ó3Ò3ñ Ið �:‰:‹<Ðr,   c           
      ó\  € V'       d   \        V 4      V8¼  d   R # \        VP                  R4      4      pV'       g   R # \        V4      ;'       g    TpWQ9   d   R # VP	                  V4       T P                  RTRVP                  R4      RVP                  R4      ;'       g    R/4       R # )NrÞ   ÚtitleÚsourceÚ	wikipedia)rp   rü   rX   r  ÚaddrŽ   )r~   Úseen_identitiesÚimgÚlimitrÞ   Úidents   &&&&  r-   Ú_append_unique_imager  ª  sŽ   € ß”#�f“+ Ô&ÙÜ
˜sŸw™w u›~Ó
.€CßÙÜ% cÓ*×1Ð1¨c€EØÔÙØ×Ñ˜ÔØ
‡M�MØˆsØ�—‘˜Ó!Ø�#—'‘'˜(Ó#×2Ð2 {ðö r,   c                  ó  € \         P                  P                  \         P                  P                  \         P                  P                  \        4      4      4      p \         P                  P                  V \        4      # r=   )Úosr  ÚdirnameÚabspathÚ__file__r�   ÚSEED_IMAGE_UPLOAD_DIR)Úbases    r-   Ú_seed_upload_rootr  »  sD   € Ü�7‰7�?‰?œ2Ÿ7™7Ÿ?™?¬2¯7©7¯?©?¼8Ó+DÓEÓF€DÜ�7‰7�<‰<˜Ô3Ó4Ð4r,   c                 ól   € \         P                  ! R RT ;'       g    R4      R,          pT;'       g    R# )z	[^\w\-|]+r©   Úunknown:NéP   N)ÚreÚsub)Ú	cache_keyÚsafes   & r-   Ú_seed_upload_subdirr!  À  s/   € Ü�6Š6�,  Y×%;Ð%;°)Ó<¸SÕA€DØ×Ð�9Ðr,   c                 ó^   € V '       g   R # R\         P                  P                  V RR7       2# )Nz$/gardentracker/api/seed-type-upload/rþ   ©r   )r×   r   Úquote©Ú	file_paths   &r-   Ú_seed_upload_display_urlr'  Å  s+   € ßÙØ1´&·,±,×2DÑ2DÀYÐUXÐ2DÓ2YÐ1ZÐ[Ð[r,   c                 óš   € V'       d   \        V4      # \        V 4      pV'       g   R # R\        P                  P	                  VRR7       2# )Nz"/gardentracker/api/seed-image?url=rI   r#  )r'  rü   r×   r   r$  )rÞ   r&  Ú
normalizeds   && r-   Ú_seed_image_display_urlr*  Ë  sC   € ßÜ'¨	Ó2Ð2Ü% cÓ*€JßÙØ/´·±×0BÑ0BÀ:ÐTVÐ0BÓ0WÐ/XÐYÐYr,   c                 ó4  € V f   . # \        V \        \        34      '       d   V P                  RRR7      p \        V \        4      '       d    \
        P                  ! V 4      p \        V \        4      '       g   . # . pV  Fx  p\        V\        4      '       d   RVRR/p\        V\        4      '       g   K7  VP                  R4      '       g   VP                  R4      '       g   Kg  VP                  V4       Kz  	  V#   \
        P                   d    . u # i ; i)Nr0   r1   r2   rÞ   r
  r  r&  )r4   r7   Ú	bytearrayr8   rL   rÚ   rÛ   ÚJSONDecodeErrorrÅ   ÚdictrX   rŽ   )r~   rŠ   r  s   &  r-   Ú_parse_images_rawr/  Ô  sã   € Ø‚~Øˆ	Ü�&œ5¤)Ð,×-Ò-Ø—‘˜w¨y�Ó9ˆÜ�&œ#×Òð	Ü—Z’Z Ó'ˆFô �fœd×#Ò#Øˆ	Ø
€CÛˆÜ�cœ3×ÒØ˜#˜x¨Ð5ˆCÜ�cœ4× Ô  c§g¡g¨e§n¢n¸¿¹À×8LÔ8LØ�J‰J�sŽOñ	 ð
 €Jøô ×#Ñ#ô 	ØŠIð	ús   ÁC= Ã=DÄDc                 óê   € \        V \        4      '       g   R # V P                  R4      '       d   RV R,           2# \        V P                  R4      4      pV'       g   R # \	        V4      ;'       g    T# )Nr&  zupload:rÞ   )r4   r.  rX   rü   r  )r  rÞ   s   & r-   Ú_image_list_identityr1  é  s_   € Ü�cœ4× Ò ÙØ
‡w�wˆ{×ÒØ˜˜[Õ)Ð*Ð+Ð+Ü
˜sŸw™w u›~Ó
.€CßÙÜ$ SÓ)×0Ð0¨SÐ0r,   c                  óæ   € \         P                  ! R R R7      ;'       g    / p \         P                  P                  R4      ;'       g    V P                  R4      ;'       g    RP	                  4       # )T©ÚforceÚsilentrÞ   rI   )r	   Úget_jsonÚargsrX   rz   )Údatas    r-   Ú_requested_image_urlr9  ô  sR   € Ü×Ò $¨tÔ4×:Ð:¸€DÜ�L‰L×Ñ˜UÓ#×<Ð< t§x¡x°£×<Ð<¸"×CÑCÓEÐEr,   c                  ó  € \         P                  ! R R R7      ;'       g    / p \         P                  P                  RV P                  R4      4      pVe   VR8X  d   R#  \	        V4      #   \
        \        3 d     R# i ; i)Tr3  ÚindexNrI   )r	   r6  r7  rX   rV   r³   rM   )r8  Úraws     r-   Ú_requested_image_indexr=  ù  sn   € Ü×Ò $¨tÔ4×:Ð:¸€DÜ
�,‰,×
Ñ
˜7 D§H¡H¨WÓ$5Ó
6€CØ
‚{�c˜R”iÙðÜ�3‹xˆøÜ”zÐ"ô Úðús   Á 
A+ Á+B Á?B c                 ó\  € \        V4      pV'       d   \        V \        4      '       g   R # \        V P                  R4      4      pV'       d	   W28X  d   R# V P                  R4      ;'       g    RP	                  4       pV'       d   VRV 2V39   d   R# \        V 4      \        RV/4      8H  # )FrÞ   Tr&  rI   úseed-upload://)rü   r4   r.  rX   rz   r1  )Ú
stored_imgÚrequested_urlrß   Ústored_normr&  s   &&   r-   Ú_image_matches_requestrC    sŽ   € Ü
˜}Ó
-€Cß”j ¬T×2Ò2ÙÜ& z§~¡~°eÓ'<Ó=€Kß�{Ô)ÙØ—‘ Ó,×2Ð2°×9Ñ9Ó;€Iß�S˜~¨i¨[Ð9¸;ÐGÔGÙÜ 
Ó+Ô/CÀUÈCÀLÓ/QÑQÐQr,   c                 ó  € \        V 4      '       g   R # V P                  4       ;_uu_ 4       pVP                  RV34       VP                  4       pRRR4       \	        X;'       d    VP                  R4      4      #   + '       g   i     L4; i)FzGSELECT images_user_managed FROM GardenSeedTypeInfo WHERE cache_key = %sNÚimages_user_managed)Ú_has_images_user_managed_columnrS   rT   rW   ÚboolrX   ©r]   r  r^   r?   s   &&  r-   Ú_type_info_images_user_managedrI    sj   € Ü*¨4×0Ò0ÙØ	�‰�Œ˜#Ø�‰ØUØˆLô	
ð �l‰l‹nˆ÷ 
ô �×6Ð6˜Ÿ™Ð 5Ó6Ó7Ð7÷ 
�ús   ¬$A<Á<B	c                 óÚ  € V f   . # \        V \        \        34      '       d   V P                  RRR7      p \        V \        4      '       d    \
        P                  ! V 4      p \        V \        4      '       g   . # . p\        4       pV  EF@  p\        V\        4      '       d   RVRR/p\        V\        4      '       g   K8  VP                  R4      ;'       g    RP                  4       p\        VP                  R4      4      pV'       g   V'       g   K�  \        V4      pV'       d   Wb9   d   K¨  VP                  V4       RT;'       g    R	V 2R
VP                  R
4      RVP                  R4      ;'       g    RR\!        YT;'       g    R R7      /pV'       d   WGR&   VP#                  V4       \%        V4      \&        8¼  g   EK@   V# 	  V#   \
        P                   d    . u # i ; i)Nr0   r1   r2   rÞ   r
  r  r&  rI   r?  r	  Údisplay_urlr%  )r4   r7   r,  r8   rL   rÚ   rÛ   r-  rÅ   Úsetr.  rX   rz   rü   r1  r  r*  rŽ   rp   ÚMAX_SEED_TYPE_IMAGES)r~   rŠ   Úseenr  r&  rÞ   r  Úentrys   &       r-   Ú_normalize_seed_imagesrP    s   € Ø‚~Øˆ	Ü�&œ5¤)Ð,×-Ò-Ø—‘˜w¨y�Ó9ˆÜ�&œ#×Òð	Ü—Z’Z Ó'ˆFô �fœd×#Ò#Øˆ	Ø
€CÜ‹5€DÜˆÜ�cœ3×ÒØ˜#˜x¨Ð5ˆCÜ˜#œt×$Ò$ÙØ—W‘W˜[Ó)×/Ð/¨R×6Ñ6Ó8ˆ	Ü" 3§7¡7¨5£>Ó2ˆßŸ9ÙÜ$ SÓ)ˆß˜œÙØ�‰�Œà�3×6Ð6˜N¨9¨+Ð6Ø�S—W‘W˜WÓ%Ø�c—g‘g˜hÓ'×6Ð6¨;ØÔ2°3×BSÐBSÈtÔTð	
ˆ÷ Ø!*�+ÑØ�
‰
�5ÔÜˆs‹8Ô+×+ØØ€Jñ1 ð0 €Jøô= ×#Ñ#ô 	ØŠIð	ús   ÁG ÇG*Ç)G*c                 ó°   € T ;'       g    R P                  4       P                  4       pT;'       g    R P                  4       P                  4       pV RV 2# )rI   Ú|)rz   r  )r€   rw   r{   Úvars   &&  r-   Ú_seed_type_cache_keyrT  F  sL   € Ø�OˆO˜×"Ñ"Ó$×*Ñ*Ó,€DØ�=ˆ=�b×
Ñ
Ó
!×
'Ñ
'Ó
)€CØˆV�1�S�Eˆ?Ðr,   c                 óL  € R V P                  R 4      RV P                  R4      RV P                  R4      RV P                  R4      RV P                  R4      RV P                  R4      R	V P                  R	4      ;'       g    . R
V P                  R
4      RV P                  R4      /	# )ÚslugÚcommon_nameÚ
commonNameÚscientific_nameÚscientificNameÚcategoryÚseasonÚdays_to_harvestÚdaysToHarvestÚwindowsÚnotesÚ
zone_rangeÚ	zoneRange©rX   )Ú	crop_datas   &r-   Ú_map_cropgraph_guidere  L  s“   € à�	—‘˜fÓ%Ø�y—}‘} \Ó2Ø˜9Ÿ=™=Ð)9Ó:Ø�I—M‘M *Ó-Ø�)—-‘- Ó)Ø˜9Ÿ=™=¨Ó9Ø�9—=‘= Ó+×1Ð1¨rØ�—‘˜wÓ'Ø�i—m‘m KÓ0ð
ð 
r,   c                 óœ  € T;'       g    R P                  4       pV'       g   R# VP                  4       P                  RR4      pRV 2p\        W4      pV'       d   V#  \	        RV 24      pTP                  R	4      ;'       g    Tp	\        T	4      p
\!        YT
^4       T
#   \
        P                  P                  \
        P                  P                  \        P                  \        3 dÜ     \	        R\
        P                  P                  T4       24      pTP                  R4      ;'       g    . pT'       g    R# T^ ,          P                  R4      ;'       g    Tp\	        RT 24      p EL  \
        P                  P                  \
        P                  P                  \        P                  \        3 d      R# i ; ii ; i)
rI   NÚ Ú-zcrop_detail:z#https://api.cropgraph.com/api/crop/ú'https://api.cropgraph.com/api/search?q=ÚresultsrV  r{   )rz   r  r1   rç   rá   r×   ÚerrorÚURLErrorÚ	HTTPErrorrÚ   r-  ÚOSErrorr   r$  rX   re  rí   )r]   r€   r{   rV  r  Úcachedr8  Úsearchrj  rd  Úguides   &&         r-   Ú_fetch_cropgraph_plantingrr  Z  sz  € Ø�OˆO˜×"Ñ"Ó$€DßÙØ�:‰:‹<×Ñ  SÓ)€DØ˜t˜fÐ%€IÜ˜Ó(€FßØˆðÜÐ!DÀTÀFÐKÓLˆð —‘˜Ó ×(Ð( D€IÜ  Ó+€EÜˆt  rÔ*Ø€Løô �L‰L×!Ñ!¤6§<¡<×#9Ñ#9¼4×;OÑ;OÔQXÐYô ð
	Ü$Ø9¼&¿,¹,×:LÑ:LÈTÓ:RÐ9SÐTóˆFð —j‘j Ó+×1Ð1¨rˆGßÚØ˜1•:—>‘> &Ó)×1Ð1¨TˆDÜ"Ð%HÈÈÐ#OÓP‹DøÜ—‘×%Ñ%¤v§|¡|×'=Ñ'=¼t×?SÑ?SÔU\Ð]ô 	Ûð	úðús?   Á B# Â#AGÃ1AE5Ä4
E5ÅE5Å!E5Å5AGÇGÇGÇGc                 ó^  € \         P                  P                  T ;'       g    R P                  RR4      R R7      pV'       g   R#  \	        \
         RV 24      #   \         P                  P                  \         P                  P                  \        P                  \        3 d     R# i ; i)rI   rg  r©   r#  Nz/api/rest_v1/page/summary/)r×   r   r$  r1   rá   ÚWIKIPEDIA_APIrk  rl  rm  rÚ   r-  rn  )r	  Úencodeds   & r-   Ú_wiki_page_summaryrv  w  s†   € Ü�l‰l× Ñ  %§+ +¨2×!6Ñ!6°s¸CÓ!@ÀrÐ ÓJ€GßÙðÜ¤- Ð0JÈ7È)ÐTÓUÐUøÜ�L‰L×!Ñ!¤6§<¡<×#9Ñ#9¼4×;OÑ;OÔQXÐYô Úðús   ÁA ÁAB,Â+B,c                 ó  € T ;'       g    R P                  4       pV'       g   . #  \        \         R\        P                  P                  V4       RV 24      pVP                  R4      ;'       g    .  Uu. uF,  qDP                  R4      '       g   K  VP                  R4      NK.  	  up# u upi   \        P                  P                  \        P                  P                  \        P                  \        3 d    . u # i ; i)rI   z/w/rest.php/v1/search/title?q=z&limit=Úpagesr	  )rz   rá   rt  r×   r   r$  rX   rk  rl  rm  rÚ   r-  rn  )Úqueryr  Úqr8  Úps   &&   r-   Ú_wiki_search_titlesr|  �  sÏ   € Ø	�ˆ�"×ÑÓ€AßØˆ	ðÜÜˆoÐ;¼F¿L¹L×<NÑ<NÈqÓ<QÐ;RÐRYÐZ_ÐY`Ðaó
ˆð *.¯©°'Ó):×)@Ð)@¸bÐ)@ÓTÑ)@ 1ÇUÁUÈ7Ç^”�—‘�g–Ñ)@ÑTÐTùÒTøÜ�L‰L×!Ñ!¤6§<¡<×#9Ñ#9¼4×;OÑ;OÔQXÐYô ØŠ	ðús1   ¦AB1 Á2B1 Á7B,ÂB,Â)B1 Â,B1 Â1ADÄDc                 ó*  € V '       g   R # V P                  R4      ;'       g    / pVP                  R4      ;'       g+    V P                  R4      ;'       g    / P                  R4      p\        V4      pV'       g   R # RVRV P                  R4      RR/# )NÚ	thumbnailr
  ÚoriginalimagerÞ   r	  r  )rX   rü   )ÚsummaryÚthumbrÞ   s   &  r-   Ú_image_from_wiki_summaryr‚  Ž  s‚   € ßÙØ�K‰K˜Ó$×*Ð*¨€EØ
�)‰)�HÓ
×
SÐ
S '§+¡+¨oÓ">×"DÐ"DÀ"×!IÑ!IÈ(Ó!S€CÜ
˜sÓ
#€CßÙàˆsØ�—‘˜WÓ%Ø�+ðð r,   c                 óú  € T ;'       g    R P                  4       p V '       g   . # \        P                  P                  RRRV RRRRRR	R
R/4      p \	        \
         RV 24      p. pTP                  R4      ;'       g    / P                  R/ 4      P                  4        F  pTP                  R4      '       d   K  \        TP                  R4      ;'       g    / P                  R4      4      pT'       g   KY  TP                  RTRTP                  R4      RR/4       K�  	  TRT #   \        P                  P                  \        P                  P                  \        P                  \        3 d    . u # i ; i)rI   Úactionry  ÚtitlesÚpropÚ
pageimagesÚformatrÚ   Úpithumbsizeéô  Úpipropzthumbnail|nameú/w/api.php?rx  Úmissingr~  r
  rÞ   r	  r  N)rz   r×   r   Ú	urlencoderá   rt  rk  rl  rm  rÚ   r-  rn  rX   Úvaluesrü   rŽ   )r	  r  Úparamsr8  r~   Úpager�  s   &&     r-   Ú_wiki_page_imagesr’  �  sW  € Ø�[ˆ[�b×ÑÓ!€EßØˆ	Ü�\‰\×#Ñ#à�gØ�eØ�LØ�fØ˜3ØÐ&ð	
ó	€FðÜ¤- °¸F¸8ÐDÓEˆð €FØ—‘˜'Ó"×(Ð( b×-Ñ-¨g°rÓ:×AÑAÖCˆØ�8‰8�I×ÒÙÜ$ d§h¡h¨{Ó&;×&AÐ&A¸r×%FÑ%FÀxÓ%PÓQˆß‰5Ø�M‰MØ�uØ˜Ÿ™ 'Ó*Ø˜+ðö ñ Dð �&�5ˆ>Ðøô �L‰L×!Ñ!¤6§<¡<×#9Ñ#9¼4×;OÑ;OÔQXÐYô ØŠ	ðús   ÁD( Ä(AE:Å9E:c                 ó˜   € T ;'       g    R P                  4       P                  4       pV'       d   \        V4      ^8:  d   R# V\        9   # )rI   T)rz   r  rp   ÚGENERIC_VARIETY_TERMS)rw   rA   s   & r-   Ú_is_generic_varietyr•  ½  s;   € Ø	�ˆ�B×ÑÓ×%Ñ%Ó'€Aß”�A“˜!”ÙØÔ%Ñ%Ð%r,   c                 óˆ  € T ;'       g    R P                  4       P                  4       p\        4       pV'       dˆ   VP                  V4       VP	                  4        F&  p\        V4      ^8¼  g   K  VP                  V4       K(  	  \        P                  VR4       F"  pVP                  VP                  4       4       K$  	  V# )rI   r(   )rz   r  rL  r  r  rp   ÚCROP_WIKI_ALIASESrX   )r€   r{   ÚtermsÚwordÚaliass   &    r-   Ú_crop_match_termsr›  Ä  sŠ   € Ø�OˆO˜×"Ñ"Ó$×*Ñ*Ó,€DÜ‹E€EßØ�	‰	�$ŒØ—J‘J–LˆDÜ�4‹y˜AŽ~Ø—	‘	˜$–ñ !ô '×*Ñ*¨4°Ö4ˆEØ�I‰I�e—k‘k“mÖ$ñ 5à€Lr,   c                 ó  € T ;'       g    R P                  4       pV'       g   R# \        V4       F  pWC9   g   K   R# 	  T;'       g    R P                  4       P                  4       pV'       d   \        V4      '       g	   W#9   d   R# R# )rI   FT)r  r›  rz   r•  )r	  r€   rw   Útitle_lÚterms   &&&  r-   Ú_wiki_title_matches_croprŸ  Ñ  sk   € Ø�{ˆ{˜×!Ñ!Ó#€GßÙÜ! )Ö,ˆØŽ?Úñ -ð �}ˆ}˜"×#Ñ#Ó%×+Ñ+Ó-€GßÔ*¨7×3Ò3¸Ô8JÙÙr,   c                 ó  € T ;'       g    R P                  4       p V '       g   . # \        4       p. p\        WR7       FT  pV'       g   K  VP                  4       V9  g   K$  VP	                  VP                  4       4       VP                  V4       KV  	  \        V4      ^8  de   \        WR7       FT  pV'       g   K  VP                  4       V9  g   K$  VP	                  VP                  4       4       VP                  V4       KV  	  V# )rI   ©r  )rz   rL  r|  r  r  rŽ   rp   Ú_wiki_fulltext_titles)r€   r  rN  rŠ   r	  s   &&   r-   Ú_wiki_crop_title_candidatesr£  Þ  s½   € Ø—�˜b×'Ñ'Ó)€IßØˆ	Ü‹5€DØ
€CÜ$ Y×<ˆß‰5�U—[‘[“]¨$Ö.Ø�H‰H�U—[‘[“]Ô#Ø�J‰J�uÖñ =ô ˆ3ƒx�!„|Ü*¨9×BˆEß‰u˜Ÿ™›¨dÖ2Ø—‘˜Ÿ™›Ô'Ø—
‘
˜5Ö!ñ Cð €Jr,   c                 óX  € T ;'       g    .  Uu. uF  p\        W1V4      '       g   K  VNK  	  ppV'       d   V# \        V4       Uu0 uF  q3P                  4       kK  	  ppT ;'       g    .  Uu. uF%  q3;'       g    R P                  4       V9   g   K#  VNK'  	  up# u upi u upi u upi ©rI   )rŸ  r£  r  )r…  r€   rw   ÚtÚfilteredÚ	allowlists   &&&   r-   Ú_filter_titles_for_cropr©  ð  s’   € Ø"ŸL˜L b˜LÓ]™L�aÔ-EÀaÐT[×-\—�™L€HÐ]ßØˆÜ$?À	Ô$JÓKÑ$J˜q—‘–Ñ$J€IÐKØŸ˜ "˜ÓH™�!¯'¨'¨r¯©Ó):¸iÑ)G�AˆA™ÑHÐHùò	 ^ùò LùÚHs"   �B¨BÁB"Á/B'Á<B'ÂB'c                 ó`   € T ;'       g    R P                  4       p \        V 4      '       d   R # V # r¥  ©rz   r•  ©rw   s   &r-   Ú_variety_for_wiki_searchr­  ø  s)   € Ø�}ˆ}˜"×#Ñ#Ó%€GÜ˜7×#Ò#ÙØ€Nr,   c                 ó   € T ;'       g    R P                  4       p \        V4      p. pV'       d-   VP                  V RV  24       VP                  V  RV 24       V '       d   VP                  V 4       \        4       p. pV FG  pVP	                  4       pV'       g   K  Wc9  g   K%  VP                  V4       VP                  V4       KI  	  V# ©rI   rg  )rz   r­  rŽ   rL  r  r  )r€   rw   ÚqueriesrN  rŠ   rz  ræ   s   &&     r-   Ú_wiki_search_queriesr±  ÿ  s¬   € Ø—�˜b×'Ñ'Ó)€IÜ& wÓ/€GØ€GßØ�‰˜'˜ ! I ;Ð/Ô0Ø�‰˜)˜ A g YÐ/Ô0ßØ�‰�yÔ!Ü‹5€DØ
€CÛˆØ�g‰g‹iˆß‰3�3–?Ø�H‰H�SŒMØ�J‰J�qŽMñ	 ð
 €Jr,   c                 óª   € Tp\        W4       F(  p\        WBR 7      p\        WPV4      pV'       g   K%  Wd3u # 	  \        WR 7      pV'       d   Wp3# . R3# )r¡  N)r±  r|  r©  r£  )r€   rw   r  Úvariety_for_matchry  r…  ÚrelevantÚcrop_titless   &&&     r-   Ú_wiki_resolve_titlesr¶    s\   € ØÐÜ% iÖ9ˆÜ$ UÔ8ˆÜ*¨6Ð>OÓPˆß‰8Ø�?Ò"ñ	 :ô
 .¨iÔE€KßØÐ%Ð%Øˆtˆ8€Or,   c                 ó>  € T ;'       g    R P                  4       pV'       g   . # \        P                  P                  RRRRRVRVRR/4      p \	        \
         R	V 24      pTP                  R4      ;'       g    / P                  R. 4       Uu. uF,  qUP                  R
4      '       g   K  TP                  R
4      NK.  	  up#   \        P                  P                  \        P                  P                  \        P                  \        3 d    . u # i ; iu upi )rI   r„  ry  rÅ   rp  ÚsrsearchÚsrlimitrˆ  rÚ   rŒ  r	  )rz   r×   r   rŽ  rá   rt  rk  rl  rm  rÚ   r-  rn  rX   )ry  r  rz  r�  r8  Úhits   &&    r-   r¢  r¢    sö   € Ø	�ˆ�"×ÑÓ€AßØˆ	Ü�\‰\×#Ñ#à�gØ�HØ˜Ø�uØ�fð	
ó€FðÜ¤- °¸F¸8ÐDÓEˆð *.¯©°'Ó):×)@Ð)@¸b×(EÑ(EÀhÐPRÔ(SÓhÑ(S ×W^ÑW^Ð_f×WgÔˆC�G‰G�GÖÑ(SÑhÐhøô �L‰L×!Ñ!¤6§<¡<×#9Ñ#9¼4×;OÑ;OÔQXÐYô ØŠ	ðüâhs   ÁC ÂDÂ-DÃADÄDc                 ó„  a€ T ;'       g    R P                  4       oSP                  R4      '       g   R# \        ;QJ d    V3R lR 4       F  '       g   K   RM	  RM! V3R lR 4       4      '       g   R# Rp\        ;QJ d)    V3R lV 4       F  '       g   K   R'       * # 	  R'       * # ! V3R lV 4       4      '       * # )rI   zfile:Fc              3   ó,   <"  € T F	  qS9   x € K  	  R # 5ir=   r(   )Ú.0Úextra   s   & €r-   Ú	<genexpr>Ú&_wiki_file_is_photo.<locals>.<genexpr>7  s   øé € ÐIÑ&H˜s�dŽ{Ó&Hùó   ƒTc              3   ó,   <"  € T F	  qS9   x € K  	  R # 5ir=   r(   )r½  Útokenra   s   & €r-   r¿  rÀ  =  s   øé € Ð:©k U˜D–=«kùrÁ  )ú.jpgú.jpegú.pngú.webp)zcommons-logoz
edit-clearÚsymbolzicon-ÚflagÚmapÚlogoÚ	pictogramÚamboxÚ	wikimediaÚquestion_bookÚcrystal)r  rù   Úany)Ú
file_titleÚskip_tokensra   s   & @r-   Ú_wiki_file_is_photorÔ  3  sŒ   ø€ Ø×Ð˜"×#Ñ#Ó%€DØ�?‰?˜7×#Ò#Ùß‹3ÔIÑ&HÓI�3�3Š3ÔIÑ&HÓI×IÒIÙð€K÷ ‹sÔ:©kÓ:�sŒsÔ:Ð:ŠsÔ:Ð:ˆsÔ:©kÓ:Ó:Ô:Ð:r,   c                 ó¾  € T ;'       g    R P                  4       p V '       d   V^ 8:  d   . # \        T;'       g    . 4      p\        P                  P	                  RRRV RRR^RR/4      p \        \         R	V 24      p. pTP                  R4      ;'       g    / P                  R
/ 4      P                  4        FZ  pTP                  R4      ;'       g    .  F8  pTP                  R4      p\        T4      '       g   K'  TP!                  T4       K:  	  K\  	  T'       g   . # . p	^p
\#        ^ \%        \'        T4      ^4      T
4       EFh  pY[Yº,            p\        P                  P	                  RRRRP)                  T4      RRRRRRRR/4      p \        \         R	T 24      pTP                  R4      ;'       g    / P                  R
/ 4      P                  4        FÎ  pTP                  R4      ;'       g    / .^ ,          p\+        TP                  R4      ;'       g    TP                  R4      4      pT'       g   Kc  \-        T4      ;'       g    TpTT9   d   K�  TP/                  T4       T	P!                  RTRTP                  R4      RR/4       \'        T	4      T8¼  g   KÊ  T	u u # 	  EKk  	  T	#   \        P                  P                  \        P                  P                  \        P                  \        3 d    . u # i ; i  \        P                  P                  \        P                  P                  \        P                  \        3 d     EK  i ; i)rI   r„  ry  r…  r†  r~   Úimlimitrˆ  rÚ   rŒ  rx  r	  rR  Ú	imageinfoÚiiproprÞ   Ú
iiurlwidthrŠ  Úthumburlr
  r  )rz   rL  r×   r   rŽ  rá   rt  rk  rl  rm  rÚ   r-  rn  rX   r�  rÔ  rŽ   rh   r›   rp   r�   rü   r  r  )r	  Úskip_identitiesr  r�  r8  Úfile_titlesr‘  ÚitemrÒ  r~   Ú
batch_sizerj   ÚbatchÚinfo_paramsÚ	info_dataÚinforÞ   r  s   &&&               r-   Ú_wiki_extra_page_imagesrã  @  sõ  € Ø�[ˆ[�b×ÑÓ!€Eß�E˜Q”JØˆ	Ü˜/×/Ð/¨RÓ0€OÜ�\‰\×#Ñ#à�gØ�eØ�HØ�rØ�fð	
ó€FðÜ¤- °¸F¸8ÐDÓEˆð €KØ—‘˜'Ó"×(Ð( b×-Ñ-¨g°rÓ:×AÑAÖCˆØ—H‘H˜XÓ&×,Ð,¨"Ò,ˆDØŸ™ 'Ó*ˆJÜ" :×.Ô.Ø×"Ñ" :Ö.ó -ñ D÷
 Øˆ	à€FØ€JÜ�qœ#œc +Ó.°Ó3°Z×@ˆØ %Õ"4Ð5ˆÜ—l‘l×,Ñ,à˜'Ø˜#Ÿ(™( 5›/Ø˜Ø˜%Ø˜cØ˜&ðó	
ˆð	Ü'¬=¨/¸À[ÀMÐ(RÓSˆIð —]‘] 7Ó+×1Ð1¨r×6Ñ6°wÀÓC×JÑJÖLˆDØ—H‘H˜[Ó)×1Ð1¨b¨T°1Õ5ˆDÜ& t§x¡x°
Ó';×'NÐ'N¸t¿x¹xÈ»ÓOˆCßÙÜ-¨cÓ2×9Ð9°cˆEØ˜Ô'ÙØ×Ñ Ô&Ø�M‰MØ�sØ˜Ÿ™ 'Ó*Ø˜+ðô ô
 �6‹{˜eÖ#Ø”ô Mñ! Að@ €Møô[ �L‰L×!Ñ!¤6§<¡<×#9Ñ#9¼4×;OÑ;OÔQXÐYô ØŠ	ðûô6 —‘×%Ñ%¤v§|¡|×'=Ñ'=¼t×?SÑ?SÔU\Ð]ô 	Ûð	ús&   Á+J5 ÆL
Ê5ALÌLÌ
AMÍMc           	      óÂ  € . p\        4       p\        WV4       F¿  p\        V4      V8¼  d    M®\        V^R7      pV'       d   \	        WEV^ ,          V4       M!\        V4      p\	        WE\        V4      V4       \        V4      V8¼  d    MQV^8”  g   K{  \        VVV\        V4      ,
          R7       F"  p	\	        WEW“4       \        V4      V8¼  g   K!   K½  	  KÁ  	  VRV # )é   r¡  )rÛ  r  N)rL  r©  rp   r’  r  rv  r‚  rã  )
r…  r€   rw   r  r~   r  r	  Ú	page_imgsÚprimaryÚextras
   &&&&      r-   Ú_collect_wiki_imagesré  €  sÌ   € Ø€FÜ“e€OÜ(¨¸GÖDˆÜˆv‹;˜%ÔÙÜ% e°1Ô5ˆ	ßÜ  ¸)ÀA½,ÈÕNä(¨Ó/ˆGÜ  Ô:RÐSZÓ:[Ð]bÔcÜˆv‹;˜%ÔÙØ�1Ž9Ü0ØØ /Øœc &›kÕ)÷�ô
 % V¸eÔKÜ�v“; %Ö'Úóñ Eð( �&�5ˆ>Ðr,   c                 óê   € V P                  4       ;_uu_ 4       pR pV'       d
   VR,          pVR,          pVP                  V4       VP                  4       uuRRR4       #   + '       g   i     R# ; i)zSELECT * FROM GardenSeedCompanyz WHERE enabled = 1z ORDER BY sort_order, nameN)rS   rT   ro   )r]   Úenabled_onlyr^   Úsqls   &&  r-   Ú_get_seed_companiesrí  š  sN   € Ø	�‰�Œ˜#Ø/ˆßØÐ'Õ'ˆCØÐ+Õ+ˆØ�‰�CÔØ�|‰|‹~÷ 
��‹ús   ™=A!Á!A2	c                 ó„   € \         P                  P                  V 4      P                  ;'       g    R P	                  4       # r¥  )r×   r   r  Úhostnamer  )rb   s   &r-   Ú_company_hostrð  ¤  s.   € Ü�L‰L×!Ñ! (Ó+×4Ñ4×:Ð:¸×AÑAÓCÐCr,   c                 ó€  € \         P                  P                  V4      pVP                  ;'       g    R P	                  4       pV'       d   VP
                  R9  d   R# \        V RR7       FN  p\        VP                  R4      4      pV'       g   K'  W58X  g!   VP                  RV,           4      '       g   KM   R# 	  R# )rI   FT©rë  rb   Ú.)ÚhttpÚhttps)
r×   r   r  rï  r  Úschemerí  rð  rX   Úendswith)r]   rÞ   Úparsedr   ÚcompanyÚcompany_hosts   &&    r-   Ú_is_allowed_product_urlrû  «  sŒ   € Ü�\‰\×"Ñ" 3Ó'€FØ�O‰O×!Ð!˜r×(Ñ(Ó*€Dß�6—=‘=Ð(9Ô9ÙÜ& t¸$×?ˆÜ$ W§[¡[°Ó%<Ó=ˆß‰<˜TÔ1°T·]±]À3ÈÕCU×5VÔ5VÚñ @ñ r,   c                 ó¨   € \        V4      p\        V R R7       F5  p\        VP                  R4      4      V8X  g   K$  VP                  R4      u # 	  R# )Trò  rb   ra   N)rð  rí  rX   )r]   rÞ   r   rù  s   &&  r-   Ú_source_name_for_urlrý  ·  sH   € Ü˜Ó€DÜ& t¸$×?ˆÜ˜Ÿ™ ZÓ0Ó1°TÖ9Ø—;‘;˜vÓ&Ò&ñ @ñ r,   c                 óÞ   € \        \        4      \        \        4      ,          p\        V R R7       F8  p\	        VP                  R4      4      pV'       g   K'  VP                  V4       K:  	  V# )Trò  rb   )rL  ÚWIKIMEDIA_IMAGE_HOSTSÚSEED_COMPANY_CDN_HOSTSrí  rð  rX   r  )r]   Úhostsrù  r   s   &   r-   Ú_allowed_image_hostsr  ¿  sT   € ÜÔ%Ó&¬Ô-CÓ)DÕD€EÜ& t¸$×?ˆÜ˜WŸ[™[¨Ó4Ó5ˆß‰4Ø�I‰I�dŽOñ @ð €Lr,   c                 ó¾   € T ;'       g    R P                  4       p V '       g   R# W9   d   R# V F*  pW8X  g!   V P                  RV,           4      '       g   K)   R# 	  R# )rI   FTró  )r  r÷  )r   Úallowed_hostsÚalloweds   && r-   Ú_image_host_allowedr  È  sN   € Ø�JˆJ�B×ÑÓ€DßÙØÔÙÛ ˆØŒ?˜dŸm™m¨C°'­M×:Ô:Úñ !ñ r,   c                 óŠ   € T ;'       g    R P                  4       p \        V4      pV'       d   V RV  2P                  4       # V # r¯  )rz   r­  )r€   rw   s   &&r-   Ú_build_seed_search_queryr  Ô  sC   € Ø—�˜b×'Ñ'Ó)€IÜ& wÓ/€GßØ�˜!˜I˜;Ð'×-Ñ-Ó/Ð/ØÐr,   c                 ó¶  € \         P                  ! R RT ;'       g    RP                  4       P                  4       4      P                  R4      pV'       g   V# VP	                  R4      '       d   V# VP	                  R4      '       d+   \        V4      ^8”  d   VR	,          R9  d   VRR
 R,           # VP	                  R4      '       d
   VR,           # VR,           # )ú
[^a-z0-9]+rh  rI   ÚsÚyÚaeiouNÚiesÚeséþÿÿÿrÿ   )ÚchÚshÚxÚz)r  r  rz   r  r÷  rp   )r€   rV  s   & r-   Ú_crop_plural_slugr  Ü  s¬   € Ü�6Š6�-  y§ °B×&=Ñ&=Ó&?×&EÑ&EÓ&GÓH×NÑNÈsÓS€DßØˆØ‡}�}�S×ÒØˆØ‡}�}�S×Òœc $›i¨!œm°°RµÀÔ0GØ�C�Rˆy˜5Õ Ð Ø‡}�}Ð+×,Ò,Ø�d�{ÐØ�#�:Ðr,   c                 óð  € T ;'       g    R P                  4       p . p\        V4      pV'       EdÔ   VP                  RR 4      P                  RR 4      P                  4       pV'       dY   VP                  4       VP                  4       8w  d6   VP	                  V RV  2P                  4       4       VP	                  V4       \
        P                  ! RV\
        P                  4      '       Edâ   \
        P                  ! RRV4      pVP	                  V RV  2P                  4       4       VP                  RR 4      P                  RR 4      P                  4       pV'       dH   VP                  4       VP                  4       8w  d%   VP	                  V RV  2P                  4       4       \
        P                  ! RR V\
        P                  R7      P                  4       pV'       dé   VP                  4       VP                  4       8w  dÆ   VP	                  V RV  2P                  4       4       VP	                  V4       VP                  RR 4      P                  RR 4      P                  4       pV'       dY   VP                  4       VP                  4       8w  d6   VP	                  V RV  2P                  4       4       VP	                  V4       VP	                  V RV  2P                  4       4       VP	                  V4       V '       d   VP	                  V 4       \        4       p	. p
V FG  pVP                  4       pV'       g   K  WÉ9  g   K%  V	P                  V4       V
P	                  V4       KI  	  V
# )	rI   Ú'u   â€™rg  ú\bog\bz\bOG\bÚOrganicz	\s+OG\s*$)Úflags)rz   Ú_effective_varietyr1   r  rŽ   r  rp  ÚIr  rL  r  )r€   rw   r°  ÚeffÚapostrophe_freeÚorganic_varÚorganic_freeÚstrippedÚstripped_freerN  rŠ   ry  ræ   s   &&           r-   Ú_seed_company_search_queriesr#  é  s˜  € Ø—�˜b×'Ñ'Ó)€IØ€GÜ
˜WÓ
%€Cß
€sØŸ+™+ c¨2Ó.×6Ñ6°u¸bÓA×GÑGÓIˆß˜×4Ñ4Ó6¸#¿)¹)»+ÔEØ�N‰N˜oÐ.¨a°	¨{Ð;×AÑAÓCÔDØ�N‰N˜?Ô+Ü�9Š9�Y ¤R§T¡T×*Ó*ÜŸ&š& ¨I°sÓ;ˆKØ�N‰N˜k˜]¨!¨I¨;Ð7×=Ñ=Ó?Ô@Ø&×.Ñ.¨s°BÓ7×?Ñ?ÀÀrÓJ×PÑPÓRˆLß × 2Ñ 2Ó 4¸×8IÑ8IÓ8KÔ KØ—‘ , ¨q°°Ð<×BÑBÓDÔEÜ—v’v˜l¨B°¼2¿4¹4Ô@×FÑFÓHˆHß˜HŸN™NÓ,°·	±	³Ô;Ø—‘ ( ¨1¨Y¨KÐ8×>Ñ>Ó@ÔAØ—‘˜xÔ(Ø (× 0Ñ 0°°bÓ 9× AÑ AÀ%ÈÓ L× RÑ RÓ T�ß  ]×%8Ñ%8Ó%:¸h¿n¹nÓ>NÔ%NØ—N‘N m _°A°i°[Ð#A×#GÑ#GÓ#IÔJØ—N‘N =Ô1Ø�‰˜#˜˜a 	˜{Ð+×1Ñ1Ó3Ô4Ø�‰�sÔßØ�‰�yÔ!Ü‹5€DØ
€CÛˆØ�k‰k‹mˆß‰5�S–_Ø�H‰H�SŒMØ�J‰J�uÖñ	 ð
 €Jr,   c                 ó<  a € S ;'       g    R P                  4       o \        ;QJ d    V 3R lR	 4       F  '       g   K   RM	  RM! V 3R lR	 4       4      '       d   R# RS 9   d!   \        \        P                  ! RS 4      4      # RS 9   g   RS 9   g   RS 9   d   R# R# )
rI   c              3   ó.   <"  € T F
  pVS9   x € K  	  R # 5ir=   r(   ©r½  Úskipr  s   & €r-   r¿  Ú+_is_company_product_path.<locals>.<genexpr>  s    øé € ð ñ
ˆDð 	�Žó
ùó   ƒTFz	/product/z/product/[^/]+(?:/\d+)?/?$z.htmlz/herbs/ú/vegetables/)z/gift-certificatez'+produrl+'Úprodurlz	/viewcartz/create_review)r  rÑ  rG  r  rp  )r  s   fr-   Ú_is_company_product_pathr,    s‰   ø€ Ø�JˆJ�B×ÑÓ€Dß
ƒsô ñ
ó‡s‡s‚sô ñ
ó÷ ò ñ Ø�dÔÜ”B—I’IÐ;¸TÓBÓCÐCØ�$„˜) tÔ+¨~ÀÔ/EÙÙr,   c                 óP  a€ T ;'       g    R P                  4       oS'       g   R# \        ;QJ d#    V3R l\         4       F  '       g   K   RM	  RM! V3R l\         4       4      '       d   R# RS9   g   RS9   d   R# RS9   d    \        P                  ! RS4      '       d   R# R# )rI   Fc              3   ó,   <"  € T F	  qS9   x € K  	  R # 5ir=   r(   )r½  r'  rû   s   & €r-   r¿  Ú-_is_seed_company_image_url.<locals>.<genexpr>"  s   øé € Ð
@Ñ!?˜�1Ž9Ó!?ùrÁ  Tz/images/popup/z/images/products/rî   z//images/[^/]*\d{3,}[^/]*\.(?:jpg|jpeg|png|webp))r  rÑ  ÚSEED_COMPANY_IMAGE_SKIP_TOKENSr  rp  rú   s   &@r-   Ú_is_seed_company_image_urlr1    s|   ø€ Ø	�ˆ�×ÑÓ€AßÙß
ƒsÔ
@Õ!?Ó
@‡s‡s‚sÔ
@Õ!?Ó
@×@Ò@ÙØ˜1ÔÐ 3°qÔ 8ÙØ˜qÔ ¤R§Y¢YØ:Ø	÷&ò &ñ Ùr,   c                 óF  € \        V P                  R 4      4      pVR8w  d   . # V P                  R 4      ;'       g    RP                  R4      p. pV FÖ  p \        P                  P                  RRRRRV/4      P                  4       p\        P                  P                  V R	2VR
RRRRRRV R2/RR7      p\        P                  P                  V^R7      ;_uu_ 4       pVP                  4       P                  RRR7      p	RRR4       VP                  \        X	V 4      4       KØ  	  \%        \&        P)                  V4      4      #   + '       g   i     LM; i  \        P                  P                  \        P                  P                   \"        3 d     EKM  i ; i)rb   úwww.totallytomato.comrI   rþ   r„  ÚSearchÚsearch_typeÚprodcatÚkeywordz
/index.phprÒ   ú<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36úContent-Typez!application/x-www-form-urlencodedÚAcceptú/text/html,application/xhtml+xml;q=0.9,*/*;q=0.8ÚRefererÚPOST)r8  rÔ   ÚmethodrÕ   r0   r1   r2   N)rð  rX   Úrstripr×   r   rŽ  Úencoder	   rØ   rÙ   rÜ   r8   ÚextendÚ_extract_company_product_linksrk  rl  rm  rn  rÅ   r.  Úfromkeys)
rù  Úsearch_queriesr   rb   Úlinksry  rä   rß   rà   Úsearch_htmls
   &&        r-   Ú_company_post_search_linksrG  .  s~  € Ü˜Ÿ™ ZÓ0Ó1€DØÐ&Ô&Øˆ	Ø—‘˜JÓ'×-Ð-¨2×5Ñ5°cÓ:€HØ€EÛˆð	Ü—l‘l×,Ñ,Ø˜(Ø˜yØ˜5ð.ó ÷ ‰v‹xð	 ô
 —.‘.×(Ñ(Ø�*˜JÐ'Øà ð-ð #Ð$GØÐOØ ( ¨1˜~ðð ð )ó ˆCô —‘×'Ñ'¨°RÐ'×8Ô8¸DØ"Ÿi™i›k×0Ñ0°ÀÐ0ÓK�÷ 9à�L‰LÔ7¸ÀWÓMÖNñ/  ô4 ”—‘˜eÓ$Ó%Ð%÷ 9×8ûô —‘×%Ñ%¤v§|¡|×'=Ñ'=¼wÐGô 	Ûð	ús+   ÁBEÃ#"E
Ä#EÅ
EÅEÅ>F ÆF c                 óÖ  aa	€ . o\        4       o	VV	3R  lpV F)  p \        \        W4      4      pV! \        W`4      4       K+  	  V! \        W4      4       V! \        W4      4       \        V P                  R4      4      pV'       d   V F  pV! \        Wu4      4       K  	  S#   \        P                  P
                  \        P                  P                  \        3 d    Rp L·i ; i)c                 ó˜   <€ T ;'       g    .  F8  pV'       g   K  VS9  g   K  SP                  V4       SP                  V4       K:  	  R # r=   )r  rŽ   )Ú	new_linksÚlinkrE  rN  s   & €€r-   r  Ú+_collect_company_product_links.<locals>.addU  s8   ø€ Ø—O�O ’OˆDß‰t˜ DÖ(Ø—‘˜”Ø—‘˜TÖ"ó $r,   rI   rb   )rL  Ú_fetch_html_urlÚ_company_search_urlr×   rk  rl  rm  rn  rB  Ú_company_browse_linksrG  rð  rX   Ú_google_site_search_links)
rù  r€   rw   rD  r  Úsearch_queryrF  ÚdomainrE  rN  s
   &&&&    @@r-   Ú_collect_company_product_linksrS  Q  sÇ   ù€ Ø€EÜ‹5€Dö#ó 'ˆð	Ü)Ô*=¸gÓ*TÓUˆKñ 	Ô*¨;Ó@ÖAñ 'ñ Ô˜gÓ1Ô2ÙÔ" 7Ó;Ô<ä˜7Ÿ;™; zÓ2Ó3€FßÛ*ˆLÙÔ)¨&Ó?Ö@ñ +à€Løô —‘×%Ñ%¤v§|¡|×'=Ñ'=¼wÐGô 	ØŠKð	ús   œB%Â%A C(Ã'C(c                 óè  € \        V P                  R 4      4      pV P                  R 4      ;'       g    RP                  R4      pT;'       g    RP                  4       pV'       d   V'       d	   V'       g   . # . pVR8X  d*   \	        V4      pV'       d   VP                  RV R24       M/VR8X  d)   \	        V4      pV'       d   VP                  RV R24       . pV F/  p \        W7,           4      pTP                  \        Y€4      4       K1  	  \        \        P!                  V4      4      #   \        P                  P                  \        P                  P                  \        3 d     K’  i ; i)rb   rI   rþ   zwww.johnnyseeds.comr*  r3  z/vegetables/vegetable-seeds/z-seeds)rð  rX   r?  rz   r  rŽ   rM  r×   rk  rl  rm  rn  rA  rB  rÅ   r.  rC  )	rù  r€   r   rb   ÚpathsÚpluralrE  r  Úbrowse_htmls	   &&       r-   rO  rO  l  s,  € Ü˜Ÿ™ ZÓ0Ó1€DØ—‘˜JÓ'×-Ð-¨2×5Ñ5°cÓ:€HØ—�˜b×'Ñ'Ó)€Iß—x§yØˆ	Ø€EØÐ$Ô$Ü" 9Ó-ˆßØ�L‰L˜<¨ x¨qÐ1Ô2øØ	Ð(Ô	(Ü" 9Ó-ˆßØ�L‰LÐ7¸°x¸vÐFÔGØ€EÛˆð	Ü)¨(­/Ó:ˆKð 	�‰Ô3°KÓIÖJñ ô ”—‘˜eÓ$Ó%Ð%øô —‘×%Ñ%¤v§|¡|×'=Ñ'=¼wÐGô 	Úð	ús   Ã"D/Ä/>E1Å0E1c                 óÜ  € \        V 4      pV.p\        P                  ! R V4      '       d(   VP                  \        P                  ! R RV4      4       VP                  RR4      pV'       d   VP                  V4       \        P                  ! RV4      pV'       d4   VP                  VP                  ^4       VP                  ^4       24       \        \        P                  V4      4      # )r  Úorganicrg  rI   ú^([a-z])\s+(\d+)\b)Ú_normalize_match_textr  rp  rŽ   r  r1   ÚmatchÚgrouprÅ   r.  rC  )rw   Únorm_varÚformsÚcompactÚ
code_matchs   &    r-   Ú_variety_match_formsrb  …  s³   € Ü$ WÓ-€HØˆJ€EÜ	‡y‚y�˜H×%Ò%Ø�‰”R—V’V˜I y°(Ó;Ô<Ø×Ñ˜s BÓ'€GßØ�‰�WÔÜ—’Ð/°Ó:€JßØ�‰˜
×(Ñ(¨Ó+Ð,¨Z×-=Ñ-=¸aÓ-@Ð,AÐBÔCÜ”—‘˜eÓ$Ó%Ð%r,   c                 óp   € T ;'       g    R P                  4       p V '       d   \        V 4      '       d   R # V # r¥  r«  r¬  s   &r-   r  r  “  s,   € Ø�}ˆ}˜"×#Ñ#Ó%€GßÔ)¨'×2Ò2ÙØ€Nr,   c                 óè   € T ;'       g    R P                  4       p V P                  RR4      P                  RR4      p \        P                  ! RRV 4      p RP	                  V P                  4       4      # )rI   rh  rg  r©   r
  )r  r1   r  r  r�   r  )Útexts   &r-   r[  r[  š  sZ   € Ø�JˆJ�B×ÑÓ€DØ�<‰<˜˜SÓ!×)Ñ)¨#¨sÓ3€DÜ�6Š6�-  dÓ+€DØ�8‰8�D—J‘J“LÓ!Ð!r,   c                 ó„  a€ \        V 4      p V '       g   ^d# \        RP                  V4      4      pV'       g   ^ # VP                  RR4      p\	        V 4       F9  pWB9   d    ^d# VP                  RR4      p\        V4      ^8¼  g   K0  WS9   g   K8   ^b# 	  \        V 4      p. pVP                  4        F@  p\        V4      ^8¼  d   VP                  V4       K&  VR	9   g   K/  VP                  V4       KB  	  \        P                  ! RV4      p	V	'       d4   VP                  V	P                  ^4       V	P                  ^4       24       V'       g   VP                  RR4      V9   d   ^d# ^ # VoRV9   d
   SR,          o\        V3R lV 4       4      p
V
\        V4      ,          pVR8¼  d   ^_# VR8¼  d   ^A# V
'       d   ^## ^ # )
éd   rg  rI   ÚogrZ  z organicc              3   ó8   <"  € T F  qS9   g   K  ^x € K  	  R# 5i©rå  Nr(   )r½  rÃ  Úexpandeds   & €r-   r¿  Ú'_variety_match_score.<locals>.<genexpr>¾  s   øé € ÐA¡˜¸Ñ/@—!’!£ùó   ƒ�
g      ð?g      à?)rh  ÚopÚf1Úf2)r  r[  r�   r1   rb  rp   r  rŽ   r  r\  r]  Úsum)rw   ÚtextsÚcombinedÚcompact_textÚformÚcompact_formr^  Ú
var_tokensrÃ  ra  ÚmatchedÚratiork  s   &*          @r-   Ú_variety_match_scorerz  ¡  s…  ø€ Ü  Ó)€GßÙÜ$ S§X¡X¨e£_Ó5€HßÙØ×#Ñ# C¨Ó,€LÜ$ WÖ-ˆØÔÚØ—|‘| C¨Ó,ˆÜˆ|Ó Ö! lÖ&BÚñ .ô % WÓ-€HØ€JØ—‘Ö!ˆÜˆu‹:˜Œ?Ø×Ñ˜eÖ$ØÐ.Ö.Ø×Ñ˜eÖ$ñ	 "ô
 —’Ð/°Ó:€JßØ×Ñ˜Z×-Ñ-¨aÓ0Ð1°*×2BÑ2BÀ1Ó2EÐ1FÐGÔHßØ×&Ñ& s¨BÓ/°<Ô?ˆsÐFÀQÐFØ€HØˆzÔØ�JÕˆÜÔA¡ÓAÓA€GØ”c˜*“oÕ%€EØ�„|ÙØ�„|ÙßÙÙr,   c                 óÜ  a€ T ;'       g    R P                  4       p V '       g   ^d# \        V 4      p\        RP                  V4      4      oS'       g   ^ # VS9   d   ^d# VP                  4        Uu. uF  p\	        V4      ^8¼  g   K  VNK  	  ppV'       g   VSP                  RR 4      9   d   ^d# ^ # \        V3R lV 4       4      p\        ^dV,          \	        V4      ,          4      # u upi )rI   rg  c              3   ó8   <"  € T F  qS9   g   K  ^x € K  	  R# 5irj  r(   )r½  rÃ  rs  s   & €r-   r¿  Ú$_crop_match_score.<locals>.<genexpr>Ö  s   øé € ÐB¡˜¸Ñ0A—!’!£ùrm  )rz   r[  r�   r  rp   r1   rq  rV   )r€   rr  Ú	norm_cropr¦  Úcrop_tokensrx  rs  s   &*    @r-   Ú_crop_match_scorer€  É  sÄ   ø€ Ø—�˜b×'Ñ'Ó)€IßÙÜ% iÓ0€IÜ$ S§X¡X¨e£_Ó5€HßÙØ�HÔÙØ'Ÿo™oÔ/Ó?Ñ/˜´3°q³6¸Q±;—1�1Ñ/€KÐ?ßØ 8×#3Ñ#3°C¸Ó#<Ô<ˆsÐCÀ!ÐCÜÔB¡ÓBÓB€GÜˆs�W�}œs ;Ó/Õ/Ó0Ð0ùò	 @s   Á0C)ÂC)c                 ó`  € T ;'       g    R T;'       g    R T;'       g    R .p\        V.VO5!  pV^(8  d   ^ # \        V.VO5!  p\        V4      '       d
   V^28  d   ^ # \        V4      '       d   VR,          VR,          ,           pM\        V4      pR\	        V 4      9   d
   V^,          pV# )rI   g      è?g      Ð?r$   )r€  rz  r  r6   r[  )	rÞ   r€   rw   r	  r€  rr  Ú
crop_scoreÚvariety_scoreÚscores	   &&&&&    r-   Ú_score_seed_candidater…  Ú  s¢   € Ø�YˆY�B˜Ÿ˜  W§] ]°Ð3€EÜ" 9Ð5¨uÓ5€JØ�B„ÙÜ(¨Ð9°5Ó9€MÜ˜'×"Ò" }°rÔ'9ÙÜ˜'×"Ò"Ø Õ$ z°DÕ'8Õ8‰ä�jÓ!ˆØÔ& sÓ+Ô+Ø��
ˆØ€Lr,   c                 óð   € V P                  R 4      ;'       g    RP                  R4      pV P                  R4      ;'       g    Rp\        P                  P	                  V4      pVP                  W$VR7      # )rb   rI   rþ   Úsearch_url_templateú{base_url}/search/?q={query})rb   ry  Úencoded_query)rX   r?  r×   r   r$  rˆ  )rù  ry  rb   rc   ru  s   &&   r-   rN  rN  ë  sk   € Ø—‘˜JÓ'×-Ð-¨2×5Ñ5°cÓ:€Hà�‰Ð)Ó*÷ 	*ð 	*Ø)ð ô �l‰l× Ñ  Ó'€GØ�?‰? HÈ7ˆ?ÓSÐSr,   c           	      ó   € \         P                  P                  V R RRRRR/R7      p\         P                  P                  W!R7      ;_uu_ 4       pVP	                  4       P                  RR	R
7      uuRRR4       #   + '       g   i     R# ; i)rÒ   r8  r:  r;  zAccept-Languagezen-US,en;q=0.9rÓ   rÕ   r0   r1   r2   N)r×   r	   rØ   rÙ   rÜ   r8   rÝ   s   &&  r-   rM  rM  õ  s}   € Ü
�.‰.×
 Ñ
 Øàð%ð ÐGØÐ/ð
ð !ó 
€Cô 
�‰×	Ñ	 Ð	×	5Ô	5¸Ø�y‰y‹{×!Ñ! '°)Ð!Ó<÷ 
6×	5×	5Ó	5ús   Á!A<Á<B	c                 óJ  € V'       d   R V R2pMRV R2p\         P                  ! \         P                  ! V4       R2V \         P                  \         P                  ,          4      pV'       g   R# \
        P                  ! VP                  ^4      P                  4       4      # )z
property="Ú"zname="z\s+content=(['\"])(.*?)\1N)	r  rp  Úescaper  ÚSÚhtmlÚunescaper]  rz   )Ú	page_htmlra   r†  Úattrr\  s   &&&  r-   Ú_html_meta_contentr“    s}   € ßØ˜D˜6 Ð#‰à˜�v˜QÐˆÜ�IŠIÜ�IŠI�d‹OÐÐ5Ð6ØÜ
�‰Œr�t‰t�ó€E÷
 ÙÜ�=Š=˜Ÿ™ Q›×-Ñ-Ó/Ó0Ð0r,   c                 ó   € \        WV4      # r=   )r…  )rÞ   r€   rw   s   &&&r-   Ú_score_seed_linkr•    s   € Ü  °Ó9Ð9r,   c                 óÆ  a€ VP                  R 4      ;'       g    RP                  R4      p\        V4      p. p\        P                  ! RT ;'       g    R4       EFf  pVP                  RR4      pVP                  R4      '       d	   W%,           pVP                  R4      '       g   KN  \        P                  P                  V4      pV'       d%   VP                  '       d   W6P                  9  d   K™  VP                  ;'       g    RP                  4       o\        ;QJ d    V3R lR 4       F  '       g   K   RM	  R	M! V3R lR 4       4      '       d   Kÿ  \        S4      '       g   EK  VP                  VP                   R
,           VP"                  ,           VP                  P                  R4      ,           4       EKi  	  \%        \&        P)                  V4      4      # )rb   rI   rþ   zhref="([^"]+)"z&amp;Ú&rô  c              3   ó.   <"  € T F
  pVS9   x € K  	  R # 5ir=   r(   r&  s   & €r-   r¿  Ú1_extract_company_product_links.<locals>.<genexpr>&  s    øé € ð 
ñ�ð �DŽLóùr)  TFz://)	z/searchz
/customer-z/growers-libraryz/shop-by-colorz/cartz/accountz/loginz	/shippingz/privacy)rX   r?  rð  r  Úfindallr1   rù   r×   r   r  rï  r  r  rÑ  r,  rŽ   rö  ÚnetlocrÅ   r.  rC  )r�  rù  rb   Ú	base_hostrE  Úhrefrø  r  s   &&     @r-   rB  rB    sX  ø€ Ø—‘˜JÓ'×-Ð-¨2×5Ñ5°cÓ:€HÜ˜hÓ'€IØ€EÜ—
’
Ð,¨d¯j¨j°b×9ˆØ�|‰|˜G SÓ)ˆØ�?‰?˜3×ÒØ•?ˆDØ�‰˜v×&Ò&ÙÜ—‘×&Ñ& tÓ,ˆß˜ŸŸ˜¨Y¿o¹oÔ-MÙØ—‘×!Ð!˜r×(Ñ(Ó*ˆß‹3ô 
ñó
�3�3Š3ô 
ñó
÷ 
ò 
ñ Ü# D×)Õ)Ø�L‰L˜Ÿ™¨Õ.°·±Õ>ÀÇÁ×ASÑASÐTWÓAXÕX×Yñ' :ô( ”—‘˜eÓ$Ó%Ð%r,   c                 óŽ  € \         '       d   \        '       g   . # \        P                  P	                  R \         R\        RRV  RV 2R\        V^
4      /4      p \        RV 2^R7      p. pTP                  R4      ;'       g    .  FE  pTP                  R	4      pT'       g   K  TP                  TP                  R
4      ^ ,          4       KG  	  \!        \"        P%                  T4      4      RT #   \        P                  P                  \        P                  P                  \        P                  \        3 d    . u # i ; i)ræ   Úcxrz  zsite:rg  Únumz+https://www.googleapis.com/customsearch/v1?rÕ   r>   rK  Ú?N)r   r   r×   r   rŽ  r›   rá   rk  rl  rm  rÚ   r-  rn  rX   rŽ   r  rÅ   r.  rC  )rR  ry  r  r�  r8  rE  rÝ  rK  s   &&&     r-   rP  rP  3  s  € ß(Ó(×0HÓ0HØˆ	Ü�\‰\×#Ñ#àÔ0ØÔ*Ø�5˜˜  % Ð)Ø”3�u˜b“>ð		
ó€FðÜØ9¸&¸ÐBØô
ˆð €EØ—‘˜Ó!×'Ð' RÒ'ˆØ�x‰x˜Óˆß‰4Ø�L‰L˜Ÿ™ C›¨Õ+Ö,ñ (ô ”—‘˜eÓ$Ó% f uÐ-Ð-øô �L‰L×!Ñ!¤6§<¡<×#9Ñ#9¼4×;OÑ;OÔQXÐYô ØŠ	ðús   ÁC2 Ã2AEÅEc           	      óZ
  aaaa€  \        V 4      oT3R lpT3R lpT! R4      ;'       g	    T! R4      oS'       gˆ   \        P                  ! RS\        P                  4      pT'       dZ   \        P                  ! TP                  ^4      P                  4       4      o\        P                  ! RRS4      P                  4       oS'       gž   \        P                  ! RS\        P                  \        P                  ,          4      pT'       d[   \        P                  ! \        P                  ! R	RTP                  ^4      4      4      oR
P                  SP!                  4       4      oT! R4      ;'       g	    T! R4      pT'       gž   \        P                  ! RS\        P                  \        P                  ,          4      pT'       d[   \        P                  ! \        P                  ! R	RTP                  ^4      4      4      pR
P                  TP!                  4       4      p. o\#        4       oTTT3R lp\        P$                  ! RS\        P                  4       F  pT! T4       K  	  \        P$                  ! RS\        P                  4       F  pT! T4       K  	  \'        T! R4      4      p	T	'       d	   T! T	4       \        P(                  ! RS\        P                  4       EF,  p
 \*        P,                  ! T
P                  ^4      4      p\1        T\2        4      '       d   TMT.pT Fá  p\1        T\4        4      '       d   TP7                  R4      R8w  d   K1  T'       g   TP7                  R4      pS'       g   TP7                  R4      oTP7                  R4      p\1        T\2        4      '       d   T'       d
   T^ ,          MR p\1        T\4        4      '       d   TP7                  R4      p\'        T4      pT'       g   KÙ  T! T4       Kã  	  EK/  	  T'       g   S'       d   SpT'       g   S'       g   R # S'       d6   \        P                  ! S4      oR
P                  SP!                  4       4      oT'       d6   \        P                  ! T4      pR
P                  TP!                  4       4      pRSRTRSR,          RT /#   \        P                  P                  \        P                  P                  \
        3 d     R # i ; i  \*        P.                   d     EK>  i ; i)Nc                 ó   <€ \        SV R 7      # ))r†  ©r“  )r†  r‘  s   &€r-   Úmeta_propertyÚ1_extract_product_page_info.<locals>.meta_propertyS  ó   ø€ Ü! )°$Ô7Ð7r,   c                 ó   <€ \        SV R 7      # ))ra   r¤  )ra   r‘  s   &€r-   Ú	meta_nameÚ-_extract_product_page_info.<locals>.meta_nameV  r§  r,   zog:titler	  z<title>([^<]+)</title>z\s*\|.*$rI   z<h1[^>]*>(.*?)</h1>z<[^>]+>rg  zog:descriptionÚdescriptionzC<p[^>]*>\s*((?:A [^<]{40,600}|(?:A blend of|This)[^<]{20,600}))</p>c                 óà   <€ \        V 4      pV'       d   \        V4      '       g   R # \        V4      ;'       g    TpVS9   d   R # SP                  V4       SP	                  RVRSRR/4       R # )NrÞ   r	  r
  Úseed_company)rü   r1  r  r  rŽ   )rÞ   r)  r  r~   rN  r	  s   &  €€€r-   Ú	add_imageÚ-_extract_product_page_info.<locals>.add_imageq  se   ø€ Ü)¨#Ó.ˆ
ßÔ!;¸J×!GÒ!GÙÜ)¨*Ó5×CÐC¸ˆØ�DŒ=ÙØ�‰�ŒØ�‰Ø�:Ø�UØ�nð
ö 	r,   z>https://[^"\']+/images/products/[^"\']+\.(?:jpg|jpeg|png|webp)z;https://cdn\.commercev3\.net/[^"\']+\.(?:jpg|jpeg|png|webp)zog:imagez2<script type="application/ld\+json">(.*?)</script>z@typeÚProductra   ÚimagerÞ   r€  r~   :Né   NÚ
source_url)rM  r×   rk  rl  rm  rn  r  rp  r  r�  r�  r]  rz   r  rŽ  r�   r  rL  rš  rü   ÚfinditerrÚ   rÛ   r-  r4   rÅ   r.  rX   )Úpage_urlr¥  r©  Útitle_matchÚh1_matchr€  Ú
lead_matchr®  rÞ   Úog_imager\  rä   r>   rÝ  r±  r~   r‘  rN  r	  s   &              @@@@r-   Ú_extract_product_page_inforº  M  s®  û€ ðÜ# HÓ-ˆ	õ8õ8ñ ˜*Ó%×;Ð;©°7Ó);€EßÜ—i’iÐ 9¸9ÄbÇdÁdÓKˆßÜ—M’M +×"3Ñ"3°AÓ"6×"<Ñ"<Ó">Ó?ˆEÜ—F’F˜;¨¨EÓ2×8Ñ8Ó:ˆEßÜ—9’9Ð3°YÄÇÁÄrÇtÁtÅÓLˆßÜ—M’M¤"§&¢&¨°R¸¿¹ÈÓ9JÓ"KÓLˆEØ—H‘H˜UŸ[™[›]Ó+ˆEÙÐ,Ó-×IÐI±¸=Ó1I€GßÜ—Y’YØRØÜ�D‰D”2—4‘4�Kó
ˆ
÷
 Ü—m’m¤B§F¢F¨:°r¸:×;KÑ;KÈAÓ;NÓ$OÓPˆGØ—h‘h˜wŸ}™}›Ó/ˆGØ€FÜ‹5€D÷ô �zŠzØIØÜ
�‰öˆñ
 	�#Žñô �zŠzØFØÜ
�‰öˆñ
 	�#Žñô $¡M°*Ó$=Ó>€HßÙ�(Ôä—’Ø=ØÜ
�‰÷ˆð
	Ü—j’j §¡¨Q£Ó0ˆGô & g¬t×4Ò4‘¸7¸)ˆÛˆDÜ˜d¤D×)Ò)¨T¯X©X°gÓ->À)Ô-KÙßØŸ(™( =Ó1�ßØŸ™ Ó(�Ø—H‘H˜WÓ%ˆEÜ˜%¤×&Ò&ß$)˜˜až¨t�Ü˜%¤×&Ò&ØŸ	™	 %Ó(�Ü(¨Ó/ˆEß‰uÙ˜%Ö ô ñ÷4 —uØˆßŸ6ÙßÜ—’˜eÓ$ˆØ—‘˜Ÿ™›Ó'ˆßÜ—-’- Ó(ˆØ—(‘(˜7Ÿ=™=›?Ó+ˆà�Ø�7Ø�&˜•*Ø�hð	ð øôK �L‰L×!Ñ!¤6§<¡<×#9Ñ#9¼7ÐCô ÚðûôP ×#Ñ#ô 	Ûð	ús#   †S Ë0%TÓ>TÔTÔT*Ô)T*c                 óZ  € \        T ;'       g    . 4      pV Uu0 uF  p\        V4      kK  	  ppVP                  R 4       T;'       g    .  FR  p\        V4      pV'       d   We9   d   K  VP                  V4       VP	                  V4       \        V4      V8¼  g   KR   M	  VR V # u upi r=   )rÅ   r1  Údiscardr  rŽ   rp   )ÚexistingÚ
new_imagesr  Úmergedr  rN  r  s   &&&    r-   Ú_merge_seed_imagesrÀ  ½  sš   € Ü�(—.�.˜bÓ!€FÙ17Ó8±¨#Ô  Ö%±€DÐ8Ø‡L�L�ÔØ×Ð˜RÒˆÜ$ SÓ)ˆß˜œÙØ�‰�ŒØ�‰�cÔÜˆv‹;˜%ÖÙñ  ð �&�5ˆ>Ðùò 9s   šB(c                 ó\  € V P                  4       ;_uu_ 4       pVP                  R V34       VP                  4       '       d    RRR4       R# TP                  RYT;'       g    R\        P                  ! . 4      34       RRR4       V P                  4        R#   + '       g   i     L"; i)z=SELECT cache_key FROM GardenSeedTypeInfo WHERE cache_key = %sNz„
            INSERT INTO GardenSeedTypeInfo (cache_key, crop_name, variety, images)
            VALUES (%s, %s, %s, %s)
            )rS   rT   rW   rÚ   rê   r[   )r]   r  r€   rw   r^   s   &&&& r-   Ú_ensure_seed_type_info_rowrÂ  Ì  s|   € Ø	�‰�Œ˜#Ø�‰ÐSÐV_ÐUaÔbØ�<‰<�>Š>Ø÷ 
‰ð 	�‰ðð  7§? ?¨d´D·J²J¸r³NÐCô	
÷	 
ð 	‡K�K†M÷ 
�ús   ™+BÁBÁ$BÂB+	c                 ó  € V P                  4       ;_uu_ 4       pVP                  R 4       \        VP                  4       ;'       g    / P	                  R4      ;'       g    ^ 4      ^ 8„  uuRRR4       #   + '       g   i     R# ; i)zò
            SELECT COUNT(*) AS cnt
            FROM information_schema.COLUMNS
            WHERE TABLE_SCHEMA = DATABASE()
              AND TABLE_NAME = 'GardenSeedTypeInfo'
              AND COLUMN_NAME = 'images_user_managed'
            rR   N)rS   rT   rV   rW   rX   r»   s   & r-   rF  rF  Û  s\   € Ø	�‰�Œ˜#Ø�‰ðô	
ô �C—L‘L“N×(Ð( b×-Ñ-¨eÓ4×9Ð9¸Ó:¸QÑ>÷ 
��‹ús   ™AA4Á 	A4Á4B	c                 ó   € V P                  4       ;_uu_ 4       pVP                  R V34       VP                  4       pRRR4       \        X'       d   VP	                  R4      4      # R4      #   + '       g   i     L8; i)z:SELECT images FROM GardenSeedTypeInfo WHERE cache_key = %sNr~   )rS   rT   rW   r/  rX   rH  s   &&  r-   Ú_load_type_info_imagesrÅ  é  sZ   € Ø	�‰�Œ˜#Ø�‰ÐPÐS\ÐR^Ô_Ø�l‰l‹nˆ÷ 
ô ·#˜SŸW™W XÓ.Ó@Ð@¸4Ó@Ð@÷ 
�ús   ™$A-Á-A=	c                 ó`  € \        WW#4       V P                  4       ;_uu_ 4       p\        P                  ! VR \         4      pV'       d&   \        V 4      '       d   VP                  RWq34       MVP                  RWq34       R R R 4       V P                  4        R #   + '       g   i     L"; i)Nz™
                UPDATE GardenSeedTypeInfo
                SET images = %s, images_user_managed = 1
                WHERE cache_key = %s
                z>UPDATE GardenSeedTypeInfo SET images = %s WHERE cache_key = %s)rÂ  rS   rÚ   rê   rM  rF  rT   r[   )r]   r  r€   rw   r~   Úuser_managedr^   rä   s   &&&&&&  r-   Ú_save_type_info_imagesrÈ  ð  s†   € Ü˜t°	ÔCØ	�‰�Œ˜#Ü—*’*˜VÐ$9Ô%9Ð:Ó;ˆßÔ;¸D×AÒAØ�K‰Kðð
 Ð$õð �K‰KØPØÐ$ô÷ 
ð  	‡K�K†M÷! 
�ús   ¥ABÂB-	c                 ót  € V '       d   R V 9   g   V P                  R4      '       d   R# \        4       p\        P                  P	                  W4      p\        P                  P                  V4      '       d    \        P                  ! V4       R# R#   \         d    \        P                  RT 4        R# i ; i)ú..rþ   NzCould not delete seed upload %s)
rù   r  r  r  r�   ÚisfileÚremovern  ÚloggerÚwarning)r&  Úupload_rootÚfulls   &  r-   Ú_delete_seed_upload_filerÑ    s„   € ß˜ 	Ô)¨Y×-AÑ-AÀ#×-FÒ-FÙÜ#Ó%€KÜ�7‰7�<‰<˜Ó/€DÜ	‡w�w‡~�~�d×Òð	IÜ�IŠI�dŽOñ øô ô 	IÜ�N‰NÐ<¸i×Hð	Iús   Á8B Â!B7Â6B7c                 ób
  € \        V R R7      pV'       g   RRR. RRRRRR/# \        W4      pV'       g   RRR. RRRRRR/# RpRp\        W4      pV EF  p\        W�W'4      p	. p
\        P                  V	4       F*  p\        W±V4      pV^ 8:  d   K  V
P                  WË34       K,  	  V
P                  R R7       V
R	,           EFF  w  rË\        V4      pV'       g   K  \        VVVVP                  R
4      VP                  R4      R7      pV^ 8:  d   KR  YíP                  R4      '       d   ^M^ ,           \        VP                  R4      ;'       g    . 4      ,           pWö8”  dU   TpRVP                  R4      RVP                  R4      ;'       g    . RRRVP                  R4      RVP                  R4      /pV'       g   EK  VP                  R4      '       g   EK  \        VP                  R4      ;'       g    . 4      ^8¼  g   EKG   M	  V'       g   EKÆ  VP                  R4      '       g   EKà  \        VP                  R4      ;'       g    . 4      ^8¼  g   EK   M	  V'       Edp   . pVP                  R4      ;'       g    .  Uu0 uF6  p\        VP                  R4      4      ;'       g    VP                  R4      kK8  	  ppV EFé  p\        VP                  R4      ;'       g    . 4      ^8¼  d    EM¾ \        \        W„4      4      p\)        TT4      p	\        P                  T	4       EF~  pYµP                  R4      8X  d   K  \        Y±T4      pT^ 8:  d   K0  \        T4      pT'       g   KE  \        TTTTP                  R
4      TP                  R4      R7      pT^ 8:  d   K|  TP                  R4      ;'       g    .  F¦  p\        TP                  R4      4      ;'       g    TP                  R4      pT'       g   K@  TT9  g   KI  TP+                  T4       TP                  T4       \        TP                  R4      ;'       g    . 4      \        T4      ,           ^8¼  g   K¦   M	  \        TP                  R4      ;'       g    . 4      \        T4      ,           ^8¼  g   EK}   EKç  	  EKì  	  \-        VP                  R4      V^R7      VR&   V# RRR. RRRRRR/# u upi   \        P                   P"                  \        P                   P$                  \&        3 d     EKc  i ; i)Trò  r€  Nr~   Úinfo_sourcer³  Úsource_name)Úreverse:Né   Nr	  ©r	  r€  r­  ra   rÞ   r¡  rÿ   )rí  r  r#  rS  r.  rC  r…  rŽ   Úsortrº  rX   rp   r  rM  rN  r×   rk  rl  rm  rn  rB  r  rÀ  )r]   r€   rw   Ú	companiesry  ÚbestÚ
best_scorerD  rù  rE  Ú
candidatesrK  Ú	url_scorer‘  Ú
full_scoreÚtotal_scoreÚextra_imagesr  rN  rF  r  s   &&&                  r-   Ú_fetch_seed_company_inforá    s¤  € Ü# D°tÔ<€Ißà�tØ�bØ˜4Ø˜$Ø˜4ð
ð 	
ô % YÓ8€Eßà�tØ�bØ˜4Ø˜$Ø˜4ð
ð 	
ð €DØ€JÜ1°)ÓE€NäˆÜ.¨wÀ7Ó[ˆØˆ
Ü—M‘M %Ö(ˆDÜ-¨d¸wÓGˆIØ˜AŒ~ÙØ×Ñ˜yÐ/Ö0ñ	 )ð
 	�‰ ˆÔ%à)¨"Ÿ~™~‰OˆIÜ-¨dÓ3ˆDßÙÜ.ØØØØ—h‘h˜wÓ'ØŸ™ Ó+ôˆJð ˜QŒÙØ$¯X©X°i×-@Ò-@©ÀaÕHÌ3ÈtÏxÉxÐX`ÓOa×OgÐOgÐegÓKhÕhˆKØÔ'Ø(�
à˜tŸx™x¨	Ó2Ø˜dŸh™h xÓ0×6Ð6°BØ! >Ø  $§(¡(¨<Ó"8Ø! 7§;¡;¨vÓ#6ð�÷ Št˜Ÿ™ ×+Õ+´°D·H±H¸XÓ4F×4LÐ4LÈ"Ó0MÐQR×0RÙñ1  .÷2 Š4�D—H‘H˜Y×'Õ'¬C°·±¸Ó0B×0HÐ0HÀbÓ,IÈQ×,NÙñI ÷L €tØˆð —x‘x Ó)×/Ð/¨RÐ/ó
á/�ô & c§g¡g¨e£nÓ5×GÐG¸¿¹À»ÒGÙ/ð 	ð 
ô !ˆGÜ�4—8‘8˜HÓ%×+Ð+¨Ó,°Ô1ÚðÜ-Ô.AÀ'Ó.QÓR�ô 3°;ÀÓHˆEÜŸ™ e×,�ØŸ8™8 LÓ1Ô1ÙÜ1°$À7ÓK�	Ø ”>ÙÜ1°$Ó7�ßÙÜ2ØØØØŸ(™( 7Ó+Ø ŸH™H YÓ/ô�
ð  ”?ÙØŸ8™8 HÓ-×3Ð3°Ò3�CÜ5°c·g±g¸e³nÓE×WÐWÈÏÉÐQVË�Eß‘u ¨dÖ!2ØŸ™ œØ$×+Ñ+¨CÔ0Ü˜tŸx™x¨Ó1×7Ð7°RÓ8¼3¸|Ó;LÕLÐPQÖQÙ!ñ 4ô �t—x‘x Ó)×/Ð/¨RÓ0´3°|Ó3DÕDÈ×IÛô5 -ñ !ôF ,¨D¯H©H°XÓ,>ÀÐTUÔVˆˆX‰Øˆð 	�4Ø�"Ø�tØ�dØ�tðð ùòU
øô —L‘L×)Ñ)¬6¯<©<×+AÑ+AÄ7ÐKô Ûðús   Ê
%S&Ê0S&Ë;S+Ó+>T.Ô-T.c           
      óD  € T ;'       g    R P                  4       p T;'       g    R P                  4       pV '       g   V'       g   RRRRRRR. /# \        W4      w  r#V'       g   V '       d   \        V 4      pT p. pRpRpRpV'       d‰   \        V^ ,          4      pV'       d]   VP	                  R4      pVP	                  R4      pVP	                  R4      ;'       g    / P	                  R	/ 4      P	                  R
4      p\        W V\        R7      pRVRVRVRVR\         /# )rI   r€  NÚwikipedia_titleÚwikipedia_urlr~   Úextractr	  Úcontent_urlsÚdesktopr‘  r¡  )rz   r¶  r¢  rv  rX   ré  ÚWIKI_IMAGE_LIMIT)	r€   rw   r…  Úmatched_queryr~   Úsummary_textÚ
wiki_titleÚwiki_urlrç  s	   &&       r-   Ú_fetch_wikipedia_seed_inforí  …  s  € Ø—�˜b×'Ñ'Ó)€IØ�}ˆ}˜"×#Ñ#Ó%€GßŸWà�tØ˜tØ˜TØ�bð	
ð 	
ô 1°ÓDÑ€Fß—iÜ& yÓ1ˆØ!ˆà€FØ€LØ€JØ€HçÜ$ V¨A¥YÓ/ˆßØ"Ÿ;™; yÓ1ˆLØ Ÿ™ WÓ-ˆJØŸ™ NÓ3×9Ð9°r×>Ñ>¸yÈ"ÓM×QÑQÐRXÓYˆHÜ% f¸ÔHXÔYˆð 	�<Ø˜:Ø˜Ø�&Ð*Ô*Ð+ð	ð r,   c                 ó.  € V '       g   R # \        V P                  R4      4      pV P                  R4      p\        V\        \        34      '       d   VP                  RRR7      p\        V\        4      '       d   \        P                  ! V4      pRV P                  R4      RV P                  R4      RV P                  R4      R	V P                  R	4      R
V P                  R
4      RV P                  R4      RVRVR\        V P                  R4      4      /	# )Nr~   rš   r0   r1   r2   r€  rã  rä  rÓ  r³  rÔ  Ú
fetched_at)
rP  rX   r4   r7   r,  r8   rL   rÚ   rÛ   r;   )r?   r~   rš   s   &  r-   Ú_serialize_seed_type_inforð  ª  sä   € ßÙÜ# C§G¡G¨HÓ$5Ó6€FØ�w‰w�zÓ"€HÜ�(œU¤IÐ.×/Ò/Ø—?‘? 7°9�?Ó=ˆÜ�(œC× Ò Ü—:’:˜hÓ'ˆà�3—7‘7˜9Ó%Ø˜3Ÿ7™7Ð#4Ó5Ø˜Ÿ™ Ó1Ø�s—w‘w˜}Ó-Ø�c—g‘g˜lÓ+Ø�s—w‘w˜}Ó-Ø�&Ø�HØ”j §¡¨Ó!6Ó7ð
ð 
r,   c                 óÜ   € \        W4      pV P                  4       ;_uu_ 4       pVP                  R V34       VP                  4       pRRR4       \	        X4      #   + '       g   i     L; i)ú5SELECT * FROM GardenSeedTypeInfo WHERE cache_key = %sN)rT  rS   rT   rW   rð  )r]   r€   rw   r  r^   r?   s   &&&   r-   r   r   À  sO   € Ü$ YÓ8€IØ	�‰�Œ˜#Ø�‰ÐKÈiÈ\ÔZØ�l‰l‹nˆ÷ 
ô % SÓ)Ð)÷ 
�ús   ¤$AÁA+	c                 ó  € V '       g   R # V P                  R4      ;'       g    RP                  4       '       d   R# V P                  R4      '       d   R# V P                  R4      '       d   R# V P                  R4      '       d   R# R # )Fr€  rI   Tr~   rš   rä  ry   )r�   s   &r-   Ú_seed_type_info_has_contentrô  È  sd   € ßÙØ�‰�iÓ ×&Ð& B×-Ñ-×/Ò/ÙØ‡}�}�X×ÒÙØ‡}�}�Z× Ò ÙØ‡}�}�_×%Ò%ÙÙr,   c                 ó”  € \        W4      p\        WW4       V P                  4       ;_uu_ 4       pVP                  R V34       VP	                  4       ;'       g    / pRRR4       \        XP                  R4      4      p\        W4      '       d   TpM$\        YsP                  R4      ;'       g    . 4      pVP                  R4      p	VP                  R4      ;'       g    VP                  R4      p
\        W	4      pV P                  4       ;_uu_ 4       pTP                  RTTT;'       g    RV
VP                  R4      VP                  R4      R	V	V\        P                  ! V4      VP                  R
4      34       RRR4       V P                  4        \        WV4      #   + '       g   i     ELN; i  + '       g   i     L@; i)rò  Nr~   r³  r€  r	  a²  
            INSERT INTO GardenSeedTypeInfo
                (cache_key, crop_name, variety, summary, wikipedia_title, wikipedia_url,
                 info_source, source_url, source_name, images, planting)
            VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
            ON DUPLICATE KEY UPDATE
                crop_name = VALUES(crop_name),
                variety = VALUES(variety),
                summary = VALUES(summary),
                info_source = VALUES(info_source),
                source_url = VALUES(source_url),
                source_name = VALUES(source_name),
                images = VALUES(images),
                fetched_at = CURRENT_TIMESTAMP
            rã  rä  r­  rš   )rT  rÂ  rS   rT   rW   rP  rX   rI  rÀ  rý  rÚ   rê   r[   r   )r]   r€   rw   Ú	page_infor  r^   r½  Úexisting_imagesr~   r³  r€  rÔ  s   &&&&        r-   Ú_apply_product_page_inforø  Ö  se  € Ü$ YÓ8€IÜ˜t°	ÔCØ	�‰�Œ˜#Ø�‰ÐKÈiÈ\ÔZØ—<‘<“>×'Ð' Rˆ÷ 
ô -¨X¯\©\¸(Ó-CÓD€OÜ% d×6Ò6Ø ‰ä# O·]±]À8Ó5L×5RÐ5RÐPRÓSˆà—‘˜|Ó,€JØ�m‰m˜IÓ&×@Ð@¨)¯-©-¸Ó*@€GÜ& tÓ8€Kà	�‰�Œ˜#Ø�‰ðð  ØØ—�˜4ØØ—‘Ð.Ó/Ø—‘˜_Ó-ØØØÜ—
’
˜6Ó"Ø—‘˜ZÓ(ðô!	
÷ 
ð> 	‡K�K„MÜ˜t°Ó8Ð8÷] 
�ˆú÷ 
�ús   °.F#ÄA)F7Æ#F4	Æ7G	c                 ó.  € \        W4      pVe   \        V4      pM\        W4      p\        W4      p\	        WV4      pVP                  R4      p\        VP                  R4      ;'       g    . 4      p	VP                  R4      p
VP                  R4      pVP                  R4      pR pR pV'       * p\        V	4      ^8  pV'       g	   V'       dü   \        W4      pV'       dU   VP                  R4      '       d>   VP                  R4      pVP                  R4      pVP                  R4      pV
'       g   Rp
V'       d3   \        T	VP                  R4      ;'       g    . R \         \        R	7      p	V
'       gS   VP                  R4      '       g   VP                  R4      '       d%   Rp
VP                  R4      pVP                  R4      p\        W4      '       d   \        W4      p	M\        WY\        R	7      p	V P                  4       ;_uu_ 4       pTP                  R
TTT;'       g    R TTTT
TT\        P                  ! V	4      V'       d   \        P                  ! V4      MR 34       R R R 4       V P!                  4        R #   + '       g   i     L"; i)Nr€  r~   rÓ  r³  rÔ  rã  rä  r  r¡  aQ  
            INSERT INTO GardenSeedTypeInfo
                (cache_key, crop_name, variety, summary, wikipedia_title, wikipedia_url,
                 info_source, source_url, source_name, images, planting)
            VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
            ON DUPLICATE KEY UPDATE
                crop_name = VALUES(crop_name),
                variety = VALUES(variety),
                summary = VALUES(summary),
                wikipedia_title = VALUES(wikipedia_title),
                wikipedia_url = VALUES(wikipedia_url),
                info_source = VALUES(info_source),
                source_url = VALUES(source_url),
                source_name = VALUES(source_name),
                images = VALUES(images),
                planting = VALUES(planting),
                fetched_at = CURRENT_TIMESTAMP
            )rT  rÅ   rÅ  rr  rá  rX   rp   rí  rÀ  rè  rM  rI  rS   rT   rÚ   rê   r[   )r]   r€   rw   Úpreserved_imagesr  r÷  rš   rù  r€  r~   rÓ  r³  rÔ  rë  rì  Úneed_summaryÚneed_imagesÚwikir^   s   &&&&               r-   Ú_fetch_and_store_seed_type_inforþ  
  s  € Ü$ YÓ8€IØÒ#ÜÐ/Ó0‰ä0°ÓAˆä(¨Ó9€HÜ& t¸Ó@€Gà�k‰k˜)Ó$€GÜ�'—+‘+˜hÓ'×-Ð-¨2Ó.€FØ—+‘+˜mÓ,€KØ—‘˜\Ó*€JØ—+‘+˜mÓ,€KØ€JØ€Hà”;€LÜ�f“+ ‘/€Kß—{Ü)¨)Ó=ˆß˜DŸH™H Y×/Ò/Ø—h‘h˜yÓ)ˆGØŸ™Ð"3Ó4ˆJØ—x‘x Ó0ˆHßØ)�ßÜ'ØØ—‘˜(Ó#×)Ð) rÐ+<Ô,<Ð=Ü*ôˆF÷
  §¡¨× 3Ò 3°t·x±xÀ×7IÒ7IØ%ˆKØŸ™Ð"3Ó4ˆJØ—x‘x Ó0ˆHä% d×6Ò6Ü'¨Ó8‰ä# OÔCWÔXˆØ	�‰�Œ˜#Ø�‰ðð& ØØ—�˜4ØØØØØØÜ—
’
˜6Ó"ß(0”—
’
˜8Ô$°dðô' 	
÷ 
ðD 	‡K�K†M÷E 
�ús   È<JÉJÊJ	c                 ón   € \         ;_uu_ 4        V \        9   uuR R R 4       #   + '       g   i     R # ; ir=   )Ú_seed_type_fetch_lockÚ_seed_type_fetch_inflight)r  s   &r-   Ú_is_seed_type_fetch_inflightr  Z  s    € ß	Ö	ØÔ5Ñ5÷ 
×	×	Ó	ús   �	#£4	c                 óZ  a aa€ \        S S4      o\        ;_uu_ 4        Ve
   V\        S&   S\        9   d    R R R 4       R # \        P	                  S4       R R R 4       VV V3R lp\
        P                  ! VRRSR,           2R7      P                  4        R #   + '       g   i     LK; i)Nc            	      óx  <€ R p  \         ;_uu_ 4        \        P                  SR 4      p R R R 4       \        4       p \	        V4       \        VSSV R7       VP                  4        \         ;_uu_ 4        \        P                  S4       R R R 4       R #   + '       g   i     Ls; i  TP                  4        i ; i  \         d    \        P                  RS4        Lyi ; i  + '       g   i     R # ; i  \         ;_uu_ 4        \        P                  S4       R R R 4       i   + '       g   i     i ; i; i)N©rú  z"Seed type enrichment failed for %s)r   Ú_seed_type_preserved_imagesÚpopr.   rd   rþ  ÚcloseÚ	ExceptionrÍ  Ú	exceptionr  r¼  )Ú	preservedr]   r  r€   rw   s     €€€r-   ÚworkerÚ&_queue_seed_type_fetch.<locals>.workeri  sà   ø€ Øˆ	ð	=ß&Ö&Ü7×;Ñ;¸IÀtÓL�	÷ 'ä“8ˆDð	Ü$ TÔ*Ü/ØØØØ%.õ	ð —
‘
”÷ 'Ö&Ü)×1Ñ1°)Ô<÷ 'Ñ&÷! '×&ûð —
‘
•ûÜô 	NÜ×ÑÐAÀ9ÖMð	Nú÷ '×&Ð&û×&Ö&Ü)×1Ñ1°)Ô<÷ '×&×&Ð&ýst   …B= “BªB= ½B( ÁB= Á5C$ÂB%	Â B= Â(B:Â:B= Â=!C!ÃC8 Ã C!Ã!C8 Ã$C5	Ã8D9ÄD&	Ä	D9Ä&D6Ä1D9Tz
seed-type-:Né    N©ÚtargetÚdaemonra   )rT  r   r  r  r  Ú	threadingÚThreadrj   )r€   rw   rú  r  r  s   ff& @r-   Ú_queue_seed_type_fetchr  _  sŒ   ú€ Ü$ Y°Ó8€Iç	Ö	ØÒ'Ø5EÔ'¨	Ñ2ØÔ1Ô1Ø÷	 
Ñ	ô
 	"×%Ñ% iÔ0÷ 
÷=ô, ×ÒØØØ˜) C�.Ð)Ð*ô÷ �e†g÷C 
×	ús   žBÁBÂB*	c                 ó  € \        V 4      ;'       g    / p\        VP                  R 4      ;'       g    ^4      p\        V4      pVP                  R4      ;'       g    Tp\	        VR,          4      \	        V4      8*  VR&   V# )Úlow_seed_thresholdÚlow_stock_thresholdÚqtyÚ	low_stock)r¼   rV   rX   rB   r6   )r]   r?   ÚsettingsÚ	thresholdrÝ  r  s   &&    r-   Ú_serialize_seed_with_stockr  †  sr   € Ü˜TÓ"×(Ð( b€HÜ�H—L‘LÐ!5Ó6×;Ð;¸!Ó<€IÜ˜#Ó€DØ�G‰GÐ)Ó*×7Ð7¨i€EÜ˜c %�jÓ)¬U°5«\Ñ9€DˆÑØ€Kr,   c                 ó  € \        V 4      ;'       g    / pVP                  R 4      ;'       g    \        pVP                  R4      ;'       g    \        pVP                  R4      ;'       g    \        p\        V4      \        V4      V3# )ÚlatÚlngÚzip_code)r¼   rX   r   r   r   r6   )r]   r  r  r  r   s   &    r-   Ú_get_coordsr!  �  sk   € Ü˜TÓ"×(Ð( b€HØ
�,‰,�uÓ
×
+Ð
+¤€CØ
�,‰,�uÓ
×
+Ð
+¤€CØ�|‰|˜JÓ'×5Ð5¬:€HÜ�‹:”u˜S“z 8Ð+Ð+r,   c                ó:  € V '       g   V # \        V 4      P                  4       pVP                  R4      p\        V4      ^8X  dd   \        ;QJ d    R V 4       F  '       d   K   RM	  RM! R V 4       4      '       d*   \        V^ ,          4      R R\        V^,          4      R 2# \        V4      ^8X  dd   \        ;QJ d    R V 4       F  '       d   K   RM	  RM! R V 4       4      '       d*   \        V^,          4      R R\        V^,          4      R 2# V# )z+Format MM-DD or date-like strings as MM/DD.rh  c              3   ó@   "  € T F  qP                  4       x € K  	  R # 5ir=   ©Úisdigit©r½  r{  s   & r-   r¿  Ú_format_mmdd.<locals>.<genexpr>�  ó   é € Ð:±E¨qŸy™yŸ{˜{³Eùó   ‚FTÚ02drþ   c              3   ó@   "  € T F  qP                  4       x € K  	  R # 5ir=   r$  r&  s   & r-   r¿  r'  Ÿ  r(  r)  )rL   rz   r  rp   ÚallrV   )r:   r  r�   s   &  r-   Ú_format_mmddr-  —  sÒ   € çØˆÜˆE‹
×ÑÓ€AØ�G‰G�C‹L€EÜ
ˆ5ƒz�Q„Ÿ3›3Ñ:±EÓ:Ÿ3Ÿ3š3Ñ:±EÓ:×:Ò:Ü�e˜A•h“- Ð$ A¤c¨%°­(£m°CÐ%8Ð9Ð9Ü
ˆ5ƒz�Q„Ÿ3›3Ñ:±EÓ:Ÿ3Ÿ3š3Ñ:±EÓ:×:Ò:Ü�e˜A•h“- Ð$ A¤c¨%°­(£m°CÐ%8Ð9Ð9Ø€Hr,   c                 ó  € \        V R 4      pV'       d   V# \        V 4      ;'       g    / pVP                  R4      ;'       g    \        p\	        V 4      w  rEp \        RV R24      p \        RV RV 24      pVP                  R4      ;'       g    / p	VP                  R4      ;'       g    / p
RTRV	P                  R4      ;'       g    VP                  R4      R	VP                  R	4      R
\        V
P                  R4      4      R\        V
P                  R4      4      RVP                  R4      RVP                  R4      RRVRV//p\        V R V^4       V#   \        P                  P                  \        P                  P                  \        P                  \        3 d    / p ELEi ; i  \        P                  P                  \        P                  P                  \        P                  \        3 d    / p EL‰i ; i)zzone_info:v2r   zhttps://phzmapi.org/z.jsonz'https://api.cropgraph.com/api/zone?lat=ú&lng=ÚzoneÚ
frostDatesrq   Útemperature_rangeÚlast_spring_frostÚ
lastSpringÚfirst_fall_frostÚ	firstFallÚseason_daysÚ
seasonDaysÚclimate_typeÚclimateTypeÚcoordinatesr  r  )rç   r¼   rX   r   r!  rá   r×   rk  rl  rm  rÚ   r-  rn  r-  rí   )r]   ro  r  r   r  r  r©   ÚphzmÚ	cropgraphr0  ÚfrostÚresults   &           r-   Ú_get_zone_infor@  ¤  sÄ  € Ü˜˜nÓ-€FßØˆÜ˜TÓ"×(Ð( b€HØ�|‰|˜JÓ'×5Ð5¬:€HÜ˜dÓ#�K€CˆaðÜÐ!5°h°Z¸uÐEÓFˆðÜ#Ø5°c°U¸%À¸uÐEó
ˆ	ð
 �=‰=˜Ó ×&Ð& B€DØ�M‰M˜,Ó'×-Ð-¨2€EàˆxØ�—‘˜Ó ×4Ð4 D§H¡H¨VÓ$4Ø˜TŸX™XÐ&9Ó:Øœ\¨%¯)©)°LÓ*AÓBØœL¨¯©°;Ó)?Ó@Ø�y—}‘} \Ó2Ø˜	Ÿ™ mÓ4Ø˜˜s E¨3Ð/ð	€Fô ˆt�^ V¨RÔ0Ø€Møô+ �L‰L×!Ñ!¤6§<¡<×#9Ñ#9¼4×;OÑ;OÔQXÐYô Ø‹ðûô �L‰L×!Ñ!¤6§<¡<×#9Ñ#9¼4×;OÑ;OÔQXÐYô Ø‹	ðús&   ÁE Á*F2 ÅAF/Æ.F/Æ2AHÈHc            
      ó,  € \         p \        pR V  RV R2p \        V4      pVP                  R4      ;'       g    / pVP                  R4      ;'       g    / pRVP                  R4      RVP                  R4      R	VP                  R
4      ;'       g    R.^ ,          RVP                  R4      ;'       g    R.^ ,          /#   \        P
                  P                  \        P
                  P                  \        P                  \        3 d     R# i ; i)z0https://api.open-meteo.com/v1/forecast?latitude=z&longitude=z’&current=temperature_2m,relative_humidity_2m&daily=temperature_2m_max,temperature_2m_min&temperature_unit=fahrenheit&timezone=auto&forecast_days=2ÚcurrentÚdailyÚtemp_fÚtemperature_2mÚhumidityÚrelative_humidity_2mÚ	today_maxÚtemperature_2m_maxNÚ	today_minÚtemperature_2m_min)r   r   rá   rX   r×   rk  rl  rm  rÚ   r-  rn  )r  r  rÞ   r8  rB  rC  s         r-   Ú_get_weatherrL  Å  s  € Ü
€CÜ
€Cð	Ø�5˜ C 5ð ))ð	)ð ðÜ˜sÓ#ˆØ—(‘(˜9Ó%×+Ð+¨ˆØ—‘˜Ó!×'Ð' Rˆà�g—k‘kÐ"2Ó3Ø˜Ÿ™Ð$:Ó;Ø˜%Ÿ)™)Ð$8Ó9×CÐC¸d¸VÀQÕGØ˜%Ÿ)™)Ð$8Ó9×CÐC¸d¸VÀQÕGð	
ð 	
øô �L‰L×!Ñ!¤6§<¡<×#9Ñ#9¼4×;OÑ;OÔQXÐYô Úðús)   —"C ºC Á=C Â"C Â6C ÃADÄDc                 ó–   € \        V P                  R 4      ;'       g    ^4      p\        P                  ! 4       \	        VR7      ,           # )Úinterval_days©rœ   )rV   rX   r   rå   r   )ÚscheduleÚintervals   & r-   Ú_advance_schedule_next_duerR  Ü  s4   € Ü�8—<‘< Ó0×6Ð6°BÓ7€HÜ�?Š?Óœy¨hÔ7Õ7Ð7r,   c                 óœ   € V P                  R 4      ;'       g    V P                  RR4      pV'       d	   V RV R2# V'       d	   V RV R2# V# )r	  Ú	task_typeÚTaskú (Ú)rc  )rP  Ú
plant_nameÚ	tank_namer	  s   &&& r-   Ú_schedule_labelrZ  á  sT   € Ø�L‰L˜Ó!×FÐF X§\¡\°+¸vÓ%F€EßØ�˜˜:˜, aÐ(Ð(ßØ�˜˜9˜+ QÐ'Ð'Ø€Lr,   c                  ód	  € \        4       p  \        V 4       \        V 4      ;'       g    / pVP                  R ^4      '       g    V P	                  4        R# \        VP                  R4      ;'       g    ^4      p\        P                  ! 4       p\        P                  ! \        P                  ! 4       \        P                  P                  4       4      pV P                  4       ;_uu_ 4       pVP                  RV34       VP                  4       pV Fè  p\!        VR,          4      pVP                  RV34       VP#                  4       p	V	'       d
   V	R,          MRp
V
'       d	   W¤8¼  d   K[  VP                  RVR,          V34       VP#                  4       '       d   KŽ  \%        WwP                  R4      VP                  R	4      4      pR
V R2p\'        V4      w  rÞV'       g   KÕ  VP                  RWƒ34       Kê  	  VP                  RV34       VP                  4        FÑ  pRVR,           2pVP                  RV34       VP#                  4       p	V	'       d
   V	R,          MRp
V
'       d	   W¤8¼  d   KU  RVR,           VP                  R4      '       d   RVR,          ,           R,           MR RVR,           RVR,           R2p\'        V4      w  ppV'       g   K¾  VP                  RWƒ34       KÓ  	  VP                  R4       VP                  4       pV EF  pVP                  RVR,          34       VP#                  4       p\        VP                  R4      ;'       g    ^4      pRpV'       g   R pMVR!,          \)        VR"7      ,           pVV8*  pV'       g   Kˆ  \!        VR,          4      pVP                  R#V34       VP#                  4       p	V	'       d
   V	R,          MRp
V
'       d	   W¤8¼  d   Kà  R$VR%,           R&2p\'        V4      w  ppV'       g   EK  VP                  R'VV34       EK  	  RRR4       V P+                  4        V P	                  4        R#   + '       g   i     L2; i  \,         d    \.        P1                  R(4        LGi ; i  T P	                  4        i ; i))Únotifications_enabledNr  a.  
                SELECT s.*, p.name AS plant_name, t.name AS tank_name
                FROM GardenSchedule s
                LEFT JOIN GardenPlant p ON p.id = s.plant_id
                LEFT JOIN GardenTank t ON t.id = s.tank_id
                WHERE s.enabled = 1 AND s.next_due <= %s
                rn   z·
                    SELECT last_notified_at FROM alert_state
                    WHERE source_type = 'garden_schedule' AND source_id = %s AND metric = 'reminder'
                    Úlast_notified_atz«
                    SELECT id FROM GardenTaskCompletion
                    WHERE schedule_id = %s AND completed_at >= %s
                    LIMIT 1
                    rX  rY  zGarden Tracker: z is dueaF  
                        INSERT INTO alert_state (source_type, source_id, metric, last_state, last_notified_at)
                        VALUES ('garden_schedule', %s, 'reminder', 'due', %s)
                        ON DUPLICATE KEY UPDATE last_state = 'due', last_notified_at = VALUES(last_notified_at)
                        zŠ
                SELECT s.* FROM GardenSeedInventory s
                WHERE s.qty <= COALESCE(s.low_stock_threshold, %s)
                Úseed_z´
                    SELECT last_notified_at FROM alert_state
                    WHERE source_type = 'garden_seed' AND source_id = %s AND metric = 'low_stock'
                    u#   Garden Tracker: Low seed stock â€” r€   rw   rV  rW  rI   z: r  rg  Úunitz
 remainingaC  
                        INSERT INTO alert_state (source_type, source_id, metric, last_state, last_notified_at)
                        VALUES ('garden_seed', %s, 'low_stock', 'low', %s)
                        ON DUPLICATE KEY UPDATE last_state = 'low', last_notified_at = VALUES(last_notified_at)
                        zSELECT * FROM GardenTankúœ
                    SELECT recorded_at FROM GardenTankReading
                    WHERE tank_id = %s ORDER BY recorded_at DESC LIMIT 1
                    Útest_interval_daysFTÚrecorded_atrO  z·
                    SELECT last_notified_at FROM alert_state
                    WHERE source_type = 'garden_tank' AND source_id = %s AND metric = 'test_overdue'
                    zGarden Tracker: Tank 'ra   z' needs testing (pH/EC)aF  
                        INSERT INTO alert_state (source_type, source_id, metric, last_state, last_notified_at)
                        VALUES ('garden_tank', %s, 'test_overdue', 'due', %s)
                        ON DUPLICATE KEY UPDATE last_state = 'due', last_notified_at = VALUES(last_notified_at)
                        zGarden reminder check failed)r.   rd   r¼   rX   r  rV   r   rå   Úcombiner   Útodayr›   ÚtimerS   rT   ro   rL   rW   rZ  r   r   r[   r	  rÍ  r
  )r]   r  Úlow_thresholdrÄ   Útoday_startr^   Údue_schedulesÚschedÚsidÚ	alert_rowÚlast_notifiedrs   ÚmsgÚokÚerrr$   r©   ÚtanksÚtankÚlast_readingrQ  ÚoverdueÚdue_byÚtids                           r-   Ú_check_remindersrv  ê  s%  € Ü‹8€DðOÜ˜TÔ"Ü  Ó&×,Ð,¨"ˆØ�|‰|Ð3°Q×7Ò7ØðV 	�
‰
ŽôU ˜HŸL™LÐ)=Ó>×CÐCÀ!ÓDˆÜ�oŠoÓˆÜ×&Ò&¤t§z¢z£|´X·\±\×5FÑ5FÓ5HÓIˆà�[‰[�]Œ]˜cØ�K‰Kðð �ô	ð  ŸL™L›NˆMã&�Ü˜% �+Ó&�Ø—‘ðð �Fôð  ŸL™L›N�	ßAJ 	Ð*<Ö =ÐPT�ß  ]Ô%AÙØ—‘ðð
 ˜4•[ +Ð.ôð —<‘<—>’>ÙÜ'ØŸ9™9 \Ó2°E·I±I¸kÓ4Jó�ð )¨¨¨wÐ7�Ü1°#Ó6‘�ß‘2Ø—K‘Kðð
 ˜
öñ; 'ðL �K‰Kðð Ð ôð Ÿ™ž�Ø˜d 4�j˜\Ð*�Ø—‘ðð �Fôð  ŸL™L›N�	ßAJ 	Ð*<Ö =ÐPT�ß  ]Ô%AÙà9¸$¸{Õ:KÐ9LØ9=¿¹À)×9LÒ9L˜˜t I�Õ.°Ö4ÐRTÐUÐUWØ˜E•{�m 1 T¨&¥\ N°*ð>ð ô
 0°Ó4‘��Aß‘2Ø—K‘Kðð
 ˜
öñ) 'ð: �K‰KÐ2Ô3Ø—L‘L“NˆEÜ�Ø—‘ðð ˜$•Z�Môð  #Ÿ|™|›~�Ü˜tŸx™xÐ(<Ó=×BÐBÀÓC�Ø�ß#Ø"‘Gà)¨-Õ8¼9È(Ô;SÕS�FØ$¨™m�GßÙÜ˜$˜t�*“o�Ø—‘ðð �Fôð  ŸL™L›N�	ßAJ 	Ð*<Ö =ÐPT�ß  ]Ô%AÙØ.¨t°F­|¨nÐ<SÐT�Ü/°Ó4‘��Aß’2Ø—K‘Kðð
 ˜c˜
÷ñC ÷s ðD 	�‰Œð 	�
‰
Ž÷M �]ûôF ô 9Ü×ÑÐ7Ö8ð9ûð 	�
‰
�ús�   Œ7Q7 ÁQ7 Á4A:Q7 Ã.A8Q$Å'8Q$Æ AQ$Ç)BQ$É0(Q$ÊAQ$Ë!BQ$Í&Q$Í7)Q$Î!AQ$Ï3(Q$Ð!Q$Ð:Q7 Ñ$Q4	Ñ/Q7 Ñ7 RÒR ÒRÒR ÒR/c                  ó¢   € \        ^<\        ^<,          4      p \        P                  ! ^
4        \	        4        \        P                  ! V 4       K#  )é<   )r�   r   re  Úsleeprv  )Úinterval_secss    r-   Ú_reminder_loopr{  ~	  s4   € Ü˜Ô9¸BÕ>Ó?€MÜ‡J‚Jˆr„NØ
ÜÔÜ�
Š
�=Ö!r,   c                  óè   € \         ;_uu_ 4        \        '       d    R R R 4       R # \        P                  ! \        RRR7      p V P                  4        RsR R R 4       R #   + '       g   i     R # ; i)NTzgarden-remindersr  )Ú_reminder_lockÚ_reminder_thread_startedr  r  r{  rj   )r¦  s    r-   Ústart_reminder_threadr  †	  sI   € ç	Žß#Ó#Ø÷ 
‰ô ×Ò¤N¸4ÐFXÔYˆØ	�‰Œ	Ø#'Ð ÷ 
��Šús   �A §/A Á A1	c                  ó   € \        4        R # r=   )r  r(   r,   r-   Ú_ensure_reminder_threadr�  �	  s   € äÖr,   z/api/healthc            	      ó¨  €  \        4       p  \        T 4       \        R RRR/4      T P                  4        #   \        P                   d%   p\        R RR\	        T4      /4      R3u Rp?# Rp?ii ; i  \        P                   d5   p\        R RR\	        T4      /4      R3u Rp?T P                  4        # Rp?ii ; i  T P                  4        i ; i)rn  Frk  rŠ  NTÚservicer   )r.   r)   ÚErrorr   rL   rd   r  )r]   Úexcs     r-   Úhealthr†  ˜	  s±   € ð>Ü‹xˆðÜ˜TÔ"Ü˜˜d I¨Ð?Ó@ð 	�
‰
�øô �=‰=ô >Ü˜˜e W¬c°#«hÐ7Ó8¸#Ð=Õ=ûð>ûô
 �=‰=ô >Ü˜˜e W¬c°#«hÐ7Ó8¸#Ð=Ô=à�
‰
�ûð>ûð 	�
‰
�úsJ   ‚
7 �A3 ·A0ÁA+Á%A0Á+A0Á3B<ÂB7Â!B<Â"B? Â7B<Â<B? Â?Cz/api/settingsÚGET)Úmethodsc            
      óº   € \        4       p  \        V 4       \        R RR\        \	        V 4      4      /4      V P                  4        #   T P                  4        i ; i)rn  Tr  )r.   rd   r   rB   r¼   r  ©r]   s    r-   Úget_settingsr‹  §	  sD   € ä‹8€DðÜ˜TÔ"Ü˜˜d J´¼}ÈTÓ?RÓ0SÐTÓUà�
‰
�øˆ�
‰
�ús   Œ+A ÁAÚPUTc                  óô  € \         P                  ! R R R7      ;'       g    / p \        4       p \        V4       VP	                  4       ;_uu_ 4       pVP                  RV P                  R4      V P                  R4      V P                  R4      V P                  R4      V P                  R4      34       RRR4       VP                  4        VP	                  4       ;_uu_ 4       pVP                  R	4       RRR4       VP                  4        \        R
R R\        \        V4      4      /4      VP                  4        #   + '       g   i     L“; i  + '       g   i     Ld; i  TP                  4        i ; i)Tr3  a„  
                UPDATE GardenSettings SET
                    zip_code = COALESCE(%s, zip_code),
                    lat = COALESCE(%s, lat),
                    lng = COALESCE(%s, lng),
                    notifications_enabled = COALESCE(%s, notifications_enabled),
                    low_seed_threshold = COALESCE(%s, low_seed_threshold)
                WHERE id = 1
                r   r  r  r\  r  NzPDELETE FROM GardenExternalCache WHERE cache_key IN ('zone_info', 'zone_info:v2')rn  r  )r	   r6  r.   rd   rS   rT   rX   r[   r   rB   r¼   r  )r8  r]   r^   s      r-   Úupdate_settingsrŽ  ±	  s  € ä×Ò $¨tÔ4×:Ð:¸€DÜ‹8€DðÜ˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰Kðð —H‘H˜ZÓ(Ø—H‘H˜U“OØ—H‘H˜U“OØ—H‘HÐ4Ó5Ø—H‘HÐ1Ó2ðô÷ ð& 	�‰ŒØ�[‰[�]Œ]˜cØ�K‰KØbô÷ ð 	�‰ŒÜ˜˜d J´¼}ÈTÓ?RÓ0SÐTÓUà�
‰
�÷7 �]ú÷( �]ûð 	�
‰
�ús<   ®#E% ÁA#D?Â40E% Ã$EÃ68E% Ä?E	Å
E% ÅE"	ÅE% Å%E7z/api/settings/backup/fullc            	      óŠ  € \        4       p  \        V 4       \        V 4      pR \        P                  ! 4       P                  R4       R2p\        VRRRV R2/R7      V P                  4        #   \         d5   p\        RR	R
\        T4      /4      R3u Rp?T P                  4        # Rp?ii ; i  T P                  4        i ; i)Úgarden_tracker_backup_z%Y%m%d_%H%M%Sz.sqlzapplication/sqlzContent-Dispositionzattachment; filename="rŒ  ©ÚmimetyperÔ   rn  Frk  rŠ  N)r.   rd   rÐ   r   rÄ   Ústrftimer   r  r	  r   rL   )r]   Údump_sqlÚfilenamer…  s       r-   Úsettings_backup_fullr–  Õ	  s°   € ä‹8€DðÜ˜TÔ"Ü*¨4Ó0ˆØ+¬H¯LªL«N×,CÑ,CÀOÓ,TÐ+UÐUYÐZˆÜØØ&Ø*Ð.DÀXÀJÈaÐ,PÐQô
ð 	�
‰
�øô ô >Ü˜˜e W¬c°#«hÐ7Ó8¸#Ð=Ô=à�
‰
�ûð>ûð 	�
‰
�ús0   ŒAA. Á.B-Á9B(ÂB-ÂB0 Â(B-Â-B0 Â0Cz/api/seed-companiesc                  ó¾   € \        4       p  \        V 4       \        \        V 4      4      p\	        R RRV/4      V P                  4        #   T P                  4        i ; i)rn  TrÙ  )r.   rd   rF   rí  r   r  )r]   rÙ  s     r-   Úlist_seed_companiesr˜  ç	  sJ   € ä‹8€DðÜ˜TÔ"Ü#Ô$7¸Ó$=Ó>ˆ	Ü˜˜d K°Ð;Ó<à�
‰
�øˆ�
‰
�ús   Œ-A
 Á
Ar=  c                  óÞ  € \         P                  ! R R R7      ;'       g    / p V P                  R4      ;'       g    RP                  4       pV P                  R4      ;'       g    RP                  4       P	                  R4      pV'       d	   V'       g   \        RRRR	/4      R
3# VP                  R4      '       g
   RV,           p\        4       p \        V4       VP                  4       ;_uu_ 4       pTP                  RTTV P                  R4      V P                  RR 4      '       d   ^M^ \        V P                  R4      ;'       g    ^ 4      34       VP                  pVP                  RV34       VP                  4       pRRR4       VP                  4        \        RR R\        X4      /4      ^É3VP!                  4        #   + '       g   i     LJ; i  TP!                  4        i ; i)Tr3  ra   rI   rb   rþ   rn  Frk  zname and base_url requiredé�  rô  r÷   zº
                INSERT INTO GardenSeedCompany
                    (name, base_url, search_url_template, enabled, sort_order)
                VALUES (%s, %s, %s, %s, %s)
                r‡  ÚenabledÚ
sort_orderú-SELECT * FROM GardenSeedCompany WHERE id = %sNrù  )r	   r6  rX   rz   r?  r   rù   r.   rd   rS   rT   rV   Ú	lastrowidrW   r[   rB   r  )r8  ra   rb   r]   r^   Ú
company_idrù  s          r-   Úcreate_seed_companyr   ò	  sˆ  € ä×Ò $¨tÔ4×:Ð:¸€DØ�H‰H�VÓ×"Ð" ×)Ñ)Ó+€DØ—‘˜Ó$×*Ð*¨×1Ñ1Ó3×:Ñ:¸3Ó?€Hß—xÜ˜˜e WÐ.JÐKÓLÈcÐQÐQØ×Ñ˜v×&Ò&Ø Õ(ˆÜ‹8€DðÜ˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰Kðð ØØ—H‘HÐ2Ó3ØŸ™ )¨T×2Ò2‘A¸Ü˜Ÿ™ Ó.×3Ð3°!Ó4ðôð Ÿ™ˆJØ�K‰KÐGÈ*ÈÔWØ—l‘l“nˆG÷# ð$ 	�‰ŒÜ˜˜d I¬~¸gÓ/FÐGÓHÈ#ÐMà�
‰
�÷+ �]ûð* 	�
‰
�ús+   Ã#G Ã3AGÅ
;GÆ1G ÇG	ÇG ÇG,z$/api/seed-companies/<int:company_id>c                 óæ  € \         P                  ! R R R7      ;'       g    / p\        4       p \        V4       VP	                  4       ;_uu_ 4       pVP                  RV 34       VP                  4       '       g,   \        RRRR/4      R3uuRRR4       VP                  4        # VP                  R	4      p\        V\        4      '       dH   VP                  4       P                  R
4      pV'       d!   VP                  R4      '       g
   RV,           pVP                  RVP                  R4      VVP                  R4      VP                  R4      VP                  R4      V 34       VP                  RV 34       VP                  4       pRRR4       VP                  4        \        RR R\!        X4      /4      VP                  4        #   + '       g   i     LH; i  TP                  4        i ; i)Tr3  z.SELECT id FROM GardenSeedCompany WHERE id = %srn  Frk  ú	Not foundé”  Nrb   rþ   rô  r÷   a~  
                UPDATE GardenSeedCompany SET
                    name = COALESCE(%s, name),
                    base_url = COALESCE(%s, base_url),
                    search_url_template = COALESCE(%s, search_url_template),
                    enabled = COALESCE(%s, enabled),
                    sort_order = COALESCE(%s, sort_order)
                WHERE id = %s
                ra   r‡  r›  rœ  r�  rù  )r	   r6  r.   rd   rS   rT   rW   r   r  rX   r4   rL   rz   r?  rù   r[   rB   )rŸ  r8  r]   r^   rb   rù  s   &     r-   Úupdate_seed_companyr¤  
  s…  € ä×Ò $¨tÔ4×:Ð:¸€DÜ‹8€Dð#Ü˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KÐHÈ:È-ÔXØ—<‘<—>’>Ü  e¨W°kÐBÓCÀSÐH÷ ‰]ðB 	�
‰
�ð; —x‘x 
Ó+ˆHÜ˜(¤C×(Ò(Ø#Ÿ>™>Ó+×2Ñ2°3Ó7�ß H×$7Ñ$7¸×$?Ò$?Ø)¨HÕ4�HØ�K‰Kðð —H‘H˜VÓ$ØØ—H‘HÐ2Ó3Ø—H‘H˜YÓ'Ø—H‘H˜\Ó*Øðôð& �K‰KÐGÈ*ÈÔWØ—l‘l“nˆG÷; ð< 	�‰ŒÜ˜˜d I¬~¸gÓ/FÐGÓHà�
‰
�÷C �]ûðB 	�
‰
�ús=   ®#G Á:GÂ
G Â&AGÃ4GÄB GÆ/G ÇG	ÇG ÇG0ÚDELETEc                 óº  € \        4       p \        V4       VP                  4       ;_uu_ 4       pVP                  R V 34       VP                  ^ 8X  d,   \        RRRR/4      R3uuRRR4       VP                  4        #  RRR4       VP                  4        \        RR/4      VP                  4        #   + '       g   i     L=; i  TP                  4        i ; i)z+DELETE FROM GardenSeedCompany WHERE id = %srn  Frk  r¢  r£  NT©r.   rd   rS   rT   Úrowcountr   r  r[   )rŸ  r]   r^   s   &  r-   Údelete_seed_companyr©  @
  s¦   € ä‹8€Dð	Ü˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KÐEÈ
À}ÔUØ�|‰|˜qÔ Ü  e¨W°kÐBÓCÀSÐH÷ ‰]ð 	�
‰
�ð !÷ ð 	�‰ŒÜ˜˜d�|Ó$à�
‰
�÷ �]ûð 	�
‰
�úó(   Œ#C ¯5B5Á$
C Â $C Â5C	Ã C ÃCz/api/plantsc                  óô  € \         P                  P                  R 4      p \        4       p \	        V4       VP                  4       ;_uu_ 4       pV '       d    VP                  \        R,           V 34       MVP                  \        R,           4       VP                  4       pRRR4       \        RRR\        X4      /4      VP                  4        #   + '       g   i     L8; i  TP                  4        i ; i)Ústatusz$ WHERE p.status = %s ORDER BY p.namez ORDER BY p.nameNrn  TÚplants)r	   r7  rX   r.   rd   rS   rT   Ú_PLANT_SELECTro   r   r“   r  )r¬  r]   r^   rD   s       r-   Úlist_plantsr¯  R
  s®   € ä�\‰\×Ñ˜hÓ'€FÜ‹8€DðÜ˜TÔ"Ø�[‰[�]Œ]˜cßØ—‘Ü!Ð$JÕJØ�Iõð
 —‘œMÐ,>Õ>Ô?Ø—<‘<“>ˆD÷ ô ˜˜d HÔ.?ÀÓ.EÐFÓGà�
‰
�÷ �]ûð 	�
‰
�ús$   «#C% ÁACÂ"C% ÃC"	ÃC% Ã%C7z/api/plants/by-label/<label_id>c                 ó€  € \        4       p \        V4       VP                  4       ;_uu_ 4       pVP                  \        R ,           V P                  4       P                  4       34       VP                  4       pV'       g,   \        RRRR/4      R3uuRRR4       VP                  4        # VR,          pVP                  RV34       \        W$W2P                  4       4      pRRR4       \        RR	R
\        XVR	R7      RX/4      VP                  4        #   + '       g   i     L=; i  TP                  4        i ; i)z WHERE p.label_id = %srn  Frk  r¢  r£  Nrn   úTSELECT * FROM GardenPlantEvent WHERE plant_id = %s ORDER BY event_date DESC, id DESCTrŸ   r’   r¬   )r.   rd   rS   rT   r®  rz   ÚupperrW   r   r  r®   ro   r‹   )Úlabel_idr]   r^   rŸ   rž   r¬   s   &     r-   Úget_plant_by_labelr´  f
  sù   € ä‹8€DðÜ˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KœÐ(@Õ@À8Ç>Á>ÓCS×CYÑCYÓC[ÐB]Ô^Ø—L‘L“NˆEßÜ  e¨W°kÐBÓCÀSÐH÷	 ‰]ð 	�
‰
�ð ˜T•{ˆHØ�K‰KØfØ�ôô $ C°5¿,¹,».ÓIˆF÷ ô ˜˜d GÔ-=¸eÈ$ÐfjÔ-kÐmuÐw}Ð~Óà�
‰
�÷ �]ûð 	�
‰
�ús/   Œ#D+ ¯A#DÂ
D+ Â-6DÃ#$D+ ÄD(	Ä#D+ Ä+D=z/api/plants/<int:plant_id>c                 ó–  € \        4       p \        V4       VP                  4       ;_uu_ 4       pVP                  \        R ,           V 34       VP                  4       pV'       g,   \        RRRR/4      R3uuRRR4       VP                  4        # VP                  RV 34       VP                  4       pVP                  RV 34       VP                  4       p\        W W44      pRRR4       \        RR	R
\        XVR	R7      RXR\        X4      /4      VP                  4        #   + '       g   i     LH; i  TP                  4        i ; i)ú WHERE p.id = %srn  Frk  r¢  r£  Nr±  zBSELECT * FROM GardenSchedule WHERE plant_id = %s ORDER BY next_dueTrŸ   r’   r¬   Ú	schedules)r.   rd   rS   rT   r®  rW   r   r  ro   r®   r‹   rF   )rž   r]   r^   rŸ   r¬   r·  s   &     r-   Ú	get_plantr¸  {
  s  € ä‹8€DðÜ˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KœÐ(:Õ:¸X¸KÔHØ—L‘L“NˆEßÜ  e¨W°kÐBÓCÀSÐH÷	 ‰]ð2 	�
‰
�ð) �K‰KØfØ�ôð —\‘\“^ˆFØ�K‰KØTØ�ôð Ÿ™›ˆIÜ# C°5ÓAˆF÷ ô  à�dØÔ)¨%°dÐRVÔWØ˜&Øœ_¨YÓ7ð	ó
ð 	�
‰
�÷3 �]ûð2 	�
‰
�ús0   Œ#D6 ¯AD#Á6
D6 ÂAD#Ã#/D6 Ä#D3	Ä.D6 Ä6Ec                  ó–	  € \         P                  ! R R R7      ;'       g    / p V P                  R4      ;'       g    RP                  4       pV\        9  d   \        RRRR/4      R3# V P                  R	4      ;'       g    R
pV\        9  d   \        RRRR/4      R3#  \        V P                  R4      ;'       g    ^4      pT^8  g   TR8”  d   \        RRRR/4      R3# T P                  R4      pT P                  R4      ;'       g    RP                  4       pT P                  R4      ;'       g    RP                  4       ;'       g    Rp\        T P                  R4      4      ;'       g    \        P                  ! 4       p\        4       p \        T4       TP                  4       ;_uu_ 4       p	Rp
TR8X  dÀ   T'       g,   \        RRRR/4      R3uuRRR4       TP!                  4        # T	P#                  RT34       T	P%                  4       p
T
'       g,   \        RRRR/4      R3uuRRR4       TP!                  4        # T'       g
   T
R,          pTf!   T
P                  R4      '       d
   T
R,          pM3T'       g,   \        RRRR/4      R3uuRRR4       TP!                  4        # TR8X  d   RMRpRpTR8X  d   \'        T
4      pM(T P                  R4      '       d   T P                  R4      p. p\)        Y“4      pT F‰  pT	P#                  R TTTT P                  R!4      TTT P                  R"4      T P                  R4      TR8X  d   TMRT3
4       T	P*                  pTP-                  T4       T	P#                  R#TY·T^ R$34       K‹  	  TR8X  d,   T P                  R%R 4      '       d   T	P#                  R&Y434       . pT FU  pT	P#                  \.        R',           T34       T	P%                  4       pT'       g   K;  TP-                  \1        T4      4       KW  	  RRR4       TP3                  4        \        RR R(\5        X4      R)T'       d
   T^ ,          MRR*T/4      ^É3TP!                  4        #   \        \        3 d    \        RRRR/4      R3u # i ; i  + '       g   i     L‡; i  TP!                  4        i ; i)+Tr3  r„   r%   rn  Frk  zinvalid source_typerš  r¬  Úactiveúinvalid statusÚquantityzinvalid quantityrŠ  z"quantity must be between 1 and 500r…   ra   rI   rw   Nr—   r$   z(seed_id required for seed-sourced plantsú/SELECT * FROM GardenSeedInventory WHERE id = %szSeed not foundr£  r€   z%name required for store-bought plantsr™   r¶   r`  a  
                    INSERT INTO GardenPlant (label_id, name, variety, location, status, planted_date,
                        moisture_device_id, notes, seed_id, source_type)
                    VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
                    r¸   Úmoisture_device_idz÷
                    INSERT INTO GardenPlantEvent (
                        plant_id, event_type, event_date, notes, days_since_start, days_since_anchor
                    )
                    VALUES (%s, %s, %s, %s, %s, %s)
                    rš   Údecrement_seedzHUPDATE GardenSeedInventory SET qty = GREATEST(0, qty - %s) WHERE id = %sr¶  ri   rŸ   r­  )r	   r6  rX   rz   ÚPLANT_SOURCE_TYPESr   ÚPLANT_STATUSESrV   r³   rM   rN   r   rd  r.   rd   rS   r  rT   rW   rˆ   rl   rž  rŽ   r®  r‹   r[   rp   )r8  r„   r¬  r¼  r…   ra   rw   r—   r]   r^   r$   r·   Úevent_notesÚcreated_idsÚ	label_idsr³  rž   r­  r?   s                      r-   Úcreate_plantrÅ  œ
  sd  € ä×Ò $¨tÔ4×:Ð:¸€DØ—8‘8˜MÓ*×<Ð<¨n×CÑCÓE€KØÔ,Ô,Ü˜˜e WÐ.CÐDÓEÀsÐJÐJØ�X‰X�hÓ×+Ð+ 8€FØ”^Ô#Ü˜˜e WÐ.>Ð?Ó@À#ÐEÐEðHÜ�t—x‘x 
Ó+×0Ð0¨qÓ1ˆð �!„|�x #”~Ü˜˜e WÐ.RÐSÓTÐVYÐYÐYØ�h‰h�yÓ!€GØ�H‰H�VÓ×"Ð" ×)Ñ)Ó+€DØ�x‰x˜	Ó"×(Ð( b×/Ñ/Ó1×9Ð9°T€GÜ˜tŸx™x¨Ó7Ó8×HÐH¼D¿JºJ»L€LÜ‹8€DðQÜ˜TÔ"Ø�[‰[�]Œ]˜cØˆDØ˜fÔ$ßÜ" D¨%°Ð:dÐ#eÓfÐhkÐk÷	 ‰]ð^ 	�
‰
�ðU —‘ÐMÐPWÈzÔZØ—|‘|“~�ßÜ" D¨%°Ð:JÐ#KÓLÈcÐQ÷ ‰]ð^ 	�
‰
�÷M Ø Õ,�DØ’? t§x¡x°	×':Ò':Ø" 9�o�GøßÜ  e¨WÐ6]Ð^Ó_ÐadÐd÷ ‰]ð^ 	�
‰
�ð *5¸Ô)>™ÀNˆJØˆKØ˜fÔ$Ü1°$Ó7‘Ø—‘˜'×"Ò"Ø"Ÿh™h wÓ/�àˆKÜ1°#Ó@ˆIÛ%�Ø—‘ðð !ØØØŸ™ Ó,ØØ$ØŸ™Ð!5Ó6ØŸ™ Ó)Ø#.°&Ô#8™¸dØ#ðôð& Ÿ=™=�Ø×"Ñ" 8Ô,Ø—‘ðð ˜z¸ÀaÈÐTöñ- &ð@ ˜fÔ$¨¯©Ð2BÀD×)IÒ)IØ—‘Ø^ØÐ'ôð
 ˆFÛ'�Ø—‘œMÐ,>Õ>ÀÀÔLØ—l‘l“n�ß‘3Ø—M‘MÔ"2°3Ó"7Ö8ñ	 (÷A ðJ 	�‰ŒÜà�dØœ˜V›Ø§f˜ ž°$Ø˜&ð	ó
ð ðð 	�
‰
�øôu ”zÐ"ô HÜ˜˜e WÐ.@ÐAÓBÀCÐGÒGðHú÷ �]ûð^ 	�
‰
�ús“   Â Q; Â=Q; Æ#R6 Æ5R#ÇR#Ç
R6 Ç2*R#ÈR#È-
R6 ÉR#É#R#É4R#ÊR#Ê
R6 Ê16R#Ë(CR#Î4AR#ÐR#Ð$AR6 Ñ;"R ÒR Ò#R3	Ò.R6 Ò6Sc                 óZ  € \         P                  ! R R R7      ;'       g    / p\        4       p \        V4       VP	                  4       ;_uu_ 4       pVP                  RV 34       VP                  4       '       g,   \        RRRR/4      R3uuRRR4       VP                  4        # VP                  R	4      pVe7   V\        9  d,   \        RRRR
/4      R3uuRRR4       VP                  4        # TP                  RVP                  R4      VP                  R4      VP                  R4      TRV9   d   \        VP                  R4      4      MRVP                  R4      VP                  R4      VP                  R4      VP                  R4      V 3
4       VP                  \        R,           V 34       VP                  4       pRRR4       VP                  4        \        RR R\        X4      /4      VP                  4        #   + '       g   i     LH; i  TP                  4        i ; i)Tr3  z(SELECT id FROM GardenPlant WHERE id = %srn  Frk  r¢  r£  Nr¬  r»  rš  aP  
                UPDATE GardenPlant SET
                    name = COALESCE(%s, name),
                    variety = COALESCE(%s, variety),
                    location = COALESCE(%s, location),
                    status = COALESCE(%s, status),
                    planted_date = COALESCE(%s, planted_date),
                    moisture_device_id = COALESCE(%s, moisture_device_id),
                    notes = COALESCE(%s, notes),
                    seed_id = COALESCE(%s, seed_id),
                    source_type = COALESCE(%s, source_type)
                WHERE id = %s
                ra   rw   r¸   r—   r¾  r`  r…   r„   r¶  rŸ   )r	   r6  r.   rd   rS   rT   rW   r   r  rX   rÁ  rN   r®  r[   r‹   )rž   r8  r]   r^   r¬  rŸ   s   &     r-   Úupdate_plantrÇ    sÆ  € ä×Ò $¨tÔ4×:Ð:¸€DÜ‹8€Dð)Ü˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KÐBÀXÀKÔPØ—<‘<—>’>Ü  e¨W°kÐBÓCÀSÐH÷ ‰]ðN 	�
‰
�ðG —X‘X˜hÓ'ˆFØÒ! f´NÔ&BÜ  e¨WÐ6FÐGÓHÈ#ÐM÷ ‰]ðN 	�
‰
�ðA �K‰Kðð —H‘H˜VÓ$Ø—H‘H˜YÓ'Ø—H‘H˜ZÓ(ØØ=KÈtÔ=S”K §¡¨Ó 8Ô9ÐY]Ø—H‘HÐ1Ó2Ø—H‘H˜WÓ%Ø—H‘H˜YÓ'Ø—H‘H˜]Ó+Øðôð6 �K‰KœÐ(:Õ:¸X¸KÔHØ—L‘L“NˆE÷G ðH 	�‰ŒÜ˜˜d GÔ-=¸eÓ-DÐEÓFà�
‰
�÷O �]ûðN 	�
‰
�ús<   ®#H Á:HÂ
H Â&0HÃ
H Ã1CHÇ/H ÈH	ÈH ÈH*z$/api/plants/<int:plant_id>/duplicatec                 óŠ  € \        4       p \        V4       VP                  4       ;_uu_ 4       pVP                  \        R ,           V 34       VP                  4       pV'       g,   \        RRRR/4      R3uuRRR4       VP                  4        # \        V^4      ^ ,          pVP                  R4      ;'       g    RpVR	8X  d   R
MRpRpVR	8X  dU   VP                  R4      '       d>   VP                  RVR,          34       VP                  4       pV'       d   \        V4      pVP                  R4      ;'       g    \        P                  ! 4       p	\        V	\        4      '       d   V	P                  4       p	TP                  RTVR,          VP                  R4      VP                  R4      VP                  R4      ;'       g    RT	VP                  R4      VP                  R4      VR	8X  d   VP                  R4      MRV3
4       VP                  p
VP                  RW¦W—^ R34       VP                  \        R ,           V
34       VP                  4       pRRR4       VP!                  4        \        RRR\#        X4      /4      ^É3VP                  4        #   + '       g   i     LJ; i  TP                  4        i ; i)r¶  rn  Frk  r¢  r£  Nr„   r%   r$   r™   r¶   r…   r½  r—   zø
                INSERT INTO GardenPlant (label_id, name, variety, location, status, planted_date,
                    moisture_device_id, notes, seed_id, source_type)
                VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
                ra   rw   r¸   r¬  rº  r¾  r`  zã
                INSERT INTO GardenPlantEvent (
                    plant_id, event_type, event_date, notes, days_since_start, days_since_anchor
                )
                VALUES (%s, %s, %s, %s, %s, %s)
                rš   TrŸ   )r.   rd   rS   rT   r®  rW   r   r  rl   rX   rˆ   r   rd  r4   r   rž  r[   r‹   )rž   r]   r^   rŸ   r³  r„   r·   rÂ  r$   r—   Únew_idÚ	new_plants   &           r-   Úduplicate_plantrË  4  sG  € ä‹8€Dð8Ü˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KœÐ(:Õ:¸X¸KÔHØ—L‘L“NˆEßÜ  e¨W°kÐBÓCÀSÐH÷	 ‰]ðl 	�
‰
�ôa 1°°aÓ8¸Õ;ˆHØŸ)™) MÓ2×DÐD°nˆKØ)4¸Ô)>™ÀNˆJØˆKØ˜fÔ$¨¯©°9×)=Ò)=Ø—‘ÐMÐPUÐV_ÕP`ÐObÔcØ—|‘|“~�ßÜ"5°dÓ";�Kà Ÿ9™9 ^Ó4×DÐD¼¿
º
»ˆLÜ˜,¬×1Ò1Ø+×0Ñ0Ó2�à�K‰Kðð Ø˜&•MØ—I‘I˜iÓ(Ø—I‘I˜jÓ)Ø—I‘I˜hÓ'×3Ð3¨8Ø Ø—I‘IÐ2Ó3Ø—I‘I˜gÓ&Ø,7¸6Ô,A�E—I‘I˜iÔ(ÀtØðôð& —]‘]ˆFØ�K‰Kðð  \ÀÀ:ÐNôð �K‰KœÐ(:Õ:¸V¸IÔFØŸ™›ˆI÷e ðf 	�‰ŒÜ˜˜d GÔ-=¸iÓ-HÐIÓJÈCÐOà�
‰
�÷m �]ûðl 	�
‰
�úsO   Œ#J0 ¯AJÁ6
J0 Â*JÂ<-JÃ*1JÄ"JÄ?BJÇBJÉ1J0 ÊJ-	Ê(J0 Ê0Kc                 óº  € \        4       p \        V4       VP                  4       ;_uu_ 4       pVP                  R V 34       VP                  ^ 8X  d,   \        RRRR/4      R3uuRRR4       VP                  4        #  RRR4       VP                  4        \        RR/4      VP                  4        #   + '       g   i     L=; i  TP                  4        i ; i)z%DELETE FROM GardenPlant WHERE id = %srn  Frk  r¢  r£  NTr§  )rž   r]   r^   s   &  r-   Údelete_plantrÍ  r  s¦   € ä‹8€Dð	Ü˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KÐ?À(ÀÔMØ�|‰|˜qÔ Ü  e¨W°kÐBÓCÀSÐH÷ ‰]ð 	�
‰
�ð !÷ ð 	�‰ŒÜ˜˜d�|Ó$à�
‰
�÷ �]ûð 	�
‰
�úrª  z!/api/plants/<int:plant_id>/eventsc                 ó  € \        4       p \        V4       VP                  4       ;_uu_ 4       pVP                  \        R ,           V 34       VP                  4       pV'       g,   \        RRRR/4      R3uuRRR4       VP                  4        # VP                  RV 34       VP                  4       p\        W W44      pRRR4       \        RRR	X/4      VP                  4        #   + '       g   i     L/; i  TP                  4        i ; i)
r¶  rn  Frk  úPlant not foundr£  Nr±  Tr¬   )
r.   rd   rS   rT   r®  rW   r   r  ro   r®   )rž   r]   r^   rŸ   rD   s   &    r-   Úlist_plant_eventsrÐ  �  sÔ   € ä‹8€DðÜ˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KœÐ(:Õ:¸X¸KÔHØ—L‘L“NˆEßÜ  e¨WÐ6GÐHÓIÈ3ÐN÷	 ‰]ð 	�
‰
�ð �K‰KØfØ�ôð —<‘<“>ˆDÜ! #°Ó=ˆD÷ ô ˜˜d H¨dÐ3Ó4à�
‰
�÷ �]ûð 	�
‰
�ús/   Œ#C: ¯AC'Á6
C: Â/C'Ã C: Ã'C7	Ã2C: Ã:Dc                 ó¨  € \         P                  ! R R R7      ;'       g    / pVP                  R4      ;'       g    RpV\        9  d   \	        RRRR/4      R3# \        VP                  R	4      4      ;'       g    \        P                  ! 4       p\        4       p \        V4       VP                  4       ;_uu_ 4       pVP                  \        R
,           V 34       VP                  4       pV'       g,   \	        RRRR/4      R3uuRRR4       VP                  4        # \        VP                  R4      4      p\!        VP                  R4      4      p\#        WPWc4      w  ršVP                  RV VVVP                  R4      VP                  R4      VP                  R4      VVV	V
3
4       \%        WPW'4       VP&                  pVP                  RV34       VP                  4       p\)        WPWl4      pRRR4       VP+                  4        \	        RR RX/4      ^É3VP                  4        #   + '       g   i     LA; i  TP                  4        i ; i)Tr3  r·   Únotern  Frk  úinvalid event_typerš  r˜   r¶  rÏ  r£  Nr¸   Úheighta$  
                INSERT INTO GardenPlantEvent (
                    plant_id, event_type, event_date, notes, qty, unit, location, height,
                    days_since_start, days_since_anchor
                )
                VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
                r`  r  r_  ú,SELECT * FROM GardenPlantEvent WHERE id = %sr¨   )r	   r6  rX   ÚEVENT_TYPESr   rN   r   rd  r.   rd   rS   rT   r®  rW   r  r±   r´   r¤   r¹   rž  rª   r[   )rž   r8  r·   r˜   r]   r^   rŸ   r¸   rÔ  Ú
days_sincer¢   Úevent_idr¨   s   &            r-   Úcreate_plant_eventrÙ  –  sð  € ä×Ò $¨tÔ4×:Ð:¸€DØ—‘˜,Ó'×1Ð1¨6€JØœÔ$Ü˜˜e WÐ.BÐCÓDÀcÐIÐIÜ˜TŸX™X lÓ3Ó4×DÐD¼¿
º
»€JÜ‹8€Dð'Ü˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KœÐ(:Õ:¸X¸KÔHØ—L‘L“NˆEßÜ  e¨WÐ6GÐHÓIÈ3ÐN÷	 ‰]ðJ 	�
‰
�ôA +¨4¯8©8°JÓ+?Ó@ˆHÜ$ T§X¡X¨hÓ%7Ó8ˆFÜ!:¸3È%Ó!\ÑˆJØ�K‰Kðð ØØØ—H‘H˜WÓ%Ø—H‘H˜U“OØ—H‘H˜VÓ$ØØØØðôô* & c°ZÔJØ—}‘}ˆHØ�K‰KÐFÈÈÔTØ—L‘L“NˆEÜ! #°Ó>ˆE÷C ðD 	�‰ŒÜ˜˜d G¨UÐ3Ó4°cÐ9à�
‰
�÷K �]ûðJ 	�
‰
�ús2   Â#H? Â?AH,Ä
H? Ä!CH,Ç3(H? È,H<	È7H? È?Iz0/api/plants/<int:plant_id>/events/<int:event_id>c                 óÔ  € \         P                  ! R R R7      ;'       g    / p\        4       p \        V4       VP	                  4       ;_uu_ 4       pVP                  \        R,           V 34       VP                  4       pV'       g,   \        RRRR/4      R3uuRRR4       VP                  4        # VP                  R	W34       VP                  4       pV'       g,   \        RRRR
/4      R3uuRRR4       VP                  4        # VP                  RVR,          4      pV\        9  d,   \        RRRR/4      R3uuRRR4       VP                  4        # RV9   dO   \        VP                  R4      4      pV'       g,   \        RRRR/4      R3uuRRR4       VP                  4        # M\        VP                  R4      4      pRV9   d
   VR,          MVP                  R4      p	RV9   d
   VR,          MVP                  R4      p
RV9   d
   VR,          MVP                  R4      pRV9   dV   VP                  R4      eC    \        ^ \        VR,          4      4      pT;'       g    / P                  R4      R8X  d   RMRpM\%        W@WX4      w  rÍ\'        RV9   d
   VR,          MVP                  R4      4      pRV9   d   \)        VP                  R4      4      pMVP                  R4      pVP                  RVVV	V
VVVVVVV 34       \+        W@W~4       VP                  RV34       VP                  4       p\-        W@WV4      pRRR4       VP/                  4        \        RR RX/4      VP                  4        #   \         \"        3 d/    \        RRRR/4      R3u uuRRR4       TP                  4        # i ; i  + '       g   i     L�; i  TP                  4        i ; i)Tr3  r¶  rn  Frk  rÏ  r£  Nz>SELECT * FROM GardenPlantEvent WHERE id = %s AND plant_id = %sr¢  r·   rÓ  rš  r˜   zinvalid event_dater`  r  r_  r¦   zinvalid days_since_startr„   r$   r™   rš   r¸   rÔ  a®  
                UPDATE GardenPlantEvent SET
                    event_type = %s,
                    event_date = %s,
                    notes = %s,
                    qty = %s,
                    unit = %s,
                    location = %s,
                    height = %s,
                    days_since_start = %s,
                    days_since_anchor = %s
                WHERE id = %s AND plant_id = %s
                rÕ  r¨   )r	   r6  r.   rd   rS   rT   r®  rW   r   r  rX   rÖ  rN   r•   r�   rV   r³   rM   r¤   r±   r´   r¹   rª   r[   )rž   rØ  r8  r]   r^   rŸ   r¨   r·   r˜   r`  r  r_  r×  r¢   r¸   rÔ  s   &&              r-   Úupdate_plant_eventrÛ  È  s†  € ä×Ò $¨tÔ4×:Ð:¸€DÜ‹8€DðNÜ˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KœÐ(:Õ:¸X¸KÔHØ—L‘L“NˆEßÜ  e¨WÐ6GÐHÓIÈ3ÐN÷	 ‰]ðX 	�
‰
�ðO �K‰KØPØÐ$ôð —L‘L“NˆEßÜ  e¨W°kÐBÓCÀSÐH÷ ‰]ðX 	�
‰
�ð Ÿ™ ,°°lÕ0CÓDˆJØ¤Ô,Ü  e¨WÐ6JÐKÓLÈcÐQ÷ ‰]ðX 	�
‰
�ðy ˜tÔ#Ü(¨¯©°,Ó)?Ó@�
ß!Ü" D¨%°Ð:NÐ#OÓPÐRUÐU÷' ‰]ðX 	�
‰
�ðu "ô & e§i¡i°Ó&=Ó>�
à%,°¤_�D˜–M¸%¿)¹)ÀGÓ:LˆEØ!&¨$¤�$�u–+°E·I±I¸eÓ4DˆCØ#)¨T¤>�4˜–<°u·y±yÀÓ7HˆDØ! TÔ)¨d¯h©hÐ7IÓ.JÒ.Vð\Ü!$ Q¬¨DÐ1CÕ,DÓ(EÓ!F�Jð +0¯+¨+°2×):Ñ):¸=Ó)IÈVÔ)S™ÐYc‘ä%>¸sÈeÓ%`Ñ"�
Ü*Ø$.°$Ô$6��ZÖ ¸E¿I¹IÀjÓ<QóˆHð ˜4ÔÜ(¨¯©°(Ó);Ó<‘àŸ™ 8Ó,�Ø�K‰Kðð ØØØØØØØØØØðôô8 & c°ZÔJØ�K‰KÐFÈÈÔTØ—L‘L“NˆEÜ! #°Ó>ˆE÷Q ðR 	�‰ŒÜ˜˜d G¨UÐ3Ó4à�
‰
�øô_ "¤:Ð.ô \Ü" D¨%°Ð:TÐ#UÓVÐX[Ð[Ñ[÷= ‰]ðX 	�
‰
�ð_\ú÷; �]ûðX 	�
‰
�ús†   ®#O ÁAOÂ
O Â3;OÃ.
O Ä	4OÄ=
O Å9OÆ
O Æ,BOÉN É!OÉ*COÍ	&O Î "N?Î"OÎ#
O Î>N?Î?OÏO	ÏO ÏO'c                 óº  € \        4       p \        V4       VP                  4       ;_uu_ 4       pVP                  R W34       VP                  ^ 8X  d,   \        RRRR/4      R3uuRRR4       VP                  4        #  RRR4       VP                  4        \        RR/4      VP                  4        #   + '       g   i     L=; i  TP                  4        i ; i)z<DELETE FROM GardenPlantEvent WHERE id = %s AND plant_id = %srn  Frk  r¢  r£  NTr§  )rž   rØ  r]   r^   s   &&  r-   Údelete_plant_eventrÝ    s¬   € ä‹8€DðÜ˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KØNØÐ$ôð �|‰|˜qÔ Ü  e¨W°kÐBÓCÀSÐH÷ ‰]ð 	�
‰
�ð !÷ ð 	�‰ŒÜ˜˜d�|Ó$à�
‰
�÷ �]ûð 	�
‰
�úrª  z /api/seed-type-upload/<path:rel>c                 ó4  € V '       d   R V P                  R4      9   d   \        RRRR/4      R3# \        4       p\        P                  P                  W4      p\        P                  P                  V4      '       g   \        RRRR/4      R3# \        W4      # )	rÊ  rþ   rn  Frk  zinvalid pathrš  z	not foundr£  )r  r   r  r  r  r�   rË  r
   )ÚrelrÏ  rÐ  s   &  r-   Úserve_seed_type_uploadrà  2  s~   € ç�$˜#Ÿ)™) C›.Ô(Ü˜˜e W¨nÐ=Ó>ÀÐCÐCÜ#Ó%€KÜ�7‰7�<‰<˜Ó)€DÜ�7‰7�>‰>˜$×ÒÜ˜˜e W¨kÐ:Ó;¸SÐ@Ð@Ü˜{Ó0Ð0r,   z/api/seed-imagec            	      ó�  € \         P                  P                  R 4      ;'       g    RP                  4       p V '       g   \	        RRRR/4      R3# \        V 4      p\        P                  P                  V4      pVP                  ;'       g    RP                  4       p\        4       p \        V4       \        V4      pVP                  4        \        W54      '       g   \	        RRRR/4      R3# VP                   R8w  d   \	        RRRR	/4      R3# R
pV\"        9  d   RV R2p \        P                   P%                  VRRRV/R7      p\        P                   P'                  V^R7      ;_uu_ 4       pVP)                  4       p	VP*                  P                  RR4      p
RRR4       \-        X	X
RR/R7      #   TP                  4        i ; i  + '       g   i     L5; i  \        P.                  P0                  \        P.                  P2                  \4        3 d%   p\	        RRR\7        T4      /4      R3u Rp?# Rp?ii ; i)rÞ   rI   rn  Frk  zurl requiredrš  zhost not allowedrõ  zinvalid urlzhttps://en.wikipedia.org/r÷   rþ   rÒ   zMozilla/5.0 GardenTracker/1.0r<  rÓ   rÕ   r9  z
image/jpegNzCache-Controlzpublic, max-age=86400r‘  éö  )r	   r7  rX   rz   r   rü   r×   r   r  rï  r  r.   rd   r  r  r  rö  rÿ  rØ   rÙ   rÜ   rÔ   r   rk  rl  rm  rn  rL   )Úraw_urlrÞ   rø  r   r]   r  Úrefererrß   rà   r8  Úcontent_typer…  s               r-   Úseed_image_proxyræ  =  sú  € ä�|‰|×Ñ Ó&×,Ð,¨"×3Ñ3Ó5€GßÜ˜˜e W¨nÐ=Ó>ÀÐCÐCÜ
˜wÓ
'€CÜ�\‰\×"Ñ" 3Ó'€FØ�O‰O×!Ð!˜r×(Ñ(Ó*€DÜ‹8€DðÜ˜TÔ"Ü,¨TÓ2ˆà�
‰
ŒÜ˜t×3Ò3Ü˜˜e WÐ.@ÐAÓBÀCÐGÐGØ‡}�}˜ÔÜ˜˜e W¨mÐ<Ó=¸sÐBÐBØ)€GØÔ(Ô(Ø˜T˜F !Ð$ˆð>Ü�n‰n×$Ñ$ØàÐ=Ø˜7ðð %ó 
ˆô �^‰^×#Ñ# C°Ð#×4Ô4¸Ø—9‘9“;ˆDØŸ<™<×+Ñ+¨N¸LÓIˆL÷ 5ô ØØ!Ø$Ð&=Ð>ô
ð 	
øð' 	�
‰
�ú÷  5×4ûô �L‰L×!Ñ!¤6§<¡<×#9Ñ#9¼7ÐCô >Ü˜˜e W¬c°#«hÐ7Ó8¸#Ð=Õ=ûð>úsC   Â*F; Ä(AG# Å6-GÆ#G# Æ;GÇG 	ÇG# Ç#>IÈ!I È:IÉ Iz
/api/seedsc                  óx  € \        4       p  \        V 4       V P                  4       ;_uu_ 4       pVP                  R 4       VP	                  4       pRRR4       \        V 4      ;'       g    / p\        VP                  R4      ;'       g    ^4      p. pX F[  p\        V4      pVP                  R4      ;'       g    Tp\        VR,          4      \        V4      8*  VR&   VP                  V4       K]  	  \        RRRV/4      V P                  4        #   + '       g   i     LË; i  T P                  4        i ; i)	z=SELECT * FROM GardenSeedInventory ORDER BY crop_name, varietyNr  r  r  r  rn  TÚseeds)r.   rd   rS   rT   ro   r¼   rV   rX   rB   r6   rŽ   r   r  )	r]   r^   rD   r  r  rŠ   r?   rÝ  r  s	            r-   Ú
list_seedsré  f  sø   € ä‹8€DðÜ˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KÐWÔXØ—<‘<“>ˆD÷ ô ! Ó&×,Ð,¨"ˆÜ˜Ÿ™Ð%9Ó:×?Ð?¸aÓ@ˆ	ØˆÛˆCÜ! #Ó&ˆDØ—G‘GÐ1Ó2×?Ð?°iˆEÜ % c¨%¥jÓ 1´U¸5³\Ñ AˆD�ÑØ�J‰J�tÖñ	 ô
 ˜˜d G¨SÐ1Ó2à�
‰
�÷ �]ûð 	�
‰
�ús5   Œ#D' ¯"DÁD' Á+D' Â0D' Â<AD' ÄD$	ÄD' Ä'D9c                  ó  € \         P                  ! R R R7      ;'       g    / p V P                  R4      ;'       g    RP                  4       pV'       g   \	        RRRR/4      R3# \        4       p \        V4       VP                  4       ;_uu_ 4       pTP                  R	TV P                  R
4      V P                  R^ 4      V P                  R4      ;'       g    RV P                  R4      \        V P                  R4      4      \        V P                  R4      4      V P                  R4      V P                  R4      V P                  R4      3
4       VP                  pVP                  RV34       VP                  4       pRRR4       VP                  4        \        WP                  R
4      4       \	        RR R\        X4      /4      ^É3VP                  4        #   + '       g   i     Ld; i  TP                  4        i ; i)Tr3  r€   rI   rn  Frk  zcrop_name requiredrš  a  
                INSERT INTO GardenSeedInventory
                    (crop_name, variety, qty, unit, source, purchase_date, expiry_date,
                     location, low_stock_threshold, notes)
                VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
                rw   r  r_  rè  r
  Úpurchase_dateÚexpiry_dater¸   r  r`  r½  Nr$   )r	   r6  rX   rz   r   r.   rd   rS   rT   rN   rž  rW   r[   r  rB   r  )r8  r€   r]   r^   r…   r$   s         r-   Úcreate_seedrí  {  s•  € ä×Ò $¨tÔ4×:Ð:¸€DØ—‘˜+Ó&×,Ð,¨"×3Ñ3Ó5€IßÜ˜˜e WÐ.BÐCÓDÀcÐIÐIÜ‹8€DðÜ˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰Kðð Ø—H‘H˜YÓ'Ø—H‘H˜U AÓ&Ø—H‘H˜VÓ$×/Ð/¨Ø—H‘H˜XÓ&Ü §¡¨Ó 9Ó:Ü §¡¨Ó 7Ó8Ø—H‘H˜ZÓ(Ø—H‘HÐ2Ó3Ø—H‘H˜WÓ%ðôð( —m‘mˆGØ�K‰KÐIÈGÈ:ÔVØ—<‘<“>ˆD÷/ ð0 	�‰ŒÜ˜y¯(©(°9Ó*=Ô>Ü˜˜d F¬N¸4Ó,@ÐAÓBÀCÐGà�
‰
�÷9 �]ûð8 	�
‰
�ús&   Á0#G2 ÂC0GÆAG2 ÇG/	Ç*G2 Ç2Hz/api/seeds/<int:seed_id>c           
      óä  € \        4       p \        V4       VP                  4       ;_uu_ 4       pVP                  R V 34       VP	                  4       pRRR4       X'       g"   \        RRRR/4      R3VP                  4        # \        W4      p\        WR,          VP                  R4      4      p\        VR,          VP                  R4      4      pRpV'       g9   \        V4      pV'       g%   \        VR,          VP                  R4      4       R	pM‘VP                  R
4      '       g{   . '       gs   \        W4      '       gb   V\        9  dL   \        P                  V4       \        V4      '       g%   \        VR,          VP                  R4      4       R	pM\        V4      p\        RR	RVRVRV/4      VP                  4        #   + '       g   i     EL; i  TP                  4        i ; i)r½  Nrn  Frk  r¢  r£  r€   rw   Tr~   r$   r�   Útype_info_loading)r.   rd   rS   rT   rW   r   r  r  r   rX   rT  r  r  rI  Ú_seed_type_image_retry_doner  )r…   r]   r^   r?   r$   r�   r  rï  s   &       r-   Úget_seedrñ  £  s�  € ä‹8€Dð"Ü˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KÐIÈGÈ:ÔVØ—,‘,“.ˆC÷ ÷ Ü˜D %¨°+Ð>Ó?ÀÐDð8 	�
‰
�ô7 *¨$Ó4ˆÜ'¨°+Õ.>ÀÇÁÈ	Ó@RÓSˆ	Ü(¨¨[Õ)9¸3¿7¹7À9Ó;MÓNˆ	Ø!ÐßÜ <¸YÓ GÐß$Ü& s¨;Õ'7¸¿¹ÀÓ9KÔLØ$(Ð!øØ—-‘- ×)Ò)¯RÜ1°$×BÒBØÔ$?Ô?Ü/×3Ñ3°IÔ>Ü7¸	×BÒBÜ.¨s°;Õ/?ÀÇÁÈÓASÔTØ,0Ð)øä(DÀYÓ(OÐ%Üà�dØ˜Ø˜YØ#Ð%6ð	ó
ð 	�
‰
�÷A �]ˆ]ûð@ 	�
‰
�ús<   Œ#G ¯$G	ÁG Á#G ÂB'G Ä,G Ä4BG Ç	G	Ç	G ÇG/z$/api/seeds/<int:seed_id>/product-urlc                 ó$  € \         P                  ! R R7      ;'       g    / pVP                  R4      ;'       g    RP                  4       pV'       g   \	        RRRR/4      R3# VP                  R	4      '       g!   VP                  R
4      '       g
   R
V,           pVP                  R4      ^ ,          P                  R4      p\        4       p \        V4       VP                  4       ;_uu_ 4       pVP                  RV 34       VP                  4       pRRR4       X'       g"   \	        RRRR/4      R3VP                  4        # \        WC4      '       g"   \	        RRRR/4      R3VP                  4        # \        V4      pV'       g    \	        RRRR/4      VP                  4        # VR,          pVP                  R4      p	\!        VVV	VP                  R4      VP                  R4      R7      p
V
\"        8¬  pRVP                  R4      RVP                  R4      RTR\%        WC4      R\'        VP                  R4      ;'       g    . 4      /p\)        WHV	4      p\+        V4      p\-        VP                  R4      4      p\-        VP                  R4      4      pV'       gl   V'       g?   \	        RRRRV 2V	'       d   RV	 2MR,           R V
R!VR"VR#R /4      VP                  4        # \	        RR R$R R V
R!VR"V/4      VP                  4        # V'       g*   V'       g"   \	        RRRR%/4      R3VP                  4        # \/        WHW—4      p\	        RR R&V/4      VP                  4        #   + '       g   i     EL^; i  TP                  4        i ; i)'T)r5  rÞ   rI   rn  Frk  zProduct URL is requiredrš  rö   r÷   r¡  rþ   r½  Nr¢  r£  z<URL must be a product page on a configured seed company sitez*Could not load product info from that pager€   rw   r	  r€  r×  r³  rÔ  Úimage_countr~   Úapplyr4  z#This page does not appear to match u    â€” Úmatch_scoreÚpreviewÚhas_existingÚ	can_applyÚmatcheszPage match not confirmedr�   )r	   r6  rX   rz   r   rù   r  r?  r.   rd   rS   rT   rW   r  rû  rº  r…  ÚPRODUCT_URL_MIN_MATCH_SCORErý  rp   r   rô  rG  rø  )r…   r8  rÞ   Ú	clean_urlr]   r^   r?   rö  r€   rw   rõ  rù  rö  r½  r÷  rô  r4  r�   s   &                 r-   Úset_seed_product_urlrü  Ë  sV  € ä×Ò 4Ô(×.Ð.¨B€DØ�8‰8�E‹?× Ð ˜b×
'Ñ
'Ó
)€CßÜ˜˜e WÐ.GÐHÓIÈ3ÐNÐNØ�>‰>˜)×$Ò$¨S¯^©^¸J×-GÒ-GØ˜3ÕˆØ—	‘	˜#“˜qÕ!×(Ñ(¨Ó-€Iä‹8€DðHÜ˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KÐIÈGÈ:ÔVØ—,‘,“.ˆC÷ ÷ Ü˜D %¨°+Ð>Ó?ÀÐDðD 	�
‰
�ôC ' t×7Ò7ÜØ�eØÐWðó ð ðð@ 	�
‰
�ôw /¨yÓ9ˆ	ßÜØ�eØÐEðó ðr 	�
‰
�ði ˜Õ$ˆ	Ø—'‘'˜)Ó$ˆÜ+ØØØØ—-‘- Ó(Ø—M‘M )Ó,ô
ˆð Ô!<Ñ<ˆà�Y—]‘] 7Ó+Ø�y—}‘} YÓ/Ø˜)ØÔ/°Ó@Øœ3˜yŸ}™}¨XÓ6×<Ð<¸"Ó=ð
ˆô ' t¸Ó@ˆÜ2°8Ó<ˆä�T—X‘X˜gÓ&Ó'ˆÜ�T—X‘X˜gÓ&Ó'ˆßßÜØ˜%ØØ=Ø$˜+ð'ß?F¨E°'°Ñ*;ÈBõPð " ;Ø˜wØ" LØ ð
 ó 
ð8 	�
‰
�ô# Ø�dØ˜4Ø˜{Ø˜7Ø ðó ð" 	�
‰
�÷ ŸuÜØ�eØÐ3ðó ð ðð 	�
‰
�ô -¨T¸gÓQˆ	Ü˜˜d K°Ð;Ó<à�
‰
�÷M �]ˆ]ûðL 	�
‰
�úsa   Ã#M= Ã0$M)ÄM= Ä$M= Å!M= Å7!M= Æ)D M= Ê*-M= Ë(M= ÌM= ÌM= ÌM= Ì>M= Í)M:	Í4	M= Í=Nz*/api/seeds/<int:seed_id>/refresh-type-infoc                 ó  € \        4       p \        V4       VP                  4       ;_uu_ 4       pVP                  R V 34       VP	                  4       pRRR4       X'       g"   \        RRRR/4      R3VP                  4        # \        VR,          VP                  R4      4      p\        W4      pVP                  4       ;_uu_ 4       pVP                  R	V34       RRR4       VP                  4        \        P                  V4       \        VR,          VP                  R4      VR
7       \        RRRR/4      VP                  4        #   + '       g   i     EL; i  + '       g   i     LŒ; i  TP                  4        i ; i)r½  Nrn  Frk  r¢  r£  r€   rw   z3DELETE FROM GardenSeedTypeInfo WHERE cache_key = %sr  Trï  )r.   rd   rS   rT   rW   r   r  rT  rX   rÅ  r[   rð  r¼  r  )r…   r]   r^   r?   r  rú  s   &     r-   Úrefresh_seed_type_inforþ  !  s&  € ä‹8€DðÜ˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KÐIÈGÈ:ÔVØ—,‘,“.ˆC÷ ÷ Ü˜D %¨°+Ð>Ó?ÀÐDð 	�
‰
�ô )¨¨[Õ)9¸3¿7¹7À9Ó;MÓNˆ	Ü1°$ÓBÐØ�[‰[�]Œ]˜cØ�K‰KÐMÐPYÈ|Ô\÷ à�‰ŒÜ#×+Ñ+¨IÔ6ÜØ�ÕØ�G‰G�IÓØ-õ	
ô
 ˜˜dÐ$7¸Ð>Ó?à�
‰
�÷% �]ˆ]ú÷ �]ûð 	�
‰
�úsH   Œ#E4 ¯$EÁE4 Á#E4 ÂAE4 Ã	E!ÃAE4 ÅE	Å	E4 Å!E1	Å,E4 Å4Fz$/api/seeds/<int:seed_id>/type-imagesc           
      óÀ  € \         P                  P                  R 4      pV'       g   \        RRRR/4      R3# \	        4       p \        V4       VP                  4       ;_uu_ 4       pVP                  RV 34       VP                  4       pRRR4       X'       g"   \        RRRR/4      R	3VP                  4        # \        VR
,          VP                  R4      4      p\        W%4      p\        V4      \        8¼  d*   \        RRRR\         R2/4      R3VP                  4        # \        VP                  ;'       g    R4      ;'       g    Rp\         P"                  P%                  V4      ^,          P'                  4       pVR9  d   Rp\         P(                  ! ^4      P+                  4        V 2p	\-        V4       RV	 2p
\         P"                  P/                  \1        4       V
4      p\         P2                  ! \         P"                  P5                  V4      RR7       VP7                  V4       VP9                  RRV
 2RV
RVRR/4       \;        W%VR
,          VP                  R4      VRR7       \=        W$R
,          VP                  R4      4      p\        RRRV/4      ^É3VP                  4        #   + '       g   i     EL5; i  TP                  4        i ; i)r±  rn  Frk  zNo file uploadedrš  r½  Nr¢  r£  r€   rw   zMaximum z imagesz	image.jpgrÄ  rþ   T)Úexist_okrÞ   r?  r&  r	  r
  Úuploaded©rÇ  r�   )rÄ  rÅ  rÆ  rÇ  z.gif)r	   ÚfilesrX   r   r.   rd   rS   rT   rW   r  rT  rÅ  rp   rM  r   r•  r  r  Úsplitextr  ÚurandomÚhexr!  r�   r  Úmakedirsr  ÚsaverŽ   rÈ  r   )r…   r±  r]   r^   r?   r  r~   Ú	safe_namer¾  r•  rß  rÐ  r�   s   &            r-   Úupload_seed_type_imager
  ;  sd  € ä�M‰M×Ñ˜gÓ&€EßÜ˜˜e WÐ.@ÐAÓBÀCÐGÐGÜ‹8€Dð#Ü˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KÐIÈGÈ:ÔVØ—,‘,“.ˆC÷ ÷ Ü˜D %¨°+Ð>Ó?ÀÐDð: 	�
‰
�ô7 )¨¨[Õ)9¸3¿7¹7À9Ó;MÓNˆ	Ü'¨Ó8ˆÜˆv‹;Ô.Ô.Ü˜D %¨°HÔ=QÐ<RÐRYÐ2ZÐ[Ó\Ð^aÐað0 	�
‰
�ô- $ E§N¡N×$AÐ$A°kÓB×QÐQÀkˆ	Ü�g‰g×Ñ˜yÓ)¨!Õ,×2Ñ2Ó4ˆØÐ@Ô@ØˆCÜ—j’j “n×(Ñ(Ó*Ð+¨C¨5Ð1ˆÜ$ YÓ/Ð0°°(°Ð<ˆÜ�w‰w�|‰|Ô-Ó/°Ó5ˆÜ
�Š”B—G‘G—O‘O DÓ)°DÕ9Ø�
‰
�4Ôà�‰Ø�^ C 5Ð)Ø˜Ø�YØ�jð	
ô 	ô 	Ø˜S Õ-¨s¯w©w°yÓ/AÀ6ÐX\õ	
ô (¨°+Õ.>ÀÇÁÈ	Ó@RÓSˆ	Ü˜˜d K°Ð;Ó<¸cÐAà�
‰
�÷C �]ˆ]ûðB 	�
‰
�úsD   Á#K Á'$J7ÂK ÂK Â<AK Ä&K Ä>K ÅEK Ê7K	Ë	K ËKc           	      ó¦  € \        4       p\        4       pVR 8X  d   Vf   \        RRRR/4      R3# \        4       p \	        V4       VP                  4       ;_uu_ 4       pVP                  RV 34       VP                  4       pRRR4       X'       g"   \        RRRR/4      R	3VP                  4        # \        VR
,          VP                  R4      4      p\        W64      pRp\        V4      p	VeK   V^ 8  g   V\        V4      8¼  d"   \        RRRR/4      R	3VP                  4        # V	P                  V4      pM5. p	V F-  p
\        W¡4      '       d	   Vf   T
pK  V	P!                  V
4       K/  	  V'       g"   \        RRRR/4      R	3VP                  4        # VP                  R4      '       d   \#        VR,          4       \%        W6VR
,          VP                  R4      V	RR7       \'        W5R
,          VP                  R4      4      p\        RRRV/4      VP                  4        #   + '       g   i     EL°; i  TP                  4        i ; i)rI   Nrn  Frk  úurl or index requiredrš  r½  r¢  r£  r€   rw   úImage not foundr&  Tr  r�   )r9  r=  r   r.   rd   rS   rT   rW   r  rT  rX   rÅ  rÅ   rp   r  rC  rŽ   rÑ  rÈ  r   )r…   rÞ   r;  r]   r^   r?   r  r~   ÚremovedÚkeptr  r�   s   &           r-   Údelete_seed_type_imager  g  s  € ä
Ó
 €CÜ"Ó$€EØ
ˆb„y�U’]Ü˜˜e WÐ.EÐFÓGÈÐLÐLÜ‹8€Dð"Ü˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KÐIÈGÈ:ÔVØ—,‘,“.ˆC÷ ÷ Ü˜D %¨°+Ð>Ó?ÀÐDð8 	�
‰
�ô5 )¨¨[Õ)9¸3¿7¹7À9Ó;MÓNˆ	Ü'¨Ó8ˆØˆÜ�F‹|ˆØÒØ�qŒy˜E¤S¨£[Ô0Ü  e¨WÐ6GÐHÓIÈ3ÐNð( 	�
‰
�ð' —h‘h˜u“o‰GàˆDÛ�Ü)¨#×3Ò3¸ºØ!�GÙØ—‘˜CÖ ñ	 ÷
 Ü˜D %¨Ð2CÐDÓEÀsÐJð 	�
‰
�ð �;‰;�{×#Ò#Ü$ W¨[Õ%9Ô:ÜØ˜S Õ-¨s¯w©w°yÓ/AÀ4ÐVZõ	
ô (¨°+Õ.>ÀÇÁÈ	Ó@RÓSˆ	Ü˜˜d K°Ð;Ó<à�
‰
�÷A �]ˆ]ûð@ 	�
‰
�úsJ   ¼#H> Á$H*ÂH> ÂH> Â4A%H> Ä*AH> Å9H> ÆH> Æ1A(H> È*H;	È5	H> È>Iz,/api/seeds/<int:seed_id>/type-images/primaryÚPATCHc           	      ó  a
€ \        4       o
\        4       pS
R 8X  d   Vf   \        RRRR/4      R3# \        4       p \	        V4       VP                  4       ;_uu_ 4       pVP                  RV 34       VP                  4       pRRR4       X'       g"   \        RRRR/4      R	3VP                  4        # \        VR
,          VP                  R4      4      p\        W%4      pVe<   V^ 8  g   V\        V4      8¼  d"   \        RRRR/4      R	3VP                  4        # TpMD\        V
3R l\        V4       4       R4      pVf"   \        RRRR/4      R	3VP                  4        # V^ 8X  dh   \        W%VR
,          VP                  R4      VRR7       \!        W$R
,          VP                  R4      4      p\        RRRV/4      VP                  4        # VP#                  V4      p	VP%                  ^ V	4       \        W%VR
,          VP                  R4      VRR7       \!        W$R
,          VP                  R4      4      p\        RRRV/4      VP                  4        #   + '       g   i     ELâ; i  TP                  4        i ; i)rI   Nrn  Frk  r  rš  r½  r¢  r£  r€   rw   r  c              3   óT   <"  € T F  w  r\        VS4      '       g   K  Vx € K  	  R # 5ir=   )rC  )r½  rk   r  rÞ   s   &  €r-   r¿  Ú/make_seed_type_image_primary.<locals>.<genexpr>ª  s"   øé € ÐWÑ!2‘v�qÔ6LÈSÐRU×6V—’Ó!2ùs   ƒ(ž
(Tr  r�   )r9  r=  r   r.   rd   rS   rT   rW   r  rT  rX   rÅ  rp   ÚnextrY   rÈ  r   r  Úinsert)r…   r;  r]   r^   r?   r  r~   r`   r�   ÚchosenrÞ   s   &         @r-   Úmake_seed_type_image_primaryr  “  s:  ø€ ä
Ó
 €CÜ"Ó$€EØ
ˆb„y�U’]Ü˜˜e WÐ.EÐFÓGÈÐLÐLÜ‹8€Dð$Ü˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KÐIÈGÈ:ÔVØ—,‘,“.ˆC÷ ÷ Ü˜D %¨°+Ð>Ó?ÀÐDð< 	�
‰
�ô9 )¨¨[Õ)9¸3¿7¹7À9Ó;MÓNˆ	Ü'¨Ó8ˆØÒØ�qŒy˜E¤S¨£[Ô0Ü  e¨WÐ6GÐHÓIÈ3ÐNð0 	�
‰
�ð/ ‰CäÜW¤¨6Ô!2ÓWØóˆCð Š{Ü  e¨WÐ6GÐHÓIÈ3ÐNð  	�
‰
�ð �!Œ8Ü"Ø  [Õ!1°3·7±7¸9Ó3EÀvÐ\`õô ,¨D°kÕ2BÀCÇGÁGÈIÓDVÓWˆIÜ˜D $¨°YÐ?Ó@ð 	�
‰
�ð —‘˜C“ˆØ�‰�a˜Ô ÜØ˜S Õ-¨s¯w©w°yÓ/AÀ6ÐX\õ	
ô (¨°+Õ.>ÀÇÁÈ	Ó@RÓSˆ	Ü˜˜d K°Ð;Ó<à�
‰
�÷E �]ˆ]ûðD 	�
‰
�úsD   ½#I1 Á $IÂI1 ÂI1 Â5AI1 Ä6I1 Å%AI1 ÇA9I1 ÉI.	É(	I1 É1Jc                 ó  € \         P                  ! R R R7      ;'       g    / p\        4       p \        V4       VP	                  4       ;_uu_ 4       pVP                  RV 34       VP                  4       '       g,   \        RRRR/4      R3uuRRR4       VP                  4        # TP                  R	VP                  R
4      VP                  R4      VP                  R4      VP                  R4      VP                  R4      RV9   d   \        VP                  R4      4      MRRV9   d   \        VP                  R4      4      MRVP                  R4      VP                  R4      VP                  R4      V 34       VP                  RV 34       VP                  4       pRRR4       VP                  4        \        RR R\        X4      /4      VP                  4        #   + '       g   i     LH; i  TP                  4        i ; i)Tr3  z0SELECT id FROM GardenSeedInventory WHERE id = %srn  Frk  r¢  r£  Na�  
                UPDATE GardenSeedInventory SET
                    crop_name = COALESCE(%s, crop_name),
                    variety = COALESCE(%s, variety),
                    qty = COALESCE(%s, qty),
                    unit = COALESCE(%s, unit),
                    source = COALESCE(%s, source),
                    purchase_date = COALESCE(%s, purchase_date),
                    expiry_date = COALESCE(%s, expiry_date),
                    location = COALESCE(%s, location),
                    low_stock_threshold = COALESCE(%s, low_stock_threshold),
                    notes = COALESCE(%s, notes)
                WHERE id = %s
                r€   rw   r  r_  r
  rë  rì  r¸   r  r`  r½  r$   )r	   r6  r.   rd   rS   rT   rW   r   r  rX   rN   r[   rB   )r…   r8  r]   r^   r$   s   &    r-   Úupdate_seedr  Á  sœ  € ä×Ò $¨tÔ4×:Ð:¸€DÜ‹8€Dð(Ü˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KÐJÈWÈJÔWØ—<‘<—>’>Ü  e¨W°kÐBÓCÀSÐH÷ ‰]ðL 	�
‰
�ðE �K‰Kðð —H‘H˜[Ó)Ø—H‘H˜YÓ'Ø—H‘H˜U“OØ—H‘H˜VÓ$Ø—H‘H˜XÓ&Ø>MÐQUÔ>U”K §¡¨Ó 9Ô:Ð[_Ø<IÈTÔ<Q”K §¡¨Ó 7Ô8ÐW[Ø—H‘H˜ZÓ(Ø—H‘HÐ2Ó3Ø—H‘H˜WÓ%Øðôð: �K‰KÐIÈGÈ:ÔVØ—<‘<“>ˆD÷E ðF 	�‰ŒÜ˜˜d F¬N¸4Ó,@ÐAÓBà�
‰
�÷M �]ûðL 	�
‰
�ús0   ®#G3 Á:G Â
G3 Â&C:G Æ /G3 Ç G0	Ç+G3 Ç3Hc                 óº  € \        4       p \        V4       VP                  4       ;_uu_ 4       pVP                  R V 34       VP                  ^ 8X  d,   \        RRRR/4      R3uuRRR4       VP                  4        #  RRR4       VP                  4        \        RR/4      VP                  4        #   + '       g   i     L=; i  TP                  4        i ; i)z-DELETE FROM GardenSeedInventory WHERE id = %srn  Frk  r¢  r£  NTr§  )r…   r]   r^   s   &  r-   Údelete_seedr  ð  s¦   € ä‹8€Dð	Ü˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KÐGÈ'ÈÔTØ�|‰|˜qÔ Ü  e¨W°kÐBÓCÀSÐH÷ ‰]ð 	�
‰
�ð !÷ ð 	�‰ŒÜ˜˜d�|Ó$à�
‰
�÷ �]ûð 	�
‰
�úrª  z#/api/seeds/<int:seed_id>/adjust-qtyc           	      ó0  € \         P                  ! R R R7      ;'       g    / pVP                  R4      pVf   \        RRRR/4      R3# \	        4       p \        V4       VP                  4       ;_uu_ 4       pVP                  R	V 34       VP                  4       pV'       g,   \        RRRR
/4      R3uuRRR4       VP                  4        # \        ^ \        VR,          4      \        V4      ,           4      pVP                  RW`34       VP                  R	V 34       VP                  4       pRRR4       VP                  4        \        RR R\        X4      /4      VP                  4        #   + '       g   i     LH; i  TP                  4        i ; i)Tr3  ÚdeltaNrn  Frk  zdelta requiredrš  r½  r¢  r£  r  z5UPDATE GardenSeedInventory SET qty = %s WHERE id = %sr$   )r	   r6  rX   r   r.   rd   rS   rT   rW   r  r�   r6   r[   rB   )r…   r8  r  r]   r^   r$   Únew_qtys   &      r-   Úadjust_seed_qtyr   ÿ  sG  € ä×Ò $¨tÔ4×:Ð:¸€DØ�H‰H�WÓ€EØ‚}Ü˜˜e WÐ.>Ð?Ó@À#ÐEÐEÜ‹8€DðÜ˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KÐIÈGÈ:ÔVØ—<‘<“>ˆDßÜ  e¨W°kÐBÓCÀSÐH÷	 ‰]ð 	�
‰
�ô ˜!œU 4¨¥;Ó/´%¸³,Õ>Ó?ˆGØ�K‰KØGØÐ"ôð �K‰KÐIÈGÈ:ÔVØ—<‘<“>ˆD÷ ð 	�‰ŒÜ˜˜d F¬N¸4Ó,@ÐAÓBà�
‰
�÷ �]ûð 	�
‰
�ús1   Á#F Á7<E0Â3
F ÃA"E0Ä0/F Å0F 	Å;F ÆFz
/api/tanksc                  ó  € \        4       p  \        V 4       V P                  4       ;_uu_ 4       pVP                  R 4       VP	                  4       p. p\
        P                  ! 4       pV FÇ  p\        V4      pVP                  RVR,          34       VP                  4       pV'       d   \        V4      MRVR&   \        VP                  R4      ;'       g    ^4      pV'       d1   VR,          \        VR7      ,           p	W”8*  VR&   \        V	4      VR	&   M
R
VR&   RVR	&   VP                  V4       KÉ  	  RRR4       \        RR
RX/4      V P                  4        #   + '       g   i     L/; i  T P                  4        i ; i)ú&SELECT * FROM GardenTank ORDER BY namez’
                    SELECT * FROM GardenTankReading WHERE tank_id = %s
                    ORDER BY recorded_at DESC LIMIT 1
                    rn   NÚlatest_readingra  rb  rO  Útest_overdueÚnext_test_dueTrn  rp  )r.   rd   rS   rT   ro   r   rå   rB   rW   rV   rX   r   r;   rŽ   r   r  )
r]   r^   rp  rŠ   rÄ   rq  rÝ  ÚlatestrQ  rt  s
             r-   Ú
list_tanksr'    s@  € ä‹8€DðÜ˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KÐ@ÔAØ—L‘L“NˆEØˆCÜ—/’/Ó#ˆCÛ�Ü% dÓ+�Ø—‘ðð ˜$•Z�Môð Ÿ™›�ßCI¬¸Ô)?Èt�Ð%Ñ&Ü˜tŸx™xÐ(<Ó=×BÐBÀÓC�ßØ# MÕ2´YÀHÔ5MÕM�FØ+1©=�D˜Ñ(Ü,6°vÓ,>�D˜Ò)à+/�D˜Ñ(Ø,0�D˜Ñ)Ø—
‘
˜4Ö ñ' ÷ ô2 ˜˜d G¨SÐ1Ó2à�
‰
�÷7 �]ûð6 	�
‰
�ús0   Œ#E/ ¯B'EÃEÃ&AEÄ5E/ ÅE,	Å'E/ Å/Fc                  ó‚  € \         P                  ! R R R7      ;'       g    / p V P                  R4      ;'       g    RP                  4       pV'       g   \	        RRRR/4      R3# \        4       p \        V4       VP                  4       ;_uu_ 4       pVP                  R	VV P                  R
4      V P                  R4      V P                  R4      V P                  R4      V P                  R4      V P                  R4      V P                  R^4      V P                  R4      3	4       VP                  pVP                  RV34       VP                  4       pRRR4       VP                  4        \	        RR R\        X4      /4      ^É3VP                  4        #   + '       g   i     LJ; i  TP                  4        i ; i)Tr3  ra   rI   rn  Frk  zname requiredrš  a  
                INSERT INTO GardenTank
                    (name, volume_gal, solution_type, target_ph_min, target_ph_max,
                     target_ec_min, target_ec_max, test_interval_days, notes)
                VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)
                Ú
volume_galÚsolution_typeÚtarget_ph_minÚtarget_ph_maxÚtarget_ec_minÚtarget_ec_maxra  r`  ú&SELECT * FROM GardenTank WHERE id = %sNrq  )r	   r6  rX   rz   r   r.   rd   rS   rT   rž  rW   r[   rB   r  )r8  ra   r]   r^   Útank_idrq  s         r-   Úcreate_tankr1  @  se  € ä×Ò $¨tÔ4×:Ð:¸€DØ�H‰H�VÓ×"Ð" ×)Ñ)Ó+€DßÜ˜˜e W¨oÐ>Ó?ÀÐDÐDÜ‹8€DðÜ˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰Kðð Ø—H‘H˜\Ó*Ø—H‘H˜_Ó-Ø—H‘H˜_Ó-Ø—H‘H˜_Ó-Ø—H‘H˜_Ó-Ø—H‘H˜_Ó-Ø—H‘HÐ1°1Ó5Ø—H‘H˜WÓ%ð
ôð& —m‘mˆGØ�K‰KÐ@À7À*ÔMØ—<‘<“>ˆD÷- ð. 	�‰ŒÜ˜˜d F¬N¸4Ó,@ÐAÓBÀCÐGà�
‰
�÷5 �]ûð4 	�
‰
�ús%   Á0#F, ÂCFÅ1F, ÆF)	Æ$F, Æ,F>z/api/tanks/<int:tank_id>c                 ó¨  € \         P                  ! R R R7      ;'       g    / p\        4       p \        V4       VP	                  4       ;_uu_ 4       pVP                  RV 34       VP                  4       '       g,   \        RRRR/4      R3uuRRR4       VP                  4        # VP                  R	VP                  R
4      VP                  R4      VP                  R4      VP                  R4      VP                  R4      VP                  R4      VP                  R4      VP                  R4      VP                  R4      V 3
4       VP                  RV 34       VP                  4       pRRR4       VP                  4        \        RR R\        X4      /4      VP                  4        #   + '       g   i     LH; i  TP                  4        i ; i)Tr3  ú'SELECT id FROM GardenTank WHERE id = %srn  Frk  r¢  r£  Na  
                UPDATE GardenTank SET
                    name = COALESCE(%s, name),
                    volume_gal = COALESCE(%s, volume_gal),
                    solution_type = COALESCE(%s, solution_type),
                    target_ph_min = COALESCE(%s, target_ph_min),
                    target_ph_max = COALESCE(%s, target_ph_max),
                    target_ec_min = COALESCE(%s, target_ec_min),
                    target_ec_max = COALESCE(%s, target_ec_max),
                    test_interval_days = COALESCE(%s, test_interval_days),
                    notes = COALESCE(%s, notes)
                WHERE id = %s
                ra   r)  r*  r+  r,  r-  r.  ra  r`  r/  rq  )r	   r6  r.   rd   rS   rT   rW   r   r  rX   r[   rB   )r0  r8  r]   r^   rq  s   &    r-   Úupdate_tankr4  f  sr  € ä×Ò $¨tÔ4×:Ð:¸€DÜ‹8€Dð&Ü˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KÐAÀGÀ:ÔNØ—<‘<—>’>Ü  e¨W°kÐBÓCÀSÐH÷ ‰]ðH 	�
‰
�ðA �K‰Kðð —H‘H˜VÓ$Ø—H‘H˜\Ó*Ø—H‘H˜_Ó-Ø—H‘H˜_Ó-Ø—H‘H˜_Ó-Ø—H‘H˜_Ó-Ø—H‘H˜_Ó-Ø—H‘HÐ1Ó2Ø—H‘H˜WÓ%Øðôð6 �K‰KÐ@À7À*ÔMØ—<‘<“>ˆD÷A ðB 	�‰ŒÜ˜˜d F¬N¸4Ó,@ÐAÓBà�
‰
�÷I �]ûðH 	�
‰
�ús0   ®#F? Á:F,Â
F? Â&CF,Å,/F? Æ,F<	Æ7F? Æ?Gc                 óº  € \        4       p \        V4       VP                  4       ;_uu_ 4       pVP                  R V 34       VP                  ^ 8X  d,   \        RRRR/4      R3uuRRR4       VP                  4        #  RRR4       VP                  4        \        RR/4      VP                  4        #   + '       g   i     L=; i  TP                  4        i ; i)z$DELETE FROM GardenTank WHERE id = %srn  Frk  r¢  r£  NTr§  )r0  r]   r^   s   &  r-   Údelete_tankr6  “  s¦   € ä‹8€Dð	Ü˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KÐ>ÀÀ
ÔKØ�|‰|˜qÔ Ü  e¨W°kÐBÓCÀSÐH÷ ‰]ð 	�
‰
�ð !÷ ð 	�‰ŒÜ˜˜d�|Ó$à�
‰
�÷ �]ûð 	�
‰
�úrª  z!/api/tanks/<int:tank_id>/readingsc                 óV  € \        4       p \        V4       VP                  4       ;_uu_ 4       pVP                  R V 34       VP	                  4       pRRR4       \        RRR\        X4      /4      VP                  4        #   + '       g   i     L8; i  TP                  4        i ; i)zˆ
                SELECT * FROM GardenTankReading WHERE tank_id = %s
                ORDER BY recorded_at DESC LIMIT 100
                Nrn  TÚreadings©r.   rd   rS   rT   ro   r   rF   r  )r0  r]   r^   rD   s   &   r-   Úlist_tank_readingsr:  ¢  s‚   € ä‹8€DðÜ˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰Kðð �
ôð —<‘<“>ˆD÷ ô ˜˜d J´ÀÓ0EÐFÓGà�
‰
�÷ �]ûð 	�
‰
�ús"   Œ#B ¯$BÁB ÂB	ÂB ÂB(c                 ó´  € \         P                  ! R R R7      ;'       g    / p\        4       p \        V4       VP	                  4       ;_uu_ 4       pVP                  RV 34       VP                  4       '       g,   \        RRRR/4      R3uuRRR4       VP                  4        # \        VP                  R	4      4      ;'       g    \        P                  ! 4       pVP                  R
V VP                  R4      VP                  R4      VP                  R4      VP                  R4      VP                  R4      V34       VP                  pVP                  RV34       VP                  4       pRRR4       VP                  4        \        RR R\        X4      /4      ^É3VP                  4        #   + '       g   i     LJ; i  TP                  4        i ; i)Tr3  r3  rn  Frk  zTank not foundr£  Nrb  zÁ
                INSERT INTO GardenTankReading
                    (tank_id, ph, ec, temp_f, volume_gal, notes, recorded_at)
                VALUES (%s, %s, %s, %s, %s, %s, %s)
                ÚphÚecrD  r)  r`  z-SELECT * FROM GardenTankReading WHERE id = %sÚreading)r	   r6  r.   rd   rS   rT   rW   r   r  rP   rX   r   rå   rž  r[   rB   )r0  r8  r]   r^   rb  Ú
reading_idr>  s   &      r-   Úcreate_tank_readingr@  µ  sm  € ä×Ò $¨tÔ4×:Ð:¸€DÜ‹8€DðÜ˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KÐAÀGÀ:ÔNØ—<‘<—>’>Ü  e¨WÐ6FÐGÓHÈ#ÐM÷ ‰]ð6 	�
‰
�ô/ *¨$¯(©(°=Ó*AÓB×WÐWÄhÇoÂoÓFWˆKØ�K‰Kðð Ø—H‘H˜T“NØ—H‘H˜T“NØ—H‘H˜XÓ&Ø—H‘H˜\Ó*Ø—H‘H˜WÓ%Øðôð  Ÿ™ˆJØ�K‰KÐGÈ*ÈÔWØ—l‘l“nˆG÷/ ð0 	�‰ŒÜ˜˜d I¬~¸gÓ/FÐGÓHÈ#ÐMà�
‰
�÷7 �]ûð6 	�
‰
�ús6   ®#G Á:F2Â
G Â& F2ÃB)F2Å01G Æ2G	Æ=G ÇGz/api/schedulesc                  óR  € \        4       p  \        V 4       V P                  4       ;_uu_ 4       pVP                  R 4       VP	                  4       pRRR4       \        RRR\        X4      /4      V P                  4        #   + '       g   i     L8; i  T P                  4        i ; i)a  
                SELECT s.*, p.name AS plant_name, t.name AS tank_name
                FROM GardenSchedule s
                LEFT JOIN GardenPlant p ON p.id = s.plant_id
                LEFT JOIN GardenTank t ON t.id = s.tank_id
                ORDER BY s.next_due
                Nrn  Tr·  r9  )r]   r^   rD   s      r-   Úlist_schedulesrB  Ü  s{   € ä‹8€DðÜ˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰Kðôð —<‘<“>ˆD÷ ô ˜˜d K´ÀÓ1FÐGÓHà�
‰
�÷ �]ûð 	�
‰
�ús"   Œ#B ¯"BÁB ÂB	ÂB ÂB&c                  óJ  € \         P                  ! R R R7      ;'       g    / p V P                  R4      ;'       g    RpV\        9  d   \	        RRRR/4      R3# V P                  R	4      ;'       g!    VP                  R
R4      P                  4       P                  4       p\        V P                  R4      ;'       g    ^4      p\        V P                  R4      4      ;'       g    \        P                  ! 4       p\        4       p \        V4       VP                  4       ;_uu_ 4       pTP                  RV P                  R4      V P                  R4      TTTTV P                  RR 4      '       d   ^M^ V P                  R4      34       VP                   pVP                  RV34       VP#                  4       pRRR4       VP%                  4        \	        RR R\'        X4      /4      ^É3VP)                  4        #   + '       g   i     LJ; i  TP)                  4        i ; i)Tr3  rT  Úcustomrn  Frk  úinvalid task_typerš  r	  r©   rg  rN  Únext_duez×
                INSERT INTO GardenSchedule
                    (plant_id, tank_id, task_type, title, interval_days, next_due, enabled, notes)
                VALUES (%s, %s, %s, %s, %s, %s, %s, %s)
                rž   r0  r›  r`  ú*SELECT * FROM GardenSchedule WHERE id = %sNrP  )r	   r6  rX   Ú
TASK_TYPESr   r1   r	  rz   rV   rP   r   rå   r.   rd   rS   rT   rž  rW   r[   rB   r  )	r8  rT  r	  rN  rF  r]   r^   Úschedule_idrP  s	            r-   Úcreate_schedulerJ  ñ  s³  € ä×Ò $¨tÔ4×:Ð:¸€DØ—‘˜Ó%×1Ð1¨€IØœ
Ô"Ü˜˜e WÐ.AÐBÓCÀSÐHÐHØ�X‰X�gÓ×EÐE )×"3Ñ"3°C¸Ó"=×"CÑ"CÓ"E×LÑLÓN€EÜ˜Ÿ™ Ó1×7Ð7°RÓ8€MÜ˜tŸx™x¨
Ó3Ó4×IÐI¼¿ºÓ8I€HÜ‹8€DðÜ˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰Kðð —H‘H˜ZÓ(Ø—H‘H˜YÓ'ØØØ!ØØŸ™ )¨T×2Ò2‘A¸Ø—H‘H˜WÓ%ð	ôð" Ÿ-™-ˆKØ�K‰KÐDÀ{ÀnÔUØ—|‘|“~ˆH÷) ð* 	�‰ŒÜ˜˜d J´¸xÓ0HÐIÓJÈCÐOà�
‰
�÷1 �]ûð0 	�
‰
�ús%   Ä#H Ä*BG=Æ;1H Ç=H	ÈH ÈH"z /api/schedules/<int:schedule_id>c                 óH  € \         P                  ! R R R7      ;'       g    / p\        4       p \        V4       VP	                  4       ;_uu_ 4       pVP                  RV 34       VP                  4       '       g,   \        RRRR/4      R3uuRRR4       VP                  4        # VP                  R	4      pVe7   V\        9  d,   \        RRRR
/4      R3uuRRR4       VP                  4        # VP                  R4      pTP                  RVP                  R4      VP                  R4      TVP                  R4      VP                  R4      RV9   d   \        VP                  R4      4      MRVR J d   ^M	VRJ d   ^ MRVP                  R4      V 3	4       VP                  RV 34       VP                  4       pRRR4       VP                  4        \        RR R\        X4      /4      VP                  4        #   + '       g   i     LH; i  TP                  4        i ; i)Tr3  rG  rn  Frk  r¢  r£  NrT  rE  rš  r›  a  
                UPDATE GardenSchedule SET
                    plant_id = COALESCE(%s, plant_id),
                    tank_id = COALESCE(%s, tank_id),
                    task_type = COALESCE(%s, task_type),
                    title = COALESCE(%s, title),
                    interval_days = COALESCE(%s, interval_days),
                    next_due = COALESCE(%s, next_due),
                    enabled = COALESCE(%s, enabled),
                    notes = COALESCE(%s, notes)
                WHERE id = %s
                rž   r0  r	  rN  rF  r`  rP  )r	   r6  r.   rd   rS   rT   rW   r   r  rX   rH  rP   r[   rB   )rI  r8  r]   r^   rT  r›  rP  s   &      r-   Úupdate_schedulerL    sÈ  € ä×Ò $¨tÔ4×:Ð:¸€DÜ‹8€Dð(Ü˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KÐDÀ{ÀnÔUØ—<‘<—>’>Ü  e¨W°kÐBÓCÀSÐH÷ ‰]ðL 	�
‰
�ðE Ÿ™ Ó-ˆIØÒ$¨¼*Ô)DÜ  e¨WÐ6IÐJÓKÈSÐP÷ ‰]ðL 	�
‰
�ð? —h‘h˜yÓ)ˆGØ�K‰Kðð —H‘H˜ZÓ(Ø—H‘H˜YÓ'ØØ—H‘H˜WÓ%Ø—H‘H˜_Ó-Ø=GÈ4Ô=O”O D§H¡H¨ZÓ$8Ô9ÐUYØ  D›‘A°G¸uÓ4D©qÈ$Ø—H‘H˜WÓ%Øð
ôð2 �K‰KÐDÀ{ÀnÔUØ—|‘|“~ˆH÷E ðF 	�‰ŒÜ˜˜d J´¸xÓ0HÐIÓJà�
‰
�÷M �]ûðL 	�
‰
�ús<   ®#H Á:G<Â
H Â&0G<Ã
H Ã1CG<Æ</H Ç<H	ÈH ÈH!c                 óº  € \        4       p \        V4       VP                  4       ;_uu_ 4       pVP                  R V 34       VP                  ^ 8X  d,   \        RRRR/4      R3uuRRR4       VP                  4        #  RRR4       VP                  4        \        RR/4      VP                  4        #   + '       g   i     L=; i  TP                  4        i ; i)z(DELETE FROM GardenSchedule WHERE id = %srn  Frk  r¢  r£  NTr§  )rI  r]   r^   s   &  r-   Údelete_schedulerN  G  s¦   € ä‹8€Dð	Ü˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KÐBÀ[ÀNÔSØ�|‰|˜qÔ Ü  e¨W°kÐBÓCÀSÐH÷ ‰]ð 	�
‰
�ð !÷ ð 	�‰ŒÜ˜˜d�|Ó$à�
‰
�÷ �]ûð 	�
‰
�úrª  z)/api/schedules/<int:schedule_id>/completec           
      ó  € \         P                  ! R R R7      ;'       g    / p\        4       p \        V4       VP	                  4       ;_uu_ 4       pVP                  RV 34       VP                  4       pV'       g,   \        RRRR/4      R3uuRRR4       VP                  4        # \        P                  ! 4       pVP                  R	WVP                  R
4      34       \        V4      pVP                  RW`34       VP                  R4      '       dn   VP                  R4      R8X  dX   TP                  RVR,          \        P                  ! 4       VP                  R
4      ;'       g    VP                  R4      34       VP                  RV 34       VP                  4       pRRR4       VP                  4        \        RR R\!        X4      /4      VP                  4        #   + '       g   i     LH; i  TP                  4        i ; i)Tr3  rG  rn  Frk  r¢  r£  Nz‰
                INSERT INTO GardenTaskCompletion (schedule_id, completed_at, notes)
                VALUES (%s, %s, %s)
                r`  z5UPDATE GardenSchedule SET next_due = %s WHERE id = %srž   rT  Ú	fertilizez¦
                    INSERT INTO GardenPlantEvent (plant_id, event_type, event_date, notes)
                    VALUES (%s, 'fertilized', %s, %s)
                    r	  rP  )r	   r6  r.   rd   rS   rT   rW   r   r  r   rå   rX   rR  r   rd  r[   rB   )rI  r8  r]   r^   rP  rÄ   rF  s   &      r-   Úcomplete_schedulerQ  V  s£  € ä×Ò $¨tÔ4×:Ð:¸€DÜ‹8€Dð%Ü˜TÔ"Ø�[‰[�]Œ]˜cØ�K‰KÐDÀ{ÀnÔUØ—|‘|“~ˆHßÜ  e¨W°kÐBÓCÀSÐH÷	 ‰]ðF 	�
‰
�ô= —/’/Ó#ˆCØ�K‰Kðð  4§8¡8¨GÓ#4Ð5ôô 2°(Ó;ˆHØ�K‰KØGØÐ'ôð �|‰|˜J×'Ò'¨H¯L©L¸Ó,EÈÔ,TØ—‘ðð
 ! Õ,ÜŸ
š
›ØŸ™ Ó)×BÐB¨X¯\©\¸'Ó-Bðô
ð �K‰KÐDÀ{ÀnÔUØ—|‘|“~ˆH÷? ð@ 	�‰ŒÜ˜˜d J´¸xÓ0HÐIÓJà�
‰
�÷G �]ûðF 	�
‰
�ús6   ®#G8 Á<G%Â
G8 Â(CG%Å+:G%Æ%/G8 Ç%G5	Ç0G8 Ç8H
z/api/tasks/duec                  ó†  € \        \        P                  P                  R 4      ;'       g    ^4      p \	        4       p \        V4       \        P                  ! 4       \        V R7      ,           pVP                  4       ;_uu_ 4       pVP                  RV34       VP                  4       pVP                  R4       VP                  4       p\        P                  ! 4       p. pV Fç  pVP                  RVR,          34       VP                  4       p	\        VP                  R4      ;'       g    ^4      p
V	'       * ;'       g    V	R,          \        V
R7      ,           V8*  pV'       g   K‡  TP                  RR	R
VR,          RVR,          RRVR,           2R\        V	'       d   V	R,          \        V
R7      ,           MT4      RR/4       Ké  	  RRR4       \        V4      p\!        4       p\#        RRR\%        X4      RXRVRV/4      VP'                  4        #   + '       g   i     LS; i  TP'                  4        i ; i)rœ   rO  aR  
                SELECT s.*, p.name AS plant_name, t.name AS tank_name
                FROM GardenSchedule s
                LEFT JOIN GardenPlant p ON p.id = s.plant_id
                LEFT JOIN GardenTank t ON t.id = s.tank_id
                WHERE s.enabled = 1 AND s.next_due <= %s
                ORDER BY s.next_due
                r"  r`  rn   ra  rb  ÚtypeÚ	tank_testr0  rY  ra   r	  zTest tank: rF  rs  TNrn  ÚtasksÚ
tank_tasksr0  Úweather)rV   r	   r7  rX   r.   rd   r   rå   r   rS   rT   ro   rW   rŽ   r;   r@  rL  r   rF   r  )rœ   r]   Úuntilr^   r·  rp  rÄ   rV  rq  r&  rQ  rs  r0  rW  s                 r-   Ú	tasks_duerY  …  só  € äŒw�|‰|×Ñ Ó'×,Ð,¨1Ó-€DÜ‹8€Dð<Ü˜TÔ"Ü—’Ó!¤I°4Ô$8Õ8ˆØ�[‰[�]Œ]˜cØ�K‰Kðð �ô
ð Ÿ™›ˆIØ�K‰KÐ@ÔAØ—L‘L“NˆEÜ—/’/Ó#ˆCØˆJÛ�Ø—‘ðð ˜$•Z�Môð Ÿ™›�Ü˜tŸx™xÐ(<Ó=×BÐBÀÓC�Ø$œ*÷ ð Ø˜=Õ)¬I¸8Ô,DÕDÈÑKð ÷ ‘7Ø×%Ñ%à" KØ% t¨D¥zØ'¨¨f­Ø# {°4¸µ<°.Ð%AØ&¬
ç#)ð !' }Õ 5¼	ÀxÔ8PÖ Pà%(ó)ð
 & tðöñ ÷# ôZ ˜dÓ#ˆÜ“.ˆÜà�dØœ¨Ó3Ø˜jØ˜Ø˜7ðó
ð 	�
‰
�÷s �]ûðr 	�
‰
�ús8   ¾A	H. ÂB'HÄ/HÅ#HÅ,A$HÇ:H. ÈH+	È&H. È.I z/api/zone-infoc            	      ó¼   € \        4       p  \        V 4       \        R RR\        V 4      R\	        4       /4      V P                  4        #   T P                  4        i ; i)rn  Tr0  rW  )r.   rd   r   r@  rL  r  rŠ  s    r-   Ú	zone_infor[  Ë  sE   € ä‹8€DðÜ˜TÔ"Ü˜˜d F¬N¸4Ó,@À)Ì\Ë^Ð\Ó]à�
‰
�øˆ�
‰
�ús   Œ,A	 Á	Az/api/planting-nowc                  ó¶  € \        4       p  \        V 4       \        V 4      ;'       g    / p\        VP	                  R 4      ;'       g    \
        4      P                  4       pV\
        8w  d5   \        RRRRRRRRRR	\         R
\
         R2/4      V P                  4        # R\
         2p\        W4      pV'       d0   \        RRRRRR\        R\
        /RV/4      V P                  4        #  \        R\         R\         24      p\+        YT^4       \        RRRRRR\        R\
        /RT/4      T P                  4        #   \        P                  P                   \        P                  P"                  \$        P&                  \(        3 d5   p\        RRR\        T4      /4      R3u Rp?T P                  4        # Rp?ii ; i  T P                  4        i ; i)r   rn  TÚshowFr¸   Nr8  Úmessagez Plant now is only available for rV  z).zplanting_now:Úcityrq   z+https://api.cropgraph.com/api/planting?lat=r/  rk  râ  )r.   rd   r¼   rL   rX   r   rz   r   r   r  rç   rá   r   r   r×   rk  rl  rm  rÚ   r-  rn  rí   )r]   r  r   r  ro  r8  r…  s          r-   Úplanting_nowr`  Õ  s½  € ä‹8€Dð)Ü˜TÔ"Ü  Ó&×,Ð,¨"ˆÜ�x—|‘| JÓ/×=Ð=´:Ó>×DÑDÓFˆØ”zÔ!Üà˜$Ø˜EØ Ø˜DØÐ!AÔBWÐAXÐXZÔ[eÐZfÐfhÐiðóðH 	�
‰
�ð7 $¤J <Ð0ˆ	Ü˜DÓ,ˆßÜà˜$Ø˜DØ Ô)>ÀÄzÐ RØ˜Fð	óð0 	�
‰
�ð!	BÜ"Ø=¼j¸\ÈÌzÈlÐ[óˆDô
 	�4 D¨!Ô,Üà�dØ˜Ø˜VÔ%:¸EÄ:ÐNØ˜ð	ó
ð 	�
‰
�øô —‘×%Ñ%¤v§|¡|×'=Ñ'=¼t×?SÑ?SÔU\Ð]ô 	BÜ˜D %¨´#°c³(Ð;Ó<¸cÐAÔAð 	�
‰
�ûð	Bûð 	�
‰
�úsI   Œ<G Á	AG Â!:G Ã-E Ä+G ÅAGÆF>Æ(GÆ)G Æ>GÇG ÇGz/api/crops/searchc            	      óœ  € \         P                  P                  R 4      ;'       g    RP                  4       p V '       g   \	        RRR. /4      # \        4       p \        V4       RV P                  4        2p\        W4      pV'       d    \	        RRRV/4      VP                  4        #  \        R\        P                  P                  V 4       24      p\+        T\,        4      '       d   TP                  R4      ;'       g    TM. p\/        YT^4       \	        RRRT/4      TP                  4        #   \        P                  P                  \        P                  P                   \"        P$                  \&        3 d5   p\	        RRR\)        T4      /4      R	3u R
p?TP                  4        # R
p?ii ; i  TP                  4        i ; i)rz  rI   rn  Trj  zcrop_search:ri  Frk  râ  N)r	   r7  rX   rz   r   r.   rd   r  rç   r  rá   r×   r   r$  rk  rl  rm  rÚ   r-  rn  rL   r4   rÅ   rí   )rz  r]   r  ro  r8  r…  rj  s          r-   Úsearch_cropsrb    sp  € ä	�‰×	Ñ	˜#Ó	×	$Ð	$ "×+Ñ+Ó-€AßÜ˜˜d I¨rÐ2Ó3Ð3Ü‹8€DðÜ˜TÔ"Ø" 1§7¡7£9 +Ð.ˆ	Ü˜DÓ,ˆßÜ˜D $¨	°6Ð:Ó;ð 	�
‰
�ð	BÜ"Ø9¼&¿,¹,×:LÑ:LÈQÓ:OÐ9PÐQóˆDô
 2<¸DÄ$×1GÒ1G�$—(‘(˜9Ó%×-Ð-¨øÈRˆÜ�4 G¨RÔ0Ü˜˜d I¨wÐ7Ó8à�
‰
�øô —‘×%Ñ%¤v§|¡|×'=Ñ'=¼t×?SÑ?SÔU\Ð]ô 	BÜ˜D %¨´#°c³(Ð;Ó<¸cÐAÔAð
 	�
‰
�ûð	Bûð 	�
‰
�úsC   Á?F9 Â++D5 Ã-F9 Ä F9 Ä5AF6ÆF1ÆF6ÆF9 Æ1F6Æ6F9 Æ9Gz/api/planting-guidec            
      ó´  € \         P                  P                  R 4      ;'       g    RP                  4       p V '       g   \	        RRRR/4      R3# \        4       p \        V4       \        W4      pV'       g"   \	        RRRR/4      R3VP                  4        # \	        RR	R
VR\        V4      /4      VP                  4        #   TP                  4        i ; i)r{   rI   rn  Frk  zcrop query param requiredrš  zCrop not foundr£  Trq  r0  )
r	   r7  rX   rz   r   r.   rd   rr  r  r@  )r{   r]   rq  s      r-   Úplanting_guiderd    s¶   € ä�L‰L×Ñ˜VÓ$×*Ð*¨×1Ñ1Ó3€DßÜ˜˜e WÐ.IÐJÓKÈSÐPÐPÜ‹8€DðÜ˜TÔ"Ü)¨$Ó5ˆßÜ˜D %¨Ð2BÐCÓDÀcÐIð 	�
‰
�ô ˜˜d G¨U°F¼NÈ4Ó<PÐQÓRà�
‰
�øˆ�
‰
�ús   Á.C ÂC ÃCrþ   r  rI   )Údefaultsz/<path:path>c                 óÌ  € \         pV P                  R 4      '       d   \        RR/4      R3# V '       dN   \        P                  P                  \        P                  P                  W4      4      '       d   \        W4      # \        P                  P                  VR4      p\        P                  P                  V4      '       d   \        VR4      # \        RRRRRV/4      R	3# )
zapi/rk  r¢  r£  z
index.htmlz!Garden Tracker frontend not builtr^  z>Build the React client and place output in GARDEN_CLIENT_DIST.Údisti÷  )r   rù   r   r  r  Úexistsr�   r
   )r  Údist_dirÚ
index_paths   &  r-   Úspark  0  s»   € ô "€HØ‡��v×ÒÜ˜ Ð-Ó.°Ð3Ð3ß”—‘—‘œrŸw™wŸ|™|¨HÓ;×<Ò<Ü" 8Ó2Ð2Ü—‘—‘˜h¨Ó5€JÜ	‡w�w‡~�~�j×!Ò!Ü" 8¨\Ó:Ð:ÜàÐ8ØÐWØ�Hð	
óð ðð r,   >   ÚpruneÚwaterrD  rP  Ú	test_tankÚharvest_check>   Údiedrº  ÚarchivedÚ	harvested>   rp  rÒ  rD  ÚprunedÚseededÚwateredrr  Ú
fertilizedÚ
germinatedr™   Útrue_leavesr¶   )rå  )NF)é   )rË  ÚfaviconÚ
mobilemenuÚ
mobilecartÚ
empty_cartz
green-lushÚheaderÚfooterÚ
newsletterzsearch-iconz	group.pngz
ngb-footerÚfontawesomeÚ
brands_secÚ	solid_secÚregular_sec))zJohnny's Selected Seedszhttps://www.johnnyseeds.com/rˆ  )zTotally Tomatoeszhttps://www.totallytomato.com/z{base_url}/search?q={query}>   ro  rp  rn  ÚgmoÚmixr<  ÚblendÚmixedÚcommonÚhybridÚgenericrY  ÚregularÚtreatedr  rw   ÚheirloomÚimprovedÚpelletedÚstandardÚ	untreatedÚtraditionalúnon gmoúnon-gmoúopen pollinatedúopen-pollinated)ÚerucaÚrocketÚroquette)Úmaizezzea maysÚzea)Ú	auberginezsolanum melongena)Ú	corianderÚ
coriandrum)zgreen onionzallium fistulosum)Ú	courgetteÚ	cucurbita)r²  r=   )é   )é   )Nr²  )Frx   )ñÚ__doc__r�  rÁ   rÚ   Úloggingr  r  r  re  Úurllib.errorr×   Úurllib.parseÚurllib.requestr   r   r   Údecimalr   r)   Úflaskr   r   r   r	   r
   Úwerkzeug.utilsr   Úblueprints.alertsr   r   Úconfigr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Ú	getLoggerÚ__name__rÍ  ÚbpÚcursorsÚ
DictCursorr+   rH  rÁ  rÀ  rÖ  r~  ÚLockr}  rL  r  r   rð  r  rM  rè  r  r.   r;   rB   rF   rN   rP   rd   rl   r\   r®  r|   r‚   r‹   rˆ   r“   r•   r¤   rª   r®   r±   r´   r¹   r¼   rÐ   rá   rç   rí   rt  Ú	frozensetrÿ  r   r0  rZ   r”  r—  rü   r  r  r  r!  r'  r*  r/  r1  r9  r=  rC  rI  rP  rT  re  rr  rv  r|  r‚  r’  r•  r›  rŸ  r£  r©  r­  r±  r¶  r¢  rÔ  rã  ré  rí  rð  rú  rû  rý  r  r  r  r  r#  r,  r1  rG  rS  rO  rb  r  r[  rz  r€  r…  rN  rM  r“  r•  rB  rP  rº  rÀ  rÂ  rF  rÅ  rÈ  rÑ  rá  rí  rð  r   rô  rø  rþ  r  r  r  r!  r-  r@  rL  rR  rZ  rv  r{  r  Úbefore_app_requestr�  Úrouter†  r‹  rŽ  r–  r˜  r   r¤  r©  r¯  r´  r¸  rÅ  rÇ  rË  rÍ  rÐ  rÙ  rÛ  rÝ  rà  ræ  ré  rí  rñ  rü  rþ  r
  r  r  r  r  r   r'  r1  r4  r6  r:  r@  rB  rJ  rL  rN  rQ  rY  r[  r`  rb  rd  rk  r(   r,   r-   Ú<module>r·     sý
  ðÙ LÛ Û 	Û Û Û 	Û 	Û Û Û Û Û ß .Ñ .Ý ã ß LÕ LÝ *ç O÷÷ ÷ ÷ ñ ð$ 
×	Ò	˜8Ó	$€áˆ Ó)€ð ˆJØ
ˆJØ
ˆJØ�Ø�Ø�7—?‘?×-Ñ-ð€	ò U€
Ú<€Ø˜nÐ-Ð ò€ð !Ð Ø—’Ó!€Ù›EÐ Ø!ŸšÓ(Ð Ù!›eÐ Ø Ð ØÐ ØÐ Ø4Ð ò(ò	ò6ò-òòòg$ôT
?òð€ò"!ò)ô
ò
1ôgòòò>ò"Fòòòòò)ôX0òò"ð +€Ù!Ð#9Ð;RÐ"SÓTÐ Ù"Ð$8Ð#9Ó:Ð ð"Ð ð
Ð ñ "ò #ó Ð ð Ð.Ø
Ð(ØÐ2ØÐ+ØÐ4ØÐ*ðÐ òòô"ò"5ò
ò
\ôZòò*1òFò
ò
Rò	8ò&òRòòò:ô
òôò@&ò
ô
ôô$Iòòô&
ôiò(
;ô=ð@ 59Ð@Pô ô4òDð !Ð ò	òòò	òò
ò"òJò ò  &òFò6&ò2&òò"ò%òP1ô"ò"Tô=ô 1ò:ò&ô6.ò4mð` 4Hô òò?òAôò*	Iòqòh"òJò,*òò19ôhMò`6ô
$òNò,ò
òòBò.8ô
òQòh"ò(ð ×Òñó ðð ‡‚ˆ-Óñó ðð ‡‚ˆ/ E 7€Ó+ñó ,ðð ‡‚ˆ/ E 7€Ó+ñ ó ,ð ðF ‡‚Ð
%°¨w€Ó7ñó 8ðð" ‡‚Ð
¨%¨€Ó1ñó 2ðð ‡‚Ð
¨&¨€Ó2ñ ó 3ð ðF ‡‚Ð
0¸5¸'€ÓBñ&ó Cð&ðR ‡‚Ð
0¸8¸*€ÓEñó Fðð" ‡‚ˆ- % €Ó)ñó *ðð& ‡‚Ð
+°e°W€Ó=ñó >ðð( ‡‚Ð
&°°€Ó8ñó 9ðð@ ‡‚ˆ- & €Ó*ñdó +ðdðN ‡‚Ð
&°°€Ó8ñ,ó 9ð,ð^ ‡‚Ð
0¸6¸(€ÓCñ:ó Dð:ðz ‡‚Ð
&°°
€Ó;ñó <ðð ‡‚Ð
-¸°w€Ó?ñó @ðð( ‡‚Ð
-¸°x€Ó@ñ.ó Að.ðb ‡‚Ð
<ÀuÀg€ÓNñQó OðQðh ‡‚Ð
<ÀxÀj€ÓQñó Rðð( ‡‚Ð
,Ó-ñ1ó .ð1ð ‡‚Ð
Óñ%>ó ð%>ðP ‡‚ˆ,  €Ó(ñó )ðð( ‡‚ˆ,  €Ó)ñ$ó *ð$ðN ‡‚Ð
$¨u¨g€Ó6ñ$ó 7ð$ðN ‡‚Ð
0¸6¸(€ÓCñRó DðRðj ‡‚Ð
6ÀÀ€ÓIñó Jðð2 ‡‚Ð
0¸6¸(€ÓCñ(ó Dð(ðV ‡‚Ð
0¸8¸*€ÓEñ(ó Fð(ðV ‡‚Ð
8À7ÈFÐBS€ÓTñ*ó Uð*ðZ ‡‚Ð
$¨u¨g€Ó6ñ+ó 7ð+ð\ ‡‚Ð
$¨x¨j€Ó9ñó :ðð ‡‚Ð
/¸'¸€ÓCñó Dðð: ‡‚ˆ,  €Ó(ñó )ððD ‡‚ˆ,  €Ó)ñ"ó *ð"ðJ ‡‚Ð
$¨u¨g€Ó6ñ)ó 7ð)ðX ‡‚Ð
$¨x¨j€Ó9ñó :ðð ‡‚Ð
-¸°w€Ó?ñó @ðð$ ‡‚Ð
-¸°x€Ó@ñ ó Að ðL ‡‚Ð
 U G€Ó,ñó -ðð( ‡‚Ð
 V H€Ó-ñ#ó .ð#ðL ‡‚Ð
,°u°g€Ó>ñ+ó ?ð+ð\ ‡‚Ð
,°x°j€ÓAñó Bðð ‡‚Ð
5À¸x€ÓHñ(ó Ið(ð\ ‡‚Ð
Óñ?ó ð?ðJ ‡‚Ð
Óñó ðð ‡‚Ð
Óñ+ó ð+ð\ ‡‚Ð
Óñó ðð0 ‡‚Ð
Ó ñó !ðð$ ‡‚ˆ#˜ ˜€Ó%Ø‡‚ˆ.Óñó ó &òr,   