chuijs 4.0.2 → 4.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (292) hide show
  1. package/CHANGELOG.md +597 -0
  2. package/README.md +43 -644
  3. package/framework/appLayout/default/chui_app_layout.js +602 -496
  4. package/framework/appLayout/default/global_style.css +288 -97
  5. package/framework/appLayout/default/main_theme_style.css +188 -101
  6. package/framework/components/chui_accordion/accordion.js +38 -35
  7. package/framework/components/chui_accordion/styles.css +13 -12
  8. package/framework/components/chui_action_sheet/action_sheet.js +93 -64
  9. package/framework/components/chui_action_sheet/styles.css +12 -5
  10. package/framework/components/chui_actions_bar/actions_bar.js +338 -0
  11. package/framework/components/chui_actions_bar/styles.css +139 -0
  12. package/framework/components/chui_affix/affix.js +16 -11
  13. package/framework/components/chui_affix/styles.css +5 -0
  14. package/framework/components/chui_alert/alert.js +34 -19
  15. package/framework/components/chui_alert/styles.css +7 -0
  16. package/framework/components/chui_avatar/avatar.js +36 -35
  17. package/framework/components/chui_avatar/styles.css +1 -1
  18. package/framework/components/chui_avatar_group/avatar_group.js +25 -23
  19. package/framework/components/chui_avatar_group/styles.css +1 -1
  20. package/framework/components/chui_backtop/backtop.js +60 -21
  21. package/framework/components/chui_backtop/styles.css +21 -0
  22. package/framework/components/chui_badge/badge.js +30 -28
  23. package/framework/components/chui_badge/styles.css +6 -6
  24. package/framework/components/chui_banner/banner.js +222 -0
  25. package/framework/components/chui_banner/styles.css +170 -0
  26. package/framework/components/chui_breadcrumb/breadcrumb.js +15 -13
  27. package/framework/components/chui_breadcrumb/styles.css +1 -1
  28. package/framework/components/chui_button/button.js +52 -36
  29. package/framework/components/chui_button/styles.css +7 -7
  30. package/framework/components/chui_calendar/calendar.js +18 -16
  31. package/framework/components/chui_card/card.js +52 -32
  32. package/framework/components/chui_card_scroll/card_scroll.js +169 -0
  33. package/framework/components/chui_card_scroll/styles.css +86 -0
  34. package/framework/components/chui_chat/chat.js +140 -79
  35. package/framework/components/chui_chat/styles.css +18 -7
  36. package/framework/components/chui_clipboard_history/clipboard_history.js +53 -39
  37. package/framework/components/chui_clipboard_history/styles.css +13 -9
  38. package/framework/components/chui_code/code.js +10 -10
  39. package/framework/components/chui_code/styles.css +4 -4
  40. package/framework/components/chui_code_editor/code_editor.js +73 -57
  41. package/framework/components/chui_code_editor/styles.css +6 -5
  42. package/framework/components/chui_command_palette/command_palette.js +87 -64
  43. package/framework/components/chui_command_palette/styles.css +5 -5
  44. package/framework/components/chui_console/console.js +13 -13
  45. package/framework/components/chui_console/styles.css +6 -3
  46. package/framework/components/chui_content_block/content_block.js +35 -21
  47. package/framework/components/chui_content_block/styles.css +2 -2
  48. package/framework/components/chui_context_menu/context_menu.js +171 -58
  49. package/framework/components/chui_context_menu/styles.css +82 -8
  50. package/framework/components/chui_custom_element/custom_element.js +25 -18
  51. package/framework/components/chui_data_grid/data_grid.js +633 -471
  52. package/framework/components/chui_data_grid/styles.css +24 -22
  53. package/framework/components/chui_descriptions/descriptions.js +34 -17
  54. package/framework/components/chui_descriptions/styles.css +1 -1
  55. package/framework/components/chui_details/details.js +42 -36
  56. package/framework/components/chui_details/styles.css +12 -11
  57. package/framework/components/chui_diff_viewer/diff_viewer.js +172 -147
  58. package/framework/components/chui_diff_viewer/styles.css +10 -10
  59. package/framework/components/chui_divider/divider.js +19 -17
  60. package/framework/components/chui_divider/styles.css +2 -2
  61. package/framework/components/chui_drawer/drawer.js +63 -38
  62. package/framework/components/chui_drawer/styles.css +18 -4
  63. package/framework/components/chui_drop_zone/drop_zone.js +37 -27
  64. package/framework/components/chui_drop_zone/styles.css +10 -6
  65. package/framework/components/chui_empty_state/empty_state.js +20 -15
  66. package/framework/components/chui_fieldset/fieldset.js +40 -23
  67. package/framework/components/chui_fieldset/styles.css +6 -6
  68. package/framework/components/chui_file_explorer/file_explorer.js +260 -189
  69. package/framework/components/chui_file_explorer/styles.css +8 -7
  70. package/framework/components/chui_form/form.js +40 -28
  71. package/framework/components/chui_form/styles.css +1 -1
  72. package/framework/components/chui_gantt/gantt.js +102 -78
  73. package/framework/components/chui_gantt/styles.css +5 -5
  74. package/framework/components/chui_graphs/graphs.js +376 -239
  75. package/framework/components/chui_graphs/styles.css +27 -6
  76. package/framework/components/chui_hero/hero.js +98 -37
  77. package/framework/components/chui_hero/styles.css +176 -7
  78. package/framework/components/chui_html_block/html_block.js +8 -8
  79. package/framework/components/chui_html_block/styles.css +3 -3
  80. package/framework/components/chui_hx/hx.js +3 -3
  81. package/framework/components/chui_hx/styles.css +13 -6
  82. package/framework/components/chui_icons/icons.js +2115 -2115
  83. package/framework/components/chui_icons/styles.css +4 -3
  84. package/framework/components/chui_inputs/chui_check_box/check_box.js +31 -19
  85. package/framework/components/chui_inputs/chui_check_box/styles.css +30 -21
  86. package/framework/components/chui_inputs/chui_chips/chips.js +141 -70
  87. package/framework/components/chui_inputs/chui_chips/styles.css +32 -7
  88. package/framework/components/chui_inputs/chui_color_picker/color_picker.js +55 -38
  89. package/framework/components/chui_inputs/chui_color_picker/styles.css +7 -7
  90. package/framework/components/chui_inputs/chui_combo_box/combo_box.js +127 -109
  91. package/framework/components/chui_inputs/chui_combo_box/styles.css +23 -21
  92. package/framework/components/chui_inputs/chui_date/date.js +161 -127
  93. package/framework/components/chui_inputs/chui_date/styles.css +20 -19
  94. package/framework/components/chui_inputs/chui_date_range/date_range.js +61 -50
  95. package/framework/components/chui_inputs/chui_date_range/styles.css +3 -3
  96. package/framework/components/chui_inputs/chui_datetime/datetime.js +47 -39
  97. package/framework/components/chui_inputs/chui_datetime/styles.css +3 -3
  98. package/framework/components/chui_inputs/chui_email/email.js +48 -36
  99. package/framework/components/chui_inputs/chui_email/styles.css +11 -11
  100. package/framework/components/chui_inputs/chui_file/file.js +71 -44
  101. package/framework/components/chui_inputs/chui_file/styles.css +23 -19
  102. package/framework/components/chui_inputs/chui_hotkey/hotkey.js +101 -76
  103. package/framework/components/chui_inputs/chui_hotkey/styles.css +6 -6
  104. package/framework/components/chui_inputs/chui_masked/masked.js +83 -72
  105. package/framework/components/chui_inputs/chui_masked/styles.css +5 -5
  106. package/framework/components/chui_inputs/chui_mention/mention.js +87 -40
  107. package/framework/components/chui_inputs/chui_mention/styles.css +14 -8
  108. package/framework/components/chui_inputs/chui_multi_combo_box/multi_combo_box.js +242 -212
  109. package/framework/components/chui_inputs/chui_multi_combo_box/styles.css +23 -15
  110. package/framework/components/chui_inputs/chui_number/number.js +84 -70
  111. package/framework/components/chui_inputs/chui_number/styles.css +13 -13
  112. package/framework/components/chui_inputs/chui_otp/otp.js +71 -62
  113. package/framework/components/chui_inputs/chui_otp/styles.css +5 -5
  114. package/framework/components/chui_inputs/chui_password/password.js +72 -56
  115. package/framework/components/chui_inputs/chui_password/styles.css +15 -15
  116. package/framework/components/chui_inputs/chui_radio_button/radio_button.js +37 -25
  117. package/framework/components/chui_inputs/chui_radio_button/styles.css +22 -22
  118. package/framework/components/chui_inputs/chui_rating/rating.js +54 -50
  119. package/framework/components/chui_inputs/chui_rating/styles.css +3 -3
  120. package/framework/components/chui_inputs/chui_select_box/select_box.js +132 -108
  121. package/framework/components/chui_inputs/chui_select_box/styles.css +21 -21
  122. package/framework/components/chui_inputs/chui_slider/slider.js +41 -38
  123. package/framework/components/chui_inputs/chui_slider/styles.css +7 -5
  124. package/framework/components/chui_inputs/chui_text/styles.css +14 -14
  125. package/framework/components/chui_inputs/chui_text/text.js +69 -52
  126. package/framework/components/chui_inputs/chui_text_area/styles.css +14 -14
  127. package/framework/components/chui_inputs/chui_text_area/text_area.js +59 -36
  128. package/framework/components/chui_inputs/chui_time/styles.css +18 -20
  129. package/framework/components/chui_inputs/chui_time/time.js +71 -49
  130. package/framework/components/chui_inputs/chui_toggle/styles.css +13 -6
  131. package/framework/components/chui_inputs/chui_toggle/toggle.js +27 -27
  132. package/framework/components/chui_json_editor/json_editor.js +137 -127
  133. package/framework/components/chui_json_editor/styles.css +5 -5
  134. package/framework/components/chui_json_viewer/json_viewer.js +133 -114
  135. package/framework/components/chui_json_viewer/styles.css +9 -8
  136. package/framework/components/chui_kanban/kanban.js +78 -60
  137. package/framework/components/chui_kanban/styles.css +8 -4
  138. package/framework/components/chui_kbd/kbd.js +12 -10
  139. package/framework/components/chui_kbd/styles.css +1 -1
  140. package/framework/components/chui_label/label.js +31 -29
  141. package/framework/components/chui_label/styles.css +3 -3
  142. package/framework/components/chui_link/link.js +36 -29
  143. package/framework/components/chui_link/styles.css +11 -4
  144. package/framework/components/chui_list/list.js +42 -38
  145. package/framework/components/chui_list/styles.css +4 -3
  146. package/framework/components/chui_markdown_editor/markdown_editor.js +125 -109
  147. package/framework/components/chui_markdown_editor/styles.css +5 -5
  148. package/framework/components/chui_media/audio.js +457 -364
  149. package/framework/components/chui_media/audio_styles.css +74 -37
  150. package/framework/components/chui_media/image.js +99 -64
  151. package/framework/components/chui_media/image_compare.js +86 -55
  152. package/framework/components/chui_media/image_compare_styles.css +5 -5
  153. package/framework/components/chui_media/image_styles.css +4 -4
  154. package/framework/components/chui_media/video.js +264 -171
  155. package/framework/components/chui_media/video_styles.css +57 -24
  156. package/framework/components/chui_menu_bar/menu_bar.js +67 -65
  157. package/framework/components/chui_menu_bar/styles.css +14 -12
  158. package/framework/components/chui_message_bar/message_bar.js +551 -0
  159. package/framework/components/chui_message_bar/styles.css +248 -0
  160. package/framework/components/chui_modal/modal.js +81 -56
  161. package/framework/components/chui_modal/styles.css +3 -2
  162. package/framework/components/chui_notification/notification.js +107 -69
  163. package/framework/components/chui_notification/notification_download.js +28 -77
  164. package/framework/components/chui_notification/notification_download_card.js +115 -0
  165. package/framework/components/chui_notification/notification_download_progress.css +5 -4
  166. package/framework/components/chui_notification/notification_download_progress.js +73 -105
  167. package/framework/components/chui_notification/notification_update.js +44 -37
  168. package/framework/components/chui_notification/status_plate.css +3 -3
  169. package/framework/components/chui_notification/status_plate.js +2 -2
  170. package/framework/components/chui_notification/styles.css +6 -1
  171. package/framework/components/chui_notification/styles_download.css +2 -2
  172. package/framework/components/chui_notification/styles_update.css +3 -3
  173. package/framework/components/chui_org_chart/org_chart.js +101 -62
  174. package/framework/components/chui_org_chart/styles.css +2 -2
  175. package/framework/components/chui_pagination/pagination.js +65 -30
  176. package/framework/components/chui_pagination/styles.css +1 -1
  177. package/framework/components/chui_paragraph/paragraph.js +2 -2
  178. package/framework/components/chui_paragraph/styles.css +3 -3
  179. package/framework/components/chui_popover/popover.js +77 -50
  180. package/framework/components/chui_popover/styles.css +1 -1
  181. package/framework/components/chui_popups/popups.js +210 -181
  182. package/framework/components/chui_popups/styles.css +7 -7
  183. package/framework/components/chui_print_button/print_button.js +48 -33
  184. package/framework/components/chui_progress_bar/progress_bar.js +49 -19
  185. package/framework/components/chui_progress_bar/styles.css +6 -6
  186. package/framework/components/chui_progress_ring/progress_ring.js +32 -30
  187. package/framework/components/chui_progress_ring/styles.css +1 -1
  188. package/framework/components/chui_qrcode/qrcode.js +85 -41
  189. package/framework/components/chui_query_builder/query_builder.js +263 -170
  190. package/framework/components/chui_query_builder/styles.css +4 -4
  191. package/framework/components/chui_radio_group/radio_group.js +36 -26
  192. package/framework/components/chui_radio_group/styles.css +2 -2
  193. package/framework/components/chui_result/result.js +41 -31
  194. package/framework/components/chui_result/styles.css +3 -3
  195. package/framework/components/chui_scheduler/scheduler.js +126 -104
  196. package/framework/components/chui_scheduler/styles.css +11 -7
  197. package/framework/components/chui_screen_spinner/screen_spinner.js +167 -0
  198. package/framework/components/chui_screen_spinner/styles.css +49 -0
  199. package/framework/components/chui_segmented_control/segmented_control.js +90 -27
  200. package/framework/components/chui_segmented_control/styles.css +32 -6
  201. package/framework/components/chui_settings/settings.js +160 -87
  202. package/framework/components/chui_settings/styles.css +4 -4
  203. package/framework/components/chui_shortcut_help/shortcut_help.js +82 -61
  204. package/framework/components/chui_sidebar_nav/sidebar_nav.js +132 -53
  205. package/framework/components/chui_sidebar_nav/styles.css +9 -3
  206. package/framework/components/chui_skeleton/skeleton.js +29 -24
  207. package/framework/components/chui_slideshow/slideshow.js +122 -103
  208. package/framework/components/chui_slideshow/styles.css +22 -16
  209. package/framework/components/chui_spinner/spinner.js +17 -17
  210. package/framework/components/chui_spinner/styles.css +0 -1
  211. package/framework/components/chui_split_button/split_button.js +53 -30
  212. package/framework/components/chui_split_button/styles.css +22 -6
  213. package/framework/components/chui_splitter/splitter.js +46 -39
  214. package/framework/components/chui_splitter/styles.css +2 -2
  215. package/framework/components/chui_statistic/statistic.js +111 -84
  216. package/framework/components/chui_status_bar/status_bar.js +11 -9
  217. package/framework/components/chui_status_bar/styles.css +2 -2
  218. package/framework/components/chui_stepper/stepper.js +230 -54
  219. package/framework/components/chui_stepper/styles.css +79 -14
  220. package/framework/components/chui_sticky_bar/sticky_bar.js +53 -17
  221. package/framework/components/chui_sticky_bar/styles.css +11 -7
  222. package/framework/components/chui_tabs/chui_tabs.js +100 -46
  223. package/framework/components/chui_tabs/styles.css +43 -15
  224. package/framework/components/chui_text_editor/styles.css +24 -23
  225. package/framework/components/chui_text_editor/text_editor.js +103 -79
  226. package/framework/components/chui_text_editor/text_editor_panel.js +428 -367
  227. package/framework/components/chui_theme_toggle/theme_toggle.js +46 -25
  228. package/framework/components/chui_timeline/styles.css +3 -1
  229. package/framework/components/chui_timeline/timeline.js +14 -12
  230. package/framework/components/chui_toast_queue/styles.css +11 -11
  231. package/framework/components/chui_toast_queue/toast_queue.js +82 -73
  232. package/framework/components/chui_toolbar/styles.css +2 -2
  233. package/framework/components/chui_toolbar/toolbar.js +20 -13
  234. package/framework/components/chui_tooltip/styles.css +2 -2
  235. package/framework/components/chui_tooltip/tooltip.js +40 -27
  236. package/framework/components/chui_tour/styles.css +12 -7
  237. package/framework/components/chui_tour/tour.js +132 -98
  238. package/framework/components/chui_transfer/styles.css +8 -7
  239. package/framework/components/chui_transfer/transfer.js +143 -123
  240. package/framework/components/chui_tree_table/styles.css +4 -4
  241. package/framework/components/chui_tree_table/tree_table.js +88 -74
  242. package/framework/components/chui_tree_view/styles.css +14 -10
  243. package/framework/components/chui_tree_view/tree_view.js +298 -253
  244. package/framework/components/chui_user_bar/styles.css +145 -0
  245. package/framework/components/chui_user_bar/user_bar.js +402 -0
  246. package/framework/components/chui_user_list_bar/styles.css +173 -0
  247. package/framework/components/chui_user_list_bar/user_list_bar.js +485 -0
  248. package/framework/components/chui_watermark/watermark.js +41 -33
  249. package/framework/components/chui_webview/styles.css +2 -2
  250. package/framework/components/chui_webview/webview.js +64 -52
  251. package/framework/components/chui_write_bar/styles.css +172 -0
  252. package/framework/components/chui_write_bar/write_bar.js +320 -0
  253. package/framework/main_window.js +1234 -0
  254. package/framework/modules/chui_a11y/chui_a11y.js +153 -123
  255. package/framework/modules/chui_animations/animations.js +105 -43
  256. package/framework/modules/chui_animations/motion.js +120 -0
  257. package/framework/modules/chui_animations/styles.css +37 -4
  258. package/framework/modules/chui_bridge/preload.js +36 -25
  259. package/framework/modules/chui_functions.js +69 -63
  260. package/framework/modules/chui_highlight/chui_highlight.js +25 -22
  261. package/framework/modules/chui_highlight/styles.css +13 -10
  262. package/framework/modules/chui_i18n/chui_i18n.js +12 -10
  263. package/framework/modules/chui_i18n/locales/a11y.js +5 -5
  264. package/framework/modules/chui_i18n/locales/app_layout.js +5 -5
  265. package/framework/modules/chui_i18n/locales/calendar.js +3 -3
  266. package/framework/modules/chui_i18n/locales/common.js +3 -3
  267. package/framework/modules/chui_i18n/locales/data.js +36 -26
  268. package/framework/modules/chui_i18n/locales/editors.js +40 -13
  269. package/framework/modules/chui_i18n/locales/feedback.js +65 -3
  270. package/framework/modules/chui_i18n/locales/forms.js +8 -8
  271. package/framework/modules/chui_i18n/locales/graphics.js +8 -8
  272. package/framework/modules/chui_i18n/locales/media.js +4 -4
  273. package/framework/modules/chui_i18n/locales/navigation.js +12 -8
  274. package/framework/modules/chui_i18n/locales/validate.js +3 -3
  275. package/framework/modules/chui_json/chui_json.js +11 -11
  276. package/framework/modules/chui_layout/chui_layout.js +12 -10
  277. package/framework/modules/chui_logger/chui_logger.js +47 -28
  278. package/framework/modules/chui_page/page.js +39 -33
  279. package/framework/modules/chui_palette/palette.js +61 -0
  280. package/framework/modules/chui_qr/chui_qr.js +179 -88
  281. package/framework/modules/chui_scrollbar/chui_scrollbar.js +79 -68
  282. package/framework/modules/chui_scrollbar/styles.css +4 -2
  283. package/framework/modules/chui_services/chui_channels.js +27 -13
  284. package/framework/modules/chui_services/chui_services.js +47 -39
  285. package/framework/modules/chui_services/desktop.js +108 -101
  286. package/framework/modules/chui_sortable/chui_sortable.js +33 -28
  287. package/framework/modules/chui_validate/chui_validate.js +10 -7
  288. package/framework/tray_bar/chui_menu_items.js +136 -46
  289. package/index.d.ts +5046 -0
  290. package/index.js +199 -1254
  291. package/package.json +81 -68
  292. package/framework/components/telegram_bot/chui_telegram_bot.js +0 -184
