{"id":498402,"date":"2026-10-13T11:25:36","date_gmt":"2026-10-13T08:25:36","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=498402"},"modified":"2026-10-13T11:25:36","modified_gmt":"2026-10-13T08:25:36","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=498402","title":{"rendered":"UML-\u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0441 \u0431\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u0430\u043c\u0438 \u043f\u043e \u0413\u041e\u0421\u0422 \u2014 \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0432\u043d\u0443\u0442\u0440\u0438"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h3>\u0417\u0430\u0447\u0435\u043c \u043c\u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0441\u044f \u0441\u0432\u043e\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440<\/h3>\n<p>\u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u043c, \u0438 UML-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u044d\u0442\u043e \u0447\u0430\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b. \u041d\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043d\u0430 plantuml.com \u0438\u0437 \u0420\u043e\u0441\u0441\u0438\u0438 \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0430 \u0441\u0442\u0430\u0432\u0438\u0442\u044c Java \u0438 \u043f\u043b\u0430\u0433\u0438\u043d \u0432 IDE \u0438\u043b\u0438 VPN \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043d\u0430\u0432\u0430\u0439\u0431\u043a\u043e\u0434\u0438\u043b <a href=\"https:\/\/umleditor.ru\" rel=\"noopener nofollow\">umleditor.ru<\/a> &#8212; \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 UML-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435. \u041f\u0438\u0448\u0435\u0448\u044c \u043a\u043e\u0434 \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u0438\u0448\u044c \u0441\u0445\u0435\u043c\u0443. \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u043d\u0430\u0434\u043e. \u0421\u0445\u0435\u043c\u044b \u0440\u0438\u0441\u0443\u0435\u0442 \u043c\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 PlantUML-\u0441\u0435\u0440\u0432\u0435\u0440 \u0432 \u041c\u043e\u0441\u043a\u0432\u0435, \u0442\u0430\u043a \u0447\u0442\u043e \u043a\u043e\u0434 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c \u043d\u0435 \u0443\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u0447\u0443\u0436\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b.<\/p>\n<p>\u0412\u0435\u0441\u044c \u0441\u0430\u0439\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043b Claude: \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c, \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0434\u0430\u0436\u0435 \u0442\u0435\u043a\u0441\u0442\u044b \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0430. \u042f \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u043b, \u0447\u0442\u043e \u0445\u043e\u0447\u0443, \u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043f\u0440\u043e\u0441\u0438\u043b \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0442\u044c \u0438 \u0434\u0435\u043b\u0430\u043b \u0442\u043e, \u0447\u0442\u043e \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u043c\u043e\u0436\u0435\u0442: \u043f\u043b\u0430\u0442\u0438\u043b \u0437\u0430 \u0441\u0435\u0440\u0432\u0435\u0440, \u043f\u043e\u043a\u0443\u043f\u0430\u043b \u0434\u043e\u043c\u0435\u043d \u0438 \u0432\u0432\u043e\u0434\u0438\u043b \u043f\u0430\u0440\u043e\u043b\u0438.<\/p>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0440\u0430\u0431\u043e\u0447\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0437\u0430 \u0434\u0432\u0430 \u0447\u0430\u0441\u0430. \u041f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0440\u043e\u0441: \u0431\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u044b \u043f\u043e \u0413\u041e\u0421\u0422 \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u043e\u043c, \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 JSON, \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a \u043d\u0430 70+ \u0441\u0442\u0440\u0430\u043d\u0438\u0446. \u041d\u0438\u0436\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0432\u043d\u0443\u0442\u0440\u0438, \u0441 \u043a\u043e\u0434\u043e\u043c \u0438 \u0446\u0438\u0444\u0440\u0430\u043c\u0438.<\/p>\n<h3>\u0427\u0442\u043e \u0443\u043c\u0435\u0435\u0442 \u0441\u0430\u0439\u0442<\/h3>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/68\/7b\/04\/687b04be81fa02a593eef2d9b76f88d6.png\" alt=\"\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438\" title=\"\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438\" width=\"953\" height=\"460\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/68\/7b\/04\/687b04be81fa02a593eef2d9b76f88d6.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/68\/7b\/04\/687b04be81fa02a593eef2d9b76f88d6.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/figcaption><\/div>\n<\/figure>\n<ul>\n<li>\n<p>16 \u0432\u0438\u0434\u043e\u0432 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c PlantUML: \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043f\u0440\u0435\u0446\u0435\u0434\u0435\u043d\u0442\u043e\u0432, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0434\u0435\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, ER, \u0413\u0430\u043d\u0442\u0430, \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442-\u043a\u0430\u0440\u0442\u044b \u0438 \u0434\u0440\u0443\u0433\u0438\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0411\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043f\u043e \u0413\u041e\u0421\u0422 19.701-90: \u043f\u0438\u0448\u0435\u0448\u044c \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 \u043f\u043e-\u0440\u0443\u0441\u0441\u043a\u0438, \u0441\u0445\u0435\u043c\u0430 \u0440\u0438\u0441\u0443\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/umleditor.ru\/redaktor-json\" rel=\"noopener nofollow\">\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 JSON<\/a> \u0441 \u0434\u0435\u0440\u0435\u0432\u043e\u043c \u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c \u0432 YAML \u0438 XML.<\/p>\n<\/li>\n<li>\n<p>\u0428\u0430\u0431\u043b\u043e\u043d\u044b, \u043a\u043d\u043e\u043f\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 PNG \u0438 SVG.<\/p>\n<\/li>\n<li>\n<p>\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0431\u0435\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/umleditor.ru\/uml\" rel=\"noopener nofollow\">\u0421\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a<\/a>, <a href=\"https:\/\/umleditor.ru\/zadachi\" rel=\"noopener nofollow\">20 \u0437\u0430\u0434\u0430\u0447 \u0441 \u0431\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u0430\u043c\u0438<\/a> \u0438 <a href=\"https:\/\/umleditor.ru\/primery\" rel=\"noopener nofollow\">\u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b<\/a> &#8212; \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0430\u043c \u0434\u043b\u044f \u043a\u0443\u0440\u0441\u043e\u0432\u044b\u0445.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h3>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/8c\/a3\/52\/8ca3528516c5ad4f3274321e17a277e2.png\" alt=\"\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f\" title=\"\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f\" width=\"2400\" height=\"1280\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/8c\/a3\/52\/8ca3528516c5ad4f3274321e17a277e2.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/8c\/a3\/52\/8ca3528516c5ad4f3274321e17a277e2.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u0435\u0441\u044c \u0441\u0430\u0439\u0442 \u0436\u0438\u0432\u0451\u0442 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c VPS \u0437\u0430 525 \u20bd \u0432 \u043c\u0435\u0441\u044f\u0446, \u0432 \u0442\u0440\u0451\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445 Docker Compose. \u0421\u043d\u0430\u0440\u0443\u0436\u0438 \u043e\u0442\u043a\u0440\u044b\u0442 \u0442\u043e\u043b\u044c\u043a\u043e Caddy, \u043e\u043d \u0441\u0430\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 Let&#8217;s Encrypt, \u0441\u0436\u0438\u043c\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442\u044b \u0438 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0451 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. PlantUML-\u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u043b\u0443\u0448\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u0441\u0435\u0442\u044c Docker.<\/p>\n<ul>\n<li>\n<p><strong>\u0411\u044d\u043a\u0435\u043d\u0434<\/strong> &#8212; Node.js 24 \u0438 Express 5. \u042d\u0442\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u0430: SQLite \u0432\u0441\u0442\u0440\u043e\u0435\u043d \u0432 Node \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 22.13, \u0430 \u043b\u0438\u043c\u0438\u0442\u044b, \u043a\u0435\u0448, cookie \u0438 \u0441\u0436\u0430\u0442\u0438\u0435 PlantUML \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0441\u0432\u043e\u0438\u043c \u043a\u043e\u0434\u043e\u043c.<\/p>\n<\/li>\n<li>\n<p><strong>\u0424\u0440\u043e\u043d\u0442\u0435\u043d\u0434<\/strong> &#8212; Vite \u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 ES-\u043c\u043e\u0434\u0443\u043b\u0438 \u0431\u0435\u0437 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430, \u0434\u0432\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0431\u043e\u0440\u043a\u0438: \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c \u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 JSON. Mermaid \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0430\u0441\u0442\u0438 \u0432\u0438\u0434\u043e\u0432 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c.<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0431\u0449\u0438\u0439 \u043a\u043e\u0434.<\/strong> \u041f\u0430\u043f\u043a\u0430 <code>frontend\/src\/lib<\/code> &#8212; \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c, \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a, \u0437\u0430\u0434\u0430\u0447\u0438, \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u0413\u041e\u0421\u0422, \u043f\u0430\u0440\u0441\u0435\u0440\u044b. \u0415\u0451 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0442 \u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440, \u0438 \u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<\/li>\n<li>\n<p><strong>\u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438.<\/strong> \u041f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 <code>uid<\/code> \u0432 cookie, \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043b\u0435\u0436\u0430\u0442 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c <code>(owner, updated_at DESC)<\/code>, \u0440\u0435\u0436\u0438\u043c WAL.<\/p>\n<\/li>\n<li>\n<p><strong>\u0412\u044b\u043a\u043b\u0430\u0434\u043a\u0430.<\/strong> <code>deploy.bat<\/code> \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 <code>tar<\/code> \u0438 \u043f\u043e SSH \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u0421\u043a\u0440\u0438\u043f\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0442\u0430\u0432\u0438\u0442 Docker \u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0440\u0442\u044b 80 \u0438 443. \u0415\u0441\u043b\u0438 Docker Hub \u0438\u0437 \u0420\u043e\u0441\u0441\u0438\u0438 \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442, \u043e\u043d \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0437\u0435\u0440\u043a\u0430\u043b\u043e \u0440\u0435\u0435\u0441\u0442\u0440\u0430 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 <code>docker compose up -d --build<\/code>.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041a\u0430\u043a \u0440\u0438\u0441\u0443\u0435\u0442\u0441\u044f \u0441\u0445\u0435\u043c\u0430 PlantUML<\/h3>\n<p>\u0411\u0440\u0430\u0443\u0437\u0435\u0440 \u0448\u043b\u0451\u0442 \u043a\u043e\u0434 \u043d\u0430 <code>POST \/api\/render<\/code>, \u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u0436\u0438\u043c\u0430\u0435\u0442 \u0435\u0433\u043e \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0443 <code>plantuml-server<\/code>. PlantUML \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443 \u043f\u0440\u044f\u043c\u043e \u0432 URL: \u0442\u0435\u043a\u0441\u0442 \u0441\u0436\u0438\u043c\u0430\u0435\u0442\u0441\u044f deflate \u0438 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c base64 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u043e\u043c.<\/p>\n<pre><code class=\"typescript\">import { deflateRawSync } from \"node:zlib\";const ALPHABET = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_\";export function encodePlantUml(text) {  const data = deflateRawSync(Buffer.from(text, \"utf8\"), { level: 9 });  let out = \"\";  for (let i = 0; i &lt; data.length; i += 3) {    const [b1, b2 = 0, b3 = 0] = [data[i], data[i + 1], data[i + 2]];    out += ALPHABET[b1 &gt;&gt; 2] + ALPHABET[((b1 &amp; 3) &lt;&lt; 4) | (b2 &gt;&gt; 4)]         + ALPHABET[((b2 &amp; 15) &lt;&lt; 2) | (b3 &gt;&gt; 6)] + ALPHABET[b3 &amp; 63];  }  return out;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper\"><\/span><\/a><\/div><\/pre>\n<p>\u041a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u043a\u043e\u0434, \u0434\u043e 4000 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0443\u0445\u043e\u0434\u0438\u0442 GET-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c <code>\/svg\/&lt;\u043a\u043e\u0434&gt;<\/code>, \u0434\u043b\u0438\u043d\u043d\u044b\u0439 &#8212; POST \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0432 \u0442\u0435\u043b\u0435. \u041d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u0430\u0451\u0442\u0441\u044f 15 \u0441\u0435\u043a\u0443\u043d\u0434 \u0447\u0435\u0440\u0435\u0437 <code>AbortController<\/code>, \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u0438\u0441\u044f\u0449\u0435\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430.<\/p>\n<p>\u0427\u0442\u043e \u0435\u0449\u0451 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043e\u043a\u0440\u0443\u0433 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430:<\/p>\n<ul>\n<li>\n<p><strong>\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430.<\/strong> \u0421\u0435\u0440\u0432\u0435\u0440 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439, \u0430 PlantUML \u0443\u043c\u0435\u0435\u0442 <code>!include<\/code> \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 URL. \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0441 <code>PLANTUML_SECURITY_PROFILE=SANDBOX<\/code>, <code>PLANTUML_LIMIT_SIZE=8192<\/code>, <code>-Xmx512m<\/code> \u0438 <code>mem_limit: 900m<\/code>, \u0438 \u043d\u0430\u0440\u0443\u0436\u0443 \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0442: \u0435\u0433\u043e \u0432\u0438\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0447\u0438\u0441\u0442\u043a\u0430 SVG.<\/strong> \u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043a\u0430\u043a \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u044b\u0440\u0435\u0437\u0430\u0435\u0442 <code>&lt;script&gt;<\/code> \u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b <code>on*=<\/code> \u043f\u0435\u0440\u0435\u0434 \u043e\u0442\u0434\u0430\u0447\u0435\u0439.<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u0435\u0448.<\/strong> \u041a\u043b\u044e\u0447 &#8212; SHA-1 \u043e\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430, LRU \u043d\u0430 300 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043d\u0430 <code>Map<\/code>. \u0423\u0434\u0430\u0447\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u0438 \u043e\u0442\u0432\u0435\u0442\u044b \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u043a\u0435\u0448\u0438\u0440\u0443\u044e\u0442\u0441\u044f, \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0441\u0431\u043e\u0438 \u043d\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p><strong>\u041b\u0438\u043c\u0438\u0442.<\/strong> 60 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043e\u043a \u0432 \u043c\u0438\u043d\u0443\u0442\u0443 \u0441 \u043e\u0434\u043d\u043e\u0433\u043e IP: \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u043e\u0442\u0432\u0435\u0442 429 \u0441 <code>Retry-After<\/code>. \u0417\u0430 Caddy \u0432\u043a\u043b\u044e\u0447\u0451\u043d <code>trust proxy<\/code>, \u0438\u043d\u0430\u0447\u0435 \u0443 \u0432\u0441\u0435\u0445 \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u0435\u0439 \u0431\u044b\u043b \u0431\u044b \u043e\u0434\u0438\u043d IP \u043f\u0440\u043e\u043a\u0441\u0438 \u0438 \u043e\u0434\u0438\u043d \u043e\u0431\u0449\u0438\u0439 \u043b\u0438\u043c\u0438\u0442.<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u043e\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438 \u043e\u0448\u0438\u0431\u043a\u0438.<\/strong> PlantUML \u043e\u0442\u0434\u0430\u0451\u0442 \u0435\u0433\u043e \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 <code>X-PlantUML-Diagram-Error-Line<\/code>, \u0438 \u043e\u043d \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0441 \u043d\u0443\u043b\u044f, \u0430 \u0432 \u0441\u0430\u043c\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0438\u0448\u0435\u0442 <code>[From string (line 4)]<\/code> \u0443\u0436\u0435 \u0441 \u0435\u0434\u0438\u043d\u0438\u0446\u044b. \u0414\u043e \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u043b \u0441\u0442\u0440\u043e\u043a\u0443 \u043d\u0430 \u043e\u0434\u043d\u0443 \u0432\u044b\u0448\u0435 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0439. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u043e\u043c\u0435\u0440 \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438, \u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a &#8212; \u0437\u0430\u043f\u0430\u0441\u043d\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442:<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"typescript\">export function errorLineOf(body, lineHeader) {  const m = \/\\(line (\\d+)\\)\/.exec(body || \"\");  if (m) return Number(m[1]);                       \/\/ \u0432 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 - \u0441 \u0435\u0434\u0438\u043d\u0438\u0446\u044b  return lineHeader ? Number(lineHeader) + 1 : null; \/\/ \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 - \u0441 \u043d\u0443\u043b\u044f}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043a\u0430 \u0432 \u043a\u043e\u0434\u0435 \u043e\u0448\u0438\u0431\u043a\u0430, \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0443\u0434\u0430\u0447\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0441\u0445\u0435\u043c\u044b, \u0430 \u043d\u0435 \u043a\u0440\u0430\u0441\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 PlantUML.<\/p>\n<h3>\u0421\u0432\u043e\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u0431\u043b\u043e\u043a-\u0441\u0445\u0435\u043c \u043f\u043e \u0413\u041e\u0421\u0422 19.701<\/h3>\n<p>\u041c\u043d\u0435 \u044d\u0442\u043e\u0433\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043d\u043e Claude \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u0430\u043b, \u0447\u0442\u043e \u043b\u044e\u0434\u0438 \u0435\u0449\u0435 \u0447\u0430\u0441\u0442\u043e \u0438\u0449\u0443\u0442 \u0431\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u044b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0435\u0448\u0438\u043b \u0438 \u0438\u0445 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0445 \u043d\u0430 Mermaid, \u0438 \u0432\u044b\u0448\u043b\u043e \u043a\u0440\u0438\u0432\u043e, \u043f\u043e\u0434\u043f\u0438\u0441\u0438 &#171;\u0434\u0430\/\u043d\u0435\u0442&#187; \u043d\u0430\u0435\u0437\u0436\u0430\u043b\u0438 \u043d\u0430 \u043b\u0438\u043d\u0438\u0438, \u0441\u0442\u0440\u0435\u043b\u043a\u0438 \u0446\u0438\u043a\u043b\u043e\u0432 \u0448\u043b\u0438 \u0434\u0443\u0433\u0430\u043c\u0438, \u0430 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438 \u0431\u043b\u043e\u043a\u043e\u0432 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u043b\u0438 \u0441 \u0413\u041e\u0421\u0422\u043e\u043c. \u041e\u0431\u0449\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438 \u0433\u0440\u0430\u0444\u0430 \u0442\u0443\u0442 \u043c\u0435\u0448\u0430\u0435\u0442. \u0423 \u0431\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u044b \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430 \u0437\u0430\u0440\u0430\u043d\u0435\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u0441\u0432\u043e\u0439: \u043e\u043a\u043e\u043b\u043e 400 \u0441\u0442\u0440\u043e\u043a \u0431\u0435\u0437 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439.<\/p>\n<p>\u041d\u0430 \u0432\u0445\u043e\u0434\u0435 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 \u043f\u043e-\u0440\u0443\u0441\u0441\u043a\u0438, \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u043e\u0442\u0441\u0442\u0443\u043f\u0430\u043c\u0438, \u043a\u0430\u043a \u0432 Python:<\/p>\n<pre><code>\u0431\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u0430: \u0414\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a\u043d\u0430\u0447\u0430\u043b\u043e\u0432\u0432\u043e\u0434 n, \u043c\u0430\u0441\u0441\u0438\u0432 a[1..n], xL = 1R = n\u043f\u043e\u043a\u0430 L &lt;= R    m = (L + R) div 2    \u0435\u0441\u043b\u0438 a[m] = x        \u0432\u044b\u0432\u043e\u0434 m    \u0438\u043d\u0430\u0447\u0435 \u0435\u0441\u043b\u0438 a[m] &lt; x        L = m + 1    \u0438\u043d\u0430\u0447\u0435        R = m - 1\u043a\u043e\u043d\u0435\u0446<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u0420\u0430\u0437\u0431\u043e\u0440.<\/strong> \u0421\u0442\u0440\u043e\u043a\u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u0434\u0435\u0440\u0435\u0432\u043e \u0443\u0437\u043b\u043e\u0432 <code>term<\/code>, <code>io<\/code>, <code>proc<\/code>, <code>sub<\/code>, <code>if<\/code>, <code>while<\/code>, <code>for<\/code>, <code>repeat<\/code>. \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>block(indent)<\/code> \u0447\u0438\u0442\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441\u0432\u043e\u0435\u0433\u043e \u043e\u0442\u0441\u0442\u0443\u043f\u0430 \u0438 \u0441\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0433\u043b\u0443\u0431\u0436\u0435, \u043a\u043e\u0433\u0434\u0430 \u043e\u0442\u0441\u0442\u0443\u043f \u0440\u0430\u0441\u0442\u0451\u0442. \u0426\u0435\u043f\u043e\u0447\u043a\u0430 <code>\u0435\u0441\u043b\u0438\/\u0438\u043d\u0430\u0447\u0435 \u0435\u0441\u043b\u0438\/\u0438\u043d\u0430\u0447\u0435<\/code> \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0440\u043e\u043c\u0431\u0430\u043c\u0438 \u0432 \u0432\u0435\u0442\u043a\u0435 &#171;\u043d\u0435\u0442&#187;. \u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0435\u0441\u0451\u0442 \u043d\u043e\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438: &#171;\u041b\u0438\u0448\u043d\u0438\u0439 \u043e\u0442\u0441\u0442\u0443\u043f&#187;, &#171;\u0438\u043d\u0430\u0447\u0435 \u0431\u0435\u0437 \u0435\u0441\u043b\u0438&#187;, &#171;\u041f\u043e\u0441\u043b\u0435 &#171;\u0435\u0441\u043b\u0438&#187; \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u0435&#187;.<\/p>\n<p><strong>\u0420\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0430.<\/strong> \u041a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b \u0441\u0430\u043c \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0441\u0442\u0430 \u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0441\u043b\u0435\u0432\u0430 \u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043e\u0442 \u043e\u0441\u0438 \u043f\u043e\u0442\u043e\u043a\u0430 \u0438 \u043a\u0430\u043a\u043e\u0439 \u0432\u044b\u0441\u043e\u0442\u044b \u043e\u043d \u0431\u0443\u0434\u0435\u0442. \u0420\u0438\u0441\u0443\u0435\u0442 \u043e\u043d \u0441\u0435\u0431\u044f \u0441\u0430\u043c, \u043a\u043e\u0433\u0434\u0430 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u0434\u0430\u0441\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b. \u0412\u0445\u043e\u0434 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0432\u0435\u0440\u0445\u0443, \u0432\u044b\u0445\u043e\u0434 \u0441\u043d\u0438\u0437\u0443 \u043d\u0430 \u043e\u0441\u0438:<\/p>\n<pre><code class=\"typescript\">\/\/ \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b: { l, r, h, draw(x, y) }function shape(n) {  const h = n.t === \"term\" ? TH : H;  return {    l: W \/ 2, r: W \/ 2 + commentSize(n).w, h,    draw(x, y) { \/* \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a, \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u043e\u0433\u0440\u0430\u043c\u043c \u0438\u043b\u0438 \"\u0442\u0430\u0431\u043b\u0435\u0442\u043a\u0430\" + \u0442\u0435\u043a\u0441\u0442 *\/ },  };}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0432\u044b\u0441\u043e\u0442\u044b \u0434\u0435\u0442\u0435\u0439 \u0438 \u0431\u0435\u0440\u0451\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0438\u0445 <code>l<\/code> \u0438 <code>r<\/code>. \u0412\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0432\u0438\u0442 \u0432\u0435\u0442\u043a\u0443 &#171;\u0434\u0430&#187; \u0441\u043b\u0435\u0432\u0430, \u0430 &#171;\u043d\u0435\u0442&#187; \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u0438\u0445 <code>r<\/code> \u0438 <code>l<\/code> \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u043b\u0438\u0441\u044c. \u0426\u0438\u043a\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u0440\u0438\u0434\u043e\u0440 \u0441\u043b\u0435\u0432\u0430 \u043f\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043d\u0443\u044e \u043b\u0438\u043d\u0438\u044e \u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043f\u043e\u0434 \u0432\u044b\u0445\u043e\u0434. \u041e\u0434\u0438\u043d \u043f\u0440\u043e\u0445\u043e\u0434 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u044b, \u043e\u0434\u0438\u043d \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 \u0440\u0438\u0441\u0443\u0435\u0442.<\/p>\n<p><strong>\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u0413\u041e\u0421\u0422\u0430 \u0432 \u043a\u043e\u0434\u0435:<\/strong><\/p>\n<ul>\n<li>\n<p>\u0411\u043b\u043e\u043a \u0432 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438 b = 1,5a, \u0448\u0438\u0440\u0438\u043d\u0430 \u043e\u0434\u043d\u0430 \u043d\u0430 \u0432\u0441\u044e \u0441\u0445\u0435\u043c\u0443.<\/p>\n<\/li>\n<li>\n<p>\u0420\u043e\u043c\u0431 \u0441 \u0434\u043b\u0438\u043d\u043d\u044b\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0443\u043f\u0435\u043d\u044f\u043c\u0438 1 &#8212; 1,25 &#8212; 1,5 \u0448\u0438\u0440\u0438\u043d\u044b, \u043f\u043e\u043a\u0430 \u0442\u0435\u043a\u0441\u0442 \u043d\u0435 \u0432\u043b\u0435\u0437\u0435\u0442 \u0432 \u0434\u0432\u0435 \u0441\u0442\u0440\u043e\u043a\u0438. \u0412\u044b\u0441\u043e\u0442\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0440\u043e\u043c\u0431\u0430: \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b\u0441\u044f, \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u0435 h \u2265 th \/ (1 \u2212 tw\/w).<\/p>\n<\/li>\n<li>\n<p>\u0426\u0438\u043a\u043b &#171;\u0434\u043b\u044f&#187; &#8212; \u0448\u0435\u0441\u0442\u0438\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a &#171;\u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f&#187;, \u0432\u044b\u0437\u043e\u0432 &#8212; \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0441 \u0434\u0432\u043e\u0439\u043d\u044b\u043c\u0438 \u0431\u043e\u043a\u0430\u043c\u0438, \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 &#8212; \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u043a\u043e\u0431\u043a\u0430 \u043d\u0430 \u043f\u0443\u043d\u043a\u0442\u0438\u0440\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041b\u0438\u043d\u0438\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435. \u0421\u0442\u0440\u0435\u043b\u043a\u0430 \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043c, \u0433\u0434\u0435 \u043f\u043e\u0442\u043e\u043a \u0438\u0434\u0451\u0442 \u043d\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 \u0438 \u043d\u0435 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e: \u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430\u0445 \u0446\u0438\u043a\u043b\u043e\u0432 \u0438 \u0441\u043b\u0438\u044f\u043d\u0438\u044f\u0445 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e.<\/p>\n<\/li>\n<li>\n<p><code>*<\/code> \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u0430\u043a \u00b7, <code>&lt;=<\/code> \u043a\u0430\u043a \u2264, <code>!=<\/code> \u043a\u0430\u043a \u2260.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0411\u0435\u0437 DOM.<\/strong> \u0420\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 SVG \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u0438 \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0435\u0442 <code>document<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0444\u0430\u0439\u043b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0433\u0434\u0435 \u0438\u0437 \u043d\u0435\u0433\u043e \u0434\u0435\u043b\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0434\u043b\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0437\u0430\u0434\u0430\u0447. \u0428\u0438\u0440\u0438\u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u0431\u0435\u0437 <code>measureText<\/code> \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0448\u0438\u0440\u0438\u043d \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u0434\u043e\u043b\u044f\u0445 \u043a\u0435\u0433\u043b\u044f:<\/p>\n<pre><code class=\"typescript\">function textWidth(s, fs = FS) {  let w = 0;  for (const ch of s) {    if (ch === \" \") w += 0.28;    else if (\"ijlI.,:;|!'()[]\".includes(ch)) w += 0.3;    else if (\"mwMW\u0428\u0429\u0416\u042e\u041c\u042b\u0424\".includes(ch)) w += 0.85;    else if (\/[A-Z\u0410-\u042f\u0401]\/.test(ch)) w += 0.68;    else w += 0.56;  }  return w * fs;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043e\u0446\u0435\u043d\u043a\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u043e\u0432, \u0438 \u043e\u043d\u0430 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u044f\u043c\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u0431\u043b\u043e\u043a\u043e\u0432. \u0428\u0440\u0438\u0444\u0442 &#8212; \u0413\u041e\u0421\u0422 \u0442\u0438\u043f B, \u0435\u0441\u043b\u0438 \u043e\u043d \u0435\u0441\u0442\u044c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0438\u043d\u0430\u0447\u0435 Arial. \u0412\u0441\u0435 20 \u0437\u0430\u0434\u0430\u0447 \u0441\u0430\u0439\u0442\u0430 \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u0432 \u0442\u0435\u0441\u0442\u0430\u0445.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/bc\/d2\/28\/bcd2280e5bafc3efcb9b414e6953ed3d.png\" alt=\"\u0411\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430\" title=\"\u0411\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430\" width=\"956\" height=\"464\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/bc\/d2\/28\/bcd2280e5bafc3efcb9b414e6953ed3d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/bc\/d2\/28\/bcd2280e5bafc3efcb9b414e6953ed3d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0411\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430<\/figcaption><\/div>\n<\/figure>\n<h3>\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 JSON, YAML \u0438 XML \u0431\u0435\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a<\/h3>\n<p><code>JSON.parse<\/code> \u0442\u0443\u0442 \u043d\u0435 \u043f\u043e\u0434\u043e\u0448\u0451\u043b \u043f\u043e \u0442\u0440\u0451\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c:<\/p>\n<ol>\n<li>\n<p>\u041e\u0431\u044a\u0435\u043a\u0442 JavaScript \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u0432 \u043d\u0430\u0447\u0430\u043b\u043e: <code>{\"2\":1,\"1\":2}<\/code> \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 <code>{\"1\":2,\"2\":1}<\/code>.<\/p>\n<\/li>\n<li>\n<p><code>2.50<\/code> \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f <code>2.5<\/code>, \u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0446\u0435\u043b\u044b\u0435 \u0442\u0435\u0440\u044f\u044e\u0442 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a <code>Unexpected token<\/code>.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 \u0442\u0440\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u043a\u043e\u0434\u043e\u043c \u0432 \u043e\u0431\u0449\u0435\u0435 \u0434\u0435\u0440\u0435\u0432\u043e, \u0433\u0434\u0435 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043a\u043b\u044e\u0447\u0435\u0439 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0447\u0438\u0441\u0435\u043b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f:<\/p>\n<pre><code class=\"typescript\">{ t: \"obj\", e: [[\"\u0437\u0430\u043a\u0430\u0437\", { t: \"num\", v: \"10452\", ln: 2 }], ...] } \/\/ \u043e\u0431\u044a\u0435\u043a\u0442: \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u0430\u0440{ t: \"arr\", a: [...] }{ t: \"str\", v } | { t: \"num\", v: \"2.50\" } | { t: \"bool\", v } | { t: \"null\" }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0435\u0441\u0442\u044c <code>ln<\/code> &#8212; \u0441\u0442\u0440\u043e\u043a\u0430 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0435. \u0429\u0435\u043b\u0447\u043e\u043a \u043f\u043e \u0443\u0437\u043b\u0443 \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442 \u043a\u0443\u0440\u0441\u043e\u0440 \u043a \u043d\u0443\u0436\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043a\u043e\u0434\u0430. \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435, \u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c JSON\/YAML\/XML &#8212; \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044c \u0442\u043e\u0433\u043e \u0436\u0435 \u0434\u0435\u0440\u0435\u0432\u0430 \u0434\u0440\u0443\u0433\u0438\u043c \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u043c.<\/p>\n<p><strong>YAML.<\/strong> \u041f\u043e\u043b\u043d\u0430\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043e\u0433\u0440\u043e\u043c\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0430\u0445:<\/p>\n<ul>\n<li>\n<p>\u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0441\u043b\u043e\u0432\u0430\u0440\u0438 \u0438 \u0441\u043f\u0438\u0441\u043a\u0438, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 <code>- \u043a\u043b\u044e\u0447: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0441\u043a\u043e\u0431\u043a\u0430\u0445 <code>[ ]<\/code> \u0438 <code>{ }<\/code>, \u043c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0435;<\/p>\n<\/li>\n<li>\n<p>\u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u043a\u0430\u0432\u044b\u0447\u043a\u0430\u0445, \u0431\u043b\u043e\u043a\u0438 <code>|<\/code> \u0438 <code>&gt;<\/code> \u0441 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c\u0438 <code>-<\/code>, <code>+<\/code> \u0438 \u0446\u0438\u0444\u0440\u043e\u0439 \u043e\u0442\u0441\u0442\u0443\u043f\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u042f\u043a\u043e\u0440\u044f <code>&amp;<\/code>\/<code>*<\/code>, \u0441\u043b\u0438\u044f\u043d\u0438\u0435 <code>&lt;&lt;<\/code> \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0444\u0430\u0439\u043b\u0435 \u0447\u0435\u0441\u0442\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0430\u044e\u0442 &#171;\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f&#187; \u0441 \u043d\u043e\u043c\u0435\u0440\u043e\u043c \u0441\u0442\u0440\u043e\u043a\u0438, \u0430 \u043d\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u0432\u0435\u0440\u043d\u043e.<\/p>\n<p>\u041f\u0430\u0440\u0441\u0435\u0440 \u0441\u0432\u0435\u0440\u044f\u043b\u0441\u044f \u0441 PyYAML: \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0442\u0435\u043a\u0441\u0442 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b\u0438 \u043e\u0431\u0430, \u0438 JSON \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u0441\u043e\u0432\u043f\u0430\u0441\u0442\u044c. \u0422\u0430\u043a \u043d\u0430\u0448\u043b\u0430\u0441\u044c \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 \u0431\u043b\u043e\u043a\u0435 <code>&gt;<\/code>: \u043f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0434\u0430\u0432\u0430\u043b\u0430 <code>\\n\\n<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>\\n<\/code>.<\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u043e\u043f\u0430\u0441\u043d\u0435\u0435 \u0440\u0430\u0437\u0431\u043e\u0440\u0430. \u0421\u0442\u0440\u043e\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0430\u0440\u0441\u0435\u0440 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u0442 \u043d\u0435 \u043a\u0430\u043a \u0441\u0442\u0440\u043e\u043a\u0443, \u043d\u0443\u0436\u043d\u043e \u0431\u0440\u0430\u0442\u044c \u0432 \u043a\u0430\u0432\u044b\u0447\u043a\u0438:<\/p>\n<ul>\n<li>\n<p><code>\"yes\"<\/code>, <code>\"no\"<\/code>, <code>\"y\"<\/code> &#8212; \u0432 YAML 1.1 \u044d\u0442\u043e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p><code>\"2026-10-06\"<\/code> &#8212; PyYAML \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432 \u0434\u0430\u0442\u0443;<\/p>\n<\/li>\n<li>\n<p><code>\"10:00\"<\/code> &#8212; \u0432 YAML 1.1 \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e 600 \u0432 \u0448\u0435\u0441\u0442\u0438\u0434\u0435\u0441\u044f\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438;<\/p>\n<\/li>\n<li>\n<p><code>\"0123\"<\/code> &#8212; \u0438\u043d\u0430\u0447\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u043d\u043e\u043b\u044c.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u0442\u044b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u043f\u043e\u043f\u0430\u043b\u0438 \u0432 \u044d\u0442\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0437\u0430\u043a\u0430\u0437\u0430 \u0441 \u043f\u043e\u043b\u0435\u043c <code>\u0434\u0430\u0442\u0430<\/code>. \u0412 \u0442\u0435\u0441\u0442\u0430\u0445 \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u044e\u0442\u0441\u044f \u043a\u0440\u0443\u0433\u043e\u043c JSON &#8212; YAML &#8212; JSON \u0442\u0440\u0438 \u0434\u0435\u0441\u044f\u0442\u043a\u0430 &#171;\u0441\u043a\u043e\u043b\u044c\u0437\u043a\u0438\u0445&#187; \u0441\u0442\u0440\u043e\u043a.<\/p>\n<p><strong>XML<\/strong> \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u043c\u0443 \u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044e:<\/p>\n<ul>\n<li>\n<p>\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043a\u043b\u044e\u0447\u0430\u043c\u0438 <code>@\u0438\u043c\u044f<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0442\u0435\u043a\u0441\u0442 \u0440\u044f\u0434\u043e\u043c \u0441 \u0442\u0435\u0433\u0430\u043c\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043a\u043b\u044e\u0447\u043e\u043c <code>#text<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0442\u0435\u0433\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432 \u043c\u0430\u0441\u0441\u0438\u0432.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0430\u0440\u0441\u0435\u0440 XML \u0442\u043e\u0436\u0435 \u0441\u0432\u043e\u0439, \u0431\u0435\u0437 <code>DOMParser<\/code>, \u0447\u0442\u043e\u0431\u044b \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0438 \u0441\u043e\u043e\u0431\u0449\u0430\u043b \u0441\u0442\u0440\u043e\u043a\u0443 \u043e\u0448\u0438\u0431\u043a\u0438: &#171;\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0442\u0435\u0433 &lt;\/b&gt; \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c &lt;a&gt;&#187;.<\/p>\n<p><strong>\u0411\u043e\u043b\u044c\u0448\u0438\u0435 \u0444\u0430\u0439\u043b\u044b.<\/strong> \u041d\u0430 JSON \u0432 4,3 \u041c\u0411 \u043a\u0430\u0436\u0434\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u043e 3-4 \u0441\u0435\u043a\u0443\u043d\u0434\u044b. \u041f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043b, \u0447\u0442\u043e \u0440\u0430\u0437\u0431\u043e\u0440 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 ~150 \u043c\u0441, \u0430 \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u044d\u0442\u043e \u0447\u0442\u0435\u043d\u0438\u0435 <code>textarea.scrollTop<\/code>. \u041e\u043d\u043e \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0437\u0430\u043d\u043e\u0432\u043e \u0432\u0435\u0440\u0441\u0442\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043a\u043e\u043b\u043e\u043d\u043a\u043e\u0439 \u0438\u0437 240 \u0442\u044b\u0441\u044f\u0447 \u043d\u043e\u043c\u0435\u0440\u043e\u0432 \u0441\u0442\u0440\u043e\u043a. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u043e\u043c\u0435\u0440\u0430 \u0440\u0438\u0441\u0443\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u0441\u0442\u0440\u043e\u043a, \u0430 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0430 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0430\u0445 \u0434\u043b\u0438\u043d\u043d\u0435\u0435 200 \u0442\u044b\u0441\u044f\u0447 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u0412 \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u0431\u0435\u0437 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b, \u0433\u0434\u0435 \u0432\u0441\u0451 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u043e\u0434\u043d\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441\u0442\u0430\u043b\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c 7 \u0441\u0435\u043a\u0443\u043d\u0434 \u0432\u043c\u0435\u0441\u0442\u043e 11. \u041e\u0441\u0442\u0430\u0442\u043e\u043a \u044d\u0442\u043e \u0432\u0451\u0440\u0441\u0442\u043a\u0430 \u0441\u0430\u043c\u043e\u0433\u043e <code>textarea<\/code>, \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0432\u0440\u043e\u0434\u0435 CodeMirror.<\/p>\n<h3>\u0421\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a: \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438<\/h3>\n<p>\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 &#8212; \u043e\u0434\u043d\u043e\u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0438 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u0438\u043a\u0438 \u0432\u0438\u0434\u044f\u0442 \u0432 \u043d\u0451\u043c \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a, \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b Express \u043e\u0442\u0434\u0430\u0451\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u043c HTML. \u0428\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u043d\u0435\u0442: \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u043c\u0438 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 JavaScript \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>esc()<\/code> \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438.<\/p>\n<p><strong>\u041e\u0434\u0438\u043d \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445.<\/strong> \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0432\u0438\u0434\u043e\u0432 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c, \u0441\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c, \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043b\u0435\u0436\u0430\u0442 \u0432 ES-\u043c\u043e\u0434\u0443\u043b\u044f\u0445 <code>frontend\/src\/lib\/*.js<\/code>. \u0418\u0445 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435, \u0438 \u0441\u0435\u0440\u0432\u0435\u0440, \u0430 Dockerfile \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u043f\u0430\u043f\u043a\u0443 <code>lib<\/code> \u0432 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043e\u0431\u0440\u0430\u0437. \u041f\u0440\u0430\u0432\u043a\u0430 \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u043c\u0435\u043d\u044f\u0435\u0442 \u0438 \u0441\u0430\u0439\u0442 \u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435.<\/p>\n<p><strong>\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u0435\u0439<\/strong> \u0440\u0438\u0441\u0443\u0435\u0442 \u0441\u0430\u043c \u0441\u0435\u0440\u0432\u0435\u0440. \u0410\u0434\u0440\u0435\u0441\u0430 \u0432\u0438\u0434\u0430 <code>\/api\/examples\/&lt;\u0432\u0438\u0434&gt;.svg<\/code> \u0438 <code>\/api\/tasks\/&lt;\u0437\u0430\u0434\u0430\u0447\u0430&gt;.svg<\/code> \u0438\u0434\u0443\u0442 \u0447\u0435\u0440\u0435\u0437 PlantUML \u0438\u043b\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u0413\u041e\u0421\u0422. \u041e\u0442\u0432\u0435\u0442 \u043a\u0435\u0448\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0438 \u043e\u0442\u0434\u0430\u0451\u0442\u0441\u044f \u0441 <code>Cache-Control: max-age=86400<\/code>. \u0412 <code>robots.txt<\/code> \u044d\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u044b, \u0445\u043e\u0442\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0439 <code>\/api\/<\/code> \u0437\u0430\u043a\u0440\u044b\u0442, \u0438\u043d\u0430\u0447\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0443\u0442 \u0432 \u043f\u043e\u0438\u0441\u043a. \u0412 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0430 schema.org \u0432 JSON-LD: <code>TechArticle<\/code>, <code>BreadcrumbList<\/code>, \u0430 \u043d\u0430 \u043f\u043e\u0441\u0430\u0434\u043e\u0447\u043d\u044b\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u0435\u0449\u0451 <code>WebApplication<\/code> \u0438 <code>FAQPage<\/code>.<\/p>\n<p><strong>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438.<\/strong> \u041f\u0440\u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0441\u0441\u044b\u043b\u043a\u0430\u0445 \u0431\u043e\u043a\u043e\u0432\u0430\u044f \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430 70 \u043f\u0443\u043d\u043a\u0442\u043e\u0432 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043b\u0430 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u0438 \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043b\u0430 \u0433\u0440\u0443\u043f\u043f\u044b. \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0432 \u0434\u0443\u0445\u0435 PJAX \u0437\u0430\u043d\u044f\u043b\u043e \u043e\u043a\u043e\u043b\u043e 50 \u0441\u0442\u0440\u043e\u043a \u0431\u0435\u0437 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430:<\/p>\n<pre><code class=\"typescript\">const doc = new DOMParser().parseFromString(await (await fetch(url)).text(), \"text\/html\");const art = doc.querySelector(\".docs article\");if (!art) throw \"no-docs\";                 \/\/ \u0447\u0443\u0436\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 - \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434history.pushState({ docs: 1 }, \"\", url);document.querySelector(\".docs article\").replaceWith(document.adoptNode(art));document.title = doc.title;               \/\/ + description, canonical \u0438 JSON-LDym(METRIKA_ID, \"hit\", url, { title: doc.title, referer: prev }); \/\/ \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0432\u0438\u0434\u0438\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438 \u0431\u044b\u0441\u0442\u0440\u044b\u0445 \u0449\u0435\u043b\u0447\u043a\u0430\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>AbortController<\/code>. \u041b\u044e\u0431\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435, \u0442\u0430\u043a \u0447\u0442\u043e \u0445\u0443\u0434\u0448\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u044d\u0442\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u0430. \u0412 \u0442\u0435\u0441\u0442\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0438 60-240 \u043c\u0441, \u0432\u043a\u043b\u044e\u0447\u0430\u044f &#171;\u041d\u0430\u0437\u0430\u0434&#187; \u0447\u0435\u0440\u0435\u0437 <code>popstate<\/code>.<\/p>\n<h3>\u041d\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u044b\u0439 \u0442\u0435\u0441\u0442 \u0438 \u0447\u0442\u043e \u043e\u043d \u043d\u0430\u0448\u0451\u043b<\/h3>\n<p>\u0421\u0435\u0440\u0432\u0435\u0440 \u0441\u0430\u043c\u044b\u0439 \u0434\u0435\u0448\u0451\u0432\u044b\u0439: 2 vCPU, 2 \u0413\u0411 \u043f\u0430\u043c\u044f\u0442\u0438, 525 \u20bd \u0432 \u043c\u0435\u0441\u044f\u0446. \u0422\u0435\u0441\u0442 \u0448\u0451\u043b \u0438\u0437 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u043d\u0430 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435: \u043f\u0430\u0447\u043a\u0438 <code>fetch<\/code> \u043f\u043e HTTP\/2, \u0441\u043c\u0435\u0441\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0430, \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0438 SVG-\u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u0441 <code>cache: \"no-store\"<\/code> \u0438 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u0432 URL, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u0442\u044c \u0432 \u043a\u0435\u0448.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p>\u0422\u0435\u0441\u0442<\/p>\n<\/th>\n<th>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">400 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e<\/p>\n<\/td>\n<td>\n<p align=\"left\">0 \u043e\u0448\u0438\u0431\u043e\u043a, \u043c\u0435\u0434\u0438\u0430\u043d\u0430 433 \u043c\u0441, \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 702 \u043c\u0441<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">25 \u0441\u0435\u043a\u0443\u043d\u0434, 120 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u0440\u044b\u0432\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">13 287 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (~530 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443), 227 \u041c\u0411, 0 \u043e\u0448\u0438\u0431\u043e\u043a; p50 191 \u043c\u0441, p95 426 \u043c\u0441, p99 666 \u043c\u0441<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">58 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043e\u043a PlantUML \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430 30\u201365 \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0432\u0441\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u044b \u0437\u0430 1,8 \u0441, SVG \u0434\u043e 138 \u041a\u0411<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">61-\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0437\u0430 \u043c\u0438\u043d\u0443\u0442\u0443<\/p>\n<\/td>\n<td>\n<p align=\"left\">429 &#171;\u0421\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043e\u043a \u043f\u043e\u0434\u0440\u044f\u0434&#187;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">40 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0439 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432 SQLite<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0432\u0441\u0435 201 \u0437\u0430 213 \u043c\u0441<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0422\u0435\u043b\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 2 \u041c\u0411, \u0431\u0438\u0442\u044b\u0439 JSON, \u0438\u043c\u044f \u0434\u043b\u0438\u043d\u043d\u0435\u0435 120 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432<\/p>\n<\/td>\n<td>\n<p align=\"left\">413, 400, 400 \u0441 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0418\u043c\u044f \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b <code>&lt;img src=x&gt;<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0442\u0435\u043a\u0441\u0442, \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0417\u0430 25 \u0441\u0435\u043a\u0443\u043d\u0434 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0443\u043f\u0430\u043b\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432\u0434\u0432\u043e\u0435 \u0431\u0435\u0437 \u0440\u043e\u0441\u0442\u0430 \u043e\u0448\u0438\u0431\u043e\u043a. 227 \u041c\u0411 \u0437\u0430 25 \u0441\u0435\u043a\u0443\u043d\u0434  \u044d\u0442\u043e ~70 \u041c\u0431\u0438\u0442\/\u0441, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u043f\u043e\u0442\u043e\u043b\u043e\u043a \u043a\u0430\u043d\u0430\u043b\u0430, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. \u041e\u0434\u043d\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u043c\u0430\u043b\u043e. \u041e\u0442\u0432\u0435\u0442\u044b \u0441\u0436\u0438\u043c\u0430\u0435\u0442 Caddy (<code>encode zstd gzip<\/code>), \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0430 \u0432\u0435\u0441\u0438\u0442 20-26 \u041a\u0411 \u0434\u043e \u0441\u0436\u0430\u0442\u0438\u044f.<\/p>\n<p><strong>\u0411\u0430\u0433 1: \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u044a\u0435\u0434\u0430\u043b\u0430 \u043b\u0438\u043c\u0438\u0442.<\/strong> \u0413\u0430\u043b\u0435\u0440\u0435\u044f \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0440\u0438\u0441\u043e\u0432\u0430\u043b\u0430 \u043f\u0440\u0435\u0432\u044c\u044e 16 \u0432\u0438\u0434\u043e\u0432 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0442 \u0436\u0435 <code>POST \/api\/render<\/code>, \u0447\u0442\u043e \u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440. \u0427\u0435\u0442\u044b\u0440\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0437\u0430 \u043c\u0438\u043d\u0443\u0442\u0443 \u0441\u044a\u0435\u0434\u0430\u043b\u0438 \u0432\u0435\u0441\u044c \u043b\u0438\u043c\u0438\u0442 \u0432 60 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043e\u043a, \u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u0430\u043b \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c. \u0421\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u0441\u0430\u0439\u0442 \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0435\u0432\u044c\u044e \u0431\u0435\u0440\u0443\u0442\u0441\u044f GET-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c <code>\/api\/examples\/&lt;\u0432\u0438\u0434&gt;.svg<\/code>. \u0418\u0445 \u043a\u0435\u0448\u0438\u0440\u0443\u0435\u0442 \u0431\u0440\u0430\u0443\u0437\u0435\u0440, \u0430 \u0432 \u043b\u0438\u043c\u0438\u0442 \u043e\u043d\u0438 \u043d\u0435 \u0432\u0445\u043e\u0434\u044f\u0442. \u0417\u0430\u043e\u0434\u043d\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043a\u043b\u0430\u0434\u0451\u0442\u0441\u044f \u0432 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u043a\u0435\u0448 \u043f\u043e \u043a\u043e\u0434\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u0430, \u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u0437 \u0433\u0430\u043b\u0435\u0440\u0435\u0438 \u0448\u0430\u0431\u043b\u043e\u043d \u043d\u0435 \u0440\u0438\u0441\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u043d\u043e\u0432\u043e. \u0411\u044b\u043b\u043e 16 POST \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 ,\u0430 \u0441\u0442\u0430\u043b\u043e 0.<\/p>\n<p><strong>\u0411\u0430\u0433 2: &#171;\u0435\u0441\u043b\u0438&#187; \u0431\u0435\u0437 \u0443\u0441\u043b\u043e\u0432\u0438\u044f.<\/strong> \u0421\u0442\u0440\u043e\u043a\u0430 <code>\u0435\u0441\u043b\u0438<\/code> \u0431\u0435\u0437 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u043b\u0430 \u0441 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u043e\u0439 <code>^\u0435\u0441\u043b\u0438\\s+(.+)<\/code> \u0438 \u043c\u043e\u043b\u0447\u0430 \u0440\u0438\u0441\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u043c \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c &#171;\u0435\u0441\u043b\u0438&#187;. \u0422\u0435\u043f\u0435\u0440\u044c \u0442\u0430\u043a\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u044d\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0430 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439: &#171;\u041f\u043e\u0441\u043b\u0435 &#171;\u0435\u0441\u043b\u0438&#187; \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 x &gt; 0&#8243;.<\/p>\n<h3>\u041a\u0430\u043a \u044d\u0442\u043e \u0431\u044b\u043b\u043e<\/h3>\n<p>\u0412\u0441\u0451 \u0434\u0435\u043b\u0430\u043b\u043e\u0441\u044c \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 Claude \u043d\u0430 \u041f\u041a. \u041d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0438\u0441\u0430\u043b\u0430 \u043a\u043e\u0434, \u043d\u043e \u0438 \u0441\u0430\u043c\u0430 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b\u0430 \u0444\u0430\u0439\u043b\u044b \u0432 \u043f\u0430\u043f\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0430 \u0442\u0435\u0441\u0442\u044b \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b\u0430 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0441\u0430\u0439\u0442 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435.<\/p>\n<ol>\n<li>\n<p><strong>\u0418\u0434\u0435\u044f.<\/strong> \u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043e\u0434\u043d\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c: \u043d\u0443\u0436\u0435\u043d \u0441\u0430\u0439\u0442 \u043a\u0430\u043a plantuml.com, \u0441 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0432\u0438\u0434\u0430\u043c \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c. \u0427\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043d\u0443\u0442 \u0431\u044b\u043b \u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u0430\u0432\u043a\u0438.<\/strong> \u0414\u0430\u043b\u044c\u0448\u0435 \u0448\u043b\u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f, \u043a\u0430\u043a \u0434\u0438\u0437\u0430\u0439\u043d\u0435\u0440\u0443, \u0442\u0451\u043c\u043d\u0430\u044f \u0442\u0435\u043c\u0430 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0440\u0430\u0447\u043d\u0430\u044f, \u0441\u0434\u0435\u043b\u0430\u0439 \u0432 \u0441\u0438\u043d\u0438\u0445 \u0442\u043e\u043d\u0430\u0445. \u042f \u043f\u0440\u0438\u0441\u044b\u043b\u0430\u043b \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0438 \u043f\u0438\u0441\u0430\u043b, \u0447\u0442\u043e \u043d\u0435 \u0442\u0430\u043a, \u0430 Claude \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u043b. \u041d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u0432\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440.<\/strong> \u042f \u0430\u0440\u0435\u043d\u0434\u043e\u0432\u0430\u043b \u043d\u0435\u0434\u043e\u0440\u043e\u0433\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432 \u041c\u043e\u0441\u043a\u0432\u0435, \u0430 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b\u0430 \u0441\u043a\u0440\u0438\u043f\u0442 <code>deploy.bat<\/code>. \u0414\u0432\u0430\u0436\u0434\u044b \u0449\u0451\u043b\u043a\u0430\u0435\u0448\u044c, \u0432\u0432\u043e\u0434\u0438\u0448\u044c \u043f\u0430\u0440\u043e\u043b\u044c \u0438 \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u043e SSH \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442, \u0441\u0442\u0430\u0432\u0438\u0442 Docker \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 <code>docker compose up -d --build<\/code>. \u0421 \u0434\u043e\u043c\u0435\u043d\u043e\u043c \u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0437\u0430\u0441\u0442\u0440\u044f\u043b: \u043a\u0443\u043f\u0438\u043b \u0435\u0433\u043e, \u0430 \u0441\u0430\u0439\u0442 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u043b\u0441\u044f. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0437\u0430\u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u043e\u043d\u0443 \u0432 DNS-\u0445\u043e\u0441\u0442\u0438\u043d\u0433\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>\u0420\u043e\u0441\u0442.<\/strong> \u041f\u043e\u0442\u043e\u043c \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0431\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u044b \u043f\u043e \u0413\u041e\u0421\u0422, \u0437\u0430\u0434\u0430\u0447\u0438, \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 JSON \u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u044b\u0439 \u0442\u0435\u0441\u0442. \u0421\u0435\u0439\u0447\u0430\u0441 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043e\u043a\u043e\u043b\u043e 7 \u0442\u044b\u0441\u044f\u0447 \u0441\u0442\u0440\u043e\u043a \u0441\u0432\u043e\u0435\u0433\u043e JavaScript \u0438 50 \u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0430 <code>node:test<\/code>, \u0438\u0437 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 Express, Mermaid \u0438 Vite.<\/p>\n<\/li>\n<\/ol>\n<p>\u0417\u0430 \u0432\u0441\u0451 \u0432\u0440\u0435\u043c\u044f \u044f \u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043d\u0438 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043a\u043e\u0434\u0430 \u0441\u0430\u043c, \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u043b \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u0438 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0430\u043c\u0438.<\/p>\n<h3>\u0427\u0442\u043e \u044f \u0432\u044b\u043d\u0435\u0441 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e<\/h3>\n<p>\u041d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0430 \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u0438 \u0442\u0435\u0441\u0442\u044b, \u043f\u043e\u0441\u043e\u0432\u0435\u0442\u043e\u0432\u0430\u043b\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0441\u0430\u043c\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0430 \u0441\u0432\u043e\u0438 \u043e\u0448\u0438\u0431\u043a\u0438. \u042f \u0447\u0435\u0441\u0442\u043d\u043e \u043d\u0435 \u0437\u043d\u0430\u043b, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 NS-\u0437\u0430\u043f\u0438\u0441\u0438, \u043e\u043d\u0430 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u043b\u0430 \u043d\u0430 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0430\u0445 \u043c\u043e\u0435\u0439 \u0436\u0435 \u043f\u0430\u043d\u0435\u043b\u0438.<\/p>\n<p>\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u044b\u0432\u043e\u0434: \u0438\u0437 2 \u0431\u0430\u0433\u043e\u0432 \u0438\u0437 \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u043f\u0440\u043e \u0442\u0435\u0441\u0442 \u044e\u043d\u0438\u0442-\u0442\u0435\u0441\u0442\u044b \u043d\u0435 \u043f\u043e\u0439\u043c\u0430\u043b\u0438 \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e. \u0418\u0418 \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u0438\u0448\u0435\u0442 \u043a\u043e\u0434 \u0438 \u0442\u0435\u0441\u0442\u044b \u043a \u043d\u0435\u043c\u0443, \u043d\u043e \u0442\u0435\u0441\u0442\u044b \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0442 \u0435\u0433\u043e \u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043c\u0438\u0440. \u041e\u0448\u0438\u0431\u043a\u0438 \u043d\u0430\u0448\u043b\u0438\u0441\u044c, \u043a\u043e\u0433\u0434\u0430 \u044f \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0441\u0430\u0439\u0442 \u043a\u0430\u043a \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a, \u0438 \u043a\u043e\u0433\u0434\u0430 YAML \u0441\u0432\u0435\u0440\u044f\u043b\u0441\u044f \u0441 \u0447\u0443\u0436\u0438\u043c \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u043c.<\/p>\n<p>\u041e\u043f\u043b\u0430\u0442\u0430, \u043f\u0430\u0440\u043e\u043b\u0438 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432 \u043b\u0438\u0447\u043d\u044b\u0445 \u043a\u0430\u0431\u0438\u043d\u0435\u0442\u0430\u0445 \u0445\u043e\u0441\u0442\u0438\u043d\u0433\u0430, \u042f\u043d\u0434\u0435\u043a\u0441\u0430 \u0438 Google \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u043c\u043d\u0435 &#8212; \u044d\u0442\u043e \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0437\u0430 \u0442\u0435\u0431\u044f \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u0442.<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043c\u043e\u0436\u0435\u0442 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u043f\u0438\u0448\u0435\u0442 \u043a\u043e\u0434 \u0441\u0430\u043c. \u041d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0442\u044b \u0445\u043e\u0447\u0435\u0448\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f.<\/p>\n<h3>\u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435<\/h3>\n<ul>\n<li>\n<p>\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043a\u043e\u0434\u0430 \u0432\u043c\u0435\u0441\u0442\u043e <code>textarea<\/code> &#8212; \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0441\u044b\u043b\u043a\u0430 &#171;\u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f&#187;, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443 \u043a\u043e\u043b\u043b\u0435\u0433\u0435 \u0438\u043b\u0438 \u043f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u044e.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u0445\u043e\u0434, \u0447\u0442\u043e\u0431\u044b \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0435 \u043f\u0440\u043e\u043f\u0430\u0434\u0430\u043b\u0438 \u043f\u0440\u0438 \u0441\u043c\u0435\u043d\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u043b\u0438 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0435 \u0440\u0438\u0441\u0443\u0435\u0442\u0441\u044f, \u043e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u043a\u043e\u0434 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438. \u041f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043d\u0430 <a href=\"https:\/\/umleditor.ru\" rel=\"noopener nofollow\">umleditor.ru<\/a>.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1093680\/\">https:\/\/habr.com\/ru\/articles\/1093680\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0417\u0430\u0447\u0435\u043c \u043c\u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0441\u044f \u0441\u0432\u043e\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u043c, \u0438 UML-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u044d\u0442\u043e \u0447\u0430\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b. \u041d\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043d\u0430 plantuml.com \u0438\u0437 \u0420\u043e\u0441\u0441\u0438\u0438 \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0430 \u0441\u0442\u0430\u0432\u0438\u0442\u044c Java \u0438 \u043f\u043b\u0430\u0433\u0438\u043d \u0432 IDE \u0438\u043b\u0438 VPN \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f.\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043d\u0430\u0432\u0430\u0439\u0431\u043a\u043e\u0434\u0438\u043b umleditor.ru &#8212; \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 UML-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435. \u041f\u0438\u0448\u0435\u0448\u044c \u043a\u043e\u0434 \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u0438\u0448\u044c \u0441\u0445\u0435\u043c\u0443. \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u043d\u0430\u0434\u043e. \u0421\u0445\u0435\u043c\u044b \u0440\u0438\u0441\u0443\u0435\u0442 \u043c\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 PlantUML-\u0441\u0435\u0440\u0432\u0435\u0440 \u0432 \u041c\u043e\u0441\u043a\u0432\u0435, \u0442\u0430\u043a \u0447\u0442\u043e \u043a\u043e\u0434 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c \u043d\u0435 \u0443\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u0447\u0443\u0436\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b.\u0412\u0435\u0441\u044c \u0441\u0430\u0439\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043b Claude: \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c, \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0434\u0430\u0436\u0435 \u0442\u0435\u043a\u0441\u0442\u044b \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0430. \u042f \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u043b, \u0447\u0442\u043e \u0445\u043e\u0447\u0443, \u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043f\u0440\u043e\u0441\u0438\u043b \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0442\u044c \u0438 \u0434\u0435\u043b\u0430\u043b \u0442\u043e, \u0447\u0442\u043e \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u043c\u043e\u0436\u0435\u0442: \u043f\u043b\u0430\u0442\u0438\u043b \u0437\u0430 \u0441\u0435\u0440\u0432\u0435\u0440, \u043f\u043e\u043a\u0443\u043f\u0430\u043b \u0434\u043e\u043c\u0435\u043d \u0438 \u0432\u0432\u043e\u0434\u0438\u043b \u043f\u0430\u0440\u043e\u043b\u0438.\u041f\u0435\u0440\u0432\u0430\u044f \u0440\u0430\u0431\u043e\u0447\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0437\u0430 \u0434\u0432\u0430 \u0447\u0430\u0441\u0430. \u041f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0440\u043e\u0441: \u0431\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u044b \u043f\u043e \u0413\u041e\u0421\u0422 \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u043e\u043c, \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 JSON, \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a \u043d\u0430 70+ \u0441\u0442\u0440\u0430\u043d\u0438\u0446. \u041d\u0438\u0436\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0432\u043d\u0443\u0442\u0440\u0438, \u0441 \u043a\u043e\u0434\u043e\u043c \u0438 \u0446\u0438\u0444\u0440\u0430\u043c\u0438.\u0427\u0442\u043e \u0443\u043c\u0435\u0435\u0442 \u0441\u0430\u0439\u0442\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u043816 \u0432\u0438\u0434\u043e\u0432 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c PlantUML: \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043f\u0440\u0435\u0446\u0435\u0434\u0435\u043d\u0442\u043e\u0432, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0434\u0435\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, ER, \u0413\u0430\u043d\u0442\u0430, \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442-\u043a\u0430\u0440\u0442\u044b \u0438 \u0434\u0440\u0443\u0433\u0438\u0435.\u0411\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043f\u043e \u0413\u041e\u0421\u0422 19.701-90: \u043f\u0438\u0448\u0435\u0448\u044c \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 \u043f\u043e-\u0440\u0443\u0441\u0441\u043a\u0438, \u0441\u0445\u0435\u043c\u0430 \u0440\u0438\u0441\u0443\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443.\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 JSON \u0441 \u0434\u0435\u0440\u0435\u0432\u043e\u043c \u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c \u0432 YAML \u0438 XML.\u0428\u0430\u0431\u043b\u043e\u043d\u044b, \u043a\u043d\u043e\u043f\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 PNG \u0438 SVG.\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0431\u0435\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438.\u0421\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a, 20 \u0437\u0430\u0434\u0430\u0447 \u0441 \u0431\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u0430\u043c\u0438 \u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b &#8212; \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0430\u043c \u0434\u043b\u044f \u043a\u0443\u0440\u0441\u043e\u0432\u044b\u0445.\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f\u0412\u0435\u0441\u044c \u0441\u0430\u0439\u0442 \u0436\u0438\u0432\u0451\u0442 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c VPS \u0437\u0430 525 \u20bd \u0432 \u043c\u0435\u0441\u044f\u0446, \u0432 \u0442\u0440\u0451\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445 Docker Compose. \u0421\u043d\u0430\u0440\u0443\u0436\u0438 \u043e\u0442\u043a\u0440\u044b\u0442 \u0442\u043e\u043b\u044c\u043a\u043e Caddy, \u043e\u043d \u0441\u0430\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 Let&#8217;s Encrypt, \u0441\u0436\u0438\u043c\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442\u044b \u0438 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0451 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. PlantUML-\u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u043b\u0443\u0448\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u0441\u0435\u0442\u044c Docker.\u0411\u044d\u043a\u0435\u043d\u0434 &#8212; Node.js 24 \u0438 Express 5. \u042d\u0442\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u0430: SQLite \u0432\u0441\u0442\u0440\u043e\u0435\u043d \u0432 Node \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 22.13, \u0430 \u043b\u0438\u043c\u0438\u0442\u044b, \u043a\u0435\u0448, cookie \u0438 \u0441\u0436\u0430\u0442\u0438\u0435 PlantUML \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0441\u0432\u043e\u0438\u043c \u043a\u043e\u0434\u043e\u043c.\u0424\u0440\u043e\u043d\u0442\u0435\u043d\u0434 &#8212; Vite \u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 ES-\u043c\u043e\u0434\u0443\u043b\u0438 \u0431\u0435\u0437 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430, \u0434\u0432\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0431\u043e\u0440\u043a\u0438: \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c \u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 JSON. Mermaid \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0430\u0441\u0442\u0438 \u0432\u0438\u0434\u043e\u0432 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c.\u041e\u0431\u0449\u0438\u0439 \u043a\u043e\u0434. \u041f\u0430\u043f\u043a\u0430 frontend\/src\/lib &#8212; \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c, \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a, \u0437\u0430\u0434\u0430\u0447\u0438, \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u0413\u041e\u0421\u0422, \u043f\u0430\u0440\u0441\u0435\u0440\u044b. \u0415\u0451 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0442 \u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440, \u0438 \u0441\u0435\u0440\u0432\u0435\u0440.\u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438. \u041f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 uid \u0432 cookie, \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043b\u0435\u0436\u0430\u0442 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c (owner, updated_at DESC), \u0440\u0435\u0436\u0438\u043c WAL.\u0412\u044b\u043a\u043b\u0430\u0434\u043a\u0430. deploy.bat \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 tar \u0438 \u043f\u043e SSH \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u0421\u043a\u0440\u0438\u043f\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0442\u0430\u0432\u0438\u0442 Docker \u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0440\u0442\u044b 80 \u0438 443. \u0415\u0441\u043b\u0438 Docker Hub \u0438\u0437 \u0420\u043e\u0441\u0441\u0438\u0438 \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442, \u043e\u043d \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0437\u0435\u0440\u043a\u0430\u043b\u043e \u0440\u0435\u0435\u0441\u0442\u0440\u0430 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 docker compose up -d &#8212;build.\u041a\u0430\u043a \u0440\u0438\u0441\u0443\u0435\u0442\u0441\u044f \u0441\u0445\u0435\u043c\u0430 PlantUML\u0411\u0440\u0430\u0443\u0437\u0435\u0440 \u0448\u043b\u0451\u0442 \u043a\u043e\u0434 \u043d\u0430 POST \/api\/render, \u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u0436\u0438\u043c\u0430\u0435\u0442 \u0435\u0433\u043e \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0443 plantuml-server. PlantUML \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443 \u043f\u0440\u044f\u043c\u043e \u0432 URL: \u0442\u0435\u043a\u0441\u0442 \u0441\u0436\u0438\u043c\u0430\u0435\u0442\u0441\u044f deflate \u0438 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c base64 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u043e\u043c.import { deflateRawSync } from &#171;node:zlib&#187;;const ALPHABET = &#171;0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_&#187;;export function encodePlantUml(text) {  const data = deflateRawSync(Buffer.from(text, &#171;utf8&#187;), { level: 9 });  let out = &#171;&#187;;  for (let i = 0; i &lt; data.length; i += 3) {    const [b1, b2 = 0, b3 = 0] = [data[i], data[i + 1], data[i + 2]];    out += ALPHABET[b1 &gt;&gt; 2] + ALPHABET[((b1 &amp; 3) &lt;&lt; 4) | (b2 &gt;&gt; 4)]         + ALPHABET[((b2 &amp; 15) &lt;&lt; 2) | (b3 &gt;&gt; 6)] + ALPHABET[b3 &amp; 63];  }  return out;}\u041a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u043a\u043e\u0434, \u0434\u043e 4000 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0443\u0445\u043e\u0434\u0438\u0442 GET-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \/svg\/&lt;\u043a\u043e\u0434&gt;, \u0434\u043b\u0438\u043d\u043d\u044b\u0439 &#8212; POST \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0432 \u0442\u0435\u043b\u0435. \u041d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u0430\u0451\u0442\u0441\u044f 15 \u0441\u0435\u043a\u0443\u043d\u0434 \u0447\u0435\u0440\u0435\u0437 AbortController, \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u0438\u0441\u044f\u0449\u0435\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430.\u0427\u0442\u043e \u0435\u0449\u0451 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043e\u043a\u0440\u0443\u0433 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430:\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430. \u0421\u0435\u0440\u0432\u0435\u0440 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439, \u0430 PlantUML \u0443\u043c\u0435\u0435\u0442 !include \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 URL. \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0441 PLANTUML_SECURITY_PROFILE=SANDBOX, PLANTUML_LIMIT_SIZE=8192, -Xmx512m \u0438 mem_limit: 900m, \u0438 \u043d\u0430\u0440\u0443\u0436\u0443 \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0442: \u0435\u0433\u043e \u0432\u0438\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.\u041e\u0447\u0438\u0441\u0442\u043a\u0430 SVG. \u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043a\u0430\u043a \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u044b\u0440\u0435\u0437\u0430\u0435\u0442 &lt;script&gt; \u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b on*= \u043f\u0435\u0440\u0435\u0434 \u043e\u0442\u0434\u0430\u0447\u0435\u0439.\u041a\u0435\u0448. \u041a\u043b\u044e\u0447 &#8212; SHA-1 \u043e\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430, LRU \u043d\u0430 300 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043d\u0430 Map. \u0423\u0434\u0430\u0447\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u0438 \u043e\u0442\u0432\u0435\u0442\u044b \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u043a\u0435\u0448\u0438\u0440\u0443\u044e\u0442\u0441\u044f, \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0441\u0431\u043e\u0438 \u043d\u0435\u0442.\u041b\u0438\u043c\u0438\u0442. 60 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043e\u043a \u0432 \u043c\u0438\u043d\u0443\u0442\u0443 \u0441 \u043e\u0434\u043d\u043e\u0433\u043e IP: \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u043e\u0442\u0432\u0435\u0442 429 \u0441 Retry-After. \u0417\u0430 Caddy \u0432\u043a\u043b\u044e\u0447\u0451\u043d trust proxy, \u0438\u043d\u0430\u0447\u0435 \u0443 \u0432\u0441\u0435\u0445 \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u0435\u0439 \u0431\u044b\u043b \u0431\u044b \u043e\u0434\u0438\u043d IP \u043f\u0440\u043e\u043a\u0441\u0438 \u0438 \u043e\u0434\u0438\u043d \u043e\u0431\u0449\u0438\u0439 \u043b\u0438\u043c\u0438\u0442.\u041d\u043e\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438 \u043e\u0448\u0438\u0431\u043a\u0438. PlantUML \u043e\u0442\u0434\u0430\u0451\u0442 \u0435\u0433\u043e \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 X-PlantUML-Diagram-Error-Line, \u0438 \u043e\u043d \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0441 \u043d\u0443\u043b\u044f, \u0430 \u0432 \u0441\u0430\u043c\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0438\u0448\u0435\u0442 [From string (line 4)] \u0443\u0436\u0435 \u0441 \u0435\u0434\u0438\u043d\u0438\u0446\u044b. \u0414\u043e \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u043b \u0441\u0442\u0440\u043e\u043a\u0443 \u043d\u0430 \u043e\u0434\u043d\u0443 \u0432\u044b\u0448\u0435 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0439. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u043e\u043c\u0435\u0440 \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438, \u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a &#8212; \u0437\u0430\u043f\u0430\u0441\u043d\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442:export function errorLineOf(body, lineHeader) {  const m = \/\\(line (\\d+)\\)\/.exec(body || &#171;&#187;);  if (m) return Number(m[1]);                       \/\/ \u0432 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 &#8212; \u0441 \u0435\u0434\u0438\u043d\u0438\u0446\u044b  return lineHeader ? Number(lineHeader) + 1 : null; \/\/ \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 &#8212; \u0441 \u043d\u0443\u043b\u044f}\u041f\u043e\u043a\u0430 \u0432 \u043a\u043e\u0434\u0435 \u043e\u0448\u0438\u0431\u043a\u0430, \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0443\u0434\u0430\u0447\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0441\u0445\u0435\u043c\u044b, \u0430 \u043d\u0435 \u043a\u0440\u0430\u0441\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 PlantUML.\u0421\u0432\u043e\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u0431\u043b\u043e\u043a-\u0441\u0445\u0435\u043c \u043f\u043e \u0413\u041e\u0421\u0422 19.701\u041c\u043d\u0435 \u044d\u0442\u043e\u0433\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043d\u043e Claude \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u0430\u043b, \u0447\u0442\u043e \u043b\u044e\u0434\u0438 \u0435\u0449\u0435 \u0447\u0430\u0441\u0442\u043e \u0438\u0449\u0443\u0442 \u0431\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u044b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0435\u0448\u0438\u043b \u0438 \u0438\u0445 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0445 \u043d\u0430 Mermaid, \u0438 \u0432\u044b\u0448\u043b\u043e \u043a\u0440\u0438\u0432\u043e, \u043f\u043e\u0434\u043f\u0438\u0441\u0438 &#171;\u0434\u0430\/\u043d\u0435\u0442&#187; \u043d\u0430\u0435\u0437\u0436\u0430\u043b\u0438 \u043d\u0430 \u043b\u0438\u043d\u0438\u0438, \u0441\u0442\u0440\u0435\u043b\u043a\u0438 \u0446\u0438\u043a\u043b\u043e\u0432 \u0448\u043b\u0438 \u0434\u0443\u0433\u0430\u043c\u0438, \u0430 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438 \u0431\u043b\u043e\u043a\u043e\u0432 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u043b\u0438 \u0441 \u0413\u041e\u0421\u0422\u043e\u043c. \u041e\u0431\u0449\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438 \u0433\u0440\u0430\u0444\u0430 \u0442\u0443\u0442 \u043c\u0435\u0448\u0430\u0435\u0442. \u0423 \u0431\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u044b \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430 \u0437\u0430\u0440\u0430\u043d\u0435\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u0441\u0432\u043e\u0439: \u043e\u043a\u043e\u043b\u043e 400 \u0441\u0442\u0440\u043e\u043a \u0431\u0435\u0437 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439.\u041d\u0430 \u0432\u0445\u043e\u0434\u0435 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 \u043f\u043e-\u0440\u0443\u0441\u0441\u043a\u0438, \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u043e\u0442\u0441\u0442\u0443\u043f\u0430\u043c\u0438, \u043a\u0430\u043a \u0432 Python:\u0431\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u0430: \u0414\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a\u043d\u0430\u0447\u0430\u043b\u043e\u0432\u0432\u043e\u0434 n, \u043c\u0430\u0441\u0441\u0438\u0432 a[1..n], xL = 1R = n\u043f\u043e\u043a\u0430 L &lt;= R    m = (L + R) div 2    \u0435\u0441\u043b\u0438 a[m] = x        \u0432\u044b\u0432\u043e\u0434 m    \u0438\u043d\u0430\u0447\u0435 \u0435\u0441\u043b\u0438 a[m] &lt; x        L = m + 1    \u0438\u043d\u0430\u0447\u0435        R = m &#8212; 1\u043a\u043e\u043d\u0435\u0446\u0420\u0430\u0437\u0431\u043e\u0440. \u0421\u0442\u0440\u043e\u043a\u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u0434\u0435\u0440\u0435\u0432\u043e \u0443\u0437\u043b\u043e\u0432 term, io, proc, sub, if, while, for, repeat. \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f block(indent) \u0447\u0438\u0442\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441\u0432\u043e\u0435\u0433\u043e \u043e\u0442\u0441\u0442\u0443\u043f\u0430 \u0438 \u0441\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0433\u043b\u0443\u0431\u0436\u0435, \u043a\u043e\u0433\u0434\u0430 \u043e\u0442\u0441\u0442\u0443\u043f \u0440\u0430\u0441\u0442\u0451\u0442. \u0426\u0435\u043f\u043e\u0447\u043a\u0430 \u0435\u0441\u043b\u0438\/\u0438\u043d\u0430\u0447\u0435 \u0435\u0441\u043b\u0438\/\u0438\u043d\u0430\u0447\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0440\u043e\u043c\u0431\u0430\u043c\u0438 \u0432 \u0432\u0435\u0442\u043a\u0435 &#171;\u043d\u0435\u0442&#187;. \u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0435\u0441\u0451\u0442 \u043d\u043e\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438: &#171;\u041b\u0438\u0448\u043d\u0438\u0439 \u043e\u0442\u0441\u0442\u0443\u043f&#187;, &#171;\u0438\u043d\u0430\u0447\u0435 \u0431\u0435\u0437 \u0435\u0441\u043b\u0438&#187;, &#171;\u041f\u043e\u0441\u043b\u0435 &#171;\u0435\u0441\u043b\u0438&#187; \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u0435&#187;.\u0420\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0430. \u041a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b \u0441\u0430\u043c \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0441\u0442\u0430 \u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0441\u043b\u0435\u0432\u0430 \u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043e\u0442 \u043e\u0441\u0438 \u043f\u043e\u0442\u043e\u043a\u0430 \u0438 \u043a\u0430\u043a\u043e\u0439 \u0432\u044b\u0441\u043e\u0442\u044b \u043e\u043d \u0431\u0443\u0434\u0435\u0442. \u0420\u0438\u0441\u0443\u0435\u0442 \u043e\u043d \u0441\u0435\u0431\u044f \u0441\u0430\u043c, \u043a\u043e\u0433\u0434\u0430 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u0434\u0430\u0441\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b. \u0412\u0445\u043e\u0434 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0432\u0435\u0440\u0445\u0443, \u0432\u044b\u0445\u043e\u0434 \u0441\u043d\u0438\u0437\u0443 \u043d\u0430 \u043e\u0441\u0438:\/\/ \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b: { l, r, h, draw(x, y) }function shape(n) {  const h = n.t === &#171;term&#187; ? TH : H;  return {    l: W \/ 2, r: W \/ 2 + commentSize(n).w, h,    draw(x, y) { \/* \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a, \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u043e\u0433\u0440\u0430\u043c\u043c \u0438\u043b\u0438 &#171;\u0442\u0430\u0431\u043b\u0435\u0442\u043a\u0430&#187; + \u0442\u0435\u043a\u0441\u0442 *\/ },  };}\u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0432\u044b\u0441\u043e\u0442\u044b \u0434\u0435\u0442\u0435\u0439 \u0438 \u0431\u0435\u0440\u0451\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0438\u0445 l \u0438 r. \u0412\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0432\u0438\u0442 \u0432\u0435\u0442\u043a\u0443 &#171;\u0434\u0430&#187; \u0441\u043b\u0435\u0432\u0430, \u0430 &#171;\u043d\u0435\u0442&#187; \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u0438\u0445 r \u0438 l \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u043b\u0438\u0441\u044c. \u0426\u0438\u043a\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u0440\u0438\u0434\u043e\u0440 \u0441\u043b\u0435\u0432\u0430 \u043f\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043d\u0443\u044e \u043b\u0438\u043d\u0438\u044e \u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043f\u043e\u0434 \u0432\u044b\u0445\u043e\u0434. \u041e\u0434\u0438\u043d \u043f\u0440\u043e\u0445\u043e\u0434 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u044b, \u043e\u0434\u0438\u043d \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 \u0440\u0438\u0441\u0443\u0435\u0442.\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u0413\u041e\u0421\u0422\u0430 \u0432 \u043a\u043e\u0434\u0435:\u0411\u043b\u043e\u043a \u0432 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438 b = 1,5a, \u0448\u0438\u0440\u0438\u043d\u0430 \u043e\u0434\u043d\u0430 \u043d\u0430 \u0432\u0441\u044e \u0441\u0445\u0435\u043c\u0443.\u0420\u043e\u043c\u0431 \u0441 \u0434\u043b\u0438\u043d\u043d\u044b\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0443\u043f\u0435\u043d\u044f\u043c\u0438 1 &#8212; 1,25 &#8212; 1,5 \u0448\u0438\u0440\u0438\u043d\u044b, \u043f\u043e\u043a\u0430 \u0442\u0435\u043a\u0441\u0442 \u043d\u0435 \u0432\u043b\u0435\u0437\u0435\u0442 \u0432 \u0434\u0432\u0435 \u0441\u0442\u0440\u043e\u043a\u0438. \u0412\u044b\u0441\u043e\u0442\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0440\u043e\u043c\u0431\u0430: \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b\u0441\u044f, \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u0435 h \u2265 th \/ (1 \u2212 tw\/w).\u0426\u0438\u043a\u043b &#171;\u0434\u043b\u044f&#187; &#8212; \u0448\u0435\u0441\u0442\u0438\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a &#171;\u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f&#187;, \u0432\u044b\u0437\u043e\u0432 &#8212; \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0441 \u0434\u0432\u043e\u0439\u043d\u044b\u043c\u0438 \u0431\u043e\u043a\u0430\u043c\u0438, \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 &#8212; \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u043a\u043e\u0431\u043a\u0430 \u043d\u0430 \u043f\u0443\u043d\u043a\u0442\u0438\u0440\u0435.\u041b\u0438\u043d\u0438\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435. \u0421\u0442\u0440\u0435\u043b\u043a\u0430 \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043c, \u0433\u0434\u0435 \u043f\u043e\u0442\u043e\u043a \u0438\u0434\u0451\u0442 \u043d\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 \u0438 \u043d\u0435 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e: \u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430\u0445 \u0446\u0438\u043a\u043b\u043e\u0432 \u0438 \u0441\u043b\u0438\u044f\u043d\u0438\u044f\u0445 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e.* \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u0430\u043a \u00b7, &lt;= \u043a\u0430\u043a \u2264, != \u043a\u0430\u043a \u2260.\u0411\u0435\u0437 DOM. \u0420\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 SVG \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u0438 \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0435\u0442 document, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0444\u0430\u0439\u043b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0433\u0434\u0435 \u0438\u0437 \u043d\u0435\u0433\u043e \u0434\u0435\u043b\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0434\u043b\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0437\u0430\u0434\u0430\u0447. \u0428\u0438\u0440\u0438\u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u0431\u0435\u0437 measureText \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0448\u0438\u0440\u0438\u043d \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u0434\u043e\u043b\u044f\u0445 \u043a\u0435\u0433\u043b\u044f:function textWidth(s, fs = FS) {  let w = 0;  for (const ch of s) {    if (ch === &#187; &#171;) w += 0.28;    else if (&#171;ijlI.,:;|!'()[]&#187;.includes(ch)) w += 0.3;    else if (&#171;mwMW\u0428\u0429\u0416\u042e\u041c\u042b\u0424&#187;.includes(ch)) w += 0.85;    else if (\/[A-Z\u0410-\u042f\u0401]\/.test(ch)) w += 0.68;    else w += 0.56;  }  return w * fs;}\u041f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043e\u0446\u0435\u043d\u043a\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u043e\u0432, \u0438 \u043e\u043d\u0430 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u044f\u043c\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u0431\u043b\u043e\u043a\u043e\u0432. \u0428\u0440\u0438\u0444\u0442 &#8212; \u0413\u041e\u0421\u0422 \u0442\u0438\u043f B, \u0435\u0441\u043b\u0438 \u043e\u043d \u0435\u0441\u0442\u044c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0438\u043d\u0430\u0447\u0435 Arial. \u0412\u0441\u0435 20 \u0437\u0430\u0434\u0430\u0447 \u0441\u0430\u0439\u0442\u0430 \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u0432 \u0442\u0435\u0441\u0442\u0430\u0445.\u0411\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 JSON, YAML \u0438 XML \u0431\u0435\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043aJSON.parse \u0442\u0443\u0442 \u043d\u0435 \u043f\u043e\u0434\u043e\u0448\u0451\u043b \u043f\u043e \u0442\u0440\u0451\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c:\u041e\u0431\u044a\u0435\u043a\u0442 JavaScript \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u0432 \u043d\u0430\u0447\u0430\u043b\u043e: {&#171;2&#8243;:1,&#187;1&#187;:2} \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 {&#171;1&#8243;:2,&#187;2&#187;:1}.2.50 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f 2.5, \u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0446\u0435\u043b\u044b\u0435 \u0442\u0435\u0440\u044f\u044e\u0442 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c.\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a Unexpected token.\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 \u0442\u0440\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u043a\u043e\u0434\u043e\u043c \u0432 \u043e\u0431\u0449\u0435\u0435 \u0434\u0435\u0440\u0435\u0432\u043e, \u0433\u0434\u0435 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043a\u043b\u044e\u0447\u0435\u0439 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0447\u0438\u0441\u0435\u043b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f:{ t: &#171;obj&#187;, e: [[&#171;\u0437\u0430\u043a\u0430\u0437&#187;, { t: &#171;num&#187;, v: &#171;10452&#187;, ln: 2 }], &#8230;] } \/\/ \u043e\u0431\u044a\u0435\u043a\u0442: \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u0430\u0440{ t: &#171;arr&#187;, a: [&#8230;] }{ t: &#171;str&#187;, v } | { t: &#171;num&#187;, v: &#171;2.50&#187; } | { t: &#171;bool&#187;, v } | { t: &#171;null&#187; }\u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0435\u0441\u0442\u044c ln &#8212; \u0441\u0442\u0440\u043e\u043a\u0430 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0435. \u0429\u0435\u043b\u0447\u043e\u043a \u043f\u043e \u0443\u0437\u043b\u0443 \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442 \u043a\u0443\u0440\u0441\u043e\u0440 \u043a \u043d\u0443\u0436\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043a\u043e\u0434\u0430. \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435, \u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c JSON\/YAML\/XML &#8212; \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044c \u0442\u043e\u0433\u043e \u0436\u0435 \u0434\u0435\u0440\u0435\u0432\u0430 \u0434\u0440\u0443\u0433\u0438\u043c \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u043c.YAML. \u041f\u043e\u043b\u043d\u0430\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043e\u0433\u0440\u043e\u043c\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0430\u0445:\u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0441\u043b\u043e\u0432\u0430\u0440\u0438 \u0438 \u0441\u043f\u0438\u0441\u043a\u0438, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 &#8212; \u043a\u043b\u044e\u0447: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435;\u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0441\u043a\u043e\u0431\u043a\u0430\u0445 [ ] \u0438 { }, \u043c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0435;\u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u043a\u0430\u0432\u044b\u0447\u043a\u0430\u0445, \u0431\u043b\u043e\u043a\u0438 | \u0438 &gt; \u0441 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c\u0438 -, + \u0438 \u0446\u0438\u0444\u0440\u043e\u0439 \u043e\u0442\u0441\u0442\u0443\u043f\u0430;\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438.\u042f\u043a\u043e\u0440\u044f &amp;\/*, \u0441\u043b\u0438\u044f\u043d\u0438\u0435 &lt;&lt; \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0444\u0430\u0439\u043b\u0435 \u0447\u0435\u0441\u0442\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0430\u044e\u0442 &#171;\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f&#187; \u0441 \u043d\u043e\u043c\u0435\u0440\u043e\u043c \u0441\u0442\u0440\u043e\u043a\u0438, \u0430 \u043d\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u0432\u0435\u0440\u043d\u043e.\u041f\u0430\u0440\u0441\u0435\u0440 \u0441\u0432\u0435\u0440\u044f\u043b\u0441\u044f \u0441 PyYAML: \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0442\u0435\u043a\u0441\u0442 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b\u0438 \u043e\u0431\u0430, \u0438 JSON \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u0441\u043e\u0432\u043f\u0430\u0441\u0442\u044c. \u0422\u0430\u043a \u043d\u0430\u0448\u043b\u0430\u0441\u044c \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 \u0431\u043b\u043e\u043a\u0435 &gt;: \u043f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0434\u0430\u0432\u0430\u043b\u0430 \\n\\n \u0432\u043c\u0435\u0441\u0442\u043e \\n.\u041e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u043e\u043f\u0430\u0441\u043d\u0435\u0435 \u0440\u0430\u0437\u0431\u043e\u0440\u0430. \u0421\u0442\u0440\u043e\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0430\u0440\u0441\u0435\u0440 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u0442 \u043d\u0435 \u043a\u0430\u043a \u0441\u0442\u0440\u043e\u043a\u0443, \u043d\u0443\u0436\u043d\u043e \u0431\u0440\u0430\u0442\u044c \u0432 \u043a\u0430\u0432\u044b\u0447\u043a\u0438:&#187;yes&#187;, &#171;no&#187;, &#171;y&#187; &#8212; \u0432 YAML 1.1 \u044d\u0442\u043e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f;&#187;2026-10-06&#8243; &#8212; PyYAML \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432 \u0434\u0430\u0442\u0443;&#187;10:00&#8243; &#8212; \u0432 YAML 1.1 \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e 600 \u0432 \u0448\u0435\u0441\u0442\u0438\u0434\u0435\u0441\u044f\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438;&#187;0123&#8243; &#8212; \u0438\u043d\u0430\u0447\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0432\u0435\u0434\u0443\u0449\u0438\u0439&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-498402","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/498402","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=498402"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/498402\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=498402"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=498402"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=498402"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}