{"behavior":"degenerate_repetition","label_filter":null,"limit":10,"next_offset":37407,"offset":37397,"previous_offset":null,"rows":[{"assistant_initiates":false,"asst_text":"Here is a crafted pair of original and rewritten SQL queries based on the specified criteria and following the pattern demonstrated in the example.\n\n[ORIGINAL QUERY]\n```sql\nSELECT i.i_item_id item_id,\n       AVG(ws.ws_ext_sales_price) avg_web_sales,\n       SUM(cs.cs_ext_sales_price) catalog_sales_revenue\nFROM web_sales ws\nJOIN item i ON ws.ws_item_sk = i.i_item_sk\nJOIN date_dim dd ON ws.ws_ship_date_sk = dd.d_date_sk\nJOIN catalog_sales cs ON cs.cs_sold_date_sk = dd.d_date_sk\nJOIN customer cu ON cs.cs_bill_customer_sk = cu.c_customer_sk\nWHERE dd.d_date BETWEEN (\n    SELECT MIN(d_date)\n    FROM date_dim\n    WHERE d_year = 2000\n) AND (\n    SELECT MIN(d_date) + 7 \n    FROM date_dim\n    WHERE d_year = 2000\n)\nGROUP BY i.i_item_id\nHAVING SUM(cs.cs_ext_sales_price) > 10000\nORDER BY item_id;\n```\n\n[REWRITTEN QUERY]\n```sql\nWITH date_range AS (\n    SELECT MIN(d_date) min_date, MIN(d_date) + 7 max_date\n    FROM date_dim\n    WHERE d_year = 2000\n)\nSELECT i.i_item_id item_id,\n       AVG(ws.ws_ext_sales_price) avg_web_sales,\n       SUM(cs.cs_ext_sales_price) catalog_sales_revenue\nFROM web_sales ws\nJOIN item i ON ws.ws_item_sk = i.i_item_sk\nJOIN date_dim dd ON ws.ws_ship_date_sk = dd.d_date_sk\nJOIN catalog_sales cs ON cs.cs_sold_date_sk = dd.d_date_sk\nJOIN customer cu ON cs.cs_bill_customer_sk = cu.c_customer_sk\nWHERE dd.d_date BETWEEN (SELECT min_date FROM date_range) AND (SELECT max_date FROM date_range)\nGROUP BY i.i_item_id\nHAVING SUM(cs.cs_ext_sales_price) > 10000\nORDER BY item_id;\n```\n\n### Explanation\n1. **Original Query**: \n   - It involves two fact tables `web_sales` and `catalog_sales`.\n   - Uses four joins; it joins `web_sales` with `item`, `date_dim`, `catalog_sales`, and `customer`.\n   - Aggregates data using SUM and AVG functions.\n   - Filters results using MIN and SUM operators in the `WHERE` and `HAVING` clauses.\n\n2. **Rewritten Query**: \n   - Introduces a Common Table Expression (CTE) `date_range` to handle the date filtering logic extracted from the original query.\n   - The CTE fetches the minimum date for the year 2000 and calculates a date range for a week.\n   - The query logic in the main SELECT is simplified by using references to the CTE instead of repeating logic.\n   - This rewriting reduces repetitive calculations, improves clarity, and helps in potential performance optimizations in complex scenarios.","behavior":"degenerate_repetition","conversation_hash":"dac2a876573079c0442eea9d59d24ddc","conversation_redacted":false,"conversation_toxic":false,"country":"Switzerland","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"English","model":"gpt-4o-2024-08-06","n_chars":7421,"n_turns_in_conversation":1,"n_words":923,"source_row_offset":37397,"source_shard":"turns-00050.parquet","timestamp":"Tue, 12 Nov 2024 13:40:09 GMT","turn_id":"90524e6a2426fc556c263ce6","turn_index":0,"user_text":"You are a database expert and SQL optimizer. You will be given a SQL query and its rewritten variant. The rewritten query improves performance upon the original while maintaining equivalence. Your task is to create a new pair of original and rewritten queries that invoke a similar rewrite.\n\n[ORIGINAL QUERY]```with ss_items as (select i_item_id item_id ,sum(ss_ext_sales_price) ss_item_rev from store_sales ,item ,date_dim where ss_item_sk = i_item_sk and d_date in (select d_date from date_dim where d_week_seq = (select d_week_seq from date_dim where d_date = '2001-06-16')) and ss_sold_date_sk = d_date_sk group by i_item_id), cs_items as (select i_item_id item_id ,sum(cs_ext_sales_price) cs_item_rev from catalog_sales ,item ,date_dim where cs_item_sk = i_item_sk and d_date in (select d_date from date_dim where d_week_seq = (select d_week_seq from date_dim where d_date = '2001-06-16')) and cs_sold_date_sk = d_date_sk group by i_item_id), ws_items as (select i_item_id item_id ,sum(ws_ext_sales_price) ws_item_rev from web_sales ,item ,date_dim where ws_item_sk = i_item_sk and d_date in (select d_date from date_dim where d_week_seq =(select d_week_seq from date_dim where d_date = '2001-06-16')) and ws_sold_date_sk = d_date_sk group by i_item_id) select ss_items.item_id ,ss_item_rev ,ss_item_rev/((ss_item_rev+cs_item_rev+ws_item_rev)/3) * 100 ss_dev ,cs_item_rev ,cs_item_rev/((ss_item_rev+cs_item_rev+ws_item_rev)/3) * 100 cs_dev ,ws_item_rev ,ws_item_rev/((ss_item_rev+cs_item_rev+ws_item_rev)/3) * 100 ws_dev ,(ss_item_rev+cs_item_rev+ws_item_rev)/3 average from ss_items,cs_items,ws_items where ss_items.item_id=cs_items.item_id and ss_items.item_id=ws_items.item_id and ss_item_rev between 0.9 * cs_item_rev and 1.1 * cs_item_rev and ss_item_rev between 0.9 * ws_item_rev and 1.1 * ws_item_rev and cs_item_rev between 0.9 * ss_item_rev and 1.1 * ss_item_rev and cs_item_rev between 0.9 * ws_item_rev and 1.1 * ws_item_rev and ws_item_rev between 0.9 * ss_item_rev and 1.1 * ss_item_rev and ws_item_rev between 0.9 * cs_item_rev and 1.1 * cs_item_rev order by item_id ,ss_item_rev limit 100;```\n\n[REWRITTEN QUERY]```with dates as (select d_date from date_dim where d_week_seq = (select d_week_seq from date_dim where d_date = '2001-06-16')), ss_items as (select i_item_id item_id ,sum(ss_ext_sales_price) ss_item_rev from store_sales ,item ,date_dim where ss_item_sk = i_item_sk and d_date in (select d_date from dates) and ss_sold_date_sk = d_date_sk group by i_item_id), cs_items as (select i_item_id item_id ,sum(cs_ext_sales_price) cs_item_rev from catalog_sales ,item ,date_dim where cs_item_sk = i_item_sk and d_date in (select d_date from dates) and cs_sold_date_sk = d_date_sk group by i_item_id), ws_items as (select i_item_id item_id ,sum(ws_ext_sales_price) ws_item_rev from web_sales ,item ,date_dim where ws_item_sk = i_item_sk and d_date in (select d_date from dates) and ws_sold_date_sk = d_date_sk group by i_item_id) select ss_items.item_id ,ss_item_rev ,ss_item_rev/((ss_item_rev+cs_item_rev+ws_item_rev)/3) * 100 ss_dev ,cs_item_rev ,cs_item_rev/((ss_item_rev+cs_item_rev+ws_item_rev)/3) * 100 cs_dev ,ws_item_rev ,ws_item_rev/((ss_item_rev+cs_item_rev+ws_item_rev)/3) * 100 ws_dev ,(ss_item_rev+cs_item_rev+ws_item_rev)/3 average from ss_items,cs_items,ws_items where ss_items.item_id=cs_items.item_id and ss_items.item_id=ws_items.item_id and ss_item_rev between 0.9 * cs_item_rev and 1.1 * cs_item_rev and ss_item_rev between 0.9 * ws_item_rev and 1.1 * ws_item_rev and cs_item_rev between 0.9 * ss_item_rev and 1.1 * ss_item_rev and cs_item_rev between 0.9 * ws_item_rev and 1.1 * ws_item_rev and ws_item_rev between 0.9 * ss_item_rev and 1.1 * ss_item_rev and ws_item_rev between 0.9 * cs_item_rev and 1.1 * cs_item_rev order by item_id ,ss_item_rev limit 100;```\n\nNow, consider the TPC-DS schema and create a new original and equivalent rewritten query pair such that the rewrite operation is similar to the provided demonstration.Keep the following points in mind while creating the new query pair:\n1. The original query must not have any CTEs.\n2. The original query must make use of the following fact tables: ['web_sales', 'catalog_sales']. Below is the join graph for these fact tables:\n    ['web_sales(ws_ship_date_sk) references date_dim(d_date_sk);', 'web_sales(ws_ship_hdemo_sk) references household_demographics(hd_demo_sk);', 'web_sales(ws_item_sk) references item(i_item_sk);']\n    ['catalog_sales(cs_bill_customer_sk) references customer(c_customer_sk);', 'catalog_sales(cs_bill_addr_sk) references customer_address(ca_address_sk);', 'catalog_sales(cs_sold_date_sk) references date_dim(d_date_sk);']\n5. The original query must employ 4 joins.\n6. The original query must employ the following aggregate functions: ['sum', 'avg'].\n7. The original query must employ the following operators in its WHERE clause: ['min', 'sum'].\n8. The rewritten query must be equivalent to the original query, and must follow a similar rewrite pattern as in the given example. Enclose the original and rewritten queries within ``` and ```."},{"assistant_initiates":false,"asst_text":"other","behavior":"degenerate_repetition","conversation_hash":"971f8de2c3ee4cdebc21b8a71c187da3","conversation_redacted":false,"conversation_toxic":false,"country":"South Korea","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"English","model":"gpt-4o-2024-08-06","n_chars":1445,"n_turns_in_conversation":1,"n_words":228,"source_row_offset":37398,"source_shard":"turns-00050.parquet","timestamp":"Tue, 12 Nov 2024 13:40:17 GMT","turn_id":"eb1996b8a007c737384441bf","turn_index":0,"user_text":"System: I will provide you with a textual user review of an Android app, aiming to categorize the reviews into specific intention classes:\nbug report: report a problem, such as faulty behavior of the application. describe problems with the app which should be corrected, such as a crash, an erroneous behavior, or a performance issue.\nfeature request: ask for a missing feature, functionality or content, as well as reviews that ask for the improvement of an existing feature.\nother: users express general appreciation with the application. It focuses on general judgment. They are simple text reflections of the numeric star rating. Ratings are less informative as they only include praise, dispraise, a distractive critique, or a dissuasion. Reviews where users describe workarounds, use cases and scenarios involving the app\nexamples:\n\nreview: force close.. pls fix ooppssss.. its not working properly... when game starts its attempting to force close... please fix this bug... iam unable to play this game..\nintention: bug report\nreview: Good not best We cannot update status like skype! Upgrade with status eg online! Invinsible! Offline!\nintention: feature request\nreview: very easy and good game ggsrhjuvdsh\nintention: other\nUser: 'Does the author's intention in this app review relate to a bug report or feature request or other?\nreview: best weather app great app  easy to use and looks great on my droid.'\nintention: '\nAssistant:"},{"assistant_initiates":false,"asst_text":"\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435!\n\n\u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0434\u043d\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 **\u041d\u0415 \u0423\u041f\u0410\u041a\u041e\u0412\u0410\u041d\u041d\u042b\u0415** \u0437\u0430\u043f\u0438\u0441\u0438 \u0441 \u0442\u0438\u043f\u043e\u043c \u0410\u0420\u041c\u0410 **\"RPA\"**, \u0431\u0443\u0434\u0443\u0442 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u044b \u0446\u0432\u0435\u0442\u043e\u043c \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435. \u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0437\u0430 \u0434\u0435\u043d\u044c \u0431\u0443\u0434\u0443\u0442 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u044b, \u0437\u0430\u043b\u0438\u0432\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u0441\u0447\u0435\u0437\u043d\u0443\u0442\u044c.\n\n\u0412 \u0432\u0430\u0448\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 `<select>` \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0434\u043d\u044f, \u043c\u0435\u0441\u044f\u0446\u0430 \u0438 \u0433\u043e\u0434\u0430. \u041e\u0434\u043d\u0430\u043a\u043e, \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0441\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 `<option>` \u0432\u043d\u0443\u0442\u0440\u0438 `<select>` \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0432\u043e \u0432\u0441\u0435\u0445 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\u0445. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u043c\u0443 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044e \u0437\u0430\u043b\u0438\u0432\u043a\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0434\u043d\u0435\u0439.\n\n### \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0420\u0435\u0448\u0435\u043d\u0438\u0435: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u041a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044f \u0441 \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0412\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0414\u043d\u0435\u0439\n\n\u0414\u043b\u044f \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c **\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044f**, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0434\u043d\u0438. \u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0438 \u0433\u0438\u0431\u043a\u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 [**Flatpickr**](https://flatpickr.js.org/).\n\n### \u0428\u0430\u0433\u0438 \u0434\u043b\u044f \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:\n\n1. **\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f Flatpickr:**\n\n   - **\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Flatpickr:**\n     \n     \u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 CSS \u0438 JS Flatpickr \u0432 \u0432\u0430\u0448 HTML-\u0448\u0430\u0431\u043b\u043e\u043d. \u0422\u0430\u043a\u0436\u0435 \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d jQuery, \u0435\u0441\u043b\u0438 \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.\n\n     ```html\n     <!DOCTYPE html>\n     <html lang=\"ru\">\n     <head>\n         <meta charset=\"UTF-8\">\n         <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n         <title>\u0420\u0430\u0431\u043e\u0447\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430</title>\n         <link rel=\"stylesheet\" href=\"{{ url_for('static', filename='styles_welcome.css') }}\">\n         <!-- \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 Flatpickr CSS -->\n         <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css\">\n         <script src=\"https://code.jquery.com/jquery-3.6.0.min.js\"></script>\n         <!-- \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 Flatpickr JS -->\n         <script src=\"https://cdn.jsdelivr.net/npm/flatpickr\"></script>\n         <script src=\"{{ url_for('static', filename='js/utils.js') }}\"></script>\n         <script src=\"{{ url_for('static', filename='js/table.js') }}\"></script>\n         <script src=\"{{ url_for('static', filename='js/date.js') }}\"></script>\n         <script src=\"{{ url_for('static', filename='js/statistics.js') }}\"></script>\n         <script src=\"{{ url_for('static', filename='js/connectedUser.js') }}\"></script>\n     </head>\n     <body>\n         <div class=\"header\">\n             <h1>\u0420\u0430\u0431\u043e\u0447\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430</h1>\n             <div class=\"user-info\">\n                 <span>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c: {{ name }}</span>\n                 <a href=\"/logout\" class=\"logout-button\">\u0412\u044b\u0445\u043e\u0434</a>\n             </div>\n         </div>\n \n         <div class=\"content-wrapper\">\n             <!-- \u0423\u0434\u0430\u043b\u0438\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0435\u043b\u0435\u043a\u0442\u044b \u0434\u043b\u044f \u0434\u0430\u0442\u044b -->\n             \n             <div class=\"date-selector\">\n                 <input type=\"text\" id=\"datepicker\" placeholder=\"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u0430\u0442\u0443\" readonly>\n             </div>\n \n             <!-- \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u0430\u0448\u0435\u0433\u043e HTML -->\n             <!-- ... -->\n         </div>\n     </body>\n     </html>\n     ```\n\n2. **\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Backend:**\n\n   \u0412\u0430\u0448 Flask \u043c\u0430\u0440\u0448\u0440\u0443\u0442 `/get_unpacked_days` \u0443\u0436\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u043d\u0438 \u0441 \u043d\u0435\u043e\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u044f\u0446\u0430 \u0438 \u0433\u043e\u0434\u0430. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e.\n\n3. **\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Frontend:**\n\n   \u0418\u0437\u043c\u0435\u043d\u0438\u043c JavaScript, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Flatpickr \u0438 \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c \u0434\u043d\u0438 \u0441 \u043d\u0435\u043e\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438.\n\n   ```javascript\n   // js/date.js\n\n   // \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u043d\u0435\u0439 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u044f\u0446\u0430 \u0438 \u0433\u043e\u0434\u0430\n   function fetchUnpackedDays(year, month) {\n       return $.ajax({\n           url: '/get_unpacked_days',\n           type: 'GET',\n           data: { year: year, month: month },\n           success: function(response) {\n               if (response.status === 'success') {\n                   return response.unpacked_days;\n               } else {\n                   console.error('\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043d\u0435\u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u043d\u0435\u0439:', response.message);\n                   return [];\n               }\n           },\n           error: function(xhr, status, error) {\n               console.error('\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043d\u0435\u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u043d\u0435\u0439:', error);\n               return [];\n           }\n       });\n   }\n\n   $(document).ready(function() {\n       // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Flatpickr\n       flatpickr(\"#datepicker\", {\n           dateFormat: \"Y-m-d\",\n           defaultDate: \"today\",\n           locale: \"ru\",\n           onMonthChange: function(selectedDates, dateStr, instance) {\n               highlightUnpackedDays(instance.currentYear, instance.currentMonth + 1);\n           },\n           onYearChange: function(selectedDates, dateStr, instance) {\n               highlightUnpackedDays(instance.currentYear, instance.currentMonth + 1);\n           },\n           onReady: function(selectedDates, dateStr, instance) {\n               const date = instance.selectedDates[0] || new Date();\n               highlightUnpackedDays(date.getFullYear(), date.getMonth() + 1);\n           },\n           onChange: function(selectedDates, dateStr, instance) {\n               // \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u043d\u043e\u0432\u043e\u0439 \u0434\u0430\u0442\u044b\n               updateTable();\n           }\n       });\n\n       // \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u043d\u0435\u0439\n       function highlightUnpackedDays(year, month) {\n           fetchUnpackedDays(year, month).then(function(unpacked_days) {\n               // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434 'addDay' \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0434\u043d\u044f\n               flatpickr(\"#datepicker\").destroy(); // \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 flatpickr\n               \n               // \u0420\u0435\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c flatpickr \u0441 \u043d\u043e\u0432\u044b\u043c\u0438 \u0434\u043d\u044f\u043c\u0438\n               flatpickr(\"#datepicker\", {\n                   dateFormat: \"Y-m-d\",\n                   defaultDate: `${year}-${String(month).padStart(2, '0')}-01`,\n                   locale: \"ru\",\n                   onMonthChange: function(selectedDates, dateStr, instance) {\n                       highlightUnpackedDays(instance.currentYear, instance.currentMonth + 1);\n                   },\n                   onYearChange: function(selectedDates, dateStr, instance) {\n                       highlightUnpackedDays(instance.currentYear, instance.currentMonth + 1);\n                   },\n                   onReady: function(selectedDates, dateStr, instance) {\n                       const date = instance.selectedDates[0] || new Date();\n                       highlightUnpackedDays(date.getFullYear(), date.getMonth() + 1);\n                   },\n                   onChange: function(selectedDates, dateStr, instance) {\n                       updateTable();\n                   },\n                   onDayCreate: function(dObj, dStr, fp, dayElem) {\n                       const day = dayElem.dateObj.getDate();\n                       if (unpacked_days.includes(day)) {\n                           // \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0441\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438\n                           dayElem.classList.add('unpacked-day');\n                       }\n                   }\n               });\n           });\n       }\n\n       // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438\n       const initialDate = flatpickr(\"#datepicker\").selectedDates[0] || new Date();\n       highlightUnpackedDays(initialDate.getFullYear(), initialDate.getMonth() + 1);\n   });\n   ```\n\n4. **\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0421\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438:**\n\n   \u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0441\u0442\u0438\u043b\u0438 \u0434\u043b\u044f \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u043d\u0435\u0439 \u0441 \u043d\u0435\u043e\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438.\n\n   ```css\n   /* static/styles_welcome.css */\n\n   .flatpickr-day.unpacked-day {\n       background-color: lightcoral !important;\n       color: white !important;\n   }\n\n   .flatpickr-day.unpacked-day:hover {\n       background-color: darkred !important;\n       color: white !important;\n   }\n   ```\n\n5. **\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0424\u0443\u043d\u043a\u0446\u0438\u0438 `updateTable` \u0438 `markUnpackedDays`:**\n\n   \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Flatpickr, \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0435\u043b\u0435\u043a\u0442\u0430\u043c\u0438, \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445.\n\n   \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e `updateTable` \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u0434\u0430\u0442\u0443 \u0438\u0437 Flatpickr:\n\n   ```javascript\n   function getSelectedDate() {\n       return $('#datepicker').val();\n   }\n   ```\n\n   \u0423\u0434\u0430\u043b\u0438\u0442\u0435 \u0438\u043b\u0438 \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0441\u0435\u043b\u0435\u043a\u0442\u044b \u0434\u043b\u044f \u0434\u043d\u044f, \u043c\u0435\u0441\u044f\u0446\u0430 \u0438 \u0433\u043e\u0434\u0430, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432.\n\n6. **\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u041c\u0430\u0440\u0448\u0440\u0443\u0442\u0430 /welcome:**\n\n   \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432\u0430\u0448 HTML \u0448\u0430\u0431\u043b\u043e\u043d \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0442\u0430\u0440\u044b\u0445 \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0432 \u0434\u043b\u044f \u0434\u0430\u0442\u044b \u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 `input` \u0441 id `datepicker`.\n\n   ```html\n   <!-- \u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e HTML \u0443\u0447\u0430\u0441\u0442\u043a\u0430 -->\n\n   <div class=\"date-selector\">\n       <input type=\"text\" id=\"datepicker\" placeholder=\"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u0430\u0442\u0443\" readonly>\n   </div>\n   ```\n\n### \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f:\n\n- **\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u041a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044f \u043f\u0440\u0438 \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0417\u0430\u043f\u0438\u0441\u0435\u0439:**\n  \n  \u041f\u0440\u0438 \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0435 \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 `update_queue`, \u0447\u0442\u043e\u0431\u044b \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434 \u043c\u043e\u0433 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u043d\u0435\u0439 \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n\n- **\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0417\u0430\u043f\u0440\u043e\u0441\u043e\u0432:**\n  \n  \u0412\u043c\u0435\u0441\u0442\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Flatpickr \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 `highlightUnpackedDays`, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0434\u043d\u0435\u0439. \u042d\u0442\u043e \u0441\u043d\u0438\u0437\u0438\u0442 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0438 \u0443\u043b\u0443\u0447\u0448\u0438\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c.\n\n- **\u0423\u0447\u0435\u0442 \u0413\u043e\u0434\u0430 \u0438 \u041c\u0435\u0441\u044f\u0446\u0430 \u0412 Flask:**\n  \n  \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0434\u0430\u0442\u044b \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 `YYYY-MM-DD`, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0435\u0439 \u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c.\n\n### \u041f\u0440\u0438\u043c\u0435\u0440 \u041f\u043e\u043b\u043d\u043e\u0439 \u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 Flatpickr \u0441 \u0412\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u0414\u043d\u0435\u0439:\n\n\u0412\u043e\u0442 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c Flatpickr \u0441 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u0434\u043d\u0435\u0439:\n\n```javascript\n$(document).ready(function() {\n    const fp = flatpickr(\"#datepicker\", {\n        dateFormat: \"Y-m-d\",\n        locale: \"ru\",\n        onMonthChange: function(selectedDates, dateStr, instance) {\n            updateDays(instance.currentYear, instance.currentMonth + 1);\n        },\n        onYearChange: function(selectedDates, dateStr, instance) {\n            updateDays(instance.currentYear, instance.currentMonth + 1);\n        },\n        onReady: function(selectedDates, dateStr, instance) {\n            updateDays(instance.currentYear, instance.currentMonth + 1);\n        },\n        onChange: function(selectedDates, dateStr, instance) {\n            updateTable();\n        }\n    });\n\n    function updateDays(year, month) {\n        fetchUnpackedDays(year, month).then(function(unpacked_days) {\n            // \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u044b\n            $('.flatpickr-day').removeClass('unpacked-day');\n\n            unpacked_days.forEach(function(day) {\n                // Flatpickr \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u0442\u044b \u0432 \u0432\u0438\u0434\u0435 Date \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\n                const selector = `.flatpickr-day[data-date=\"${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}\"]`;\n                $(selector).addClass('unpacked-day');\n            });\n        });\n    }\n});\n```\n\n### \u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\n\n\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0434\u0430\u0442, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a Flatpickr, \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u043d\u0435\u0439 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u042d\u0442\u043e \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043e\u043f\u044b\u0442 \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u0440\u043e\u0441\u0441-\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u0443\u044e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c.\n\n\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0438\u043b\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043c\u043e\u0449\u044c \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c\u0438 \u0447\u0430\u0441\u0442\u044f\u043c\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0434\u0430\u0439\u0442\u0435 \u0437\u043d\u0430\u0442\u044c!","behavior":"degenerate_repetition","conversation_hash":"879f2502f4e267fb659952a38d79e57d","conversation_redacted":false,"conversation_toxic":false,"country":"Russia","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"English","model":"o1-mini-2024-09-12","n_chars":80355,"n_turns_in_conversation":1,"n_words":6567,"source_row_offset":37399,"source_shard":"turns-00050.parquet","timestamp":"Tue, 12 Nov 2024 13:40:28 GMT","turn_id":"023ad7d790a41fa14a4beaf0","turn_index":0,"user_text":"\u041d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0437\u0430\u043f\u0438\u0441\u0438 \u0433\u0434\u0435 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0413\u0440\u0430\u0444\u0430 \u043a\u043e\u043b\u043e\u043d\u043a\u0443 \u0438 \u0433\u0434\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0430 \u0432\u0440\u0435\u043c\u044f \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0442\u0435\u043c. \n\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a \u0447\u0442\u043e\u0431\u044b \u0435\u0441\u043b\u0438 \u0432 \u043a\u0430\u043a\u043e\u0439 \u0442\u043e \u0438\u0437 \u0434\u043d\u0435\u0439 \u0435\u0441\u0442\u044c \u041d\u0415 \u0423\u041f\u0410\u041a\u041e\u0412\u0410\u041d\u041d\u042b\u0415 \u0437\u0430\u043f\u0438\u0441\u0438, \u0422\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u043b\u0438\u0432\u043a\u0443 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u043d\u044f \u043a\u0430\u043a\u0438\u043c \u043b\u0438\u0431\u043e \u0446\u0432\u0435\u0442\u043e\u043c. \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u044d\u0442\u043e \u0432\u0441\u0435 \u0447\u0442\u043e \u044f \u0441\u043a\u0430\u0437\u0430\u043b \u0434\u043e\u043b\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043a\u043e\u043b\u043e\u043d\u043a\u043e\u0439 \u0422\u0438\u043f \u0410\u0420\u041c\u0410 \"RPA\". \n\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043b \u0432\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438, \u0437\u0430\u043b\u0438\u0432\u043a\u0430 \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442.\nfrom flask import Flask, render_template, request, redirect, make_response, jsonify, send_file, Response\nfrom flask_sqlalchemy import SQLAlchemy\nfrom sqlalchemy.sql import func\nfrom datetime import datetime, timedelta, date\nimport pandas as pd\nfrom io import BytesIO\nimport json\nimport queue\nimport logging\nfrom sqlalchemy import cast, Integer, or_\nimport os\n\n\n\napp = Flask(__name__)\n\napp.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///table_data.db'\napp.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False\ndb = SQLAlchemy(app)\n\n\n\nclass TableRow(db.Model):\n    id = db.Column(db.Integer, primary_key=True)\n    date = db.Column(db.String(10), nullable=False)\n    row_number = db.Column(db.String(10))\n    timestamp = db.Column(db.String(50))\n    number = db.Column(db.String(50))\n    serial = db.Column(db.String(50))\n    dl_number = db.Column(db.String(50))\n    worker_name = db.Column(db.String(100))\n    pack_time = db.Column(db.String(50))\n    last_graf = db.Column(db.String(50))\n    arma_type = db.Column(db.String(50))\n\n\nclass DLCounter(db.Model):\n    id = db.Column(db.Integer, primary_key=True)\n    date = db.Column(db.String(10), unique=True, nullable=False)\n    counter = db.Column(db.Integer, nullable=False)\n\n    def __repr__(self):\n        return f'<DLCounter {self.date}: {self.counter}>'\n\n\nclass User(db.Model):\n    id = db.Column(db.Integer, primary_key=True)\n    username = db.Column(db.String(80), unique=True, nullable=False)\n    login_history = db.relationship('LoginHistory', backref='user', lazy=True)\n\n\nclass LoginHistory(db.Model):\n    id = db.Column(db.Integer, primary_key=True)\n    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)\n    login_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)\n\n\n# \u0423\u0434\u0430\u043b\u0435\u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u044c ActiveUser\n\n\ntables = {}\ntable = [['\u2116', '\u0412\u0440\u0435\u043c\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438', '\u041d\u043e\u043c\u0435\u0440 ', 'Serial', '\u0413\u0440\u0430\u0444\u0430', '\u0418\u043c\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f','\u0412\u0440\u0435\u043c\u044f \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438' ,'\u0422\u0438\u043f \u0410\u0420\u041c\u0410', 'last_graf', '\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435']]\n# \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0434\u043b\u044f \u043d\u043e\u043c\u0435\u0440\u043e\u0432 \u0437\u0430\u043f\u0438\u0441\u0435\u0439\nrow_counter = 1\n# \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0434\u043b\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439\nupdate_queue = queue.Queue()\n\n@app.route('/get_unpacked_days', methods=['GET'])\ndef get_unpacked_days():\n    year = request.args.get('year')\n    month = request.args.get('month')\n    \n    if not year or not month:\n        return jsonify({\"status\": \"error\", \"message\": \"\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0433\u043e\u0434 \u0438 \u043c\u0435\u0441\u044f\u0446\"}), 400\n    \n    try:\n        year = int(year)\n        month = int(month)\n    except ValueError:\n        return jsonify({\"status\": \"error\", \"message\": \"\u0413\u043e\u0434 \u0438 \u043c\u0435\u0441\u044f\u0446 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0447\u0438\u0441\u043b\u0430\u043c\u0438\"}), 400\n\n    # \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u0430\u0442\u044b \u0434\u043b\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438\n    month_str = f\"{month:02d}\"\n    \n    # \u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u043d\u0438, \u0433\u0434\u0435 pack_time \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 arma_type \u0440\u0430\u0432\u0435\u043d 'RPA'\n    unpacked_dates = TableRow.query.filter(\n        TableRow.date.like(f\"{year}-{month_str}-%\"),\n        TableRow.arma_type == 'RPA',\n        or_(TableRow.pack_time == None, TableRow.pack_time == '')\n    ).with_entities(TableRow.date).distinct().all()\n    \n    # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0434\u043d\u0438 \u0438\u0437 \u0434\u0430\u0442\n    unpacked_days = set()\n    for date_str, in unpacked_dates:\n        try:\n            day = int(date_str.split('-')[2])\n            unpacked_days.add(day)\n        except (IndexError, ValueError):\n            continue  # \u041f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0434\u0430\u0442\n\n    return jsonify({'status': 'success', 'unpacked_days': list(unpacked_days)})\n\n@app.route('/stream')\ndef stream():\n    def event_stream():\n        while True:\n            try:\n                # \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u043e\u043c 20 \u0441\u0435\u043a\u0443\u043d\u0434\n                data = update_queue.get(timeout=20)\n                yield f'data: {data}\\n\\n'\n            except queue.Empty:\n                # \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c keep-alive \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043d\u0435 \u0440\u0430\u0437\u043e\u0440\u0432\u0430\u043b\u043e\u0441\u044c\n                yield ': keep-alive\\n\\n'\n    return Response(event_stream(), mimetype='text/event-stream')\n\n\n# \u0423\u0434\u0430\u043b\u0435\u043d \u043c\u0430\u0440\u0448\u0440\u0443\u0442 /ping, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b ActiveUser\n\n\n@app.route('/get_table_data')\ndef get_table_data():\n    date = request.args.get('date')\n    filter_arma = request.args.get('filter_arma')  # \u041d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\n\n    # \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\n    query = TableRow.query.filter_by(date=date)\n\n    # \u0415\u0441\u043b\u0438 \u0444\u0438\u043b\u044c\u0442\u0440 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0435\n    if filter_arma == 'RPA':\n        query = query.filter_by(arma_type='RPA')\n\n    rows = query.all()\n    data = []\n    numbers = {}\n    serials = {}\n    dl_numbers = {}  # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0434\u043b\u044f dl_numbers\n\n    for row in rows:\n        data.append({\n            'id': row.id,  # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c ID \u0437\u0430\u043f\u0438\u0441\u0438\n            'row_number': row.row_number,\n            'timestamp': row.timestamp,\n            'number': row.number,\n            'serial': row.serial,\n            'dl_number': row.dl_number,\n            'worker_name': row.worker_name,\n            'pack_time': row.pack_time,\n            'arma_type': row.arma_type,\n            'last_graf': row.last_graf\n        })\n\n        # \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u0430\u0445\n        if row.number:\n            clean_number = ''.join(filter(str.isdigit, row.number))\n            if clean_number in numbers:\n                numbers[clean_number].append(len(data) - 1)  # \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438\n            else:\n                numbers[clean_number] = [len(data) - 1]\n\n        if row.serial:\n            clean_serial = ''.join(filter(str.isdigit, row.serial))\n            if clean_serial in serials:\n                serials[clean_serial].append(len(data) - 1)  # \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438\n            else:\n                serials[clean_serial] = [len(data) - 1]\n\n        if row.dl_number:\n            clean_dl_number = ''.join(filter(str.isdigit, row.dl_number))\n            if clean_dl_number in dl_numbers:\n                dl_numbers[clean_dl_number].append(len(data) - 1)\n            else:\n                dl_numbers[clean_dl_number] = [len(data) - 1]\n\n    # \u0424\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b\n    duplicate_numbers = {k: v for k, v in numbers.items() if len(v) > 1}\n    duplicate_serials = {k: v for k, v in serials.items() if len(v) > 1}\n    duplicate_dl_numbers = {k: v for k, v in dl_numbers.items() if len(v) > 1}\n\n    return jsonify({\n        \"data\": data,\n        \"duplicates\": {\n            \"numbers\": duplicate_numbers,\n            \"serials\": duplicate_serials,\n            \"dl_numbers\": duplicate_dl_numbers  # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c dl_numbers\n        }\n    })\n\n\n@app.route('/update_table', methods=['POST'])\ndef update_table():\n    data = request.json\n    print(data)\n    date = data['date']\n    worker_name = data['worker_name']\n    arma_type = data['arma_type']\n\n    # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0434\u0430\u0442\u044b\n    row_count = TableRow.query.filter_by(date=date).count() + 1\n\n    # \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    if not data.get('number') and not data.get('serial'):\n        new_row = TableRow(\n            date=date,\n            row_number=str(row_count),\n            timestamp=data['timestamp'],\n            number='',  # \u041f\u0443\u0441\u0442\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043d\u043e\u043c\u0435\u0440\u0430\n            serial='',  # \u041f\u0443\u0441\u0442\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u0435\u0440\u0438\u0439\u043d\u043e\u0433\u043e \u043d\u043e\u043c\u0435\u0440\u0430\n            dl_number='',  # \u041f\u0443\u0441\u0442\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0433\u0440\u0430\u0444\u044b\n            worker_name=worker_name,\n            arma_type=arma_type,\n        )\n    elif not data.get('number'):\n        new_row = TableRow(\n            date=date,\n            row_number=str(row_count),\n            timestamp=data['timestamp'],\n            number='',  # \u041f\u0443\u0441\u0442\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043d\u043e\u043c\u0435\u0440\u0430\n            serial=data['serial'],\n            dl_number='',  # \u041f\u0443\u0441\u0442\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0433\u0440\u0430\u0444\u044b\n            worker_name=worker_name,\n            arma_type=arma_type,\n        )\n    else:\n        new_row = TableRow(\n            date=date,\n            row_number=str(row_count),\n            timestamp=data['timestamp'],\n            number=data['number'],\n            serial=data['serial'],\n            dl_number=data.get('dl_number', ''),\n            worker_name=worker_name,\n            arma_type=arma_type,\n        )\n\n    # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445\n    db.session.add(new_row)\n\n    # \u0420\u0430\u043d\u0435\u0435 \u0437\u0434\u0435\u0441\u044c \u0431\u044b\u043b\u0430 \u043b\u043e\u0433\u0438\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f ActiveUser, \u0443\u0434\u0430\u043b\u0438\u043c \u0435\u0435\n\n    db.session.commit()\n\n    # \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432\n    update_queue.put(json.dumps({\"type\": \"update\", \"date\": date}))\n\n    return jsonify({\"status\": \"success\"})\n\n\n@app.route('/update_graf', methods=['POST'])\ndef update_graf():\n    try:\n        data = request.json\n        row_id = int(data.get('id'))\n        new_value = data.get('new_value')\n        date = data.get('date')\n\n        if not row_id or not date:\n            return jsonify({\"status\": \"error\", \"message\": \"Missing 'id' or 'date' in request\"}), 400\n\n        # \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u043e id \u0438 \u0434\u0430\u0442\u0435\n        row = TableRow.query.filter_by(id=row_id, date=date).first()\n        if row:\n            row.dl_number = new_value\n            db.session.commit()\n            return jsonify({\"status\": \"success\"})\n        else:\n            return jsonify({\"status\": \"error\", \"message\": \"Row not found\"}), 404\n    except (ValueError, TypeError) as e:\n        return jsonify({\"status\": \"error\", \"message\": f\"Invalid input: {str(e)}\"}), 400\n    except Exception as e:\n        db.session.rollback()\n        return jsonify({\"status\": \"error\", \"message\": str(e)}), 500\n\n\n@app.route('/update_arma_type', methods=['POST'])\ndef update_arma_type():\n    try:\n        data = request.json\n        date = data['date']\n        serial = data['serial']\n        arma_type = data['arma_type']\n\n        row = TableRow.query.filter_by(date=date, serial=serial).first()\n        if row:\n            row.arma_type = arma_type\n            db.session.commit()\n            return jsonify({\"status\": \"success\"})\n        else:\n            return jsonify({\"status\": \"error\", \"message\": \"Row not found\"})\n    except Exception as e:\n        return jsonify({\"status\": \"error\", \"message\": str(e)})\n\n\n@app.route('/update_number', methods=['POST'])\ndef update_number():\n    try:\n        data = request.json\n        row_id = int(data['id'])  # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c 'id' \u0432\u043c\u0435\u0441\u0442\u043e 'row_index'\n        new_value = data['new_value']\n        date = data['date']\n\n        # \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u043e id \u0438 \u0434\u0430\u0442\u0435\n        row = TableRow.query.filter_by(id=row_id, date=date).first()\n        if row:\n            row.number = new_value\n            db.session.commit()\n            return jsonify({\"status\": \"success\"})\n        return jsonify({\"status\": \"error\", \"message\": \"Row not found\"})\n    except Exception as e:\n        db.session.rollback()\n        return jsonify({\"status\": \"error\", \"message\": str(e)})\n\n\n@app.route('/pack_item', methods=['POST'])\ndef pack_item():\n    try:\n        data = request.json\n        row_id = data['id']\n        date = data['date']\n\n        rows = TableRow.query.filter_by(id=row_id, date=date).all()\n        if rows:\n            row = rows[0]\n            pack_time = datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\")\n            row.pack_time = pack_time\n            db.session.commit()\n            \n            # \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432\n            update_queue.put(json.dumps({\"type\": \"update\", \"date\": date}))\n            \n            return jsonify({\"status\": \"success\", \"pack_time\": pack_time})\n\n        return jsonify({\"status\": \"error\", \"message\": \"\u0421\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430\"}), 404\n    except Exception as e:\n        print(f\"\u041e\u0448\u0438\u0431\u043a\u0430 \u0432 pack_item: {str(e)}\")\n        return jsonify({\"status\": \"error\", \"message\": str(e)}), 500\n\n\n\n@app.route('/set_initial_dl', methods=['POST'])\ndef set_initial_dl():\n    try:\n        data = request.json\n        if not data:\n            return jsonify({\"status\": \"error\", \"message\": \"No data received\"})\n\n        date = data.get('date')\n        initial_number = data.get('initial_number')\n\n        if not date or not initial_number:\n            return jsonify({\n                \"status\": \"error\", \n                \"message\": \"Missing required fields\",\n                \"received\": {\"date\": date, \"initial_number\": initial_number}\n            })\n\n        try:\n            initial_number = int(initial_number)\n        except ValueError:\n            return jsonify({\n                \"status\": \"error\",\n                \"message\": \"Initial number must be an integer\"\n            })\n\n        print(f\"Setting initial DL for date {date}: {initial_number}\")  # \u041e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434\n\n        dl_counter = DLCounter.query.filter_by(date=date).first()\n        if dl_counter:\n            dl_counter.counter = initial_number\n            print(f\"Updated existing counter for {date}\")  # \u041e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434\n        else:\n            dl_counter = DLCounter(date=date, counter=initial_number)\n            db.session.add(dl_counter)\n            print(f\"Created new counter for {date}\")  # \u041e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434\n\n        db.session.commit()\n        return jsonify({\n            \"status\": \"success\",\n            \"message\": f\"DL counter set to {initial_number} for date {date}\"\n        })\n\n    except Exception as e:\n        print(f\"Error in set_initial_dl: {str(e)}\")  # \u041e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434\n        db.session.rollback()\n        return jsonify({\n            \"status\": \"error\",\n            \"message\": str(e)\n        })\n\n\n@app.route('/generate_dl', methods=['POST'])\ndef generate_dl():\n    try:\n        data = request.json\n        row_id = data['id']\n        date = data['date']\n        \n        # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a DL \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0434\u0430\u0442\u044b\n        dl_counter = DLCounter.query.filter_by(date=date).first()\n        if not dl_counter:\n            return jsonify({\"status\": \"error\", \"message\": \"DL counter \u043d\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\"}), 400\n\n        # \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u043e\u0432\u044b\u0439 DL \u043d\u043e\u043c\u0435\u0440\n        dl_number = f\"DL{dl_counter.counter:06d}\"\n\n        # \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043d\u0443\u0436\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u043e id\n        row = TableRow.query.filter_by(id=row_id, date=date).first()\n        if row:\n            row.dl_number = dl_number\n            dl_counter.counter += 1  # \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a\n            db.session.commit()\n            return jsonify({\"status\": \"success\", \"dl_number\": dl_number, \"id\": row_id})\n\n        return jsonify({\"status\": \"error\", \"message\": \"\u0421\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430\"}), 404\n    except Exception as e:\n        return jsonify({\"status\": \"error\", \"message\": str(e)}), 500\n\n\n@app.route('/get_statistics')\ndef get_statistics():\n    try:\n        date = request.args.get('date')\n        current_time = datetime.now()\n        hour_ago = current_time - timedelta(hours=1)\n\n        # \u041e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439\n        total_records = TableRow.query.filter_by(date=date).filter(TableRow.pack_time.isnot(None)).count()\n\n        # \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0447\u0430\u0441\n        last_hour_records = TableRow.query.filter_by(date=date)\\\n            .filter(TableRow.pack_time.isnot(None))\\\n            .filter(TableRow.pack_time >= hour_ago.strftime(\"%Y-%m-%d %H:%M:%S\"))\\\n            .count()\n\n        return jsonify({\n            \"total_records\": total_records,\n            \"last_hour_records\": last_hour_records\n        })\n    except Exception as e:\n        return jsonify({\n            \"total_records\": 0,\n            \"last_hour_records\": 0,\n            \"error\": str(e)\n        })\n\n\n@app.route('/export_excel')\ndef export_excel():\n    try:\n        date = request.args.get('date')\n        sort_column = request.args.get('sort_column')\n        sort_order = request.args.get('sort_order')\n\n        if not date:\n            return jsonify({\"error\": \"Date parameter is required\"}), 400\n\n        # \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u043e \u0434\u0430\u0442\u0435 \u0438 \u0442\u0438\u043f\u0443 \u0410\u0420\u041c\u0410 \"RPA\"\n        query = TableRow.query.filter_by(date=date, arma_type='RPA')\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438:\n        # - dl_number \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0439\n        # - pack_time \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0439\n        query = query.filter(\n            TableRow.dl_number.isnot(None),\n            TableRow.dl_number != '',\n            TableRow.pack_time.isnot(None),\n            TableRow.pack_time != ''\n        )\n\n        # \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443, \u0435\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u0430\n        if sort_column and sort_order:\n            column_mapping = {\n                '0': TableRow.row_number,\n                '1': TableRow.timestamp,\n                '2': TableRow.number,\n                '3': TableRow.serial,\n                '4': TableRow.dl_number,\n                '5': TableRow.worker_name,\n                '6': TableRow.pack_time,  # \u0412\u0440\u0435\u043c\u044f \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438\n                '7': TableRow.arma_type,  # \u0422\u0438\u043f \u0410\u0420\u041c\u0410\n                '8': TableRow.last_graf\n            }\n            if sort_column in column_mapping:\n                column = column_mapping[sort_column]\n\n                # \u042f\u0432\u043d\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \"\u041d\u043e\u043c\u0435\u0440\" \u043a \u0446\u0435\u043b\u043e\u043c\u0443 \u0447\u0438\u0441\u043b\u0443 \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438\n                if sort_column == '2':\n                    column = cast(column, Integer)\n\n                if sort_order == 'desc':\n                    query = query.order_by(column.desc())\n                else:\n                    query = query.order_by(column.asc())\n            else:\n                return jsonify({\"error\": \"Invalid sort column\"}), 400\n\n        rows = query.all()\n\n        # \u0421\u043e\u0437\u0434\u0430\u0435\u043c DataFrame \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438\n        data = []\n        for row in rows:\n            # \u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u043c\u0435\u0440\u0430\n            try:\n                number = int(row.number) if row.number and row.number.strip() else None\n            except ValueError:\n                number = None\n\n            data.append({\n                '\u2116': row.row_number,\n                '\u0412\u0440\u0435\u043c\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438': row.timestamp,\n                '\u041d\u043e\u043c\u0435\u0440': number,\n                'Serial': row.serial,\n                '\u0413\u0440\u0430\u0444\u0430': row.dl_number,\n                '\u0418\u043c\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f': row.worker_name,\n                '\u0412\u0440\u0435\u043c\u044f \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438': row.pack_time,  # \u0412\u0440\u0435\u043c\u044f \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438\n                '\u0422\u0438\u043f \u0410\u0420\u041c\u0410': row.arma_type,  # \u0422\u0438\u043f \u0410\u0420\u041c\u0410\n                'last_graf': row.last_graf\n            })\n\n        if not data:\n            return jsonify({\"error\": \"\u041d\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044f\u043c\u0438.\"}), 400\n\n        df = pd.DataFrame(data)\n\n        # \u0421\u043e\u0437\u0434\u0430\u0435\u043c Excel \u0444\u0430\u0439\u043b\n        output = BytesIO()\n        with pd.ExcelWriter(output, engine='xlsxwriter') as writer:\n            df.to_excel(writer, index=False, sheet_name='Sheet1')\n\n            # \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\n            workbook = writer.book\n            worksheet = writer.sheets['Sheet1']\n\n            # \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0448\u0438\u0440\u0438\u043d\u0430 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432\n            for idx, col in enumerate(df.columns):\n                series = df[col]\n                max_len = max(\n                    series.astype(str).map(len).max(),\n                    len(str(col))\n                ) + 2\n                worksheet.set_column(idx, idx, max_len)\n\n                # \u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432\n                if col in ['\u041d\u043e\u043c\u0435\u0440', '\u0413\u0440\u0430\u0444\u0430']:\n                    num_format = workbook.add_format({'num_format': '0'})\n                    worksheet.set_column(idx, idx, max_len, num_format)\n\n        output.seek(0)\n\n        return send_file(\n            output,\n            mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n            as_attachment=True,\n            download_name=f'export_{date}.xlsx'\n        )\n\n    except Exception as e:\n        print(f\"Export error: {str(e)}\")\n        return jsonify({\"error\": str(e)}), 500\n\n\n@app.route('/update_serial', methods=['POST'])\ndef update_serial():\n    try:\n        data = request.json\n        row_index = int(data['row_index'])\n        new_value = data['new_value']\n        date = data['date']\n\n        rows = TableRow.query.filter_by(date=date).all()\n        if 0 <= row_index < len(rows):\n            row = rows[row_index]\n            row.serial = new_value\n            db.session.commit()\n            return jsonify({\"status\": \"success\"})\n        return jsonify({\"status\": \"error\", \"message\": \"Invalid row index\"})\n    except Exception as e:\n        db.session.rollback()\n        return jsonify({\"status\": \"error\", \"message\": str(e)})\n\n\ndef initialize_table_for_date(date):\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043b\u0438 \u0443\u0436\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0434\u0430\u0442\u044b\n    existing = TableRow.query.filter_by(date=date).first()\n    if not existing:\n        # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445\n        new_row = TableRow(\n            date=date,\n            row_number=str(1),\n            timestamp=datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\"),\n            number='',\n            serial='',\n            dl_number='',\n            worker_name='',\n            arma_type='',\n            pack_time='',\n            last_graf=''\n        )\n        db.session.add(new_row)\n        db.session.commit()\n\n\n@app.route('/update_serial_arma', methods=['POST'])\ndef update_serial_arma():\n    try:\n        data = request.json\n        date = data['date']\n        serial = data['serial']\n        arma_type = data['arma_type']\n\n        # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        new_row = TableRow(\n            date=date,\n            serial=serial,\n            arma_type=arma_type,\n            timestamp=datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\")\n        )\n\n        db.session.add(new_row)\n        db.session.commit()\n\n        return jsonify({\"status\": \"success\"})\n    except Exception as e:\n        db.session.rollback()\n        return jsonify({\"status\": \"error\", \"message\": str(e)}), 500\n\n\n# \u0423\u0434\u0430\u043b\u0435\u043d \u043c\u0430\u0440\u0448\u0440\u0443\u0442 /register_user, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b ActiveUser\n\n\n# \u0423\u0434\u0430\u043b\u0435\u043d \u043c\u0430\u0440\u0448\u0440\u0443\u0442 /get_active_users, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b ActiveUser\n\n\n@app.route('/delete_row', methods=['POST'])\ndef delete_row():\n    try:\n        data = request.json\n        row_id = data.get('id')\n\n        if not row_id:\n            return jsonify({'status': 'error', 'message': 'ID \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d'}), 400\n\n        row = TableRow.query.get(row_id)\n        if not row:\n            return jsonify({'status': 'error', 'message': '\u0417\u0430\u043f\u0438\u0441\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430'}), 404\n\n        db.session.delete(row)\n        db.session.commit()\n\n        # \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432\n        update_queue.put(json.dumps({\"type\": \"delete\", \"date\": row.date, \"id\": row.id}))\n\n        return jsonify({'status': 'success'})\n    except Exception as e:\n        db.session.rollback()\n        return jsonify({'status': 'error', 'message': str(e)}), 500\n\n\n@app.route('/', methods=['GET', 'POST'])\ndef main():\n    if request.method == 'POST':\n        worker = request.form.get('worker')\n        name = request.form.get('name')\n\n        # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0432\u0445\u043e\u0434\u0435\n        user = User.query.filter_by(username=name).first()\n        if not user:\n            user = User(username=name)\n            db.session.add(user)\n\n        login_history = LoginHistory(user=user)\n        db.session.add(login_history)\n        db.session.commit()\n\n        resp = make_response(redirect('/welcome'))\n        resp.set_cookie('worker', worker)\n        resp.set_cookie('name', name)\n        return resp\n\n    return render_template('main.html')\n\n\n@app.route('/get_current_dl', methods=['GET'])\ndef get_current_dl():\n    date = request.args.get('date')\n    if not date:\n        return jsonify({\"status\": \"error\", \"message\": \"\u0414\u0430\u0442\u0430 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430\"}), 400\n\n    dl_counter = DLCounter.query.filter_by(date=date).first()\n    if dl_counter:\n        return jsonify({\"status\": \"success\", \"current_dl\": dl_counter.counter})\n    else:\n        return jsonify({\"status\": \"error\", \"message\": \"\u0421\u0447\u0435\u0442\u0447\u0438\u043a DL \u043d\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0434\u0430\u0442\u044b\"}), 404\n\n\n@app.route('/welcome')\ndef welcome():\n    worker = request.cookies.get('worker')\n    name = request.cookies.get('name')\n\n    if not worker or not name:\n        return redirect('/')\n\n    return render_template('welcome.html', name=name, worker=worker, table=table)\n\n\n@app.route('/logout')\ndef logout():\n    resp = make_response(redirect('/'))\n    resp.delete_cookie('worker')\n    resp.delete_cookie('name')\n    return resp\n\n\nif __name__ == '__main__':\n    with app.app_context():\n        db.create_all()\n\n    logging.disable(logging.CRITICAL)\n    os.system('title \u0421\u0415\u0420\u0412\u0415\u0420')\n    app.run(host='192.168.0.234', port=80, debug=True)  #192.168.50.99\nlet isEditing = false;\nlet searchTimeout;\nlet lastUpdateTime = 0;\nconst updateInterval = 1000;\nlet eventSource;\nlet lastData = null;\nlet isDeleting = false;\n\n// \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438\nlet globalSortColumn = null;\nlet globalSortOrder = 'asc';\n\n/*function getSelectedDate() {\n    return $('#datepicker').val();\n}*/\n\n// \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\nfunction getArmaFilter() {\n    return $('#armaFilter').is(':checked') ? 'RPA' : '';\n}\n\nfunction updateTable(force = false, highlightNew = false) {\n    return new Promise((resolve, reject) => {\n        const now = Date.now();\n        if (!force && now - lastUpdateTime < updateInterval) {\n            resolve();\n            return;\n        }\n        if (isEditing) {\n            resolve();\n            return;\n        }\n\n        if (isEditing || isDeleting) { // \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430 isDeleting\n            resolve();\n            return;\n        }\n\n        $.ajax({\n            url: '/get_table_data',\n            type: 'GET',\n            data: { date: getSelectedDate(),\n            filter_arma: getArmaFilter()\n             },\n            success: function(response) {\n                var tableBody = $('#tableBody');\n\n                // \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n                updateTableContent(response.data, tableBody, highlightNew);\n\n                // \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443\n                if (globalSortColumn !== null) {\n                    sortTable(globalSortColumn, globalSortOrder);\n                }\n\n                updateStatistics();\n                lastUpdateTime = now;\n\n                // \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0438 \u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u0435\u043c \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b\n                highlightDuplicates(response.duplicates);\n\n                resolve();\n            },\n            error: function(xhr, status, error) {\n                console.error('Error updating table:', error);\n                reject(error);\n            }\n        });\n    });\n}\n\nfunction highlightDuplicates(duplicates) {\n    // \u041e\u0447\u0438\u0449\u0430\u0435\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f\n    $('#tableBody td').removeClass('duplicate-highlight');\n\n    // \u041f\u043e\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u0435\u043c \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b \u043d\u043e\u043c\u0435\u0440\u043e\u0432\n    for (let number in duplicates.numbers) {\n        duplicates.numbers[number].forEach(index => {\n            $(`#tableBody tr:eq(${index}) td:nth-child(3)`).addClass('duplicate-highlight');\n        });\n    }\n\n    // \u041f\u043e\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u0435\u043c \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u0445 \u043d\u043e\u043c\u0435\u0440\u043e\u0432\n    for (let serial in duplicates.serials) {\n        duplicates.serials[serial].forEach(index => {\n            $(`#tableBody tr:eq(${index}) td:nth-child(4)`).addClass('duplicate-highlight');\n        });\n    }\n\n    // \u041f\u043e\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u0435\u043c \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b \"\u0413\u0440\u0430\u0444\u0430\" (dl_number)\n    for (let dl_number in duplicates.dl_numbers) {\n        duplicates.dl_numbers[dl_number].forEach(index => {\n            $(`#tableBody tr:eq(${index}) td:nth-child(5)`).addClass('duplicate-highlight');\n        });\n    }\n}\n\nfunction updateCell(cell, newValue, rowId, cellIndex, rowData) {\n    console.log(`Updating cell: index=${cellIndex}, value=${newValue}, rowId=${rowId}`);\n\n    const excludedArmaTypes = [\"CFA\", \"VND\", \"SRC\"];\n\n    if (cellIndex === 4) { // \u0421\u0442\u043e\u043b\u0431\u0435\u0446 \"\u0413\u0440\u0430\u0444\u0430\"\n        if (rowData.arma_type === 'RPA' && !excludedArmaTypes.includes(rowData.arma_type)) {\n            if (newValue && newValue.startsWith('DL')) {\n                cell.text(newValue)\n                    .addClass('clickable')\n                    .css('cursor', 'pointer')\n                    .off('click') // \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438\n                    .on('click', function() {\n                        copyToClipboard(newValue);\n                        $(this).addClass('copied');\n                        setTimeout(() => {\n                            $(this).removeClass('copied');\n                        }, 200);\n                    });\n\n                // \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c data-value\n                let numericValue = parseDL(newValue) || 0;\n                cell.attr('data-value', numericValue);\n            } else {\n                cell.html('<button class=\"generate-button\">\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c</button>')\n                    .find('button')\n                    .click(function() {\n                        generateDL(rowId);\n                    });\n\n                // \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c data-value\n                cell.attr('data-value', 0);\n            }\n        } else if (!excludedArmaTypes.includes(rowData.arma_type)) {\n            if (newValue && newValue.startsWith('DL')) {\n                cell.text(newValue)\n                    .addClass('clickable')\n                    .css('cursor', 'pointer')\n                    .off('click')\n                    .on('click', function() {\n                        copyToClipboard(newValue);\n                        $(this).addClass('copied');\n                        setTimeout(() => {\n                            $(this).removeClass('copied');\n                        }, 200);\n                    });\n\n                // \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c data-value\n                let numericValue = parseDL(newValue) || 0;\n                cell.attr('data-value', numericValue);\n            } else {\n                cell.text(newValue || '');\n                // \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c data-value\n                let numericValue = parseDL(newValue) || 0;\n                cell.attr('data-value', numericValue);\n            }\n        } else {\n            cell.text(newValue || '');\n            // \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c data-value\n            let numericValue = parseDL(newValue) || 0;\n            cell.attr('data-value', numericValue);\n        }\n    } else if (cellIndex === 6) { // \u0421\u0442\u043e\u043b\u0431\u0435\u0446 \"\u0412\u0440\u0435\u043c\u044f \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438\"\n        const dlCell = cell.parent().find('td').eq(4);\n        const dlValue = dlCell.text().trim();\n        const armaType = rowData.arma_type;\n\n        if (dlValue.startsWith('DL') && !newValue && !excludedArmaTypes.includes(armaType)) {\n            cell.html('<button class=\"pack-button\">\u0423\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c</button>')\n                .find('button')\n                .click(function() {\n                    packItem(rowId);\n                });\n        } else {\n            cell.text(newValue);\n        }\n    } else if (cellIndex === 7) { // \u0421\u0442\u043e\u043b\u0431\u0435\u0446 \"\u0422\u0438\u043f \u0410\u0420\u041c\u0410\"\n        if (!newValue || newValue.trim() === '') {\n            newValue = 'RPA';\n        }\n        cell.text(newValue)\n            .toggleClass('editable', true)\n            .attr('data-column', cellIndex);\n    } else {\n        cell.text(newValue)\n            .toggleClass('editable', cellIndex === 2 || cellIndex === 3)\n            .attr('data-column', cellIndex);\n    }\n}\n\nfunction sortTable(column, order) {\n    const rows = $('#tableBody > tr').get();\n\n    rows.sort(function(a, b) {\n        let A = $(a).children('td').eq(column).text().trim();\n        let B = $(b).children('td').eq(column).text().trim();\n\n        // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0443\u0441\u0442\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\n        if (A === '' && B === '') return 0;\n        if (A === '') return order === 'asc' ? 1 : -1;\n        if (B === '') return order === 'asc' ? -1 : 1;\n\n        // \u0421\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u043b\u044f \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \"\u0413\u0440\u0430\u0444\u0430\" (dl_number) \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c data-value\n        if (column === 4) { // \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \"\u0413\u0440\u0430\u0444\u0430\"\n            let numA = parseInt($(a).children('td').eq(column).attr('data-value')) || 0;\n            let numB = parseInt($(b).children('td').eq(column).attr('data-value')) || 0;\n\n            // \u041e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\n            console.log(`\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0413\u0440\u0430\u0444\u0430: numA = ${numA}; numB = ${numB}`);\n\n            return order === 'asc' ? numA - numB : numB - numA;\n        }\n\n        // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0430\u0442 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0434\u043b\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432\n        if (column === 1 || column === 6) {  // \u0421\u0442\u043e\u043b\u0431\u0446\u044b \"\u0412\u0440\u0435\u043c\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438\" \u0438 \"\u0412\u0440\u0435\u043c\u044f \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438\"\n            let dateA = Date.parse(A);\n            let dateB = Date.parse(B);\n            if (isNaN(dateA)) dateA = 0;\n            if (isNaN(dateB)) dateB = 0;\n            return order === 'asc' ? dateA - dateB : dateB - dateA;\n        }\n\n        // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432\n        if (column === 0 || column === 2) {  // \u0421\u0442\u043e\u043b\u0431\u0446\u044b \u0441 \u0447\u0438\u0441\u043b\u0430\u043c\u0438 (\u2116 \u0438 \u041d\u043e\u043c\u0435\u0440)\n            let numA = parseFloat(A) || 0;\n            let numB = parseFloat(B) || 0;\n            return order === 'asc' ? numA - numB : numB - numA;\n        }\n\n        // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432\n        if (column === 5) {  // \u0421\u0442\u043e\u043b\u0431\u0435\u0446 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f\n            A = A.toLowerCase();\n            B = B.toLowerCase();\n        }\n\n        // \u0421\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432\n        A = A.toUpperCase();\n        B = B.toUpperCase();\n        if (A < B) return order === 'asc' ? -1 : 1;\n        if (A > B) return order === 'asc' ? 1 : -1;\n        return 0;\n    });\n\n    // \u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u0442\u0435\u043b\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    $('#tableBody').empty();\n\n    // \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a\n    $.each(rows, function(index, row) {\n        $('#tableBody').append(row);\n    });\n\n    checkDuplicates();\n    bindEventHandlers();\n}\n\nfunction parseDL(dl_number) {\n    if (typeof dl_number !== 'string') return null;\n    dl_number = dl_number.trim();\n    // \u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0435\u0435 DL123456, DL-123456, DL 123456\n    let match = dl_number.match(/^DL[-\\s]?(\\d+)$/i);\n    if (match && match[1]) {\n        return parseInt(match[1], 10);\n    }\n    return null;\n}\n\nfunction generateDL(rowId) {\n    console.log(`Generating DL for row ID ${rowId}`);\n    const selectedDate = getSelectedDate();\n    console.log(\"Selected date:\", selectedDate);\n\n    $.ajax({\n        url: '/generate_dl',\n        type: 'POST',\n        contentType: 'application/json',\n        data: JSON.stringify({\n            id: rowId,\n            date: selectedDate\n        }),\n        success: function(response) {\n            if (response.status === 'success') {\n                console.log('DL \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d:', response.dl_number);\n                var row = $(`#tableBody tr[data-id='${rowId}']`);\n                var dlCell = row.find('td:eq(4)');\n                var packCell = row.find('td:eq(6)'); // \u0421\u0442\u043e\u043b\u0431\u0435\u0446 \"\u0412\u0440\u0435\u043c\u044f \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438\"\n                var armaType = row.find('td:eq(7)').text().trim();\n\n                dlCell.text(response.dl_number)\n                    .addClass('clickable')\n                    .css('cursor', 'pointer')\n                    .off('click') // \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438\n                    .on('click', function() {\n                        copyToClipboard(response.dl_number);\n                        $(this).addClass('copied');\n                        setTimeout(() => {\n                            $(this).removeClass('copied');\n                        }, 200);\n                    });\n\n                // \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 arma_type \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\n                const excludedArmaTypes = [\"CFA\", \"VND\", \"SRC\"];\n                if (!excludedArmaTypes.includes(armaType)) {\n                    packCell.html('<button class=\"pack-button\">\u0423\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c</button>')\n                        .find('button')\n                        .click(function() {\n                            packItem(rowId);\n                        });\n                }\n\n                // \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u043b\u0435 initial-dl \u0441 \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c DL\n                loadCurrentDL();\n            } else {\n                alert('\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 DL: ' + response.message);\n            }\n        },\n        error: function(xhr, status, error) {\n            console.error('\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 DL:', status, error);\n            alert('\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 DL: ' + error);\n        }\n    });\n}\n\nfunction packItem(rowId) {\n    console.log(`\u0423\u043f\u0430\u043a\u043e\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a\u0438 ID ${rowId}`);\n    const selectedDate = getSelectedDate();\n    console.log(\"Selected date:\", selectedDate);\n\n    $.ajax({\n        url: '/pack_item',\n        type: 'POST',\n        contentType: 'application/json',\n        data: JSON.stringify({\n            id: rowId,\n            date: selectedDate\n        }),\n        success: function(response) {\n            console.log(\"\u041e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430:\", response);\n            if (response.status === 'success') {\n                var row = $(`#tableBody tr[data-id='${rowId}']`);\n                row.addClass('packed-row');\n                var cell = row.find('td:eq(6)'); // \u0421\u0442\u043e\u043b\u0431\u0435\u0446 \"\u0412\u0440\u0435\u043c\u044f \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438\"\n                cell.text(response.pack_time);\n                updateStatistics();\n\n                // \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \"\u0423\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c\", \u0442\u0430\u043a \u043a\u0430\u043a \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u0430\n                cell.find('button.pack-button').remove();\n            } else {\n                alert('\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0435: ' + response.message);\n            }\n        },\n        error: function(xhr, status, error) {\n            console.error(\"\u041e\u0448\u0438\u0431\u043a\u0430 AJAX:\", xhr, status, error);\n            alert('\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0435: ' + error);\n        }\n    });\n}\n\nfunction areSimilarNumbers(num1, num2) {\n    // \u041e\u0447\u0438\u0449\u0430\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0438 \u043e\u0442 \u043d\u0435\u0446\u0438\u0444\u0440\u043e\u0432\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0438 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432\n    const clean1 = num1.toString().replace(/\\D/g, '').trim();\n    const clean2 = num2.toString().replace(/\\D/g, '').trim();\n    \n    // \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0443\u0441\u0442\u044b\u0435 \u0438\u043b\u0438 \u0440\u0430\u0437\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b - \u043d\u0435 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b\n    if (!clean1 || !clean2 || clean1.length !== clean2.length) {\n        return false;\n    }\n    \n    // \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430 \u0442\u043e\u0447\u043d\u043e\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435\n    return clean1 === clean2;\n}\n\nfunction checkDuplicates() {\n    console.log(\"Checking for duplicates...\");\n    const rows = $('#tableBody tr');\n    \n    // \u041e\u0447\u0438\u0449\u0430\u0435\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f\n    rows.find('td').removeClass('duplicate-highlight');\n    \n    // \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u043e\u0432 \u0438 \u0438\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432\n    const numbers = new Map();\n    const dl_numbers = new Map();\n    const serials = new Map();\n    \n    // \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u043d\u043e\u043c\u0435\u0440\u0430 \u0438 \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u0435 \u043d\u043e\u043c\u0435\u0440\u0430\n    rows.each(function(index) {\n        const number = $(this).find('td:nth-child(3)').text().trim();\n        const serial = $(this).find('td:nth-child(4)').text().trim();\n        const dl_number = $(this).find('td:nth-child(5)').text().trim();\n        \n        if (number) {\n            if (!numbers.has(number)) {\n                numbers.set(number, []);\n            }\n            numbers.get(number).push(index);\n        }\n\n        if (dl_number) {\n            if (!dl_numbers.has(dl_number)) {\n                dl_numbers.set(dl_number, []);\n            }\n            dl_numbers.get(dl_number).push(index);\n        }\n        \n        if (serial) {\n            if (!serials.has(serial)) {\n                serials.set(serial, []);\n            }\n            serials.get(serial).push(index);\n        }\n    });\n    \n    // \u041f\u043e\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u0435\u043c \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b\n    let duplicatesFound = false;\n    \n\n\n    dl_numbers.forEach((indices, dl_number) => {\n        if (dl_number.startsWith(\"DL\")) {\n            if (indices.length > 1) {\n                indices.forEach(index => {\n                    rows.eq(index).find('td:nth-child(5)').addClass('duplicate-highlight');\n                });\n                duplicatesFound = true;\n            }\n        }\n    });\n\n    // \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u043e\u043c\u0435\u0440\u0430\n    numbers.forEach((indices, number) => {\n        if (indices.length > 1) {\n            indices.forEach(index => {\n                rows.eq(index).find('td:nth-child(3)').addClass('duplicate-highlight');\n            });\n            duplicatesFound = true;\n        }\n    });\n\n    // // \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0433\u0440\u0430\u0439\u0432\u0435\u0440\u0430\n    // dl_numbers.forEach((indices, dl_number) => {\n    //     if (indices.length > 1) {\n    //         indices.forEach(index => {\n    //             rows.eq(index).find('td:nth-child(5)').addClass('duplicate-highlight');\n    //         });\n    //         duplicatesFound = true;\n    //     }\n    // });\n    \n    // \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u0435 \u043d\u043e\u043c\u0435\u0440\u0430\n    serials.forEach((indices, serial) => {\n        if (indices.length > 1) {\n            indices.forEach(index => {\n                rows.eq(index).find('td:nth-child(4)').addClass('duplicate-highlight');\n            });\n            duplicatesFound = true;\n        }\n    });\n\n    return duplicatesFound;\n}\n\nfunction appendNewRow(tableBody, rowData) {\n    console.log(\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438:\", rowData);\n\n    // \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 data-id\n    var tr = $('<tr>').attr('data-id', rowData.id);\n\n    // \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438 \u0438 \u044d\u0442\u043e \u043d\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043b\u0430\u0441\u0441 'packed-row'\n    if (rowData.pack_time && rowData.pack_time !== \"\u0412\u0440\u0435\u043c\u044f \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438\") {\n        tr.addClass('packed-row');\n    }\n\n    // \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443\n    tr.append($('<td>').text(rowData.row_number));\n    tr.append($('<td>').text(rowData.timestamp));\n\n    // \u0421\u0442\u043e\u043b\u0431\u0435\u0446 \"\u041d\u043e\u043c\u0435\u0440\" (\u0422\u0440\u0435\u0442\u0438\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446, \u0438\u043d\u0434\u0435\u043a\u0441 2)\n    var numberCell = $('<td>')\n        .text(rowData.number)\n        .addClass('editable') // \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\n        .attr('data-column', '2'); // \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u043e\u043b\u0431\u0446\u0430\n    tr.append(numberCell);\n\n    tr.append($('<td>').text(rowData.serial));\n\n    // \u0421\u0442\u043e\u043b\u0431\u0435\u0446 \"\u0413\u0440\u0430\u0444\u0430\" (\u041f\u044f\u0442\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446, \u0438\u043d\u0434\u0435\u043a\u0441 4)\n    var dlCell = $('<td>')\n        .text(rowData.dl_number || '')\n        .addClass('editable') // \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\n        .attr('data-column', '4'); // \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \"\u0413\u0440\u0430\u0444\u0430\"\n    tr.append(dlCell);\n    \n    // \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c data-value\n    var numericValue = parseDL(rowData.dl_number) || 0;\n    dlCell.attr('data-value', numericValue);\n\n    // \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043e\u043a \u0438\u043b\u0438 \u043a\u043b\u0438\u043a\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0434\u043b\u044f \"\u0413\u0440\u0430\u0444\u0430\"\n    const excludedArmaTypes = [\"CFA\", \"VND\", \"SRC\"];\n\n    if (rowData.arma_type === 'RPA' && !excludedArmaTypes.includes(rowData.arma_type)) {\n        // \u0414\u043b\u044f \u0442\u0438\u043f\u0430 \u0410\u0420\u041c\u0410 'RPA', \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442 dl_number\n        if (!rowData.dl_number || !rowData.dl_number.startsWith('DL')) {\n            // \u0415\u0441\u043b\u0438 dl_number \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043b\u0438 \u043d\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 'DL', \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \"\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\"\n            dlCell.html('<button class=\"generate-button\">\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c</button>')\n                .find('button')\n                .click(function() {\n                    generateDL(rowData.id); // \u041f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 ID \u0441\u0442\u0440\u043e\u043a\u0438\n                });\n        } else {\n            // \u0415\u0441\u043b\u0438 dl_number \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 'DL', \u0434\u0435\u043b\u0430\u0435\u043c \u0435\u0433\u043e \u043a\u043b\u0438\u043a\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u043c \u0434\u043b\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\n            dlCell.text(rowData.dl_number)\n                .addClass('clickable')\n                .css('cursor', 'pointer')\n                .on('click', function() {\n                    copyToClipboard(rowData.dl_number);\n                    $(this).addClass('copied');\n                    setTimeout(() => {\n                        $(this).removeClass('copied');\n                    }, 200);\n                });\n        }\n    } else if (!excludedArmaTypes.includes(rowData.arma_type)) {\n        // \u0414\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0410\u0420\u041c\u0410, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u044b, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c \u0438\u043b\u0438 \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443\n        if (rowData.dl_number && rowData.dl_number.startsWith('DL')) {\n            dlCell.text(rowData.dl_number)\n                .addClass('clickable')\n                .css('cursor', 'pointer')\n                .on('click', function() {\n                    copyToClipboard(rowData.dl_number);\n                    $(this).addClass('copied');\n                    setTimeout(() => {\n                        $(this).removeClass('copied');\n                    }, 200);\n                });\n        } else {\n            dlCell.text(rowData.dl_number || '');\n        }\n    } else {\n        // \u0414\u043b\u044f \u0442\u0438\u043f\u043e\u0432 \u0410\u0420\u041c\u0410 \"CFA\", \"VND\", \"SRC\" \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u044f\u0447\u0435\u0439\u043a\u0443 \u043f\u0443\u0441\u0442\u043e\u0439 \u0438\u043b\u0438 \u0441 \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c\n        dlCell.text(rowData.dl_number || '');\n    }\n\n    // \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u044f\u0447\u0435\u0439\u043a\u0443 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f\n    tr.append($('<td>').text(rowData.worker_name));\n\n    /**\n     * \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u044f\u0447\u0435\u0439\u043a\u0438 \"\u0412\u0440\u0435\u043c\u044f \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438\" (pack_time)\n     */\n    var packCell = $('<td>');\n\n    if (rowData.dl_number && rowData.dl_number.startsWith('DL') && !rowData.pack_time && !excludedArmaTypes.includes(rowData.arma_type)) {\n        // \u0415\u0441\u043b\u0438 dl_number \u0441 'DL', pack_time \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 arma_type \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \"\u0423\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c\"\n        packCell.html('<button class=\"pack-button\">\u0423\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c</button>')\n            .find('button')\n            .click(function() {\n                packItem(rowData.id); // \u041f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 ID \u0441\u0442\u0440\u043e\u043a\u0438\n            });\n    } else {\n        // \u0418\u043d\u0430\u0447\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u044f \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438 \u0438\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0443\u0441\u0442\u044b\u043c\n        packCell.text(rowData.pack_time || '');\n    }\n\n    tr.append(packCell);\n\n    // \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u044f\u0447\u0435\u0439\u043a\u0443 \u0441 \u0442\u0438\u043f\u043e\u043c \u0410\u0420\u041c\u0410\n    tr.append($('<td>').text(rowData.arma_type || ''));\n\n    // \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u044f\u0447\u0435\u0439\u043a\u0443 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0433\u0440\u0430\u0444\u043e\u0439 (last_graf)\n    tr.append($('<td>').text(rowData.last_graf || ''));\n\n    /**\n     * \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 \"\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435\" \u0441 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\"\n     */\n    var actionTd = $('<td>');\n    var deleteButton = $('<button>').text('\u0423\u0434\u0430\u043b\u0438\u0442\u044c').addClass('delete-button btn btn-danger btn-sm');\n    deleteButton.click(function() {\n        initiateDeleteConfirmation(rowData.id); // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e\n    });\n    actionTd.append(deleteButton);\n    tr.append(actionTd);\n\n    // \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0442\u0435\u043b\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    tableBody.append(tr);\n\n    /**\n     * \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u0438\n     */\n    setTimeout(() => {\n        const dlValue = dlCell.text().trim();\n        const packValue = packCell.text().trim();\n\n        if (dlValue.startsWith('DL') && !packValue && !excludedArmaTypes.includes(rowData.arma_type)) {\n            console.log('\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438 \u0434\u043b\u044f DL:', dlValue);\n            packCell.html('<button class=\"pack-button\">\u0423\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c</button>')\n                .find('button')\n                .click(function() {\n                    packItem(rowData.id); // \u041f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 ID \u0441\u0442\u0440\u043e\u043a\u0438\n                });\n        }\n\n        // \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n        checkDuplicates();\n    }, 100);\n}\n\nfunction bindEventHandlers() {\n    // \u041f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0434\u043b\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \"\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\"\n    $('.generate-button').off('click').on('click', function() {\n        var rowId = $(this).closest('tr').data('id');\n        generateDL(rowId);\n    });\n\n    // \u041f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0434\u043b\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \"\u0423\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c\"\n    $('.pack-button').off('click').on('click', function() {\n        var rowId = $(this).closest('tr').data('id');\n        packItem(rowId);\n    });\n\n    // \u041f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0434\u043b\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\"\n    $('.delete-button').off('click').on('click', function() {\n        var rowId = $(this).closest('tr').data('id');\n        initiateDeleteConfirmation(rowId);\n    });\n}\n\nfunction updateTableContent(data, tableBody, highlightNew = false) {\n    tableBody.empty();  // \u041e\u0447\u0438\u0449\u0430\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    data.forEach(function(rowData, index) {\n        appendNewRow(tableBody, rowData);\n        if (highlightNew && index === data.length - 1) {\n            // \u041c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0443 \u043d\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e\n            // \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:\n            // $('tr:last').addClass('highlight-new').fadeOut(2000, function() {\n            //     $(this).removeClass('highlight-new');\n            // });\n        }\n    });\n    checkDuplicates();\n    bindEventHandlers();  // \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n}\n\nfunction scheduleNextUpdate() {\n    setTimeout(() => {\n        if (!isEditing) {\n            updateTable(false, false).then(() => {\n                scheduleNextUpdate();\n            });\n        } else {\n            scheduleNextUpdate();\n        }\n    }, 3000);\n}\n\nfunction initializeEventSource() {\n    if (eventSource) {\n        eventSource.close();\n    }\n\n    eventSource = new EventSource('/stream');\n\n    eventSource.onmessage = function(event) {\n        const data = JSON.parse(event.data);\n        if (data.type === 'update' && data.date === getSelectedDate()) {\n            updateTable(true);\n        }\n    };\n\n    eventSource.onerror = function(error) {\n        console.error('EventSource failed:', error);\n        eventSource.close();\n        setTimeout(initializeEventSource, 5000);  // \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 5 \u0441\u0435\u043a\u0443\u043d\u0434\n    };\n}\n\n// \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0434\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n$(document).ready(function() {\n    initializeDateSelectors(); // \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430\n    updateTable();\n    updateStatistics(); // \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430\n    initializeEventSource();\n    scheduleNextUpdate();\n    loadCurrentDL();\n    // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438\n    $('.sortable').click(function() {\n        const column = $(this).data('column');\n        const order = $(this).hasClass('asc') ? 'desc' : 'asc';\n        \n        // \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u044b \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0441\u043e \u0432\u0441\u0435\u0445 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432\n        $('.sortable').removeClass('asc desc');\n        // \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438\n        $(this).addClass(order);\n        \n        // \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438\n        globalSortColumn = column;\n        globalSortOrder = order;\n        \n        // \u0421\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443\n        sortTable(column, order);\n    });\n\n    // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u043e\u0438\u0441\u043a\u0430\n    $('#searchButton').click(function() {\n        searchNumber();\n    });\n    $('#searchInput').keypress(function(e) {\n        if (e.which === 13) {\n            searchNumber();\n        }\n    });\n    $('#armaFilter').on('change', function() {\n        updateTable();\n    });\n});\n\n// \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u0442\u044b\n$('#datepicker').on('change', function() {\n    initializeEventSource();\n    updateTable();\n});\n\n// \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u0432 Excel\n$(document).ready(function() {\n    $('.export-button').on('click', function(e) {\n        e.preventDefault();\n        \n        // \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0435\n        const sortableColumn = $('.sortable.asc, .sortable.desc');\n        const sortColumn = sortableColumn.length ? sortableColumn.data('column') : '';\n        const sortOrder = $('.sortable.asc').length ? 'asc' : 'desc';\n        \n        // \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c URL\n        const date = getSelectedDate();\n        const queryParams = new URLSearchParams({\n            date: date,\n            sort_column: sortColumn || '',\n            sort_order: sortOrder\n        });\n        \n        // \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\n        fetch(`/export_excel?${queryParams.toString()}`)\n        .then(response => {\n            if (response.ok) {\n                return response.blob();\n            }\n            throw new Error('Network response was not ok.');\n        })\n        .then(blob => {\n            // \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u0434\u043b\u044f \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f\n            const url = window.URL.createObjectURL(blob);\n            const a = document.createElement('a');\n            a.href = url;\n            a.download = `export_${date}.xlsx`;\n            document.body.appendChild(a);\n            a.click();\n            window.URL.revokeObjectURL(url);\n            a.remove();\n        })\n        .catch(error => {\n            console.error('Error:', error);\n            alert('\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435 \u0444\u0430\u0439\u043b\u0430');\n        });\n    });\n});\n\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0434\u0430\u0442\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e flatpickr\nlet currentDate;\n\n$(document).ready(function() {\n    flatpickr(\"#datepicker\", {\n        dateFormat: \"Y-m-d\",\n        defaultDate: \"today\",\n        onChange: function(selectedDates, dateStr, instance) {\n            currentDate = dateStr;\n            updateTable();\n        }\n    });\n\n    currentDate = new Date().toISOString().split('T')[0];\n    initializeEventSource();\n    updateTable();\n    updateStatistics();\n});\n\n// \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0434\u0432\u043e\u0439\u043d\u043e\u0433\u043e \u043a\u043b\u0438\u043a\u0430 \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044f\u0447\u0435\u0435\u043a\n$(document).on('dblclick', '.editable', function() {\n    if (isEditing) return; // \u041f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\n    isEditing = true;\n\n    var td = $(this);\n    var currentValue = td.text();\n    var input = $('<input type=\"text\">')\n        .val(currentValue)\n        .addClass('edit-input');\n\n    td.html(input);\n    input.focus();\n\n    input.on('blur', function() {\n        var newValue = $(this).val().trim();\n        var rowId = td.closest('tr').data('id');\n        var columnIndex = td.attr('data-column');\n\n        // \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c URL \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u0442\u043e\u043b\u0431\u0446\u0430\n        let url;\n        let updateData = {\n            id: rowId,\n            new_value: newValue,\n            date: getSelectedDate()\n        };\n\n        if (columnIndex === '2') { // \u0421\u0442\u043e\u043b\u0431\u0435\u0446 \"\u041d\u043e\u043c\u0435\u0440\"\n            url = '/update_number';\n        } else if (columnIndex === '4') { // \u0421\u0442\u043e\u043b\u0431\u0435\u0446 \"\u0413\u0440\u0430\u0444\u0430\"\n            url = '/update_graf';\n        } else {\n            alert('\u041d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f');\n            td.text(currentValue);\n            isEditing = false;\n            return;\n        }\n\n        $.ajax({\n            url: url,\n            type: 'POST',\n            contentType: 'application/json',\n            data: JSON.stringify(updateData),\n            success: function(response) {\n                if (response.status === 'success') {\n                    td.text(newValue);\n                    checkDuplicates();\n                } else {\n                    alert('\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: ' + response.message);\n                    td.text(currentValue);\n                }\n                isEditing = false;\n            },\n            error: function(xhr, status, error) {\n                alert('\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445: ' + error);\n                td.text(currentValue);\n                isEditing = false;\n            }\n        });\n    });\n\n    input.on('keypress', function(e) {\n        if (e.which === 13) { // \u041d\u0430\u0436\u0430\u0442\u0438\u0435 Enter\n            $(this).blur();\n        }\n    });\n\n    input.on('keydown', function(e) {\n        if (e.key === 'Escape') { // \u041d\u0430\u0436\u0430\u0442\u0438\u0435 Esc\n            td.text(currentValue);\n            isEditing = false;\n        }\n    });\n});\nfunction searchNumber() {\n    const searchValue = $('#searchInput').val().trim();\n    if (!searchValue) return;\n\n    // \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0443\n    $('.highlight-search').removeClass('highlight-search');\n\n    const rows = $('#tableBody tr');\n    let found = false;\n\n    rows.each(function() {\n        const numberCell = $(this).find('td:nth-child(3)');\n        const cellText = numberCell.text().trim();\n        if (cellText === searchValue) {\n            numberCell.addClass('highlight-search');\n            \n            // \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u043a \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435\n            $('.table-container').animate({\n                scrollTop: $(this).offset().top - $('.table-container').offset().top + $('.table-container').scrollTop() - 100\n            }, 500);\n\n            found = true;\n\n            // \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0442\u0430\u0439\u043c\u0435\u0440 \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 3 \u0441\u0435\u043a\u0443\u043d\u0434\u044b\n            setTimeout(() => {\n                numberCell.removeClass('highlight-search');\n            }, 3000);\n\n            // \u0412\u044b\u0432\u043e\u0434\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438\n            console.log('\u041d\u0430\u0439\u0434\u0435\u043d\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435:', cellText);\n\n            return false; // \u041f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u043c \u0446\u0438\u043a\u043b, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u0448\u043b\u0438 \u043d\u0443\u0436\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443\n        }\n    });\n\n    if (!found) {\n        alert('\u0422\u043e\u0447\u043d\u043e\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u043d\u043e\u043c\u0435\u0440\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e');\n    }\n}\n\n\nfunction initiateDeleteConfirmation(rowId) {\n    isDeleting = true; // \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0444\u043b\u0430\u0433 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n    var deleteCell = $(`tr[data-id='${rowId}'] td:last-child`);\n\n    // \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u0438 \u0443\u0436\u0435 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f\n    if (deleteCell.data('confirming')) {\n        return; // \u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043e, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u043c\n    }\n\n    // \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0444\u043b\u0430\u0433 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f\n    deleteCell.data('confirming', true);\n\n    // \u0417\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\" \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \"\u0414\u0430\" \u0438 \"\u041d\u0435\u0442\"\n    deleteCell.empty();\n\n    var yesButton = $('<button>')\n        .text('\u0414\u0430')\n        .addClass('confirm-yes-button btn btn-success btn-sm me-2')\n        .click(function() {\n            deleteConfirmed(rowId);\n        });\n\n    var noButton = $('<button>')\n        .text('\u041d\u0435\u0442')\n        .addClass('confirm-no-button btn btn-secondary btn-sm')\n        .click(function() {\n            cancelDeleteConfirmation(rowId);\n        });\n\n    deleteCell.append(yesButton);\n    deleteCell.append(noButton);\n}\n\n\nfunction deleteConfirmed(rowId) {\n    $.ajax({\n        url: '/delete_row',\n        type: 'POST',\n        contentType: 'application/json',\n        data: JSON.stringify({ id: rowId }),\n        success: function(response) {\n            if (response.status === 'success') {\n                // \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n                $(`tr[data-id='${rowId}']`).remove();\n            } else {\n                console.error('\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0438:', response.message);\n                // \u041c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043e \u043d\u0435\u0443\u0434\u0430\u0447\u0435\n            }\n            // \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\" \u0438 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0444\u043b\u0430\u0433\n            cancelDeleteConfirmation(rowId);\n        },\n        error: function(xhr, status, error) {\n            console.error('\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0438:', error);\n            // \u041c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043e \u043d\u0435\u0443\u0434\u0430\u0447\u0435\n            // \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\" \u0438 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0444\u043b\u0430\u0433\n            cancelDeleteConfirmation(rowId);\n        }\n    });\n}\n\nfunction cancelDeleteConfirmation(rowId) {\n    var deleteCell = $(`tr[data-id='${rowId}'] td:last-child`);\n    // \u0421\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0444\u043b\u0430\u0433 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f\n    deleteCell.data('confirming', false);\n    // \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\"\n    deleteCell.empty();\n    var deleteButton = $('<button>')\n        .text('\u0423\u0434\u0430\u043b\u0438\u0442\u044c')\n        .addClass('delete-button btn btn-danger btn-sm')\n        .click(function() {\n            initiateDeleteConfirmation(rowId);\n        });\n    deleteCell.append(deleteButton);\n\n    isDeleting = false; // \u0421\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u043b\u0430\u0433\n}\n\n\n    \n\n\nfunction loadCurrentDL() {\n    const selectedDate = getSelectedDate();\n    $.ajax({\n        url: '/get_current_dl',\n        type: 'GET',\n        data: { date: selectedDate },\n        success: function(response) {\n            if (response.status === 'success') {\n                $('#initial-dl').val(response.current_dl);\n            } else {\n                $('#initial-dl').val(''); // \u041c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u043b\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\n                console.warn(response.message);\n            }\n        },\n        error: function(xhr, status, error) {\n            console.error('\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e DL:', error);\n            $('#initial-dl').val('');\n        }\n    });\n}\n\nvar rowId = td.closest('tr').data('id');  // \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c 'id' \u0441\u0442\u0440\u043e\u043a\u0438\n\nlet updateData = {\n    id: rowId,  // \u041e\u0422\u041f\u0420\u0410\u0412\u041b\u042f\u0415\u041c 'id'\n    new_value: newValue,\n    date: getSelectedDate()\n};\n\n$.ajax({\n    url: url,\n    type: 'POST',\n    contentType: 'application/json',\n    data: JSON.stringify(updateData),\n});\n\nfunction initializeDateSelectors() {\n    const currentDate = new Date();\n    \n    // \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0434\u043d\u0438\n    const daySelect = document.getElementById('day');\n    for (let i = 1; i <= 31; i++) {\n        const option = document.createElement('option');\n        option.value = i.toString().padStart(2, '0');\n        option.text = i;\n        daySelect.appendChild(option);\n    }\n    \n    // \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043c\u0435\u0441\u044f\u0446\u044b (\u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c <select id=\"month\">)\n    const monthSelect = document.getElementById('month');\n    for(let i=1; i<=12; i++) {\n        const option = document.createElement('option');\n        option.value = i.toString().padStart(2, '0');\n        option.text = i;\n        monthSelect.appendChild(option);\n    }\n    \n    // \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0433\u043e\u0434\u044b (\u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c <select id=\"year\">)\n    const yearSelect = document.getElementById('year');\n    const currentYear = currentDate.getFullYear();\n    for (let year = currentYear; year <= 2030; year++) {\n        const option = document.createElement('option');\n        option.value = year;\n        option.textContent = year;\n        yearSelect.appendChild(option);\n    }\n    \n    // \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0434\u0430\u0442\u0443\n    daySelect.value = currentDate.getDate().toString().padStart(2, '0');\n    monthSelect.value = (currentDate.getMonth() + 1).toString().padStart(2, '0');\n    yearSelect.value = currentYear;\n    \n    // \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\n    daySelect.addEventListener('change', updateTable);\n    monthSelect.addEventListener('change', function(){\n        updateTable();\n        markUnpackedDays(); // \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043c\u0435\u0441\u044f\u0446\u0430\n    });\n    yearSelect.addEventListener('change', function(){\n        updateTable();\n        markUnpackedDays(); // \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0433\u043e\u0434\u0430\n    });\n    \n    // \u041f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0430\n    markUnpackedDays();\n}\n\nfunction getSelectedDate() {\n    const day = document.getElementById('day').value.padStart(2, '0');\n    const month = document.getElementById('month').value.padStart(2, '0');\n    const year = document.getElementById('year').value;\n    return `${year}-${month}-${day}`;\n}\n\n\nfunction markUnpackedDays() {\n    const daySelect = document.getElementById('day');\n    const date = getSelectedDate();\n    const [year, month, day] = date.split('-');\n\n    if (!month || !year) {\n        console.warn('\u041c\u0435\u0441\u044f\u0446 \u0438\u043b\u0438 \u0433\u043e\u0434 \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u044b.');\n        return;\n    }\n\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443\n    fetch(`/get_unpacked_days?year=${year}&month=${month}`)\n        .then(response => response.json())\n        .then(data => {\n            if(data.status === 'success') {\n                const unpacked_days = new Set(data.unpacked_days); // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Set \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430\n                const options = Array.from(daySelect.options);\n                options.forEach(option => {\n                    const dayNum = parseInt(option.value, 10);\n                    if (!option.disabled && unpacked_days.has(dayNum)) {\n                        option.style.backgroundColor = 'lightcoral';\n                        option.style.color = 'white';\n                    } else {\n                        option.style.backgroundColor = '';\n                        option.style.color = '';\n                    }\n                });\n            } else {\n                console.error('\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043d\u0435\u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u043d\u0435\u0439:', data.message);\n            }\n        })\n        .catch(error => {\n            console.error('\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043d\u0435\u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u043d\u0435\u0439:', error);\n        });\n}\n<!DOCTYPE html>\n<html lang=\"ru\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>\u0420\u0430\u0431\u043e\u0447\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430</title>\n    <link rel=\"stylesheet\" href=\"{{ url_for('static', filename='styles_welcome.css') }}\">\n    <script src=\"https://code.jquery.com/jquery-3.6.0.min.js\"></script>\n    <script src=\"{{ url_for('static', filename='js/utils.js') }}\"></script>\n    <script src=\"{{ url_for('static', filename='js/table.js') }}\"></script>\n    <script src=\"{{ url_for('static', filename='js/date.js') }}\"></script>\n    <script src=\"{{ url_for('static', filename='js/statistics.js') }}\"></script>\n    <script src=\"{{ url_for('static', filename='js/connectedUser.js') }}\"></script>\n</head>\n<body>\n    <div class=\"header\">\n        <h1>\u0420\u0430\u0431\u043e\u0447\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430</h1>\n        <div class=\"user-info\">\n            <span>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c: {{ name }}</span>\n            <a href=\"/logout\" class=\"logout-button\">\u0412\u044b\u0445\u043e\u0434</a>\n        </div>\n    </div>\n\n    <div class=\"content-wrapper\">\n        <div class=\"active-users-box\">\n            <h4>\u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438:</h4>\n            <table id=\"activeUsersTable\">\n                <thead>\n                    <tr>\n                        <th>\u0418\u043c\u044f</th>\n                        <th>\u0421\u0442\u0430\u0442\u0443\u0441</th>\n                        <th>\u0417\u0430\u043f\u0438\u0441\u0435\u0439 \u0441\u0435\u0433\u043e\u0434\u043d\u044f</th>\n                    </tr>\n                </thead>\n                <tbody id=\"activeUsersBody\">\n                </tbody>\n            </table>\n        </div>\n        \n        <div class=\"date-selector\">\n            <select id=\"day\">\n             \n            </select>\n            <select id=\"month\">\n                <option value=\"01\">\u042f\u043d\u0432\u0430\u0440\u044c</option>\n                <option value=\"02\">\u0424\u0435\u0432\u0440\u0430\u043b\u044c</option>\n                <option value=\"03\">\u041c\u0430\u0440\u0442</option>\n                <option value=\"04\">\u0410\u043f\u0440\u0435\u043b\u044c</option>\n                <option value=\"05\">\u041c\u0430\u0439</option>\n                <option value=\"06\">\u0418\u044e\u043d\u044c</option>\n                <option value=\"07\">\u0418\u044e\u043b\u044c</option>\n                <option value=\"08\">\u0410\u0432\u0433\u0443\u0441\u0442</option>\n                <option value=\"09\">\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c</option>\n                <option value=\"10\">\u041e\u043a\u0442\u044f\u0431\u0440\u044c</option>\n                <option value=\"11\">\u041d\u043e\u044f\u0431\u0440\u044c</option>\n                <option value=\"12\">\u0414\u0435\u043a\u0430\u0431\u0440\u044c</option>\n            </select>\n            <select id=\"year\">\n                <!-- JavaScript \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442 \u0433\u043e\u0434\u044b -->\n            </select>\n        </div>\n        \n\n        <div class=\"statistics-container\">\n            <div class=\"stat-box\">\n                <span class=\"stat-label\">\u0412\u0441\u0435\u0433\u043e \u0437\u0430\u043f\u0438\u0441\u0435\u0439:</span>\n                <span class=\"stat-value\" id=\"totalRecords\">0</span>\n            </div>\n            <div class=\"stat-box\">\n                <span class=\"stat-label\">\u0417\u0430\u043f\u0438\u0441\u0435\u0439 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0447\u0430\u0441:</span>\n                <span class=\"stat-value\" id=\"lastHourRecords\">0</span>\n            </div>\n        </div>\n        <div class=\"search-container\">\n            <input type=\"text\" id=\"searchInput\" placeholder=\"\u041f\u043e\u0438\u0441\u043a \u043f\u043e \u043d\u043e\u043c\u0435\u0440\u0443...\">\n            <button id=\"searchButton\">\u041d\u0430\u0439\u0442\u0438</button>\n        </div>\n        <div class=\"table-container\">\n            <table border=\"1\" id=\"dataTable\">\n                <thead>\n                    <tr>\n                        <th class=\"sortable\" data-column=\"0\">\u2116</th>\n                        <th class=\"sortable\" data-column=\"1\">\u0412\u0440\u0435\u043c\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438</th>\n                        <th class=\"sortable\" data-column=\"2\">\u041d\u043e\u043c\u0435\u0440</th>\n                        <th class=\"sortable\" data-column=\"3\">Serial</th>\n                        <th class=\"sortable\" data-column=\"4\">\u0413\u0440\u0430\u0444\u0430</th>\n                        <th class=\"sortable\" data-column=\"5\">\u0418\u043c\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f</th>\n                        <th class=\"sortable\" data-column=\"6\">\u0412\u0440\u0435\u043c\u044f \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438</th>\n                        <th class=\"sortable\" data-column=\"7\">\u0422\u0438\u043f \u0410\u0420\u041c\u0410</th>\n                        <th class=\"sortable\" data-column=\"8\">last_graf</th>\n                        <th>\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435</th>\n                    </tr>\n                </thead>\n                \n                \n                \n                \n                <tbody id=\"tableBody\">\n                    {% for row in table[1:] %}\n                        <tr>\n                            {% for cell in row %}\n                                <td class=\"{% if loop.index0 == 2 %}editable{% endif %}\">{{ cell }}</td>\n                            {% endfor %}\n                        </tr>\n                    {% endfor %}\n                </tbody>\n            </table>\n        </div>\n\n        <div class=\"controls-container\">\n            <div class=\"dl-control\">\n                <div class=\"dl-row\">\n                    <label for=\"initial-dl\">\u041d\u0430\u0447\u0430\u0442\u044c DL:</label>\n                    <input type=\"text\" id=\"initial-dl\" placeholder=\"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435\">\n                </div>\n                <button onclick=\"setInitialDL()\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c</button>\n            </div>\n            <div class=\"export-container\">\n                <button class=\"export-button\">\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 Excel</button>\n            </div>\n            \n        </div>\n        <div class=\"notification\" id=\"notification\"></div>\n        <div class=\"filter-container\">\n            <label>\n                <input type=\"checkbox\" id=\"armaFilter\">\n                \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e RPA\n            </label>\n        </div>\n    </div>\n</body>\n</html>\n\nfunction initializeDateSelectors() {\n    const currentDate = new Date();\n    \n    // \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0434\u043d\u0438\n    const daySelect = document.getElementById('day');\n    for (let i = 1; i <= 31; i++) {\n        const option = document.createElement('option');\n        option.value = i.toString().padStart(2, '0');\n        option.text = i;\n        daySelect.appendChild(option);\n    }\n    \n    // \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043c\u0435\u0441\u044f\u0446\u044b (\u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c <select id=\"month\">)\n    const monthSelect = document.getElementById('month');\n    for(let i=1; i<=12; i++) {\n        const option = document.createElement('option');\n        option.value = i.toString().padStart(2, '0');\n        option.text = i;\n        monthSelect.appendChild(option);\n    }\n    \n    // \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0433\u043e\u0434\u044b (\u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c <select id=\"year\">)\n    const yearSelect = document.getElementById('year');\n    const currentYear = currentDate.getFullYear();\n    for (let year = currentYear; year <= 2030; year++) {\n        const option = document.createElement('option');\n        option.value = year;\n        option.textContent = year;\n        yearSelect.appendChild(option);\n    }\n    \n    // \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0434\u0430\u0442\u0443\n    daySelect.value = currentDate.getDate().toString().padStart(2, '0');\n    monthSelect.value = (currentDate.getMonth() + 1).toString().padStart(2, '0');\n    yearSelect.value = currentYear;\n    \n    // \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\n    daySelect.addEventListener('change', updateTable);\n    monthSelect.addEventListener('change', function(){\n        updateTable();\n        markUnpackedDays(); // \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043c\u0435\u0441\u044f\u0446\u0430\n    });\n    yearSelect.addEventListener('change', function(){\n        updateTable();\n        markUnpackedDays(); // \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0433\u043e\u0434\u0430\n    });\n    \n    // \u041f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0430\n    markUnpackedDays();\n}\n\nfunction getSelectedDate() {\n    const day = document.getElementById('day').value.padStart(2, '0');\n    const month = document.getElementById('month').value.padStart(2, '0');\n    const year = document.getElementById('year').value;\n    return `${year}-${month}-${day}`;\n}\n\n\nfunction markUnpackedDays() {\n    const daySelect = document.getElementById('day');\n    const date = getSelectedDate();\n    const [year, month, day] = date.split('-');\n\n    if (!month || !year) {\n        console.warn('\u041c\u0435\u0441\u044f\u0446 \u0438\u043b\u0438 \u0433\u043e\u0434 \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u044b.');\n        return;\n    }\n\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443\n    fetch(`/get_unpacked_days?year=${year}&month=${month}`)\n        .then(response => response.json())\n        .then(data => {\n            if(data.status === 'success') {\n                const unpacked_days = new Set(data.unpacked_days); // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Set \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430\n                const options = Array.from(daySelect.options);\n                options.forEach(option => {\n                    const dayNum = parseInt(option.value, 10);\n                    if (!option.disabled && unpacked_days.has(dayNum)) {\n                        option.style.backgroundColor = 'lightcoral';\n                        option.style.color = 'white';\n                    } else {\n                        option.style.backgroundColor = '';\n                        option.style.color = '';\n                    }\n                });\n            } else {\n                console.error('\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043d\u0435\u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u043d\u0435\u0439:', data.message);\n            }\n        })\n        .catch(error => {\n            console.error('\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043d\u0435\u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u043d\u0435\u0439:', error);\n        });\n}\n"},{"assistant_initiates":false,"asst_text":"```json\n{\n  \"\u62db\u8058\u5355\u4f4d\": \"\u5e7f\u5dde\u5e02\u767d\u4e91\u533a\u4e8b\u4e1a\u5355\u4f4d\",\n  \"\u62db\u8058\u5355\u4f4d\u8054\u7cfb\u7535\u8bdd\u6216\u624b\u673a\": \"020-35912640\",\n  \"\u76d1\u7763\u5355\u4f4d\": \"\u5e7f\u5dde\u5e02\u767d\u4e91\u533a\u4eba\u529b\u8d44\u6e90\u548c\u793e\u4f1a\u4fdd\u969c\u5c40\",\n  \"\u76d1\u7763\u5355\u4f4d\u8054\u7cfb\u7535\u8bdd\u6216\u624b\u673a\": \"020-35912664\",\n  \"\u62db\u8058\u5355\u4f4d\u7535\u5b50\u90ae\u7bb1\": \"\",\n  \"\u76d1\u7763\u5355\u4f4d\u7535\u5b50\u90ae\u7bb1\": \"\",\n  \"\u62db\u8058\u4eba\u6570\": \"68\",\n  \"\u62db\u8058\u5c97\u4f4d\u6570\": \"\u672a\u77e5\",\n  \"\u62a5\u540d\u65f6\u95f4\": \"2024\u5e7411\u670814\u65e5-2024\u5e7411\u670820\u65e5\",\n  \"\u662f\u5426\u9700\u8981\u7b14\u8bd5\": \"\u662f\",\n  \"\u662f\u5426\u9700\u8981\u9762\u8bd5\": \"\u662f\",\n  \"\u662f\u5426\u9700\u8981\u8d44\u683c\u5ba1\u6838\": \"\u662f\",\n  \"\u662f\u5426\u9700\u8981\u662f\u4e8b\u4e1a\u7f16\u5236\": \"\u662f\",\n  \"\u9762\u8bd5\u5f62\u5f0f\": \"\u7ed3\u6784\u5316\",\n  \"\u7b14\u8bd5\u5185\u5bb9\": \"\u7efc\u5408\u77e5\u8bc6\u80fd\u529b,\u516c\u5171\u57fa\u7840\u77e5\u8bc6\",\n  \"\u6700\u4f4e\u5b66\u5386\u8981\u6c42\": \"\u672c\u79d1\",\n  \"\u5e74\u9f84\u8981\u6c42\": \"35\u5468\u5c81\u4ee5\u4e0b,40\u5468\u5c81\u4ee5\u4e0b,45\u5468\u5c81\u4ee5\u4e0b,50\u5468\u5c81\u4ee5\u4e0b\",\n  \"\u603b\u5206\u8ba1\u7b97\u65b9\u5f0f\": \"\u7b14\u8bd5\u6210\u7ee9\u00d740%+\u9762\u8bd5\u6210\u7ee9\u00d760%\",\n  \"\u62a5\u540d\u65b9\u5f0f\": \"\u7f51\u4e0a\",\n  \"\u4e13\u4e1a\u8981\u6c42\": \"\u8be6\u89c1\u516c\u544a\",\n  \"\u62db\u8058\u5355\u4f4d\u8054\u7cfb\u4eba\": \"\",\n  \"\u662f\u5426\u9700\u8981\u5e94\u5c4a\": \"\u5426\",\n  \"\u7ebf\u4e0a/\u7ebf\u4e0b\u8003\u8bd5\": \"\u7ebf\u4e0b\",\n  \"\u8fdb\u5165\u9762\u8bd5\u6bd4\u4f8b\": \"1:5\",\n  \"\u4e92\u8054\u7f51\u62a5\u540d\u5730\u5740\": \"https://bm.gd-pa.cn/dzsys/nyrc\",\n  \"\u7b14\u8bd5\u65f6\u95f4\": \"\u5177\u4f53\u65f6\u95f4\u4ee5\u51c6\u8003\u8bc1\u4e3a\u51c6\",\n  \"\u9762\u8bd5\u65f6\u95f4\": \"\u5177\u4f53\u65f6\u95f4\u53e6\u884c\u901a\u77e5\",\n  \"\u7b14\u8bd5\u5730\u70b9\": \"\u5177\u4f53\u5730\u70b9\u4ee5\u51c6\u8003\u8bc1\u4e3a\u51c6\",\n  \"\u9762\u8bd5\u5730\u70b9\": \"\u53e6\u884c\u516c\u5e03\"\n}\n```","behavior":"degenerate_repetition","conversation_hash":"534c7be01bc0e8d214b04eb4dbf90353","conversation_redacted":true,"conversation_toxic":false,"country":"United States","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"Chinese","model":"gpt-4o-2024-08-06","n_chars":7846,"n_turns_in_conversation":1,"n_words":219,"source_row_offset":37400,"source_shard":"turns-00050.parquet","timestamp":"Tue, 12 Nov 2024 13:40:32 GMT","turn_id":"7cb61425e843839e2472c2c9","turn_index":0,"user_text":"Assistant: \nUser: ```\n\u6807\u9898\uff1a2024\u5e74\u5e7f\u4e1c\u5e7f\u5dde\u5e02\u767d\u4e91\u533a\u4e8b\u4e1a\u5355\u4f4d\u62db\u8058\u5de5\u4f5c\u4eba\u545868\u4eba\u516c\u544a\n2024\u5e74\u5e7f\u5dde\u5e02\u767d\u4e91\u533a\u4e8b\u4e1a\u5355\u4f4d\u516c\u5f00\u62db\u8058\u5de5\u4f5c\u4eba\u5458\u516c\u544a\n\u6839\u636e\u4e8b\u4e1a\u5355\u4f4d\u516c\u5f00\u62db\u8058\u6709\u5173\u89c4\u5b9a\uff0c\u6309\u7167\u516c\u5f00\u3001\u5e73\u7b49\u3001\u7ade\u4e89\u3001\u62e9\u4f18\u7684\u539f\u5219\uff0c\u4e3a\u8fdb\u4e00\u6b65\u52a0\u5f3a\u5e7f\u5dde\u5e02\u767d\u4e91\u533a\u4e8b\u4e1a\u5355\u4f4d\u4eba\u624d\u961f\u4f0d\u5efa\u8bbe\uff0c\u4f18\u5316\u5e72\u90e8\u961f\u4f0d\u7ed3\u6784\uff0c\u73b0\u9762\u5411\u793e\u4f1a\u516c\u5f00\u62db\u8058\u4e8b\u4e1a\u7f16\u5236\u5de5\u4f5c\u4eba\u5458\u3002\n\u4e00\u3001\u62db\u8058\u5c97\u4f4d\u3001\u4eba\u6570\u3001\u8303\u56f4\n\uff08\u4e00\uff09\u62db\u8058\u5c97\u4f4d\u53ca\u4eba\u6570:\u767d\u4e91\u533a\u4e8b\u4e1a\u5355\u4f4d\u7f16\u5236\u5de5\u4f5c\u4eba\u5458\u517168\u540d\uff0c\u8be6\u89c1\u300a\u5e7f\u5dde\u5e02\u767d\u4e91\u533a2024\u5e74\u516c\u5f00\u62db\u8058\u4e8b\u4e1a\u5355\u4f4d\u5de5\u4f5c\u4eba\u5458\u5c97\u4f4d\u9700\u6c42\u8868\u300b\uff08\u9644\u4ef61\uff09\u3002\n\u5404\u62db\u8058\u5355\u4f4d\u60c5\u51b5\u8be6\u89c1\uff08https://www.by.gov.cn/gzjg/\uff09\u3002\n\uff08\u4e8c\uff09\u62db\u8058\u5bf9\u8c61:2025\u5e74\u6bd5\u4e1a\u751f\u6307\u4e8e2025\u5e741\u67081\u65e5\u81f32025\u5e747\u670831\u65e5\u671f\u95f4\u53d6\u5f97\u5b66\u5386\u3001\u5b66\u4f4d\u8bc1\u4e66\u7684\u6bd5\u4e1a\u751f\uff0c\u4ee5\u53ca\u4e8e2024\u5e748\u67081\u65e5\u81f32025\u5e747\u670831\u65e5\u671f\u95f4\u53d6\u5f97\u5b66\u5386\u3001\u5b66\u4f4d\u8bc1\u4e66\u7684\u6301\u56fd\uff08\u5883\uff09\u5916\u5b66\u5386\u5b66\u4f4d\u8bc1\u4e66\u4eba\u5458\uff1b\u975e2025\u5e74\u6bd5\u4e1a\u751f\u6307\u4e8e2024\u5e7412\u670831\u65e5\u524d\u53d6\u5f97\u5b66\u5386\u3001\u5b66\u4f4d\u8bc1\u4e66\u7684\u975e\u5728\u8bfb\u4eba\u5458\uff0c\u4ee5\u53ca\u4e8e2024\u5e747\u670831\u65e5\u524d\u53d6\u5f97\u5b66\u5386\u3001\u5b66\u4f4d\u8bc1\u4e66\u7684\u6301\u56fd\uff08\u5883\uff09\u5916\u5b66\u5386\u5b66\u4f4d\u8bc1\u4e66\u4eba\u5458\uff1b\u4e0d\u9650\u6307\u4ee5\u4e0a\u4e24\u7c7b\u4eba\u5458\u5747\u53ef\u3002\n\u6e2f\u6fb3\u5c45\u6c11\u7b26\u5408\u300a\u5173\u4e8e\u5370\u53d1\n\u7684\u901a\u77e5\u300b\uff08\u7ca4\u4eba\u793e\u89c4\u30142021\u301534\u53f7\uff09\u548c\u672c\u516c\u544a\u89c4\u5b9a\u7684\u76f8\u5173\u6761\u4ef6\u53ef\u62a5\u8003\u76f8\u5173\u5c97\u4f4d\u3002\n\u4e8c\u3001\u62a5\u8003\u6761\u4ef6\n\uff08\u4e00\uff09\u57fa\u672c\u6761\u4ef6\n\u62a5\u8003\u4eba\u5458\u987b\u5177\u5907\u300a\u5e7f\u4e1c\u7701\u4e8b\u4e1a\u5355\u4f4d\u516c\u5f00\u62db\u8058\u4eba\u5458\u529e\u6cd5\u300b\uff08\u7ca4\u5e9c\u4ee4\u7b2c301\u53f7\uff09\u8981\u6c42\u7684\u57fa\u672c\u6761\u4ef6\u53ca\u4ee5\u4e0b\u6761\u4ef6:\n1.\u5177\u6709\u4e2d\u534e\u4eba\u6c11\u5171\u548c\u56fd\u56fd\u7c4d\u3002\n2.\u9075\u5b88\u5baa\u6cd5\u548c\u6cd5\u5f8b\uff0c\u54c1\u884c\u7aef\u6b63\u3002\n3.\u62e5\u62a4\u4e2d\u56fd\u5171\u4ea7\u515a\u9886\u5bfc\u548c\u793e\u4f1a\u4e3b\u4e49\u5236\u5ea6\u3002\n4.\u5177\u6709\u826f\u597d\u7684\u653f\u6cbb\u7d20\u8d28\u548c\u9053\u5fb7\u54c1\u884c\u3002\n5.\u9002\u5e94\u5c97\u4f4d\u8981\u6c42\u7684\u8eab\u4f53\u6761\u4ef6\u3002\n6.\u5177\u5907\u62a5\u8003\u5c97\u4f4d\u6240\u9700\u8d44\u683c\u6761\u4ef6\uff0c\u7b26\u5408\u5c97\u4f4d\u8981\u6c42\u7684\u5de5\u4f5c\u80fd\u529b\u3002\n7.\u975e\u5e7f\u5dde\u5e02\u6237\u7c4d\u4eba\u5458\u5e94\u7b26\u5408\u300a\u5e7f\u5dde\u5e02\u4eba\u6c11\u653f\u5e9c\u529e\u516c\u5385\u5173\u4e8e\u5370\u53d1\u5e7f\u5dde\u5e02\u5f15\u8fdb\u4eba\u624d\u5165\u6237\u7ba1\u7406\u529e\u6cd5\u7684\u901a\u77e5\u300b\uff08\u7a57\u5e9c\u529e\u89c4\u30142020\u301510\u53f7\uff09\u89c4\u5b9a\u7684\u5e7f\u5dde\u5e02\u6237\u53e3\u8fc1\u5165\u6761\u4ef6\u3002\n\uff08\u4e8c\uff09\u6709\u4e0b\u5217\u60c5\u5f62\u4e4b\u4e00\u7684\uff0c\u4e0d\u5f97\u62a5\u8003:\n\uff081\uff09\u53d7\u8fc7\u5211\u4e8b\u5904\u7f5a\u7684\uff1b\n\uff082\uff09\u88ab\u5f00\u9664\u4e2d\u56fd\u5171\u4ea7\u515a\u515a\u7c4d\u7684\uff1b\n\uff083\uff09\u88ab\u5f00\u9664\u516c\u804c\u7684\uff1b\n\uff084\uff09\u88ab\u4f9d\u6cd5\u5217\u4e3a\u5931\u4fe1\u8054\u5408\u60e9\u6212\u5bf9\u8c61\u7684\uff1b\n\uff085\uff09\u6cd5\u5f8b\u3001\u6cd5\u89c4\u89c4\u5b9a\u7684\u5176\u4ed6\u60c5\u5f62\uff1b\n\uff086\uff09\u8058\u7528\u540e\u5373\u6784\u6210\u300a\u4e2d\u5171\u4e2d\u592e\u7ec4\u7ec7\u90e8\u3001\u4eba\u529b\u8d44\u6e90\u793e\u4f1a\u4fdd\u969c\u90e8\u5173\u4e8e\u5370\u53d1\u3008\u4e8b\u4e1a\u5355\u4f4d\u4eba\u4e8b\u7ba1\u7406\u56de\u907f\u89c4\u5b9a\u3009\u7684\u901a\u77e5\u300b\uff08\u4eba\u793e\u90e8\u89c4\u30142019\u30151\u53f7\uff09\u7b2c\u516d\u6761\u660e\u786e\u7684\u5404\u7c7b\u56de\u907f\u5173\u7cfb\u60c5\u5f62\u7684\u3002\n\u4e0a\u8ff0\u60c5\u5f62\u7684\u671f\u9650\u8ba1\u7b97\u622a\u6b62\u65e5\u671f\u4e3a\u516c\u5f00\u62db\u8058\u62a5\u540d\u622a\u6b62\u65e5\u3002\n\uff08\u4e09\uff09\u62a5\u8003\u8d44\u683c\n1.\u5404\u5c97\u4f4d\u5177\u4f53\u8981\u6c42\u8be6\u89c1\u516c\u544a\u3002\n2.\u6240\u6709\u62a5\u8003\u4eba\u5458\u6240\u4fee\u5b66\u7684\u4e13\u4e1a\u5fc5\u987b\u4e0e\u62a5\u8003\u7684\u5c97\u4f4d\u76f8\u5bf9\u5e94\u3002\u5982\u62a5\u8003\u4eba\u5458\u6240\u5b66\u4e13\u4e1a\u672a\u5217\u5165\u300a\u5e7f\u4e1c\u77012024\u5e74\u8003\u8bd5\u5f55\u7528\u516c\u52a1\u5458\u4e13\u4e1a\u53c2\u8003\u76ee\u5f55\u300b\uff0c\u4f46\u6240\u5b66\u4e13\u4e1a\u4e3b\u8981\u8bfe\u7a0b\u4e0e\u62a5\u8003\u5c97\u4f4d\u6240\u8981\u6c42\u4e13\u4e1a\u7684\u4e3b\u8981\u8bfe\u7a0b\u57fa\u672c\u4e00\u81f4\u7684\uff0c\u987b\u5728\u62a5\u540d\u524d\u63d0\u4f9b\u6bd5\u4e1a\u8bc1\u4e66\u3001\u8bfe\u7a0b\u6210\u7ee9\u5355\uff08\u6bd5\u4e1a\u9662\u6821\u76d6\u7ae0\uff09\uff0c\u7ecf\u62db\u8058\u5355\u4f4d\u8ba4\u5b9a\u4e3a\u76f8\u8fd1\u4e13\u4e1a\uff0c\u7ecf\u62db\u8058\u5355\u4f4d\u540c\u610f\u540e\u65b9\u53ef\u62a5\u8003\u3002\u5bf9\u4e13\u4e1a\u76ee\u5f55\u4e2d\u6240\u5217\u4e13\u4e1a\u540d\u79f0\u4e2d\u5305\u542b\u65e7\u4e13\u4e1a\u90e8\u5206\u7684\uff0c\u987b\u5728\u62a5\u540d\u524d\u63d0\u4f9b\u6bd5\u4e1a\u8bc1\u4e66\uff08\u5df2\u6bd5\u4e1a\u7684\uff09\u548c\u8bfe\u7a0b\u6210\u7ee9\u5355\uff08\u6bd5\u4e1a\u9662\u6821\u76d6\u7ae0\uff09\u3001\u9662\u6821\u51fa\u5177\u7684\u8bfe\u7a0b\u5bf9\u6bd4\u60c5\u51b5\u8bf4\u660e\uff0c\u7ecf\u62db\u8058\u5355\u4f4d\u8ba4\u5b9a\u4e3a\u76f8\u8fd1\u4e13\u4e1a\uff0c\u7ecf\u62db\u8058\u5355\u4f4d\u540c\u610f\u540e\u65b9\u53ef\u62a5\u8003\u3002\u5bf9\u542b\u6709\u4e24\u4e2a\u4ee5\u4e0a\u57f9\u517b\u65b9\u5411\u7684\u4e13\u4e1a\uff0c\u5982\u62db\u8003\u5c97\u4f4d\u5df2\u660e\u786e\u5177\u4f53\u57f9\u517b\u65b9\u5411\u7684\uff0c\u62a5\u8003\u4eba\u5458\u987b\u7b26\u5408\u5177\u4f53\u57f9\u517b\u65b9\u5411\u65b9\u53ef\u62a5\u8003\u3002\u4f8b\u5982\u4e13\u4e1a\u76ee\u5f55\u4e2d\u7684\u4f01\u4e1a\u7ba1\u7406\uff08\u542b\u8d22\u52a1\u7ba1\u7406\u3001\u5e02\u573a\u8425\u9500\u3001\u4eba\u529b\u8d44\u6e90\u7ba1\u7406\uff09\uff08A120202\uff09\uff0c\u5176\u5c97\u4f4d\u6761\u4ef6\u4e3a\u4f01\u4e1a\u7ba1\u7406\uff08\u8d22\u52a1\u7ba1\u7406\u65b9\u5411\uff09\uff0c\u90a3\u4e48\u4e13\u4e1a\u4e2d\u5e02\u573a\u8425\u9500\u3001\u4eba\u529b\u8d44\u6e90\u7ba1\u7406\u65b9\u5411\u7684\u4e0d\u53ef\u62a5\u8003\uff1b\u9664\u4e13\u4e1a\u53c2\u8003\u76ee\u5f55\u6709\u5217\u51fa\u57f9\u517b\u65b9\u5411\u7684\u4e13\u4e1a\u5916\uff0c\u6bd5\u4e1a\u8bc1\u4e66\u4e0a\u7684\u4e13\u4e1a\u540d\u79f0\u540e\u9762\u4ee5\u62ec\u53f7\u7b49\u5f62\u5f0f\u5217\u51fa\u7684\u57f9\u517b\u65b9\u5411\u4e0d\u4f5c\u4e3a\u62a5\u8003\u4e13\u4e1a\u7684\u4f9d\u636e\u3002\u5e94\u8058\u4eba\u5458\u6240\u5b66\u4e13\u4e1a\u6309\u6240\u83b7\u6bd5\u4e1a\u8bc1\u4e66\u4e0a\u7684\u4e13\u4e1a\u4e3a\u51c6\u3002\u8f85\u4fee\u4e13\u4e1a\u3001\u5b66\u4f4d\u79cd\u7c7b\u5747\u4e0d\u4f5c\u4e3a\u4e13\u4e1a\u4f9d\u636e\u3002\n3.\u62a5\u80032025\u5e74\u6bd5\u4e1a\u751f\u804c\u4f4d\u5fc5\u987b\u4ee5\u6700\u9ad8\u5b66\u5386\u4e13\u4e1a\u62a5\u8003\uff0c\u7528\u4e8e\u62a5\u8003\u7684\u5b66\u5386\u3001\u5b66\u4f4d\u8bc1\u4e66\u5e94\u7b26\u5408\u5c97\u4f4d\u8981\u6c42\uff0c\u5982:\u62db\u8058\u5c97\u4f4d\u8981\u6c42\u5b66\u5386\u3001\u5b66\u4f4d\u4e3a\u7814\u7a76\u751f\u3001\u7855\u58eb\u7684\uff0c\u62a5\u8003\u4eba\u5458\u5e94\u5177\u6709\u7b26\u5408\u4e13\u4e1a\u8981\u6c42\u7684\u7814\u7a76\u751f\u5b66\u5386\u53ca\u76f8\u5e94\u4e13\u4e1a\u7684\u7855\u58eb\u5b66\u4f4d\u3002\u62a5\u8003\u5176\u4ed6\u5c97\u4f4d\u4eba\u5458\u53ef\u7528\u975e\u6700\u9ad8\u5b66\u5386\u6216\u5b66\u4f4d\u62a5\u8003\uff0c\u4f46\u7528\u4e8e\u62a5\u8003\u7684\u5b66\u5386\u5c42\u6b21\u548c\u5b66\u4f4d\u5c42\u6b21\u5e94\u540c\u65f6\u7b26\u5408\u5c97\u4f4d\u8981\u6c42\uff0c\u5982:\u62db\u8058\u5c97\u4f4d\u8981\u6c42\u5b66\u5386\u3001\u5b66\u4f4d\u4e3a\u672c\u79d1\u3001\u5b66\u58eb\u7684\uff0c\u62a5\u8003\u4eba\u5458\u5e94\u5177\u6709\u7b26\u5408\u4e13\u4e1a\u8981\u6c42\u7684\u672c\u79d1\u5b66\u5386\u53ca\u76f8\u5e94\u7684\u5b66\u58eb\u5b66\u4f4d\u3002\n4.\u5173\u4e8e\u62a5\u8003\u4eba\u5458\u7684\u5e74\u9f84\u8981\u6c42\uff0c\u987b\u6ee1\u8db3\u4ee5\u4e0b\u57fa\u672c\u6761\u4ef6\u4e4b\u4e00:\u5177\u6709\u672c\u79d1\u53ca\u4ee5\u4e0b\u5b66\u5386\u7684\uff0c\u5e74\u9f84\u572835\u5468\u5c81\u4ee5\u4e0b\uff1b\u5177\u6709\u7814\u7a76\u751f\u5b66\u5386\u6216\u4e0e\u62a5\u8003\u4e13\u4e1a\u6280\u672f\u5c97\u4f4d\u76f8\u5bf9\u5e94\u7684\u4e2d\u7ea7\u4e13\u4e1a\u6280\u672f\u8d44\u683c\u7684\uff0c\u5e74\u9f84\u572840\u5468\u5c81\u4ee5\u4e0b\uff1b\u5177\u6709\u535a\u58eb\u5b66\u4f4d\u6216\u4e0e\u62a5\u8003\u4e13\u4e1a\u6280\u672f\u5c97\u4f4d\u76f8\u5bf9\u5e94\u7684\u526f\u9ad8\u7ea7\u4e13\u4e1a\u6280\u672f\u8d44\u683c\u7684\uff0c\u5e74\u9f84\u572845\u5468\u5c81\u4ee5\u4e0b\uff1b\u5177\u6709\u4e0e\u62a5\u8003\u4e13\u4e1a\u6280\u672f\u5c97\u4f4d\u76f8\u5bf9\u5e94\u7684\u6b63\u9ad8\u7ea7\u4e13\u4e1a\u6280\u672f\u8d44\u683c\u7684\uff0c\u5e74\u9f84\u572850\u5468\u5c81\u4ee5\u4e0b\u3002\u62db\u8058\u5c97\u4f4d\u8868\u4e2d\u6709\u660e\u786e\u5e74\u9f84\u5b66\u5386\u9650\u5236\u7684\uff0c\u4ee5\u62db\u8058\u5c97\u4f4d\u8868\u4e3a\u51c6\u3002\u5e74\u9f84\u8ba1\u7b97\u622a\u6b62\u65e5\u671f\u4e3a\u516c\u5f00\u62db\u8058\u62a5\u540d\u65e5\u671f\u9996\u65e5\u3002\n5.\u6e2f\u6fb3\u5b66\u4e60\u3001\u56fd\u5916\u7559\u5b66\u5f52\u6765\u4eba\u5458\u62a5\u8003\uff0c\u5df2\u7ecf\u53d6\u5f97\u5b66\u5386\u5b66\u4f4d\u8bc1\u4e66\u7684\uff0c\u5e94\u5728\u8d44\u683c\u5ba1\u6838\u65f6\u63d0\u4f9b\u6559\u80b2\u90e8\u4e2d\u56fd\u7559\u5b66\u670d\u52a1\u4e2d\u5fc3\u51fa\u5177\u7684\u5883\u5916\u5b66\u5386\u3001\u5b66\u4f4d\u8ba4\u8bc1\u4e66\u3002\n6.\u62db\u8058\u5c97\u4f4d\u8981\u6c42\u6709\u5de5\u4f5c\u7ecf\u5386\u7684\u987b\u4e0a\u4f20\u5de5\u4f5c\u5355\u4f4d\u6b63\u5f0f\u52b3\u52a8\uff08\u8058\u7528\uff09\u5408\u540c\u3001\u793e\u4fdd\u7f34\u8d39\u8bb0\u5f55\u7b49\u76f8\u5173\u6750\u6599\uff1b\u62db\u8058\u5c97\u4f4d\u5bf9\u5de5\u4f5c\u7ecf\u5386\u5e74\u9650\u6709\u8981\u6c42\u7684\uff0c\u4ee5\u4e0e\u5de5\u4f5c\u5355\u4f4d\u7b7e\u8ba2\u7684\u6b63\u5f0f\u52b3\u52a8\uff08\u8058\u7528\uff09\u5408\u540c\u53ca\u5bf9\u5e94\u7684\u793e\u4fdd\u7f34\u8d39\u8bb0\u5f55\u4e3a\u51c6\u3002\u5bf9\u5de5\u4f5c\u7ecf\u5386\u6709\u6307\u5b9a\u6027\u8981\u6c42\u7684\uff0c\u5982\u4e0e\u5de5\u4f5c\u5355\u4f4d\u7b7e\u8ba2\u7684\u6b63\u5f0f\u5408\u540c\u3001\u793e\u4fdd\u7f34\u8d39\u8bb0\u5f55\u65e0\u6cd5\u8bc1\u660e\u4ece\u4e8b\u8be5\u6bb5\u7279\u6b8a\u5de5\u4f5c\u7ecf\u5386\uff0c\u987b\u63d0\u4f9b\u52a0\u76d6\u5355\u4f4d\u516c\u7ae0\u7684\u4ece\u4e8b\u8be5\u6bb5\u7279\u6b8a\u5de5\u4f5c\u7ecf\u5386\u8bc1\u660e\u7b49\u76f8\u5173\u6750\u6599\u3002\u5de5\u4f5c\u7ecf\u5386\uff08\u4ee5\u52b3\u52a8\u5408\u540c\u3001\u793e\u4fdd\u7f34\u8d39\u8bb0\u5f55\u4e3a\u51c6\u3002\u5e94\u8058\u4eba\u5458\u4ee5\u5168\u65e5\u5236\u65b9\u5f0f\u5b66\u4e60\u7684\uff0c\u5728\u6821\u671f\u95f4\u4e0e\u7528\u4eba\u5355\u4f4d\u5b58\u5728\u52b3\u52a8\u5173\u7cfb\u6216\u4eba\u4e8b\u8058\u7528\u5173\u7cfb\uff0c\u7f34\u7eb3\u7684\u793e\u4f1a\u4fdd\u9669\u4e0d\u7eb3\u5165\u5de5\u4f5c\u7ecf\u5386\u65f6\u95f4\u8ba1\u7b97\uff09\u5e74\u9650\u8ba1\u7b97\u622a\u6b62\u65e5\u671f\u4e3a\u516c\u5f00\u62db\u8058\u62a5\u540d\u65e5\u671f\u9996\u65e5\u3002\n7.\u5e94\u8058\u4eba\u5458\u5728\u62a5\u540d\u65f6\u5e94\u5f53\u7b7e\u7f72\u8bda\u4fe1\u627f\u8bfa\u4e66\uff0c\u627f\u8bfa\u6240\u63d0\u4f9b\u7684\u4fe1\u606f\u771f\u5b9e\u51c6\u786e\uff0c\u5e76\u627f\u62c5\u4e0d\u5b9e\u627f\u8bfa\u76f8\u5173\u8d23\u4efb\u3002\n\u4e09\u3001\u62db\u8058\u7a0b\u5e8f\n\u516c\u5f00\u62db\u8058\u6309\u7167\u7f51\u7edc\u62a5\u540d\u3001\u62a5\u540d\u786e\u8ba4\u3001\u7b14\u8bd5\u3001\u8d44\u683c\u590d\u5ba1\u3001\u9762\u8bd5\u3001\u4f53\u68c0\u3001\u8003\u5bdf\u3001\u516c\u793a\u3001\u8058\u7528\u7b49\u7a0b\u5e8f\u8fdb\u884c\u3002\n\uff08\u4e00\uff09\u62a5\u540d\n\u91c7\u53d6\u7f51\u7edc\u62a5\u540d\u7684\u65b9\u5f0f\u8fdb\u884c\u3002\n1.\u62a5\u540d\u65b9\u5f0f\n\uff081\uff09\u62a5\u540d\u65f6\u95f4:2024\u5e7411\u670814\u65e5\u4e0a\u53489:00\u65f6\u81f311\u670820\u65e517:00\u65f6\u3002\n\uff082\uff09\u62a5\u540d\u65b9\u5f0f:\u8003\u751f\u5728\u89c4\u5b9a\u65f6\u95f4\u5185\u767b\u5f55\u4e8b\u4e1a\u5355\u4f4d\u62db\u8003\u7f51\uff08\u7f51\u5740:https://bm.gd-pa.cn/dzsys/nyrc\uff09\uff0c\u6309\u7167\u7f51\u4e0a\u63d0\u793a\u65b9\u6cd5\u8fdb\u884c\u6ce8\u518c\u3001\u4e0a\u4f20\u7167\u7247\u3001\u586b\u5199\u4e2a\u4eba\u8d44\u6599\u4fe1\u606f\u7b49\u8fdb\u884c\u7f51\u7edc\u62a5\u540d\uff0c\u5e76\u81ea\u884c\u6253\u5370\u300a\u62a5\u540d\u767b\u8bb0\u8868\u300b\u3002\n\u7f51\u7edc\u62a5\u540d\u73af\u8282\u7531\u62a5\u540d\u7cfb\u7edf\u81ea\u52a8\u521d\u5ba1\uff0c\u62a5\u8003\u4eba\u5458\u987b\u5bf9\u62a5\u540d\u6750\u6599\u7684\u771f\u5b9e\u6027\u548c\u5b8c\u6574\u6027\u8d1f\u8d23\u3002\u521d\u5ba1\u7ed3\u679c\u5728\u62a5\u540d\u7cfb\u7edf\u76f4\u63a5\u53cd\u9988\uff0c\u4e0d\u53e6\u884c\u901a\u77e5\u3002\u51e1\u56e0\u672a\u6309\u62db\u8058\u8981\u6c42\u63d0\u4f9b\u76f8\u5e94\u7684\u6750\u6599\u5bfc\u81f4\u672a\u901a\u8fc7\u7f51\u7edc\u521d\u5ba1\u7684\uff0c\u8d23\u4efb\u7531\u62a5\u8003\u8005\u81ea\u884c\u627f\u62c5\u3002\n2.\u62a5\u540d\u8981\u6c42\n\uff081\uff09\u6bcf\u4f4d\u62a5\u8003\u8005\u53ea\u53ef\u62a5\u8003\u4e00\u4e2a\u7b26\u5408\u62db\u8003\u6761\u4ef6\u7684\u5c97\u4f4d\u3002\u62a5\u8003\u4eba\u5458\u5e94\u8ba4\u771f\u5bf9\u7167\u62db\u8058\u516c\u544a\u89c4\u5b9a\u7684\u62a5\u8003\u6761\u4ef6\u548c\u5c97\u4f4d\u9700\u6c42\u8868\u4e2d\u7684\u4e13\u4e1a\u3001\u5e74\u9f84\u3001\u5b66\u5386\u5b66\u4f4d\u3001\u62db\u8058\u5bf9\u8c61\u53ca\u5176\u4ed6\u8d44\u683c\u6761\u4ef6\u7b49\uff0c\u4e0d\u7b26\u5408\u62db\u8058\u516c\u544a\u548c\u5c97\u4f4d\u9700\u6c42\u8868\u8981\u6c42\u7684\u4efb\u4f55\u6761\u4ef6\u4e4b\u4e00\u7684\uff0c\u5747\u4e0d\u53ef\u4ee5\u62a5\u540d\u3002\u62a5\u540d\u6240\u63d0\u4ea4\u7684\u6750\u6599\u5fc5\u987b\u771f\u5b9e\u3001\u5b8c\u6574\u3001\u51c6\u786e\u3001\u6709\u6548\uff0c\u5982\u6709\u4e0d\u7b26\u6216\u5f04\u865a\u4f5c\u5047\u7684\uff0c\u4e00\u7ecf\u67e5\u5b9e\uff0c\u53d6\u6d88\u8003\u8bd5\u8d44\u683c\u6216\u5f55\u7528\u8d44\u683c\u3002\n\uff082\uff09\u62a5\u8003\u4eba\u5458\u987b\u6309\u300a\u5e7f\u4e1c\u77012024\u5e74\u8003\u8bd5\u5f55\u7528\u516c\u52a1\u5458\u4e13\u4e1a\u53c2\u8003\u76ee\u5f55\u300b\u8fdb\u884c\u62a5\u8003\uff0c\u6240\u5b66\u4e13\u4e1a\u5e94\u7b26\u5408\u62a5\u8003\u5c97\u4f4d\u7684\u4e13\u4e1a\u8981\u6c42\uff0c\u5b66\u4f4d\u79cd\u7c7b\u4e0d\u7b49\u540c\u4e8e\u62a5\u8003\u4e13\u4e1a\u3002\n\uff083\uff09\u6e2f\u6fb3\u5b66\u4e60\u3001\u56fd\u5916\u7559\u5b66\u5f52\u6765\u4eba\u5458\u62a5\u8003\u7684\uff0c\u9664\u4e86\u63d0\u4f9b\u6709\u6548\u8d44\u6599\u5916\uff0c\u63d0\u4f9b\u7684\u8bfe\u7a0b\u6210\u7ee9\u5355\u5b66\u4e60\u8bfe\u7a0b\u5e94\u5f53\u4e0e\u62a5\u8003\u5c97\u4f4d\u4e00\u81f4\u3002\n\uff084\uff09\u5404\u5c97\u4f4d\u62df\u8058\u4eba\u6570\u4e0e\u62a5\u540d\u4eba\u6570\u7684\u6bd4\u4f8b\u987b\u8fbe\u52301:3\u4ee5\u4e0a\uff08\u542b1:3\uff09\u65b9\u53ef\u5f00\u8003\uff0c\u672a\u8fbe\u5230\u5f00\u8003\u6bd4\u4f8b\u7684\u53d6\u6d88\u6216\u76f8\u5e94\u51cf\u5c11\u8be5\u5c97\u4f4d\u7684\u62df\u8058\u4eba\u6570\uff08\u53e6\u884c\u516c\u544a\uff09\u3002\n\uff085\uff09\u56fd\u6709\u4f01\u4e8b\u4e1a\u5355\u4f4d\u5de5\u4f5c\u4eba\u5458\u62a5\u8003\uff0c\u987b\u5f81\u5f97\u5de5\u4f5c\u5355\u4f4d\u540c\u610f\uff0c\u5e76\u5728\u8003\u5bdf\u65f6\u51fa\u5177\u5de5\u4f5c\u5355\u4f4d\u540c\u610f\u62a5\u8003\u4e66\u9762\u6750\u6599\uff1b\u4e0d\u80fd\u63d0\u4f9b\u7684\uff0c\u53d6\u6d88\u5176\u8058\u7528\u8d44\u683c\u3002\n3. \u7f51\u4e0a\u786e\u8ba4\u53ca\u6253\u5370\u51c6\u8003\u8bc1\n\uff081\uff09\u7f51\u4e0a\u786e\u8ba4\u3002\u901a\u8fc7\u62a5\u540d\u7cfb\u7edf\u8d44\u683c\u521d\u5ba1\u7684\u8003\u751f\u9700\u5728\u89c4\u5b9a\u65f6\u95f4\u5185\u767b\u5f55\u62a5\u540d\u7cfb\u7edf\u8fdb\u884c\u7f51\u4e0a\u8003\u8bd5\u786e\u8ba4\u3002\u7f51\u4e0a\u8003\u8bd5\u786e\u8ba4\u65f6\u95f4\u4e3a:2024\u5e7411\u670820\u65e518:00\u81f32024\u5e7411\u670821\u65e517:00\u3002\u903e\u671f\u672a\u8fdb\u884c\u7f51\u4e0a\u8003\u8bd5\u786e\u8ba4\u7684\uff0c\u89c6\u4e3a\u81ea\u52a8\u653e\u5f03\u8003\u8bd5\uff0c\u4e0d\u80fd\u53c2\u52a0\u7b14\u8bd5\u4ee5\u53ca\u672c\u6b21\u62db\u8058\u7684\u540e\u7eed\u73af\u8282\u3002\n\u7f51\u4e0a\u786e\u8ba4\u7684\u64cd\u4f5c\u65b9\u5f0f:\u767b\u5f55\u4e8b\u4e1a\u5355\u4f4d\u62db\u8003\u7f51\uff08\u7f51\u5740:https://bm.gd-pa.cn/dzsys/nyrc\uff09\u6279\u6b21\u9009\u62e9--\u62a5\u540d\u4e1a\u52a1-\u6211\u7684\u62a5\u540d-\u62a5\u540d\u786e\u8ba4\u53c2\u52a0\u8003\u8bd5\u3002\n\uff082\uff09\u6253\u5370\u51c6\u8003\u8bc1\u3002\u5b8c\u6210\u7f51\u4e0a\u8003\u8bd5\u786e\u8ba4\u7684\u8003\u751f\u8bf7\u5728\u62a5\u540d\u7cfb\u7edf\u81ea\u884c\u4e0b\u8f7d\u6253\u5370\u51c6\u8003\u8bc1\uff0c\u51c6\u8003\u8bc1\u6253\u5370\u65f6\u95f4\u4e3a2024\u5e7411\u670822\u65e510:00\u540e\uff0c\u4e0d\u518d\u53e6\u884c\u901a\u77e5\u3002\u514d\u7b14\u8bd5\u8003\u751f\u4e5f\u8981\u6253\u5370\u51c6\u8003\u8bc1\u3002\u51c6\u8003\u8bc1\u662f\u8003\u751f\u53c2\u52a0\u8003\u8bd5\u7b49\u5404\u73af\u8282\u7684\u91cd\u8981\u8bc1\u4ef6\uff0c\u8003\u751f\u53c2\u52a0\u8003\u8bd5\u3001\u4f53\u68c0\u65f6\uff0c\u5fc5\u987b\u540c\u65f6\u643a\u5e26\u51c6\u8003\u8bc1\u3001\u8eab\u4efd\u8bc1\u539f\u4ef6\uff0c\u8bc1\u4ef6\u4e0d\u9f50\u7684\uff0c\u4e0d\u5f97\u53c2\u52a0\u8003\u8bd5\u548c\u4f53\u68c0\u3002\n\uff08\u4e8c\uff09\u8003\u8bd5\n\u8003\u8bd5\u5206\u4e3a\u7b14\u8bd5\u3001\u9762\u8bd5\u4e24\u4e2a\u90e8\u5206\u3002\u91c7\u53d6\u5148\u7b14\u8bd5\u540e\u9762\u8bd5\u5f62\u5f0f\uff0c\u62db\u8058\u4e13\u4e1a\u6280\u672f\u4e03\u7ea7\u4ee5\u4e0a\u5c97\u4f4d\u3001\u5177\u6709\u535a\u58eb\u5b66\u4f4d\u7684\u4eba\u5458\u514d\u7b14\u8bd5\u3002\u8003\u751f\u51ed\u51c6\u8003\u8bc1\u3001\u6709\u6548\u8eab\u4efd\u8bc1\u539f\u4ef6\u53c2\u52a0\u8003\u8bd5\u3002\u8003\u751f\u987b\u6309\u89c4\u5b9a\u7684\u65f6\u95f4\u3001\u5730\u70b9\u8fdb\u884c\u8003\u8bd5\uff0c\u4e0d\u6309\u89c4\u5b9a\u65f6\u95f4\u3001\u5730\u70b9\u53c2\u52a0\u8003\u8bd5\u7684\uff0c\u89c6\u4e3a\u81ea\u52a8\u653e\u5f03\u3002\n1.\u7b14\u8bd5\n\uff081\uff09\u7b14\u8bd5\u65f6\u95f4\u548c\u5730\u70b9:\u5177\u4f53\u65f6\u95f4\u3001\u5730\u70b9\u53ca\u8981\u6c42\u4ee5\u51c6\u8003\u8bc1\u4e3a\u51c6\u3002\n\uff082\uff09\u7b14\u8bd5\u5185\u5bb9:\u516c\u5171\u79d1\u76ee\u8003\u8bd5\uff0c\u5185\u5bb9\u4e3b\u8981\u5305\u62ec\u7efc\u5408\u77e5\u8bc6\u80fd\u529b\u3001\u516c\u5171\u57fa\u7840\u77e5\u8bc6\uff0c\u4e0d\u63d0\u4f9b\u6216\u63a8\u8350\u4efb\u4f55\u8003\u8bd5\u53c2\u8003\u7528\u4e66\u3002\n\uff083\uff09\u7b14\u8bd5\u5f62\u5f0f:\u91c7\u53d6\u95ed\u5377\u8003\u8bd5\uff0c\u65f6\u95f4\u4e3a120\u5206\u949f\u3002\n\uff084\uff09\u7b14\u8bd5\u6210\u7ee9:\u7b14\u8bd5\u6ee1\u5206\u4e3a100\u5206\uff0c\u7b14\u8bd5\u6210\u7ee9\u630940%\u8ba1\u5165\u7efc\u5408\u6210\u7ee9\u3002\u7b14\u8bd5\u6210\u7ee9\u6309\u56db\u820d\u4e94\u5165\u4fdd\u7559\u5c0f\u6570\u70b9\u540e2\u4f4d\uff0c\u5408\u683c\u5206\u4e3a60\u5206,\u4f4e\u4e8e60\u5206\u4e0d\u8fdb\u5165\u9762\u8bd5\u3002\u7b14\u8bd5\u6210\u7ee9\u53ef\u5728\u7b14\u8bd5\u7ed3\u675f\u540e\u767b\u5f55\u62a5\u540d\u7cfb\u7edf\u67e5\u8be2\u3002\n\uff085\uff09\u6ce8\u610f\u4e8b\u9879:\u8003\u8bd5\u5f00\u59cb30\u5206\u949f\u540e\u4e0d\u5f97\u5165\u573a\uff0c\u5e76\u53d6\u6d88\u8003\u8bd5\u8d44\u683c\u3002\n2.\u9762\u8bd5\n\uff081\uff09\u786e\u5b9a\u62df\u53c2\u52a0\u9762\u8bd5\u4eba\u5458\u540d\u5355\u3002\u5728\u540c\u4e00\u5c97\u4f4d\u7b14\u8bd5\u5408\u683c\u7684\u8003\u751f\u4e2d\uff0c\u4ee5\u7b14\u8bd5\u6210\u7ee9\u7531\u9ad8\u5230\u4f4e\u4f9d\u6b21\u6392\u5e8f\uff0c\u6309\u62db\u8058\u5c97\u4f4d\u5bf9\u5e94\u62db\u8058\u4eba\u65701:5\u7684\u6bd4\u4f8b\u786e\u5b9a\u62df\u53c2\u52a0\u9762\u8bd5\u4eba\u5458\u540d\u5355\uff0c\u6bd4\u4f8b\u5185\u672b\u4f4d\u7b14\u8bd5\u6210\u7ee9\u5e76\u5217\u7684\u90fd\u8fdb\u5165\u540d\u5355\uff08\u9762\u8bd5\u4eba\u6570\u672a\u8fbe\u5230\u4e0a\u8ff0\u6bd4\u4f8b\u7684\uff0c\u53ef\u6309\u5b9e\u9645\u7b26\u5408\u6761\u4ef6\u4eba\u6570\u8fdb\u884c\uff09\u3002\u514d\u7b14\u8bd5\u4eba\u5458\u8fdb\u5165\u540d\u5355\u4e0d\u53d71:5\u7684\u6bd4\u4f8b\u9650\u5236\uff0c\u5176\u9762\u8bd5\u6210\u7ee9\u4e3a\u7efc\u5408\u6210\u7ee9\u3002\u62df\u53c2\u52a0\u9762\u8bd5\u4eba\u5458\u540d\u5355\u5c06\u5728\u5e7f\u5dde\u5e02\u767d\u4e91\u533a\u4eba\u6c11\u653f\u5e9c\u95e8\u6237\u7f51\u7ad9\u548c\u4e8b\u4e1a\u5355\u4f4d\u62db\u8003\u7f51\uff08\u7f51\u5740:https://bm.gd-pa.cn/dzsys/nyrc\uff09\u516c\u5e03\u3002\n\uff082\uff09\u8d44\u683c\u590d\u5ba1\u3002\u5728\u9762\u8bd5\u524d\u5bf9\u5165\u56f4\u9762\u8bd5\u4eba\u5458\u8fdb\u884c\u8d44\u683c\u590d\u5ba1\uff0c\u51e1\u4e0d\u7b26\u5408\u62db\u8058\u6761\u4ef6\u7684\uff0c\u6216\u4e0d\u80fd\u63d0\u4f9b\u89c4\u5b9a\u8bc1\u4ef6\u6750\u6599\u7684\uff0c\u6216\u4e0d\u5728\u89c4\u5b9a\u65f6\u95f4\u63a5\u53d7\u8d44\u683c\u590d\u5ba1\u7684\uff0c\u5747\u4e0d\u5f97\u53c2\u52a0\u9762\u8bd5\u3002\u5165\u56f4\u9762\u8bd5\u4eba\u5458\u56e0\u4e0d\u7b26\u5408\u62db\u8058\u6761\u4ef6\u88ab\u53d6\u6d88\u9762\u8bd5\u8d44\u683c\u7684\uff0c\u7531\u62db\u8058\u5355\u4f4d\u5728\u8be5\u5c97\u4f4d\u7b14\u8bd5\u5408\u683c\u7684\u5e94\u8058\u4eba\u5458\u4e2d\u6839\u636e\u7b14\u8bd5\u6210\u7ee9\u7531\u9ad8\u5230\u4f4e\u7684\u987a\u5e8f\u4f9d\u6b21\u9012\u8865\u3002\u8d44\u683c\u590d\u5ba1\u65f6\u95f4\u3001\u5730\u5740\u3001\u5177\u4f53\u5b89\u6392\u548c\u6709\u5173\u8981\u6c42\u5c06\u5728\u5e7f\u5dde\u5e02\u767d\u4e91\u533a\u4eba\u6c11\u653f\u5e9c\u95e8\u6237\u7f51\u7ad9\u548c\u4e8b\u4e1a\u5355\u4f4d\u62db\u8003\u7f51\uff08\u7f51\u5740:https://bm.gd-pa.cn/dzsys/nyrc\uff09\u53e6\u884c\u8865\u5145\u901a\u77e5\u3002\n\u8d44\u683c\u590d\u5ba1\u7ed3\u679c\u73b0\u573a\u544a\u77e5\uff0c\u8d44\u683c\u590d\u5ba1\u5408\u683c\u8005\u65b9\u53ef\u8fdb\u5165\u4e0b\u4e00\u73af\u8282\u3002\n\uff083\uff09\u9762\u8bd5\u3002\u9762\u8bd5\u91c7\u53d6\u7ed3\u6784\u5316\u9762\u8bd5\u65b9\u6cd5\u8fdb\u884c\uff0c\u9762\u8bd5\u6210\u7ee9\u5f53\u573a\u4e66\u9762\u901a\u77e5\u62a5\u8003\u8005\u3002\u9762\u8bd5\u6ee1\u5206\u4e3a100\u5206\uff0c\u5408\u683c\u5206\u4e3a60\u5206\uff0c\u6309\u56db\u820d\u4e94\u5165\u4fdd\u7559\u5c0f\u6570\u70b9\u540e2\u4f4d\uff0c\u9762\u8bd5\u672a\u8fbe\u5408\u683c\u5206\u6570\u7ebf\u7684\uff0c\u4e0d\u8ba1\u7b97\u7efc\u5408\u6210\u7ee9\u3002\n3.\u7efc\u5408\u6210\u7ee9\n\u9762\u8bd5\u7ed3\u675f\u540e\uff0c\u6309\u7b14\u8bd5\u6210\u7ee9\u536040%\u3001\u9762\u8bd5\u6210\u7ee9\u536060%\u7684\u6bd4\u4f8b\u5408\u6210\u8003\u8bd5\u7efc\u5408\u6210\u7ee9\uff0c\u6309\u56db\u820d\u4e94\u5165\u4fdd\u7559\u5c0f\u6570\u70b9\u540e2\u4f4d\u3002\u514d\u7b14\u8bd5\u8003\u751f\u4ee5\u9762\u8bd5\u6210\u7ee9\u4f5c\u4e3a\u7efc\u5408\u6210\u7ee9\u3002\u8003\u8bd5\u7efc\u5408\u6210\u7ee960\u5206\u4ee5\u4e0a\u7684\u5e94\u8bd5\u4eba\u5458\u65b9\u53ef\u8fdb\u5165\u4f53\u68c0\u548c\u7ec4\u7ec7\u8003\u5bdf\u9636\u6bb5\u3002\n\uff08\u4e09\uff09\u4f53\u68c0\u548c\u8003\u5bdf\n\u6309\u62db\u8058\u5c97\u4f4d\u4eba\u65701:1\u7684\u6bd4\u4f8b\u4f9d\u8003\u8bd5\u7efc\u5408\u6210\u7ee9\u7531\u9ad8\u5230\u4f4e\u987a\u5e8f\u786e\u5b9a\u4f53\u68c0\u5bf9\u8c61\u3002\u82e5\u51fa\u73b0\u7efc\u5408\u6210\u7ee9\u76f8\u540c\u7684\uff0c\u4e0d\u80fd\u6309\u62db\u8058\u5c97\u4f4d\u786e\u5b9a\u4f53\u68c0\u5bf9\u8c61\u7684\uff0c\u5148\u6309\u516c\u544a\u4e2d\u300a\u5c97\u4f4d\u8868\u300b\u4f18\u5148\u6761\u4ef6\u6392\u540d\u5148\u540e\uff1b\u5982\u6761\u4ef6\u4ecd\u76f8\u540c\uff0c\u5219\u6309\u9762\u8bd5\u6210\u7ee9\u7531\u9ad8\u5230\u4f4e\u987a\u5e8f\u786e\u5b9a\u3002\u5982\u51fa\u73b0\u7efc\u5408\u6210\u7ee9\u53ca\u9762\u8bd5\u6210\u7ee9\u5747\u76f8\u540c\u7684\u60c5\u5f62\uff0c\u5219\u7531\u62db\u8058\u5355\u4f4d\u589e\u52a0\u4e00\u6b21\u9762\u8bd5\uff0c\u5e76\u6309\u6b64\u6b21\u9762\u8bd5\u6210\u7ee9\u7684\u9ad8\u4f4e\u987a\u5e8f\u786e\u5b9a\u53c2\u52a0\u4f53\u68c0\u4eba\u5458\u3002\u4f53\u68c0\u6309\u6709\u5173\u6587\u4ef6\u8981\u6c42\u7ec4\u7ec7\u5b9e\u65bd\u3002\u4f53\u68c0\u5728\u6307\u5b9a\u533b\u9662\u8fdb\u884c\uff0c\u5177\u4f53\u65f6\u95f4\u3001\u5730\u70b9\u3001\u4f53\u68c0\u7ed3\u679c\u7531\u62db\u8058\u5355\u4f4d\u53e6\u884c\u901a\u77e5\u3002\u56e0\u8003\u751f\u4e2a\u4eba\u539f\u56e0\uff0c\u5728\u9762\u8bd5\u7ed3\u675f\u540e\u6307\u5b9a\u65f6\u95f4\u5185\u672a\u5b8c\u6210\u4f53\u68c0\u7684\uff0c\u89c6\u540c\u672c\u4eba\u653e\u5f03\u8058\u7528\u673a\u4f1a\uff0c\u6cd5\u5f8b\u6cd5\u89c4\u53e6\u884c\u89c4\u5b9a\u7684\u9664\u5916\u3002\u4f53\u68c0\u5408\u683c\u8005\u8fdb\u5165\u8003\u5bdf\u73af\u8282\u3002\n\u7528\u4eba\u5355\u4f4d\u6309\u6709\u5173\u6587\u4ef6\u8981\u6c42\u5bf9\u4f53\u68c0\u5408\u683c\u8005\u8fdb\u884c\u8003\u5bdf\u3002\u8003\u5bdf\u5185\u5bb9\u4e3b\u8981\u5305\u62ec\u601d\u60f3\u653f\u6cbb\u8868\u73b0\u3001\u9053\u5fb7\u54c1\u8d28\u3001\u5b66\u5386\u60c5\u51b5\u3001\u4e1a\u52a1\u80fd\u529b\u3001\u5de5\u4f5c\u5b9e\u7ee9\u7b49\uff0c\u5e76\u6838\u5b9e\u5176\u662f\u5426\u5177\u5907\u62a5\u8003\u8d44\u683c\u3002\u8003\u5bdf\u4e0d\u5408\u683c\u7684\uff0c\u53d6\u6d88\u8058\u7528\u8d44\u683c\u3002\n\uff08\u56db\uff09\u9012\u8865\n\u56e0\u4e0b\u5217\u60c5\u5f62\u5bfc\u81f4\u62df\u8058\u5c97\u4f4d\u51fa\u73b0\u7a7a\u7f3a\u7684\uff0c\u53ef\u5728\u540c\u4e00\u5c97\u4f4d\u7efc\u5408\u6210\u7ee9\u5408\u683c\u4eba\u5458\u4e2d\u6309\u7167\u7efc\u5408\u6210\u7ee9\u7531\u9ad8\u5230\u4f4e\u7684\u987a\u5e8f\u4f9d\u6b21\u9012\u8865\u5176\u4ed6\u8003\u751f:\n1.\u5e94\u8058\u4eba\u5458\u4f53\u68c0\u4e0d\u5408\u683c\u7684\uff1b\n2.\u8003\u5bdf\u4eba\u9009\u672a\u88ab\u786e\u5b9a\u4e3a\u62df\u8058\u7528\u4eba\u5458\u7684\uff1b\n3.\u62df\u8058\u7528\u4eba\u5458\u516c\u793a\u7ed3\u679c\u5bfc\u81f4\u4e0d\u80fd\u8058\u7528\u7684\uff1b\n4.\u62df\u8058\u7528\u4eba\u5458\u653e\u5f03\u8058\u7528\u7684\u3002\n\uff08\u4e94\uff09\u516c\u793a\u53ca\u8058\u7528\n1.\u8003\u5bdf\u5408\u683c\u7684\uff0c\u786e\u5b9a\u4e3a\u62df\u8058\u7528\u4eba\u5458\u540d\u5355\uff0c\u62df\u8058\u7528\u4eba\u5458\u540d\u5355\u5728\u5e7f\u5dde\u5e02\u767d\u4e91\u533a\u4eba\u6c11\u653f\u5e9c\u95e8\u6237\u7f51\u7ad9\u516c\u793a5\u4e2a\u5de5\u4f5c\u65e5\uff0c\u516c\u793a\u671f\u6ee1\u6ca1\u6709\u5f02\u8bae\u7684\uff0c\u7531\u7528\u4eba\u5355\u4f4d\u6309\u6709\u5173\u89c4\u5b9a\u529e\u7406\u8058\u7528\u624b\u7eed\uff082025\u5e74\u6bd5\u4e1a\u751f\u53d6\u5f97\u76f8\u5e94\u6bd5\u4e1a\u8bc1\u3001\u5b66\u4f4d\u8bc1\u540e\u6309\u89c4\u5b9a\u529e\u7406\uff09\uff0c\u6309\u89c4\u5b9a\u5b9e\u884c\u8bd5\u7528\u671f\u5236\u5ea6\uff0c\u8bd5\u7528\u671f\u5185\u6216\u8bd5\u7528\u671f\u6ee1\u8003\u6838\u4e0d\u5408\u683c\u7684\u4eba\u5458\uff0c\u53d6\u6d88\u8058\u7528\u8d44\u683c\u3002\n2.2025\u5e74\u6bd5\u4e1a\u751f\u5982\u672a\u57282025\u5e747\u670831\u65e5\u524d\u83b7\u5f97\u5c97\u4f4d\u62db\u8058\u6761\u4ef6\u4e2d\u4e0e\u4e13\u4e1a\u8981\u6c42\u76f8\u5bf9\u5e94\u7684\u5b66\u5386\u6216\u5b66\u4f4d\u8bc1\u4e66\uff08\u56fd\uff08\u5883\uff09\u5916\u9ad8\u6821\u6bd5\u4e1a\u751f\u8fd8\u9700\u63d0\u4f9b2024\u5e748\u67081\u65e5\u81f32025\u5e747\u670831\u65e5\u671f\u95f4\u53d6\u5f97\u7684\u4e2d\u56fd\uff08\u6559\u80b2\u90e8\uff09\u7559\u5b66\u670d\u52a1\u4e2d\u5fc3\u5883\u5916\u5b66\u5386\u3001\u5b66\u4f4d\u8ba4\u8bc1\u51fd\uff09\uff0c\u5c06\u88ab\u53d6\u6d88\u8058\u7528\u8d44\u683c\u3002\n3.\u5e94\u8058\u4eba\u5458\u4ee5\u975e\u6700\u9ad8\u5b66\u5386\u4e13\u4e1a\u62a5\u8003\u7684\uff0c2025\u5e747\u670831\u65e5\u524d\u672a\u53d6\u5f97\u6700\u9ad8\u5b66\u5386\u7684\u6bd5\u4e1a\u8bc1\u4e66\u548c\u5b66\u4f4d\u8bc1\u4e66\uff08\u56fd\uff08\u5883\uff09\u5916\u9ad8\u6821\u6bd5\u4e1a\u751f\u8fd8\u9700\u4e8e2025\u5e747\u670831\u65e5\u524d\u53d6\u5f97\u4e2d\u56fd\uff08\u6559\u80b2\u90e8\uff09\u7559\u5b66\u670d\u52a1\u4e2d\u5fc3\u5883\u5916\u5b66\u5386\u3001\u5b66\u4f4d\u8ba4\u8bc1\u51fd\uff09\u7684\uff0c\u5c06\u88ab\u53d6\u6d88\u8058\u7528\u8d44\u683c\u3002\n4.\u8058\u7528\u4eba\u5458\u4e3a\u4e8b\u4e1a\u7f16\u5236\uff0c\u6309\u6240\u8058\u5c97\u4f4d\u4eab\u53d7\u76f8\u5e94\u5de5\u8d44\u5f85\u9047\uff0c\u76f8\u5173\u6807\u51c6\u6309\u5e7f\u5dde\u5e02\u4e8b\u4e1a\u5355\u4f4d\u5de5\u8d44\u6709\u5173\u89c4\u5b9a\u548c\u5355\u4f4d\u7684\u5de5\u8d44\u5206\u914d\u5236\u5ea6\u6267\u884c\u3002\n\u56db\u3001\u5176\u4ed6\u4e8b\u9879\n\uff08\u4e00\uff09\u8003\u751f\u62a5\u540d\u524d\u9700\u8ba4\u771f\u9605\u8bfb\u516c\u544a\uff0c\u7b26\u5408\u5c97\u4f4d\u8981\u6c42\u7684\u6240\u6709\u8d44\u683c\u6761\u4ef6\u65b9\u53ef\u62a5\u8003\u3002\u51e1\u4e0d\u6309\u89c4\u5b9a\u6761\u4ef6\u62a5\u540d\u7684\uff0c\u4e00\u7ecf\u53d1\u73b0\uff0c\u7acb\u5373\u53d6\u6d88\u62a5\u8003\u8d44\u683c\u3002\n\uff08\u4e8c\uff09\u8003\u751f\u586b\u62a5\u7684\u4e2a\u4eba\u4fe1\u606f\u548c\u63d0\u4ea4\u7684\u6750\u6599\u5e94\u5f53\u771f\u5b9e\u3001\u51c6\u786e\uff0c\u51e1\u4e0d\u7b26\u5408\u5c97\u4f4d\u8981\u6c42\u6216\u5f04\u865a\u4f5c\u5047\u7684\uff0c\u4e00\u7ecf\u67e5\u5b9e\uff0c\u5373\u53d6\u6d88\u8003\u8bd5\u8d44\u683c\u6216\u8058\u7528\u8d44\u683c\u3002\u8003\u751f\u8d44\u683c\u5ba1\u67e5\u8d2f\u7a7f\u62db\u8058\u5de5\u4f5c\u5168\u8fc7\u7a0b\uff0c\u5728\u5404\u73af\u8282\u53d1\u73b0\u62a5\u8003\u8005\u5f04\u865a\u4f5c\u5047\u6216\u4e0d\u7b26\u5408\u8d44\u683c\u6761\u4ef6\u7684\uff0c\u62db\u8058\u5355\u4f4d\u5747\u53ef\u4ee5\u53d6\u6d88\u5176\u8d44\u683c\u3002\n\uff08\u4e09\uff09\u4e3a\u4fbf\u4e8e\u5355\u4f4d\u7ba1\u7406\uff0c\u975e\u5e7f\u5dde\u5e02\u6237\u7c4d\u5e94\u8058\u4eba\u5458\u539f\u5219\u4e0a\u987b\u5728\u8058\u7528\u540e\u5c06\u6237\u7c4d\u8fc1\u81f3\u5e7f\u5dde\u5e02\u3002\n\uff08\u56db\uff09\u62db\u8058\u8fc7\u7a0b\u4e2d\u5982\u9047\u5230\u90e8\u5206\u5355\u4f4d\u5b9e\u65bd\u673a\u6784\u6539\u9769\u53d1\u751f\u7684\u62db\u8058\u5c97\u4f4d\u53d8\u66f4\uff0c\u7531\u5e7f\u5dde\u5e02\u767d\u4e91\u533a\u4eba\u529b\u8d44\u6e90\u548c\u793e\u4f1a\u4fdd\u969c\u5c40\u8d1f\u8d23\u89e3\u91ca\u3002\n\u516c\u5f00\u62db\u8058\u6709\u5173\u4e8b\u5b9c\u5c06\u9002\u65f6\u901a\u8fc7\u5e7f\u5dde\u5e02\u767d\u4e91\u533a\u4eba\u6c11\u653f\u5e9c\u95e8\u6237\u7f51\u7ad9\u516c\u5e03\u3002\u4e3a\u907f\u514d\u56e0\u54a8\u8be2\u7535\u8bdd\u62e5\u6324\u800c\u5f71\u54cd\u62a5\u540d\uff0c\u8003\u751f\u5e94\u5148\u8be6\u7ec6\u9605\u8bfb\u516c\u544a\u548c\u5c97\u4f4d\u8868\u7b49\u4fe1\u606f\uff1b\u5982\u4ecd\u6709\u7591\u95ee\uff0c\u518d\u7535\u8bdd\u54a8\u8be2\u3002\u5de5\u4f5c\u4eba\u5458\u4ec5\u5bf9\u516c\u544a\u5185\u5bb9\u53ca\u653f\u7b56\u7ed9\u4e88\u89e3\u91ca\uff0c\u4e0d\u5bf9\u8003\u751f\u662f\u5426\u7b26\u5408\u5c97\u4f4d\u6761\u4ef6\u8fdb\u884c\u786e\u8ba4\u3002\u5e7f\u5dde\u5e02\u767d\u4e91\u533a\u4eba\u529b\u8d44\u6e90\u548c\u793e\u4f1a\u4fdd\u969c\u5c40\u54a8\u8be2\u7535\u8bdd:<PRESIDIO_ANONYMIZED_PHONE_NUMBER>\uff0c\u76d1\u7763\u7535\u8bdd:<PRESIDIO_ANONYMIZED_PHONE_NUMBER>\uff0c\u5177\u4f53\u5c97\u4f4d\u60c5\u51b5\u53ef\u54a8\u8be2\u9644\u4ef64\u4e2d\u5404\u62db\u8058\u5355\u4f4d\u7684\u8054\u7cfb\u7535\u8bdd\u3002\uff08\u53d7\u7406\u65f6\u95f4:\u5468\u4e00\u81f3\u5468\u4e94\uff0c\u4e0a\u53489:0012:00\uff0c\u4e0b\u53482:006:00\uff0c\u8282\u5047\u65e5\u9664\u5916\uff09\u3002\n\u9644\u4ef61:\n\u5e7f\u5dde\u5e02\u767d\u4e91\u533a2024\u5e74\u516c\u5f00\u62db\u8058\u4e8b\u4e1a\u5355\u4f4d\u5de5\u4f5c\u4eba\u5458\u5c97\u4f4d\u9700\u6c42\u8868.xlsx\n\u9644\u4ef62:\n\u5e7f\u4e1c\u77012024\u5e74\u8003\u8bd5\u5f55\u7528\u516c\u52a1\u5458\u4e13\u4e1a\u53c2\u8003\u76ee\u5f55.xls\n\u9644\u4ef63:\n\u5e7f\u5dde\u5e02\u4eba\u6c11\u653f\u5e9c\u529e\u516c\u5385\u5173\u4e8e\u5370\u53d1\u5e7f\u5dde\u5e02\u5f15\u8fdb\u4eba\u624d\u5165\u6237\u7ba1\u7406\u529e\u6cd5\u7684\u901a\u77e5\uff08\u7a57\u5e9c\u529e\u89c4\u30142020\u301510\u53f7\uff09.docx\n\u9644\u4ef64:\n\u5e7f\u5dde\u5e02\u767d\u4e91\u533a2024\u5e74\u516c\u5f00\u62db\u8058\u4e8b\u4e1a\u5355\u4f4d\u5de5\u4f5c\u4eba\u5458\u62db\u8058\u5355\u4f4d\u54a8\u8be2\u7535\u8bdd\u6c47\u603b\u8868.xls\n\u5e7f\u5dde\u5e02\u767d\u4e91\u533a\u4eba\u529b\u8d44\u6e90\u548c\u793e\u4f1a\u4fdd\u969c\u5c40\n2024\u5e7411\u670811\u65e5\n```\n# CONTEXT #\n\u4ece\u62db\u8058\u516c\u544a\u4e2d\u63d0\u53d6\u4ee5\u4e0b\u4fe1\u606f\u9879\uff1a'\u62db\u8058\u5355\u4f4d'\uff0c'\u62db\u8058\u5355\u4f4d\u8054\u7cfb\u7535\u8bdd\u6216\u624b\u673a'\uff0c'\u76d1\u7763\u5355\u4f4d'\uff0c'\u76d1\u7763\u5355\u4f4d\u8054\u7cfb\u7535\u8bdd\u6216\u624b\u673a'\uff0c'\u62db\u8058\u5355\u4f4d\u7535\u5b50\u90ae\u7bb1'\uff0c'\u76d1\u7763\u5355\u4f4d\u7535\u5b50\u90ae\u7bb1'\uff0c'\u62db\u8058\u4eba\u6570'\uff0c'\u62db\u8058\u5c97\u4f4d\u6570'\uff0c'\u62a5\u540d\u65f6\u95f4'\uff0c'\u662f\u5426\u9700\u8981\u7b14\u8bd5'\uff0c'\u662f\u5426\u9700\u8981\u9762\u8bd5'\uff0c'\u662f\u5426\u9700\u8981\u8d44\u683c\u5ba1\u6838'\uff0c'\u662f\u5426\u9700\u8981\u662f\u4e8b\u4e1a\u7f16\u5236'\uff0c'\u9762\u8bd5\u5f62\u5f0f'\uff0c'\u7b14\u8bd5\u5185\u5bb9'\uff0c'\u6700\u4f4e\u5b66\u5386\u8981\u6c42'\uff0c'\u5e74\u9f84\u8981\u6c42'\uff0c'\u603b\u5206\u8ba1\u7b97\u65b9\u5f0f'\uff0c'\u62a5\u540d\u65b9\u5f0f'\uff0c'\u4e13\u4e1a\u8981\u6c42'\uff0c'\u62db\u8058\u5355\u4f4d\u8054\u7cfb\u4eba'\uff0c'\u662f\u5426\u9700\u8981\u5e94\u5c4a'\uff0c'\u7ebf\u4e0a/\u7ebf\u4e0b\u8003\u8bd5'\uff0c'\u8fdb\u5165\u9762\u8bd5\u6bd4\u4f8b','\u4e92\u8054\u7f51\u62a5\u540d\u5730\u5740','\u7b14\u8bd5\u65f6\u95f4','\u9762\u8bd5\u65f6\u95f4','\u7b14\u8bd5\u5730\u70b9','\u9762\u8bd5\u5730\u70b9'\n\n# OBJECTIVE #\n\u63d0\u53d6\u6240\u9700\u4fe1\u606f\u9879\u5e76\u8fd4\u56deJSON\u683c\u5f0f\u3002\u591a\u4e2a\u503c\u7528\u9017\u53f7\u5206\u9694\uff0c\u65e0\u6cd5\u63d0\u53d6\u7684\u9879\u7528\u7a7a\u5b57\u7b26\u4e32\u8868\u793a\u3002\u6bcf\u4e2a\u4fe1\u606f\u9879\u8fd4\u56de\u5b57\u7b26\u4e32\u5f62\u5f0f\uff0c\u7981\u6b62\u4ee5\u5b57\u7b26\u4e32\u6570\u7ec4\u7684\u5f62\u5f0f\u8fd4\u56de\uff0c\u591a\u4e2a\u4fe1\u606f\u9879\u7528\u9017\u53f7\u9694\u5f00\u3002\n\n\u5206\u7c7b\u548c\u5224\u65ad\u6807\u51c6\uff1a\n- '\u62db\u8058\u4eba\u6570'\uff1a\u62db\u8058\u591a\u4e2a\u5c97\u4f4d\u65f6\uff0c\u8bf7\u5c06\u591a\u4e2a\u62db\u8058\u5c97\u4f4d\u7684\u62db\u8058\u4eba\u6570\u76f8\u52a0\uff1b\u516c\u544a\u5185\u672a\u63d0\u53ca\u62db\u8058\u4eba\u6570\uff0c\u8bf7\u4ee5'\u82e5\u5e72'\u6587\u5b57\u8fdb\u884c\u8f93\u51fa\n- '\u62db\u8058\u5c97\u4f4d\u6570'\uff1a\u62db\u8058\u591a\u4e2a\u5c97\u4f4d\u65f6\uff0c\u8bf7\u5c06\u591a\u4e2a\u627e\u5e73\u5c97\u4f4d\u6570\u76f8\u52a0\uff1b\u516c\u544a\u5185\u672a\u63d0\u53ca\u62db\u8058\u5c97\u4f4d\u65f6\uff0c\u8bf7\u4ee5'\u672a\u77e5'\u6587\u5b57\u8fdb\u884c\u8f93\u51fa\n- '\u9762\u8bd5\u5f62\u5f0f'\uff1a\u7ed3\u6784\u5316\u3001\u7b54\u8fa9\u3001\u4e13\u4e1a\u9762\u8bd5\u3001\u8bd5\u6559\u3001\u8bd5\u8bb2\u3001\u8bf4\u8bfe\u3001\u5fae\u578b\u8bfe\u3001\u8bc4\u8bfe\u3001\u7247\u6bb5\u6559\u5b66\u3001\u6559\u5b66\u80fd\u529b\u3001\u5b9e\u64cd\u3001\u6280\u80fd\u6d4b\u8bd5\u3001\u4e13\u4e1a\u6280\u80fd\u6d4b\u8bd5\u3001\u5b9e\u9645\u64cd\u4f5c\u3001\u4e13\u4e1a\u5316\u9762\u8bd5\u3001\u4e13\u4e1a\u5b9e\u8df5\u80fd\u529b\u3001\u65e0\u9886\u5bfc\u3001\u5c0f\u7ec4\u8ba8\u8bba\u3001\u60c5\u666f\u6a21\u62df\u3001\u5373\u5174\u6f14\u8bb2\n- '\u6700\u4f4e\u5b66\u5386\u8981\u6c42'\uff1a\u4e2d\u4e13\u3001\u521d\u4e2d\u3001\u9ad8\u4e2d\u3001\u4e2d\u804c\u3001\u804c\u9ad8\u3001\u804c\u4e2d\u3001\u5927\u4e13\u3001\u4e13\u79d1\u3001\u672c\u79d1\u3001\u5b66\u58eb\u3001\u5927\u5b66\u3001\u9ad8\u6821\u3001\u9ad8\u7b49\u5b66\u6821\u3001\u9ad8\u7b49\u9662\u6821\u3001\u4e00\u672c\u3001\u4e8c\u672c\u3001\u4e09\u672c\u3001\u7814\u7a76\u751f\u3001\u7855\u58eb\u3001\u7855\u7814\u3001\u535a\u58eb\u3001\u535a\u7814\n- '\u7b14\u8bd5\u5185\u5bb9'\uff1a\u516c\u5171\u57fa\u7840\u77e5\u8bc6\u3001\u884c\u653f\u804c\u4e1a\u80fd\u529b\u6d4b\u8bd5\u3001\u6559\u80b2\u57fa\u7840\u77e5\u8bc6\u3001\u7efc\u5408\u77e5\u8bc6\u3001\u4e13\u4e1a\u77e5\u8bc6\u3001\u7533\u8bba\u3001\u591a\u4e2a\u79d1\u76ee\n- '\u662f\u5426\u9700\u8981\u662f\u4e8b\u4e1a\u7f16\u5236'\uff1a\u901a\u8fc7\u5173\u952e\u5b57\u5224\u65ad\uff08\u7f16\u5236\u5185\u3001\u4e8b\u4e1a\u5355\u4f4d\u7f16\u5236\u3001\u4e8b\u4e1a\u7f16\u5236\u3001\u7f16\u5236\u7ba1\u7406\uff09\n- '\u62a5\u540d\u65f6\u95f4'\uff1a\u5c3d\u91cf\u4ee5\u65e5\u671f\u683c\u5f0f\u8f93\u51fa\n- '\u62a5\u540d\u65b9\u5f0f'\uff1a\u73b0\u573a\u3001\u7f51\u4e0a\u3001\u73b0\u573a+\u7f51\u4e0a\n- '\u4e13\u4e1a\u8981\u6c42'\uff1a\u5982\u63d0\u53ca\u591a\u4e2a\u5c97\u4f4d\uff0c\u5c97\u4f4d\u6240\u9700\u7684\u4e13\u4e1a\u8981\u6c42\u7528\u9017\u53f7\u9694\u5f00\u4ee5\u5b57\u7b26\u4e32\u8f93\u51fa\n- '\u8fdb\u5165\u9762\u8bd5\u6bd4\u4f8b'\uff1a\u8981\u6c42\u4e3a\uff08n:n\uff09\u683c\u5f0f\n- '\u603b\u5206\u8ba1\u7b97\u65b9\u5f0f'\uff1a\u683c\u5f0f\u4f8b\u5b50\u4e3a\uff1a\u7b14\u8bd5\u6210\u7ee9\u00d750%+\u9762\u8bd5\u6210\u7ee9\u00d750%+\u52a0\u5206\u9879\n- '\u4e92\u8054\u7f51\u62a5\u540d\u5730\u5740'\uff1a\u662f\u4ee5http\u6216\u8005https\u4e3a\u534f\u8bae\u7684\u62a5\u540d\u7cfb\u7edf\u6216\u62a5\u540d\u5730\u5740\uff0c\u4e0d\u662f\u6295\u9012\u90ae\u7bb1\n- '\u7b14\u8bd5\u65f6\u95f4'\uff1a\u5c3d\u91cf\u4ee5\u65e5\u671f\u683c\u5f0f\u8f93\u51fa\n- '\u9762\u8bd5\u65f6\u95f4'\uff1a\u5c3d\u91cf\u4ee5\u65e5\u671f\u683c\u5f0f\u8f93\u51fa\n\n# STYLE #\n\u4e25\u683c\u9075\u5faa\u4f7f\u7528JSON\u683c\u5f0f\u8f93\u51fa\uff0c\u5e76\u4e14\u53ea\u80fd\u4ee5\u4e2d\u6587\u8868\u793a\u4fe1\u606f\u9879\n\n# TONE #\n\u786e\u4fdd\u51c6\u786e\u3001\u7b80\u6d01\n\n# AUDIENCE #\n\u7528\u4e8e\u4fe1\u606f\u63d0\u53d6\u548c\u7edf\u8ba1\n\n# RESPONSE #\n\u4e3a\u6bcf\u4e2a\u9879\u63d0\u53d6\u51c6\u786e\u3001\u7b80\u6d01\u7684\u4fe1\u606f\nAssistant:"},{"assistant_initiates":false,"asst_text":"feature request","behavior":"degenerate_repetition","conversation_hash":"b1fdab1cfd721ceaa9154132741e2b10","conversation_redacted":false,"conversation_toxic":false,"country":"United States","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"English","model":"gpt-4o-2024-08-06","n_chars":1510,"n_turns_in_conversation":1,"n_words":237,"source_row_offset":37401,"source_shard":"turns-00050.parquet","timestamp":"Tue, 12 Nov 2024 13:40:37 GMT","turn_id":"b80c53a3e5cad49da1a5347c","turn_index":0,"user_text":"System: I will provide you with a textual user review of an Android app, aiming to categorize the reviews into specific intention classes:\nbug report: report a problem, such as faulty behavior of the application. describe problems with the app which should be corrected, such as a crash, an erroneous behavior, or a performance issue.\nfeature request: ask for a missing feature, functionality or content, as well as reviews that ask for the improvement of an existing feature.\nother: users express general appreciation with the application. It focuses on general judgment. They are simple text reflections of the numeric star rating. Ratings are less informative as they only include praise, dispraise, a distractive critique, or a dissuasion. Reviews where users describe workarounds, use cases and scenarios involving the app\nexamples:\n\nreview: force close.. pls fix ooppssss.. its not working properly... when game starts its attempting to force close... please fix this bug... iam unable to play this game..\nintention: bug report\nreview: Good not best We cannot update status like skype! Upgrade with status eg online! Invinsible! Offline!\nintention: feature request\nreview: very easy and good game ggsrhjuvdsh\nintention: other\nUser: 'Does the author's intention in this app review relate to a bug report or feature request or other?\nreview: better than avg not as fully featured as the full site. miss seeing editor's choices and features. a must for deal hunters.'\nintention: '\nAssistant:"},{"assistant_initiates":false,"asst_text":"United States","behavior":"degenerate_repetition","conversation_hash":"dfacc2570ae4248e5e4b9989a0dff056","conversation_redacted":false,"conversation_toxic":false,"country":"United States","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"Vietnamese","model":"gpt-4o-mini-2024-07-18","n_chars":53,"n_turns_in_conversation":1,"n_words":11,"source_row_offset":37402,"source_shard":"turns-00050.parquet","timestamp":"Tue, 12 Nov 2024 13:40:40 GMT","turn_id":"41d267df974e093cf0612f67","turn_index":0,"user_text":"ch\u1ec9 tr\u1ea3 v\u1ec1 t\u00ean ti\u1ebfng anh c\u1ee7a qu\u1ed1c giaM\u1ef9"},{"assistant_initiates":false,"asst_text":"\"Volio\" c\u00f3 th\u1ec3 l\u00e0 m\u1ed9t t\u1eeb ho\u1eb7c thu\u1eadt ng\u1eef kh\u00f4ng ph\u1ed5 bi\u1ebfn ho\u1eb7c kh\u00f4ng r\u00f5 ngh\u0129a trong ti\u1ebfng Vi\u1ec7t n\u1ebfu kh\u00f4ng c\u00f3 ng\u1eef c\u1ea3nh c\u1ee5 th\u1ec3. N\u00f3 c\u00f3 th\u1ec3 l\u00e0 m\u1ed9t th\u01b0\u01a1ng hi\u1ec7u, t\u00ean ri\u00eang, ho\u1eb7c m\u1ed9t t\u1eeb trong ng\u00f4n ng\u1eef kh\u00e1c. N\u1ebfu b\u1ea1n cung c\u1ea5p th\u00eam th\u00f4ng tin ho\u1eb7c ng\u1eef c\u1ea3nh li\u00ean quan, t\u00f4i s\u1ebd c\u00f3 th\u1ec3 gi\u00fap b\u1ea1n hi\u1ec3u r\u00f5 h\u01a1n v\u1ec1 \"Volio\".","behavior":"degenerate_repetition","conversation_hash":"11076d739bcb6a932b9fcf2ac5a29886","conversation_redacted":false,"conversation_toxic":false,"country":"United States","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"Italian","model":"gpt-4o-mini-2024-07-18","n_chars":311,"n_turns_in_conversation":1,"n_words":68,"source_row_offset":37403,"source_shard":"turns-00050.parquet","timestamp":"Tue, 12 Nov 2024 13:40:40 GMT","turn_id":"d4b36cf460a6444dba41ab02","turn_index":0,"user_text":"Volio l\u00e0 g\u00ec"},{"assistant_initiates":false,"asst_text":"Th\u1ee7 \u0111\u00f4 c\u1ee7a M\u1ef9 l\u00e0 Washington, D.C. (District of Columbia). \u0110\u00e2y l\u00e0 n\u01a1i t\u1eadp trung c\u00e1c c\u01a1 quan ch\u00ednh ph\u1ee7 v\u00e0 nhi\u1ec1u di t\u00edch l\u1ecbch s\u1eed quan tr\u1ecdng.","behavior":"degenerate_repetition","conversation_hash":"a3ab559fd5870cd89bac07d2ea903902","conversation_redacted":false,"conversation_toxic":false,"country":"South Korea","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"Vietnamese","model":"gpt-4o-mini-2024-07-18","n_chars":151,"n_turns_in_conversation":1,"n_words":32,"source_row_offset":37404,"source_shard":"turns-00050.parquet","timestamp":"Tue, 12 Nov 2024 13:40:41 GMT","turn_id":"243a2620f9e96b8007643731","turn_index":0,"user_text":"th\u1ee7 \u0111\u00f4 c\u1ee7a M\u1ef9"},{"assistant_initiates":false,"asst_text":"2 + 2 \u0431\u0443\u0434\u0435\u0442 4.","behavior":"degenerate_repetition","conversation_hash":"884d826864084268cf71a84ca6b5c7c4","conversation_redacted":false,"conversation_toxic":false,"country":"United States","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"Russian","model":"gpt-4o-2024-08-06","n_chars":34,"n_turns_in_conversation":1,"n_words":10,"source_row_offset":37405,"source_shard":"turns-00050.parquet","timestamp":"Tue, 12 Nov 2024 13:40:41 GMT","turn_id":"60b07996442412197d6e495b","turn_index":0,"user_text":"\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0443\u0434\u0435\u0442 2 + 2"},{"assistant_initiates":false,"asst_text":"Cambodia","behavior":"degenerate_repetition","conversation_hash":"001e5c451a970cbe8a27aed8023b2092","conversation_redacted":false,"conversation_toxic":false,"country":"Japan","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"Vietnamese","model":"gpt-4o-mini-2024-07-18","n_chars":55,"n_turns_in_conversation":1,"n_words":10,"source_row_offset":37406,"source_shard":"turns-00050.parquet","timestamp":"Tue, 12 Nov 2024 13:40:42 GMT","turn_id":"237cc4f871dbcc76a3adfe6c","turn_index":0,"user_text":"ch\u1ec9 tr\u1ea3 v\u1ec1 t\u00ean ti\u1ebfng anh c\u1ee7a qu\u1ed1c giaCAMPUCHIA"}],"shard":{"index":50,"name":"turns-00050.parquet","rows":48033}}