@@ -33,63 +33,119 @@ const LEVELS = {
33
33
  LOW: "L",
34
34
  MEDIUM: "M",
35
35
  QUARTILE: "Q",
36
- HIGH: "H"
36
+ HIGH: "H",
37
37
  };
38
38
  const MODES = {
39
39
  AUTO: "auto",
40
40
  NUMERIC: "numeric",
41
41
  ALPHANUMERIC: "alphanumeric",
42
- BYTE: "byte"
42
+ BYTE: "byte",
43
43
  };
44
44
  /** Знаки, которые кодируются в алфавитно-цифровом режиме (45 значений) */
45
45
  const ALPHANUMERIC_CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:";
46
46
  /** Биты режима, разрядность счётчика символов по диапазонам версий (1–9, 10–26, 27–40) */
47
47
  const MODE_INFO = {
48
- numeric: {bits: 0b0001, count: [10, 12, 14]},
49
- alphanumeric: {bits: 0b0010, count: [9, 11, 13]},
50
- byte: {bits: 0b0100, count: [8, 16, 16]}
48
+ numeric: { bits: 0b0001, count: [10, 12, 14] },
49
+ alphanumeric: { bits: 0b0010, count: [9, 11, 13] },
50
+ byte: { bits: 0b0100, count: [8, 16, 16] },
51
51
  };
