[{"data":1,"prerenderedAt":522},["ShallowReactive",2],{"i-ic:sharp-mail":3,"i-fa6-brands:github":8,"i-fa6-brands:linkedin":12,"i-fa6-brands:telegram":15,"blog\u002F2025-02-19-taming-the-chaos\u002Fposition":4,"\u002Fblog\u002F2025-02-19-taming-the-chaos":17,"i-openmoji:flag-united-kingdom":511,"i-ic:sharp-monitor":514,"i-ic:sharp-arrow-back-ios":516,"i-ic:sharp-arrow-forward-ios":518,"i-mdi-light:clipboard":520},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cpath fill=\"currentColor\" d=\"M22 4H2v16h20zm-2 4l-8 5l-8-5V6l8 5l8-5z\"\u002F>",{"left":4,"top":4,"width":9,"height":10,"rotate":4,"vFlip":6,"hFlip":6,"body":11},496,512,"\u003Cpath fill=\"currentColor\" d=\"M165.9 397.4c0 2-2.3 3.6-5.2 3.6c-3.3.3-5.6-1.3-5.6-3.6c0-2 2.3-3.6 5.2-3.6c3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9c2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9c.3 2 2.9 3.3 5.9 2.6c2.9-.7 4.9-2.6 4.6-4.6c-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2c12.8 2.3 17.3-5.6 17.3-12.1c0-6.2-.3-40.4-.3-61.4c0 0-70 15-84.7-29.8c0 0-11.4-29.1-27.8-36.6c0 0-22.9-15.7 1.6-15.4c0 0 24.9 2 38.6 25.8c21.9 38.6 58.6 27.5 72.9 20.9c2.3-16 8.8-27.1 16-33.7c-55.9-6.2-112.3-14.3-112.3-110.5c0-27.5 7.6-41.3 23.6-58.9c-2.6-6.5-11.1-33.3 2.6-67.9c20.9-6.5 69 27 69 27c20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27c13.7 34.7 5.2 61.4 2.6 67.9c16 17.7 25.8 31.5 25.8 58.9c0 96.5-58.9 104.2-114.8 110.5c9.2 7.9 17 22.9 17 46.4c0 33.7-.3 75.4-.3 83.6c0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252C496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2c1.6 1.6 3.9 2.3 5.2 1c1.3-1 1-3.3-.7-5.2c-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9c1.6 1 3.6.7 4.3-.7c.7-1.3-.3-2.9-2.3-3.9c-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2c2.3 2.3 5.2 2.6 6.5 1c1.3-1.3.7-4.3-1.3-6.2c-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2c-1.4-2.3-4-3.3-5.6-2\"\u002F>",{"left":4,"top":4,"width":13,"height":10,"rotate":4,"vFlip":6,"hFlip":6,"body":14},448,"\u003Cpath fill=\"currentColor\" d=\"M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3M135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5c0 21.3-17.2 38.5-38.5 38.5m282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7c-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5c67.2 0 79.7 44.3 79.7 101.9z\"\u002F>",{"left":4,"top":4,"width":9,"height":10,"rotate":4,"vFlip":6,"hFlip":6,"body":16},"\u003Cpath fill=\"currentColor\" d=\"M248 8C111.033 8 0 119.033 0 256s111.033 248 248 248s248-111.033 248-248S384.967 8 248 8m114.952 168.66c-3.732 39.215-19.881 134.378-28.1 178.3c-3.476 18.584-10.322 24.816-16.948 25.425c-14.4 1.326-25.338-9.517-39.287-18.661c-21.827-14.308-34.158-23.215-55.346-37.177c-24.485-16.135-8.612-25 5.342-39.5c3.652-3.793 67.107-61.51 68.335-66.746c.153-.655.3-3.1-1.154-4.384s-3.59-.849-5.135-.5q-3.283.746-104.608 69.142q-14.845 10.194-26.894 9.934c-8.855-.191-25.888-5.006-38.551-9.123c-15.531-5.048-27.875-7.717-26.8-16.291q.84-6.7 18.45-13.7q108.446-47.248 144.628-62.3c68.872-28.647 83.183-33.623 92.511-33.789c2.052-.034 6.639.474 9.61 2.885a10.45 10.45 0 0 1 3.53 6.716a43.8 43.8 0 0 1 .417 9.769\"\u002F>",{"id":18,"title":19,"body":20,"date":489,"description":490,"draft":6,"extension":491,"image":431,"lang":492,"meta":493,"navigation":182,"path":494,"seo":495,"stem":496,"tags":497,"__hash__":500,"before":501,"after":506},"blog\u002Fblog\u002F2025-02-19-taming-the-chaos.md","Taming the Chaos: Building a Custom File Format Toolkit",{"type":21,"value":22,"toc":482},"minimark",[23,27,31,34,39,42,49,52,56,59,62,68,71,77,107,110,113,117,120,123,126,129,135,138,141,419,423,426,432,435,438,444,447,451,454,457,475,478],[24,25,19],"h1",{"id":26},"taming-the-chaos-building-a-custom-file-format-toolkit",[28,29,30],"p",{},"Imagine situation: you are a big company chasing the AI trends, and you want to do unimaginable amount of data analysis, but all of your data is encoded in files, which none of the existing programs cannot read properly. That is the place, where I should come in and solve these problems.",[28,32,33],{},"Hello, my name is Nikolai Dorofeev and here I would like to share my experience in systemizing proprietary standards and implementing a toolkit for it.",[35,36,38],"h2",{"id":37},"prehistory","Prehistory",[28,40,41],{},"Some time before the main events described in this article, I was asked to update one small detail in a large proprietary file. It was something like “Change property ID from A to B in all occurrences”. I, professional JSON Ops, obviously thought, that it is not a big deal, I can just read the file using a special deserialization function, make required changes and save changed objects back into the file. Therefore, I asked for the parser, and that was the most naive question in my life.",[28,43,44],{},[45,46],"img",{"alt":47,"src":48},"Star Wars Anakin and Padme meme","\u002Fblog\u002F2025-02-19\u002F1_star_wars_meme.jpg",[28,50,51],{},"It appeared, that some very clunky ways existed, however there were no solutions for extraction of meaningful structures from our files. It was a start of disappointment in this world, but the task was completed by a regular-expressions-like approach.",[35,53,55],{"id":54},"understanding-the-entity-encoded-into-the-files","Understanding the entity encoded into the files",[28,57,58],{},"There is a reason why all the crucial data is stored in the surprising new format - it is used for execution of core business scenarios. And this information was 80% enough for extracting our core business entity.",[28,60,61],{},"There is another incredibly convenient thing - these files are stored as CSV files, so I could open it in spreadsheet software.",[28,63,64],{},[45,65],{"alt":66,"src":67},"Custom format first look","\u002Fblog\u002F2025-02-19\u002F2_custom_format_first_look.png",[28,69,70],{},"It was no CSV file I had ever met before. There definitely are some tables, but it looked like the files stored not a single but several tables with metadata for each “scenario” as I could see from markers. After some time I figured out, that these “scenarios” describe scripts to simulate user’s activity in a system, and it has the following structure:",[28,72,73],{},[45,74],{"alt":75,"src":76},"Custom format entity structure","\u002Fblog\u002F2025-02-19\u002F3_custom_format_entity_structure.png",[78,79,80,84,87,90,93,104],"ol",{},[81,82,83],"li",{},"Begin indicator of the scenario - specific value in the first cell of a row",[81,85,86],{},"Scenario’s name - text in the cell right under the beginning indicator",[81,88,89],{},"Domain-specific scenario’s property value - text in the cell right under the name cell",[81,91,92],{},"Empty row - just for aesthetic when displaying in a spreadsheet software",[81,94,95,96],{},"Table of steps describing user’s behavior in the system\n",[78,97,98,101],{},[81,99,100],{},"First line - columns’ names",[81,102,103],{},"Following lines - steps’ values",[81,105,106],{},"End indicator -  specific value in the first cell of a row",[28,108,109],{},"It appeared, that this brand-new format was intentionally built on top of CSV to make it more visually interpretable and give users an opportunity to edit it with well-known spreadsheet software. Further, I will call this format “Super CSV”, as it stores many tables in a single file, while classic CSV keeps only one table inside.",[28,111,112],{},"It looked quite simple and good enough to make a first prototype, so it was time to do some coding.",[35,114,116],{"id":115},"changing-coding-approach","Changing coding approach",[28,118,119],{},"I am not a type of people, who writes everything with my own hands just because they cannot read and understand others’ code. I am smart, I need to simply build a convenient abstraction over already existing code.",[28,121,122],{},"So. I found the code for my basis. And building something over it was not an optimal solution for several reasons. Firstly, it supported only read-transform-write operations altogether, therefore I could not these features separately. Secondly, it did not use memory in optimal way - the whole file stored in raw format even if I needed only the first entity from it. Thirdly, it was already overcomplicated - team of four analytics was not able to understand this solution in three months.",[28,124,125],{},"Regardless of the listed disadvantages, I was able to pick the most useful interpretation part and copy it to the fresh file with the future toolkit. It was not building an abstraction over existing logic, but it still was reused logic.",[28,127,128],{},"For some reason, the original solution read a file into pieces of raw data, what limited a lot of capabilities for analysis and modification. On place of this mistake, I built a good old data class storing a structured data. Originally it included “name” field, getter for the important property and the steps table in a form of Pandas data frame (the code base happened to be Python code). However, later I had to write my custom table implementation to prevent users’ skill issue.",[28,130,131],{},[45,132],{"alt":133,"src":134},"Replace raw data with understandable structure","\u002Fblog\u002F2025-02-19\u002F4_replace_raw_data_with_understandable_structure.png",[28,136,137],{},"The most convenient solution is the most familiar solution, and the existing one looked completely strange in Python ecosystem. It was just built around the concept of callbacks, which creates a lot of barriers for a Python user. It is not possible to annotate a whole function with one imported type to ensure its correctness before passing as a parameter and Python does not allow creation of multiline lambda function, if we want to define the callback directly inside a function call. The only way, that somehow works is to create a class, where method should be rewritten, but who wants to create 10 classes for a single script?",[28,139,140],{},"Looking for an inspiration, I found “csv” module. CSV format is conceptually close to Super CSV - both store a sequence of some data. It is also well-known and relatively simple. I decided to go with this approach. As a result, time required to understand the tool reduced from 3 months to 5 minutes.",[142,143,148],"pre",{"className":144,"code":145,"language":146,"meta":147,"style":147},"language-py shiki shiki-themes github-light one-dark-pro","# Before\nfrom lib import SuperCsvManager, Scenario\n\nscenarios = []\ncurrent_scenario = None\n\ndef on_scenario_name_read(name):\n    nonlocal current_scenario \n    current_scenario = Scenario(name=name, steps=[])\n    scenarios.append(current_scenario)\n    \ndef on_scenario_step_read(step):\n    current_scenario.steps.append(step)\n    \nSuperCsvManager.read_file(file, \n                          on_scenario_name_read=on_scenario_name_read, \n                          on_scenario_step_read=on_scenario_step_read)\n\n# =========================================\n# After\n\nfrom lib import SuperCsvReader\nscenarios = list(SuperCsvReader(file))\n","py","",[149,150,151,160,177,184,197,209,214,234,243,273,285,291,306,317,322,340,351,362,367,373,379,384,396],"code",{"__ignoreMap":147},[152,153,156],"span",{"class":154,"line":155},"line",1,[152,157,159],{"class":158},"s91Lf","# Before\n",[152,161,163,167,171,174],{"class":154,"line":162},2,[152,164,166],{"class":165},"sudEI","from",[152,168,170],{"class":169},"sXDFC"," lib ",[152,172,173],{"class":165},"import",[152,175,176],{"class":169}," SuperCsvManager, Scenario\n",[152,178,180],{"class":154,"line":179},3,[152,181,183],{"emptyLinePlaceholder":182},true,"\n",[152,185,187,190,194],{"class":154,"line":186},4,[152,188,189],{"class":169},"scenarios ",[152,191,193],{"class":192},"su5p0","=",[152,195,196],{"class":169}," []\n",[152,198,200,203,205],{"class":154,"line":199},5,[152,201,202],{"class":169},"current_scenario ",[152,204,193],{"class":192},[152,206,208],{"class":207},"syI6z"," None\n",[152,210,212],{"class":154,"line":211},6,[152,213,183],{"emptyLinePlaceholder":182},[152,215,217,220,224,227,231],{"class":154,"line":216},7,[152,218,219],{"class":165},"def",[152,221,223],{"class":222},"sotTb"," on_scenario_name_read",[152,225,226],{"class":169},"(",[152,228,230],{"class":229},"sNiS7","name",[152,232,233],{"class":169},"):\n",[152,235,237,240],{"class":154,"line":236},8,[152,238,239],{"class":165},"    nonlocal",[152,241,242],{"class":169}," current_scenario \n",[152,244,246,249,251,255,257,260,262,265,268,270],{"class":154,"line":245},9,[152,247,248],{"class":169},"    current_scenario ",[152,250,193],{"class":192},[152,252,254],{"class":253},"sSSbv"," Scenario",[152,256,226],{"class":169},[152,258,230],{"class":259},"sagcK",[152,261,193],{"class":192},[152,263,264],{"class":169},"name, ",[152,266,267],{"class":259},"steps",[152,269,193],{"class":192},[152,271,272],{"class":169},"[])\n",[152,274,276,279,282],{"class":154,"line":275},10,[152,277,278],{"class":169},"    scenarios.",[152,280,281],{"class":253},"append",[152,283,284],{"class":169},"(current_scenario)\n",[152,286,288],{"class":154,"line":287},11,[152,289,290],{"class":169},"    \n",[152,292,294,296,299,301,304],{"class":154,"line":293},12,[152,295,219],{"class":165},[152,297,298],{"class":222}," on_scenario_step_read",[152,300,226],{"class":169},[152,302,303],{"class":229},"step",[152,305,233],{"class":169},[152,307,309,312,314],{"class":154,"line":308},13,[152,310,311],{"class":169},"    current_scenario.steps.",[152,313,281],{"class":253},[152,315,316],{"class":169},"(step)\n",[152,318,320],{"class":154,"line":319},14,[152,321,290],{"class":169},[152,323,325,328,331,333,337],{"class":154,"line":324},15,[152,326,327],{"class":169},"SuperCsvManager.",[152,329,330],{"class":253},"read_file",[152,332,226],{"class":169},[152,334,336],{"class":335},"snicI","file",[152,338,339],{"class":169},", \n",[152,341,343,346,348],{"class":154,"line":342},16,[152,344,345],{"class":259},"                          on_scenario_name_read",[152,347,193],{"class":192},[152,349,350],{"class":169},"on_scenario_name_read, \n",[152,352,354,357,359],{"class":154,"line":353},17,[152,355,356],{"class":259},"                          on_scenario_step_read",[152,358,193],{"class":192},[152,360,361],{"class":169},"on_scenario_step_read)\n",[152,363,365],{"class":154,"line":364},18,[152,366,183],{"emptyLinePlaceholder":182},[152,368,370],{"class":154,"line":369},19,[152,371,372],{"class":158},"# =========================================\n",[152,374,376],{"class":154,"line":375},20,[152,377,378],{"class":158},"# After\n",[152,380,382],{"class":154,"line":381},21,[152,383,183],{"emptyLinePlaceholder":182},[152,385,387,389,391,393],{"class":154,"line":386},22,[152,388,166],{"class":165},[152,390,170],{"class":169},[152,392,173],{"class":165},[152,394,395],{"class":169}," SuperCsvReader\n",[152,397,399,401,403,407,409,412,414,416],{"class":154,"line":398},23,[152,400,189],{"class":169},[152,402,193],{"class":192},[152,404,406],{"class":405},"si8dO"," list",[152,408,226],{"class":169},[152,410,411],{"class":253},"SuperCsvReader",[152,413,226],{"class":169},[152,415,336],{"class":335},[152,417,418],{"class":169},"))\n",[35,420,422],{"id":421},"do-not-underestimate-users","Do not underestimate users",[28,424,425],{},"Remember the clear and understandable file layout given at the beginning? Forget it, here is the real layout:",[28,427,428],{},[45,429],{"alt":430,"src":431},"True super CSV - a lot of space to put incorrect data","\u002Fblog\u002F2025-02-19\u002F5_true_super_csv_layout.png",[28,433,434],{},"As Super CSV can be opened and edited in a spreadsheet software, users can do whatever they want, because Excel does not know about our own restrictions. That is why it was decided to make Super CSV parser extremely tolerant to any kind of mistakes, they will be automatically fixed if possible.",[28,436,437],{},"The most popular way of using of free cells was leaving the comments, and it was hurtless except 1 particular slot. Parser thought, that the first line with data after the property slot is the header of a steps table. However, a cell between the property and the table was also used for a comment.",[28,439,440],{},[45,441],{"alt":442,"src":443},"New description slot in super CSV","\u002Fblog\u002F2025-02-19\u002F6_new_description_slot_in_super_csv.png",[28,445,446],{},"A first idea was to reformat the problematic files, but it appeared, that there were tons of them. That way, I had no other options rather than accept a new description slot for the Super CSV standard and add corresponding logic into the toolkit.",[35,448,450],{"id":449},"key-takeaways","Key Takeaways",[28,452,453],{},"Of course, I also implemented a Super CSV writer, adapted these classes for Python-specific resource management, implemented a query system for the custom tables, and so on. Even though these stories are not so interesting, because they were not broke by users.",[28,455,456],{},"From these experiences and challenges, several key lessons emerged about designing file format tools:",[458,459,460,463,466,469,472],"ul",{},[81,461,462],{},"Custom file formats require careful consideration of user behavior and real-world usage patterns",[81,464,465],{},"Building on familiar concepts (like CSV) makes tools more accessible and easier to understand",[81,467,468],{},"Simple, intuitive APIs are preferable to complex callback-based approaches",[81,470,471],{},"Parser tolerance is essential when users can modify files through spreadsheet software",[81,473,474],{},"Standards may need to evolve based on how users actually use the format",[28,476,477],{},"The journey from a complex, callback-based system to an intuitive file format toolkit demonstrates the importance of user-centric design in technical solutions.",[479,480,481],"style",{},"html pre.shiki code .s91Lf, html code.shiki .s91Lf{--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic}html pre.shiki code .sudEI, html code.shiki .sudEI{--shiki-default:#D73A49;--shiki-dark:#C678DD}html pre.shiki code .sXDFC, html code.shiki .sXDFC{--shiki-default:#24292E;--shiki-dark:#ABB2BF}html pre.shiki code .su5p0, html code.shiki .su5p0{--shiki-default:#D73A49;--shiki-dark:#56B6C2}html pre.shiki code .syI6z, html code.shiki .syI6z{--shiki-default:#005CC5;--shiki-dark:#D19A66}html pre.shiki code .sotTb, html code.shiki .sotTb{--shiki-default:#6F42C1;--shiki-dark:#61AFEF}html pre.shiki code .sNiS7, html code.shiki .sNiS7{--shiki-default:#24292E;--shiki-default-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic}html pre.shiki code .sSSbv, html code.shiki .sSSbv{--shiki-default:#24292E;--shiki-dark:#61AFEF}html pre.shiki code .sagcK, html code.shiki .sagcK{--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic}html pre.shiki code .snicI, html code.shiki .snicI{--shiki-default:#E36209;--shiki-dark:#E06C75}html pre.shiki code .si8dO, html code.shiki .si8dO{--shiki-default:#005CC5;--shiki-dark:#56B6C2}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":147,"searchDepth":162,"depth":162,"links":483},[484,485,486,487,488],{"id":37,"depth":162,"text":38},{"id":54,"depth":162,"text":55},{"id":115,"depth":162,"text":116},{"id":421,"depth":162,"text":422},{"id":449,"depth":162,"text":450},"2025-02-19","How I built a toolkit for a custom file format. Which difficulties I faced and how I solved them.","md","en",{},"\u002Fblog\u002F2025-02-19-taming-the-chaos",{"title":19,"description":490},"blog\u002F2025-02-19-taming-the-chaos",[498,499],"FileFormats","BestPractices","vEdr_4MvoXky708iFdDXYJyOpjaOD-A8WF_eeAe1A48",{"title":502,"path":503,"stem":504,"description":505,"children":-1},"How to use Nuxt Typography with TailwindCSS","\u002Fblog\u002F2023-05-09-how-to-use-nuxt-typography-with-tailwindcss","blog\u002F2023-05-09-how-to-use-nuxt-typography-with-tailwindcss","Small hack to use Nuxt Typography with TailwindCSS",{"title":507,"path":508,"stem":509,"description":510,"children":-1},"Le serveur MCP (Model Context Protocol) pour les enfants","\u002Fblog\u002F2026-07-06-mcp-pour-les-enfants","blog\u002F2026-07-06-mcp-pour-les-enfants","Express.js vs MCP : la même logique, une API que les LLM comprennent mieux",{"left":4,"top":4,"width":512,"height":512,"rotate":4,"vFlip":6,"hFlip":6,"body":513},72,"\u003Cpath fill=\"#1e50a0\" d=\"M5 17h62v38H5z\"\u002F>\u003Cpath fill=\"#fff\" d=\"M40 28.856V32h10.181L67 21.691V17h-7.654z\"\u002F>\u003Cpath fill=\"#d22f27\" d=\"M67 17h-3.827L40 31.203V32h3.482L67 17.586z\"\u002F>\u003Cpath fill=\"#fff\" d=\"M59.347 55H67v-4.692L50.182 40H40v3.143z\"\u002F>\u003Cpath fill=\"#d22f27\" d=\"M67 55v-2.347L46.355 40h-4.787l24.474 15z\"\u002F>\u003Cpath fill=\"#fff\" d=\"M32 43.144V40H21.819L5 50.309V55h7.654z\"\u002F>\u003Cpath fill=\"#d22f27\" d=\"M5 55h3.827L32 40.797V40h-3.482L5 54.414z\"\u002F>\u003Cpath fill=\"#fff\" d=\"M12.653 17H5v4.692L21.818 32H32v-3.143z\"\u002F>\u003Cpath fill=\"#d22f27\" d=\"M5 17v2.347L25.646 32h4.786L5.958 17z\"\u002F>\u003Cpath fill=\"#fff\" d=\"M5 31h62v10H5z\"\u002F>\u003Cpath fill=\"#fff\" d=\"M31 17h10v38H31z\"\u002F>\u003Cpath fill=\"#d22f27\" d=\"M5 33h62v6H5z\"\u002F>\u003Cpath fill=\"#d22f27\" d=\"M33 17h6v38h-6z\"\u002F>\u003Cpath fill=\"none\" stroke=\"#000\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 17h62v38H5z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":515},"\u003Cpath fill=\"currentColor\" d=\"M22 3H2v15h5l-1 1v2h12v-2l-1-1h5zm-2 13H4V5h16z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":517},"\u003Cpath fill=\"currentColor\" d=\"M17.51 3.87L15.73 2.1L5.84 12l9.9 9.9l1.77-1.77L9.38 12z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":519},"\u003Cpath fill=\"currentColor\" d=\"M6.23 20.23L8 22l10-10L8 2L6.23 3.77L14.46 12z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":521},"\u003Cpath fill=\"currentColor\" d=\"M6 5h2.5a3 3 0 0 1 3-3a3 3 0 0 1 3 3H17a3 3 0 0 1 3 3v11a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3V8a3 3 0 0 1 3-3m0 1a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-1v3H7V6zm2 2h7V6H8zm3.5-5a2 2 0 0 0-2 2h4a2 2 0 0 0-2-2\"\u002F>",1787506837848]