52
52
  /** Биты уровня в информации о формате (порядок в таблицах блоков — L, M, Q, H) */
53
53
  const LEVEL_INFO = {
54
- L: {format: 0b01, index: 0},
55
- M: {format: 0b00, index: 1},
56
- Q: {format: 0b11, index: 2},
57
- H: {format: 0b10, index: 3}
54
+ L: { format: 0b01, index: 0 },
55
+ M: { format: 0b00, index: 1 },
56
+ Q: { format: 0b11, index: 2 },
57
+ H: { format: 0b10, index: 3 },
58
58
  };
59
59
  /** Кодовых слов коррекции в блоке по версиям 1…40 (строки — L, M, Q, H) */
60
60
  const EC_CODEWORDS = [
61
- [7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],
62
- [10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28],
63
- [13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],
64
- [17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30]
61
+ [
62
+ 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30,
63
+ 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
64
+ ],
65
+ [
66
+ 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28,
67
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
68
+ ],
69
+ [
70
+ 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30,
71
+ 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
72
+ ],
73
+ [
74
+ 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30,
75
+ 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
76
+ ],
65
77
  ];
66
78
  /** Число блоков коррекции по версиям 1…40 (строки — L, M, Q, H) */
67
79
  const EC_BLOCKS = [
68
- [1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25],
69
- [1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49],
70
- [1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68],
71
- [1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81]
80
+ [
81
+ 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19,
82
+ 19, 20, 21, 22, 24, 25,
83
+ ],
84
+ [
85
+ 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31,
86
+ 33, 35, 37, 38, 40, 43, 45, 47, 49,
87
+ ],
88
+ [
89
+ 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43,
90
+ 45, 48, 51, 53, 56, 59, 62, 65, 68,
91
+ ],
92
+ [
93
+ 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48,
94
+ 51, 54, 57, 60, 63, 66, 70, 74, 77, 81,
95
+ ],
72
96
  ];
73
97
  /** Центры узоров выравнивания по версиям 1…40 (пусто у первой версии) */
74
98
  const ALIGNMENT_POSITIONS = [
75
- [], [6, 18], [6, 22], [6, 26], [6, 30], [6, 34], [6, 22, 38], [6, 24, 42], [6, 26, 46], [6, 28, 50],
76
- [6, 30, 54], [6, 32, 58], [6, 34, 62], [6, 26, 46, 66], [6, 26, 48, 70], [6, 26, 50, 74], [6, 30, 54, 78],
77
- [6, 30, 56, 82], [6, 30, 58, 86], [6, 34, 62, 90], [6, 28, 50, 72, 94], [6, 26, 50, 74, 98],
78
- [6, 30, 54, 78, 102], [6, 28, 54, 80, 106], [6, 32, 58, 84, 110], [6, 30, 58, 86, 114],
79
- [6, 34, 62, 90, 118], [6, 26, 50, 74, 98, 122], [6, 30, 54, 78, 102, 126], [6, 26, 52, 78, 104, 130],
80
- [6, 30, 56, 82, 108, 134], [6, 34, 60, 86, 112, 138], [6, 30, 58, 86, 114, 142], [6, 34, 62, 90, 118, 146],
81
- [6, 30, 54, 78, 102, 126, 150], [6, 24, 50, 76, 102, 128, 154], [6, 28, 54, 80, 106, 132, 158],
82
- [6, 32, 58, 84, 110, 136, 162], [6, 26, 54, 82, 110, 138, 166], [6, 30, 58, 86, 114, 142, 170]
99
+ [],
100
+ [6, 18],
101
+ [6, 22],
102
+ [6, 26],
103
+ [6, 30],
104
+ [6, 34],
105
+ [6, 22, 38],
106
+ [6, 24, 42],
107
+ [6, 26, 46],
108
+ [6, 28, 50],
109
+ [6, 30, 54],
110
+ [6, 32, 58],
111
+ [6, 34, 62],
112
+ [6, 26, 46, 66],
113
+ [6, 26, 48, 70],
114
+ [6, 26, 50, 74],
115
+ [6, 30, 54, 78],
116
+ [6, 30, 56, 82],
117
+ [6, 30, 58, 86],
118
+ [6, 34, 62, 90],
119
+ [6, 28, 50, 72, 94],
120
+ [6, 26, 50, 74, 98],
121
+ [6, 30, 54, 78, 102],
122
+ [6, 28, 54, 80, 106],
123
+ [6, 32, 58, 84, 110],
124
+ [6, 30, 58, 86, 114],
125
+ [6, 34, 62, 90, 118],
126
+ [6, 26, 50, 74, 98, 122],
127
+ [6, 30, 54, 78, 102, 126],
128
+ [6, 26, 52, 78, 104, 130],
129
+ [6, 30, 56, 82, 108, 134],
130
+ [6, 34, 60, 86, 112, 138],
131
+ [6, 30, 58, 86, 114, 142],
132
+ [6, 34, 62, 90, 118, 146],
133
+ [6, 30, 54, 78, 102, 126, 150],
134
+ [6, 24, 50, 76, 102, 128, 154],
135
+ [6, 28, 54, 80, 106, 132, 158],
136
+ [6, 32, 58, 84, 110, 136, 162],
137
+ [6, 26, 54, 82, 110, 138, 166],
138
+ [6, 30, 58, 86, 114, 142, 170],
83
139
  ];
84
140
  const MIN_VERSION = 1;
85
141
  const MAX_VERSION = 40;
86
142
  /** Полином поля Галуа и порождающий полином модуля `x^8 + x^4 + x^3 + x^2 + 1` */
87
- const GF_PRIME = 0x11D;
88
- const PAD_BYTES = [0xEC, 0x11];
89
- const PENALTY = {N1: 3, N2: 3, N3: 40, N4: 10};
143
+ const GF_PRIME = 0x11d;
144
+ const PAD_BYTES = [0xec, 0x11];
145
+ const PENALTY = { N1: 3, N2: 3, N3: 40, N4: 10 };
90
146
  const FORMAT_POLYNOMIAL = 0x537;
91
147
  const FORMAT_MASK = 0x5412;
92
- const VERSION_POLYNOMIAL = 0x1F25;
148
+ const VERSION_POLYNOMIAL = 0x1f25;
93
149
 
94
150
  class QR {
95
151
  static LEVEL = LEVELS;
@@ -105,11 +161,11 @@ class QR {
105
161
  * `version` по умолчанию — 40: это предел всего формата.
106
162
  */
107
163
  static capacity(version = MAX_VERSION, level = LEVELS.MEDIUM, mode = MODES.AUTO) {
108
- const checked_level = QR.#checkLevel(QR.#option(level));
164
+ const checkedLevel = QR.#checkLevel(QR.#option(level));
109
165
  const chosen = QR.#option(mode);
110
- const checked_mode = chosen === undefined || chosen === MODES.AUTO ? MODES.BYTE : QR.#checkMode(chosen);
111
- const checked_version = QR.#checkVersion(QR.#option(version) === undefined ? MAX_VERSION : version);
112
- return QR.#capacity(checked_version, checked_level, checked_mode);
166
+ const checkedMode = chosen === undefined || chosen === MODES.AUTO ? MODES.BYTE : QR.#checkMode(chosen);
167
+ const checkedVersion = QR.#checkVersion(QR.#option(version) === undefined ? MAX_VERSION : version);
168
+ return QR.#capacity(checkedVersion, checkedLevel, checkedMode);
113
169
  }
114
170
 
115
171
  /** Режим, который выберет `AUTO` для этой строки: цифры, буквы и цифры или байты */
@@ -134,9 +190,15 @@ class QR {
134
190
  for (const char of String(text)) {
135
191
  const code = char.codePointAt(0);
136
192
  if (code < 0x80) bytes.push(code);
137
- else if (code < 0x800) bytes.push(0xC0 | (code >> 6), 0x80 | (code & 0x3F));
138
- else if (code < 0x10000) bytes.push(0xE0 | (code >> 12), 0x80 | ((code >> 6) & 0x3F), 0x80 | (code & 0x3F));
139
- else bytes.push(0xF0 | (code >> 18), 0x80 | ((code >> 12) & 0x3F), 0x80 | ((code >> 6) & 0x3F), 0x80 | (code & 0x3F));
193
+ else if (code < 0x800) bytes.push(0xc0 | (code >> 6), 0x80 | (code & 0x3f));
194
+ else if (code < 0x10000) bytes.push(0xe0 | (code >> 12), 0x80 | ((code >> 6) & 0x3f), 0x80 | (code & 0x3f));
195
+ else
196
+ bytes.push(
197
+ 0xf0 | (code >> 18),
198
+ 0x80 | ((code >> 12) & 0x3f),
199
+ 0x80 | ((code >> 6) & 0x3f),
200
+ 0x80 | (code & 0x3f)
201
+ );
140
202
  }
141
203
  return bytes;
142
204
  }
@@ -150,21 +212,21 @@ class QR {
150
212
  */
151
213
  static encode(value = String(), options = {}) {
152
214
  const text = value === undefined || value === null ? "" : String(value);
153
- if (text === "") return {ok: false, error: {code: "empty"}};
215
+ if (text === "") return { ok: false, error: { code: "empty" } };
154
216
  // Пустая строка в опции значит «не задана» — общее правило фреймворка
155
217
  const level = QR.#checkLevel(QR.#option(options.level));
156
218
  const requested = QR.#option(options.mode);
157
219
  const mode = requested === undefined || requested === MODES.AUTO ? MODES.AUTO : QR.#checkMode(requested);
158
- const min_version = QR.#option(options.minVersion);
159
- const max_version = QR.#option(options.maxVersion);
160
- const first = QR.#checkVersion(min_version === undefined ? MIN_VERSION : min_version);
161
- const last = QR.#checkVersion(max_version === undefined ? MAX_VERSION : max_version);
220
+ const minVersion = QR.#option(options.minVersion);
221
+ const maxVersion = QR.#option(options.maxVersion);
222
+ const first = QR.#checkVersion(minVersion === undefined ? MIN_VERSION : minVersion);
223
+ const last = QR.#checkVersion(maxVersion === undefined ? MAX_VERSION : maxVersion);
162
224
  if (first > last) throw new RangeError("QR: minVersion больше maxVersion");
163
225
  const mask = QR.#option(options.mask) === undefined ? undefined : QR.#checkMask(options.mask);
164
226
 
165
227
  const chosen = mode === MODES.AUTO ? QR.modeOf(text) : mode;
166
228
  const payload = QR.#payload(text, chosen);
167
- if (payload === undefined) return {ok: false, error: {code: "mode", mode: chosen}};
229
+ if (payload === undefined) return { ok: false, error: { code: "mode", mode: chosen } };
168
230
 
169
231
  // Версия — наименьшая, в которую влезает заголовок (4 бита режима и счётчик) и данные
170
232
  let version = undefined;
@@ -176,24 +238,34 @@ class QR {
176
238
  }
177
239
  }
178
240
  if (version === undefined) {
179
- return {ok: false, error: {
180
- code: "tooLong", mode: payload.mode, length: payload.length,
181
- needed: payload.length, capacity: QR.#capacity(last, level, payload.mode)
182
- }};
241
+ return {
242
+ ok: false,
243
+ error: {
244
+ code: "tooLong",
245
+ mode: payload.mode,
246
+ length: payload.length,
247
+ needed: payload.length,
248
+ capacity: QR.#capacity(last, level, payload.mode),
249
+ },
250
+ };
183
251
  }
184
252
 
185
253
  const codewords = QR.#codewords(payload, version, level);
186
254
  const size = QR.size(version);
187
255
  const pattern = QR.#functionPatterns(version, level);
188
256
  QR.#placeData(pattern.modules, pattern.isFunction, codewords, size);
189
- const chosen_mask = mask === undefined
190
- ? QR.#bestMask(pattern.modules, pattern.isFunction, size, level)
191
- : mask;
192
- QR.#applyMask(pattern.modules, pattern.isFunction, size, chosen_mask);
193
- QR.#drawFormat(pattern.modules, pattern.isFunction, size, level, chosen_mask);
257
+ const chosenMask = mask === undefined ? QR.#bestMask(pattern.modules, pattern.isFunction, size, level) : mask;
258
+ QR.#applyMask(pattern.modules, pattern.isFunction, size, chosenMask);
259
+ QR.#drawFormat(pattern.modules, pattern.isFunction, size, level, chosenMask);
194
260
  return {
195
- ok: true, matrix: pattern.modules, size: size, version: version, mask: chosen_mask,
196
- level: level, mode: payload.mode, length: payload.length
261
+ ok: true,
262
+ matrix: pattern.modules,
263
+ size: size,
264
+ version: version,
265
+ mask: chosenMask,
266
+ level: level,
267
+ mode: payload.mode,
268
+ length: payload.length,
197
269
  };
198
270
  }
199
271
 
@@ -207,23 +279,24 @@ class QR {
207
279
  const group = text.slice(i, i + 3);
208
280
  QR.#append(bits, Number(group), group.length * 3 + 1);
209
281
  }
210
- return {mode: mode, length: text.length, bits: bits};
282
+ return { mode: mode, length: text.length, bits: bits };
211
283
  }
212
284
  if (mode === MODES.ALPHANUMERIC) {
213
285
  if (!QR.isAlphanumeric(text)) return undefined;
214
286
  const bits = [];
215
287
  let i = 0;
216
288
  for (; i + 2 <= text.length; i += 2) {
217
- const value = ALPHANUMERIC_CHARS.indexOf(text.charAt(i)) * 45 + ALPHANUMERIC_CHARS.indexOf(text.charAt(i + 1));
289
+ const value =
290
+ ALPHANUMERIC_CHARS.indexOf(text.charAt(i)) * 45 + ALPHANUMERIC_CHARS.indexOf(text.charAt(i + 1));
218
291
  QR.#append(bits, value, 11);
219
292
  }
220
293
  if (i < text.length) QR.#append(bits, ALPHANUMERIC_CHARS.indexOf(text.charAt(i)), 6);
221
- return {mode: mode, length: text.length, bits: bits};
294
+ return { mode: mode, length: text.length, bits: bits };
222
295
  }
223
296
  const bytes = QR.toBytes(text);
224
297
  const bits = [];
225
298
  for (const byte of bytes) QR.#append(bits, byte, 8);
226
- return {mode: MODES.BYTE, length: bytes.length, bits: bits};
299
+ return { mode: MODES.BYTE, length: bytes.length, bits: bits };
227
300
  }
228
301
 
229
302
  /** Сколько символов влезает в версию при уровне и режиме */
@@ -270,27 +343,27 @@ class QR {
270
343
  */
271
344
  static #interleave(data = [], version = MIN_VERSION, level = LEVELS.MEDIUM) {
272
345
  const blocks = EC_BLOCKS[LEVEL_INFO[level].index][version - 1];
273
- const ec_length = EC_CODEWORDS[LEVEL_INFO[level].index][version - 1];
346
+ const errorCorrectionLength = EC_CODEWORDS[LEVEL_INFO[level].index][version - 1];
274
347
  const total = QR.#rawDataModules(version) >> 3;
275
- const short_length = Math.floor(total / blocks) - ec_length;
276
- const short_blocks = blocks - (total % blocks);
277
- const divisor = QR.#divisor(ec_length);
348
+ const shortLength = Math.floor(total / blocks) - errorCorrectionLength;
349
+ const shortBlocks = blocks - (total % blocks);
350
+ const divisor = QR.#divisor(errorCorrectionLength);
278
351
  const chunks = [];
279
352
  let offset = 0;
280
353
  for (let index = 0; index < blocks; index += 1) {
281
- const length = short_length + (index < short_blocks ? 0 : 1);
354
+ const length = shortLength + (index < shortBlocks ? 0 : 1);
282
355
  const chunk = data.slice(offset, offset + length);
283
356
  offset += length;
284
- chunks.push({data: chunk, ec: QR.#remainder(chunk, divisor)});
357
+ chunks.push({ data: chunk, ec: QR.#remainder(chunk, divisor) });
285
358
  }
286
359
  const result = [];
287
- const longest = short_length + 1;
360
+ const longest = shortLength + 1;
288
361
  for (let position = 0; position < longest; position += 1) {
289
362
  for (const chunk of chunks) {
290
363
  if (position < chunk.data.length) result.push(chunk.data[position]);
291
364
  }
292
365
  }
293
- for (let position = 0; position < ec_length; position += 1) {
366
+ for (let position = 0; position < errorCorrectionLength; position += 1) {
294
367
  for (const chunk of chunks) result.push(chunk.ec[position]);
295
368
  }
296
369
  return result;
@@ -298,7 +371,7 @@ class QR {
298
371
 
299
372
  /** Порождающий полином коррекции степени `degree` (без старшего члена) */
300
373
  static #divisor(degree = Number()) {
301
- let result = new Array(degree).fill(0);
374
+ const result = new Array(degree).fill(0);
302
375
  result[degree - 1] = 1;
303
376
  let root = 1;
304
377
  for (let index = 0; index < degree; index += 1) {
@@ -358,8 +431,8 @@ class QR {
358
431
  /** Матрица со служебными узорами: где можно ставить данные, отмечено в `isFunction` */
359
432
  static #functionPatterns(version = MIN_VERSION, level = LEVELS.MEDIUM) {
360
433
  const size = QR.size(version);
361
- const modules = Array.from({length: size}, () => new Array(size).fill(false));
362
- const isFunction = Array.from({length: size}, () => new Array(size).fill(false));
434
+ const modules = Array.from({ length: size }, () => new Array(size).fill(false));
435
+ const isFunction = Array.from({ length: size }, () => new Array(size).fill(false));
363
436
  const set = (x, y, dark) => {
364
437
  if (x < 0 || y < 0 || x >= size || y >= size) return;
365
438
  modules[y][x] = dark;
@@ -371,7 +444,11 @@ class QR {
371
444
  set(i, 6, i % 2 === 0);
372
445
  }
373
446
  // Поисковые узоры 7×7 с разделителем: расстояние Чебышёва до центра 3 — тёмное, 2 и 4 — светлое
374
- for (const center of [[3, 3], [size - 4, 3], [3, size - 4]]) {
447
+ for (const center of [
448
+ [3, 3],
449
+ [size - 4, 3],
450
+ [3, size - 4],
451
+ ]) {
375
452
  for (let dy = -4; dy <= 4; dy += 1) {
376
453
  for (let dx = -4; dx <= 4; dx += 1) {
377
454
  const distance = Math.max(Math.abs(dx), Math.abs(dy));
@@ -383,7 +460,8 @@ class QR {
383
460
  const centers = ALIGNMENT_POSITIONS[version - 1];
384
461
  for (let row = 0; row < centers.length; row += 1) {
385
462
  for (let column = 0; column < centers.length; column += 1) {
386
- const corner = (row === 0 && column === 0) ||
463
+ const corner =
464
+ (row === 0 && column === 0) ||
387
465
  (row === 0 && column === centers.length - 1) ||
388
466
  (row === centers.length - 1 && column === 0);
389
467
  if (corner) continue;
@@ -398,7 +476,7 @@ class QR {
398
476
  // считаются сразу — данные туда не попадут
399
477
  QR.#drawFormat(modules, isFunction, size, level, 0);
400
478
  QR.#drawVersion(modules, isFunction, size, version);
401
- return {modules: modules, isFunction: isFunction};
479
+ return { modules: modules, isFunction: isFunction };
402
480
  }
403
481
 
404
482
  /** Информация о формате: 5 битов данных, 10 битов BCH-остатка и маска 0x5412 */
@@ -467,15 +545,24 @@ class QR {
467
545
  /** Маска: `true` — модуль инвертируется */
468
546
  static #maskAt(mask = 0, x = Number(), y = Number()) {
469
547
  switch (mask) {
470
- case 0: return (x + y) % 2 === 0;
471
- case 1: return y % 2 === 0;
472
- case 2: return x % 3 === 0;
473
- case 3: return (x + y) % 3 === 0;
474
- case 4: return (Math.floor(x / 3) + Math.floor(y / 2)) % 2 === 0;
475
- case 5: return ((x * y) % 2) + ((x * y) % 3) === 0;
476
- case 6: return (((x * y) % 2) + ((x * y) % 3)) % 2 === 0;
477
- case 7: return (((x + y) % 2) + ((x * y) % 3)) % 2 === 0;
478
- default: throw new RangeError("QR: маска вне диапазона 0…7");
548
+ case 0:
549
+ return (x + y) % 2 === 0;
550
+ case 1:
551
+ return y % 2 === 0;
552
+ case 2:
553
+ return x % 3 === 0;
554
+ case 3:
555
+ return (x + y) % 3 === 0;
556
+ case 4:
557
+ return (Math.floor(x / 3) + Math.floor(y / 2)) % 2 === 0;
558
+ case 5:
559
+ return ((x * y) % 2) + ((x * y) % 3) === 0;
560
+ case 6:
561
+ return (((x * y) % 2) + ((x * y) % 3)) % 2 === 0;
562
+ case 7:
563
+ return (((x + y) % 2) + ((x * y) % 3)) % 2 === 0;
564
+ default:
565
+ throw new RangeError("QR: маска вне диапазона 0…7");
479
566
  }
480
567
  }
481
568
 
@@ -491,14 +578,14 @@ class QR {
491
578
  /** Маска с наименьшим штрафом; повторное применение снимает маску */
492
579
  static #bestMask(modules = [], isFunction = [], size = Number(), level = LEVELS.MEDIUM) {
493
580
  let best = 0;
494
- let best_score = Infinity;
581
+ let bestScore = Infinity;
495
582
  for (let mask = 0; mask < 8; mask += 1) {
496
583
  QR.#applyMask(modules, isFunction, size, mask);
497
584
  QR.#drawFormat(modules, isFunction, size, level, mask);
498
585
  const score = QR.#penalty(modules, size);
499
- if (score < best_score) {
586
+ if (score < bestScore) {
500
587
  best = mask;
501
- best_score = score;
588
+ bestScore = score;
502
589
  }
503
590
  QR.#applyMask(modules, isFunction, size, mask);
504
591
  }
@@ -520,7 +607,8 @@ class QR {
520
607
  for (let y = 0; y < size - 1; y += 1) {
521
608
  for (let x = 0; x < size - 1; x += 1) {
522
609
  const dark = modules[y][x];
523
- if (dark === modules[y][x + 1] && dark === modules[y + 1][x] && dark === modules[y + 1][x + 1]) score += PENALTY.N2;
610
+ if (dark === modules[y][x + 1] && dark === modules[y + 1][x] && dark === modules[y + 1][x + 1])
611
+ score += PENALTY.N2;
524
612
  }
525
613
  }
526
614
  // Правило 4: доля тёмных модулей вне 45…55 %, шаг — 5 %
@@ -581,10 +669,13 @@ class QR {
581
669
  /** Узор 1:1:3:1:1 в истории полос: тёмная полоса шириной 3 единицы в тёмной рамке */
582
670
  static #finderRuns(history = []) {
583
671
  const unit = history[1];
584
- const core = unit > 0 && history[2] === unit && history[3] === unit * 3 && history[4] === unit && history[5] === unit;
672
+ const core =
673
+ unit > 0 && history[2] === unit && history[3] === unit * 3 && history[4] === unit && history[5] === unit;
585
674
  if (!core) return 0;
586
- return (history[0] >= unit * 4 && history[6] >= unit ? 1 : 0) +
587
- (history[6] >= unit * 4 && history[0] >= unit ? 1 : 0);
675
+ return (
676
+ (history[0] >= unit * 4 && history[6] >= unit ? 1 : 0) +
677
+ (history[6] >= unit * 4 && history[0] >= unit ? 1 : 0)
678
+ );
588
679
  }
589
680
 
590
681
  /** Число, записанное `length` битами, в конец потока */
@@ -622,4 +713,4 @@ class QR {
622
713
  }
623
714
  }
624
715
 
625
- exports.QR = QR
716
+ exports.QR = QR;