impact-nova 2.5.1 → 2.5.2

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 (32) hide show
  1. package/dist/components/data/data-table/build-column-state-from-tree.d.ts +7 -0
  2. package/dist/components/data/data-table/build-column-state-from-tree.js +34 -0
  3. package/dist/components/data/data-table/column-runtime-state-guard.d.ts +17 -0
  4. package/dist/components/data/data-table/column-runtime-state-guard.js +69 -0
  5. package/dist/components/data/data-table/data-table-column-apply.d.ts +4 -0
  6. package/dist/components/data/data-table/data-table-column-apply.js +82 -65
  7. package/dist/components/data/data-table/data-table-column-list-sync.d.ts +4 -3
  8. package/dist/components/data/data-table/data-table-column-list-sync.js +6 -5
  9. package/dist/components/data/data-table/data-table-column-list.js +34 -36
  10. package/dist/components/data/data-table/data-table-column-tree-cache.d.ts +6 -4
  11. package/dist/components/data/data-table/data-table-column-tree-cache.js +102 -69
  12. package/dist/components/data/data-table/data-table.js +66 -61
  13. package/dist/components/data/data-table/index.d.ts +1 -0
  14. package/dist/components/data/data-table/index.js +50 -44
  15. package/dist/components/data/data-table/patch-column-tree-visibility-from-grid.d.ts +3 -0
  16. package/dist/components/data/data-table/patch-column-tree-visibility-from-grid.js +35 -0
  17. package/dist/components/data/data-table/use-data-table-column-list-sync.d.ts +0 -1
  18. package/dist/components/data/data-table/use-data-table-column-list-sync.js +194 -263
  19. package/dist/components/data/expandable-list-item/expandable-list-item-attributes.js +3 -2
  20. package/dist/components/data/expandable-list-item/expandable-list-item-metrics.js +3 -2
  21. package/dist/components/data/nested-list/components/SortableItem.js +43 -42
  22. package/dist/components/data/nested-list/nested-list-tree-utils.d.ts +8 -0
  23. package/dist/components/data/nested-list/nested-list-tree-utils.js +38 -12
  24. package/dist/components/feedback/tooltip/tab-tooltip-render.js +3 -2
  25. package/dist/components/flows/command-palette/shortcut-settings.js +10 -10
  26. package/dist/components/flows/filter-panel/filter-panel.js +4 -4
  27. package/dist/components/forms/select/components/SelectTriggerValue.js +3 -2
  28. package/dist/components/forms/select/components/Submenu.js +3 -2
  29. package/dist/index.js +292 -286
  30. package/dist/llms/rules/installation.js +1 -1
  31. package/dist/llms/rules/requirements.js +1 -1
  32. package/package.json +1 -1
@@ -1,25 +1,26 @@
1
- import { jsx as t, jsxs as i } from "react/jsx-runtime";
2
- import R, { useMemo as j } from "react";
3
- import { useSortable as _ } from "@dnd-kit/sortable";
4
- import { useDroppable as H } from "@dnd-kit/core";
5
- import { Checkbox as D } from "../../../forms/checkbox/checkbox.js";
6
- import { ChevronRight as $, Drag as E } from "impact-nova-icons";
1
+ import { jsx as t, jsxs as c } from "react/jsx-runtime";
2
+ import C, { useMemo as R } from "react";
3
+ import { useSortable as j } from "@dnd-kit/sortable";
4
+ import { useDroppable as _ } from "@dnd-kit/core";
5
+ import { Checkbox as H } from "../../../forms/checkbox/checkbox.js";
6
+ import { ChevronRight as D, Drag as $ } from "impact-nova-icons";
7
7
  import { cn as d } from "../../../../lib/utils.js";
8
- import { useImpactNovaI18n as k } from "../../../../i18n/use-impact-nova-i18n.js";
8
+ import { useImpactNovaI18n as v } from "../../../../i18n/use-impact-nova-i18n.js";
9
+ import { isNestedListSubtreeIndeterminate as E } from "../nested-list-tree-utils.js";
9
10
  const z = "flex shrink-0 items-center h-5 gap-0.5", A = "flex h-5 w-4 shrink-0 items-center justify-center", O = "flex h-5 w-5 shrink-0 cursor-grab active:cursor-grabbing items-center justify-center rounded-sm text-content-icon transition-colors hover:bg-canvas-muted hover:text-content", P = (e, r) => {
10
11
  const s = "group flex items-start gap-2 py-1 pr-2 rounded transition-colors duration-150 min-w-0";
11
12
  return e ? d(s, "opacity-40 bg-canvas-muted") : r ? d(s, "bg-feedback-error-surface border border-destructive animate-pulse") : d(s, "hover:bg-canvas-muted");
12
13
  }, G = ({ item: e, isAnyDragging: r, renderActions: s }) => {
13
- const { t: n } = k(), a = !e.children || e.children.length === 0, {
14
+ const { t: n } = v(), a = !e.children || e.children.length === 0, {
14
15
  setNodeRef: l,
15
16
  isOver: o
16
- } = H({
17
+ } = _({
17
18
  id: `droppable-${e.id}`,
18
19
  data: { sectionId: e.id },
19
20
  disabled: !a
20
21
  });
21
- return /* @__PURE__ */ i("div", { ref: a ? l : void 0, children: [
22
- /* @__PURE__ */ i(
22
+ return /* @__PURE__ */ c("div", { ref: a ? l : void 0, children: [
23
+ /* @__PURE__ */ c(
23
24
  "div",
24
25
  {
25
26
  className: d(
@@ -28,7 +29,7 @@ const z = "flex shrink-0 items-center h-5 gap-0.5", A = "flex h-5 w-4 shrink-0 i
28
29
  o && r && a && "bg-canvas-tint rounded"
29
30
  ),
30
31
  children: [
31
- /* @__PURE__ */ i("div", { className: "flex items-center", children: [
32
+ /* @__PURE__ */ c("div", { className: "flex items-center", children: [
32
33
  e.label,
33
34
  o && r && a && /* @__PURE__ */ t("span", { className: "ml-2 text-brand text-[11px]", children: n("nestedList.dropHere") })
34
35
  ] }),
@@ -57,56 +58,56 @@ const z = "flex shrink-0 items-center h-5 gap-0.5", A = "flex h-5 w-4 shrink-0 i
57
58
  isAnyDragging: o = !1,
58
59
  enableDragDrop: N = !0,
59
60
  enableCollapse: g = !0,
60
- shouldBlink: y = !1,
61
- isDragDisabled: f = !1,
62
- renderLabelExtras: m,
63
- renderActions: x
61
+ shouldBlink: k = !1,
62
+ isDragDisabled: u = !1,
63
+ renderLabelExtras: f,
64
+ renderActions: m
64
65
  }) => {
65
- const { t: h } = k(), v = e.category === "structure", p = e.children && e.children.length > 0, b = !p && e.category !== "structure", C = j(() => !e.children || e.children.length === 0 || e.children.every((u) => u.checked) ? !1 : e.children.some((u) => u.checked), [e.children]), {
66
- attributes: L,
67
- listeners: w,
68
- setNodeRef: S,
66
+ const { t: h } = v(), x = e.category === "structure", p = e.children && e.children.length > 0, b = !p && e.category !== "structure", L = R(() => !e.children || e.children.length === 0 ? !1 : E(e.children), [e.children]), {
67
+ attributes: y,
68
+ listeners: S,
69
+ setNodeRef: w,
69
70
  isDragging: I
70
- } = _({
71
+ } = j({
71
72
  id: e.id,
72
73
  data: {
73
74
  level: r,
74
75
  hasChildren: p,
75
76
  isExpanded: !n
76
77
  },
77
- disabled: v || e.disabled || f
78
+ disabled: x || e.disabled || u
78
79
  });
79
- return v ? /* @__PURE__ */ t(G, { item: e, isAnyDragging: o, renderActions: x }) : /* @__PURE__ */ t(
80
+ return x ? /* @__PURE__ */ t(G, { item: e, isAnyDragging: o, renderActions: m }) : /* @__PURE__ */ t(
80
81
  "div",
81
82
  {
82
- ref: S,
83
+ ref: w,
83
84
  className: "relative",
84
85
  "data-item-id": e.id,
85
86
  "data-level": r,
86
87
  "data-checked": e.checked,
87
88
  "data-disabled": e.disabled,
88
89
  "data-collapsed": n,
89
- children: /* @__PURE__ */ i(
90
+ children: /* @__PURE__ */ c(
90
91
  "div",
91
92
  {
92
- className: P(I, y),
93
+ className: P(I, k),
93
94
  style: {
94
95
  paddingLeft: `${8 + s * 20}px`
95
96
  },
96
97
  children: [
97
- /* @__PURE__ */ i("div", { className: z, children: [
98
+ /* @__PURE__ */ c("div", { className: z, children: [
98
99
  /* @__PURE__ */ t("div", { className: A, children: g && p && /* @__PURE__ */ t(
99
100
  "button",
100
101
  {
101
102
  type: "button",
102
- onClick: (c) => {
103
- c.stopPropagation(), l(e.id);
103
+ onClick: (i) => {
104
+ i.stopPropagation(), l(e.id);
104
105
  },
105
- onMouseDown: (c) => c.stopPropagation(),
106
+ onMouseDown: (i) => i.stopPropagation(),
106
107
  className: "flex h-4 w-4 items-center justify-center rounded-full p-0 hover:bg-canvas-muted transition-colors text-content-icon hover:text-brand",
107
108
  "aria-label": h(n ? "nestedList.expand" : "nestedList.collapse"),
108
109
  children: /* @__PURE__ */ t(
109
- $,
110
+ D,
110
111
  {
111
112
  size: "16px",
112
113
  className: d("transition-transform", !n && "rotate-90")
@@ -115,21 +116,21 @@ const z = "flex shrink-0 items-center h-5 gap-0.5", A = "flex h-5 w-4 shrink-0 i
115
116
  }
116
117
  ) }),
117
118
  /* @__PURE__ */ t("div", { className: "flex h-5 w-4 shrink-0 items-center justify-center", children: /* @__PURE__ */ t(
118
- D,
119
+ H,
119
120
  {
120
121
  id: `checkbox-${e.id}`,
121
- checked: C ? "indeterminate" : e.checked,
122
+ checked: L ? "indeterminate" : e.checked,
122
123
  onCheckedChange: () => a(e.id),
123
124
  disabled: e.disabled,
124
125
  className: "mr-0",
125
126
  "aria-label": e.label
126
127
  }
127
128
  ) }),
128
- N && !f ? /* @__PURE__ */ t(
129
+ N && !u ? /* @__PURE__ */ t(
129
130
  "div",
130
131
  {
131
- ...L,
132
- ...w,
132
+ ...y,
133
+ ...S,
133
134
  "aria-label": `${h("aria.dragHandle")}: ${e.label}`,
134
135
  className: O,
135
136
  style: {
@@ -138,10 +139,10 @@ const z = "flex shrink-0 items-center h-5 gap-0.5", A = "flex h-5 w-4 shrink-0 i
138
139
  zIndex: 30,
139
140
  touchAction: "none"
140
141
  },
141
- onPointerDown: (c) => {
142
- c.stopPropagation();
142
+ onPointerDown: (i) => {
143
+ i.stopPropagation();
143
144
  },
144
- children: /* @__PURE__ */ t(E, { size: "14px" })
145
+ children: /* @__PURE__ */ t($, { size: "14px" })
145
146
  }
146
147
  ) : /* @__PURE__ */ t("div", { className: "w-5 shrink-0", "aria-hidden": !0 })
147
148
  ] }),
@@ -153,14 +154,14 @@ const z = "flex shrink-0 items-center h-5 gap-0.5", A = "flex h-5 w-4 shrink-0 i
153
154
  children: /* @__PURE__ */ t("span", { className: "break-words", children: e.label })
154
155
  }
155
156
  ),
156
- m?.(e, { isLeaf: b, level: r }) ? /* @__PURE__ */ t("div", { className: "shrink-0 self-center flex items-center", children: m(e, { isLeaf: b, level: r }) }) : null,
157
- /* @__PURE__ */ t("div", { className: "shrink-0 self-center flex items-center", children: x?.(e, { isLeaf: b, level: r }) })
157
+ f?.(e, { isLeaf: b, level: r }) ? /* @__PURE__ */ t("div", { className: "shrink-0 self-center flex items-center", children: f(e, { isLeaf: b, level: r }) }) : null,
158
+ /* @__PURE__ */ t("div", { className: "shrink-0 self-center flex items-center", children: m?.(e, { isLeaf: b, level: r }) })
158
159
  ]
159
160
  }
160
161
  )
161
162
  }
162
163
  );
163
- }, W = R.memo(M);
164
+ }, W = C.memo(M);
164
165
  export {
165
166
  O as DRAG_HANDLE_CLASS,
166
167
  z as LEADING_RAIL_CLASS,
@@ -1,3 +1,11 @@
1
1
  import { NestedListItem } from './nested-list.types';
2
+ export interface NestedListSubtreeLeafSelection {
3
+ totalLeafCount: number;
4
+ checkedLeafCount: number;
5
+ }
6
+ /** Counts selectable leaves under a subtree (skips structure section nodes). */
7
+ export declare function computeNestedListSubtreeLeafSelection(items: NestedListItem[]): NestedListSubtreeLeafSelection;
8
+ /** True when some but not all selectable leaves in the subtree are checked. */
9
+ export declare function isNestedListSubtreeIndeterminate(items: NestedListItem[]): boolean;
2
10
  export declare function countNestedListLeaves(items: NestedListItem[]): number;
3
11
  export declare function buildCollapsedStateForAllGroups(items: NestedListItem[]): Record<string, boolean>;
@@ -1,24 +1,50 @@
1
- function r(l) {
2
- let t = 0;
3
- const n = (o) => {
1
+ function i(n) {
2
+ return !!(n.category === "group" || n.children && n.children.length > 0);
3
+ }
4
+ function l(n) {
5
+ let c = 0, t = 0;
6
+ const o = (e) => {
7
+ for (const r of e) {
8
+ if (r.category === "structure") {
9
+ r.children && r.children.length > 0 && o(r.children);
10
+ continue;
11
+ }
12
+ if (i(r) && r.children) {
13
+ o(r.children);
14
+ continue;
15
+ }
16
+ c += 1, r.checked && (t += 1);
17
+ }
18
+ };
19
+ return o(n), { totalLeafCount: c, checkedLeafCount: t };
20
+ }
21
+ function u(n) {
22
+ const { totalLeafCount: c, checkedLeafCount: t } = l(n);
23
+ return c === 0 ? !1 : t > 0 && t < c;
24
+ }
25
+ function d(n) {
26
+ let c = 0;
27
+ const t = (o) => {
4
28
  for (const e of o)
5
- e.children && e.children.length > 0 ? n(e.children) : t += 1;
29
+ e.children && e.children.length > 0 ? t(e.children) : c += 1;
6
30
  };
7
- return n(l), t;
31
+ return t(n), c;
8
32
  }
9
- function c(l) {
10
- const t = {}, n = (o) => {
33
+ function s(n) {
34
+ const c = {}, t = (o) => {
11
35
  for (const e of o) {
12
36
  if (e.category === "structure") {
13
- e.children && e.children.length > 0 && n(e.children);
37
+ e.children && e.children.length > 0 && t(e.children);
14
38
  continue;
15
39
  }
16
- e.children && e.children.length > 0 && (t[e.id] = !0, n(e.children));
40
+ e.children && e.children.length > 0 && (c[e.id] = !0, t(e.children));
17
41
  }
18
42
  };
19
- return n(l), t;
43
+ return t(n), c;
20
44
  }
21
45
  export {
22
- c as buildCollapsedStateForAllGroups,
23
- r as countNestedListLeaves
46
+ s as buildCollapsedStateForAllGroups,
47
+ l as computeNestedListSubtreeLeafSelection,
48
+ d as countNestedListLeaves,
49
+ u as isNestedListSubtreeIndeterminate
24
50
  };
@@ -1,6 +1,7 @@
1
1
  import { jsxs as t, jsx as e } from "react/jsx-runtime";
2
2
  import { Tooltip as l, TooltipTrigger as n, TooltipContent as o } from "./tooltip.js";
3
- const d = (i, r, a) => /* @__PURE__ */ t(l, { children: [
3
+ import "react";
4
+ const p = (i, r, a) => /* @__PURE__ */ t(l, { children: [
4
5
  /* @__PURE__ */ e(n, { asChild: !0, children: /* @__PURE__ */ e("span", { className: "inline-flex items-center justify-center h-full w-full", children: i }) }),
5
6
  /* @__PURE__ */ e(o, { variant: "tertiary", className: a, children: r })
6
7
  ] }), h = (i, r) => /* @__PURE__ */ t(l, { children: [
@@ -9,5 +10,5 @@ const d = (i, r, a) => /* @__PURE__ */ t(l, { children: [
9
10
  ] });
10
11
  export {
11
12
  h as defaultAccordionTooltipRender,
12
- d as defaultTabTooltipRender
13
+ p as defaultTabTooltipRender
13
14
  };
@@ -2,17 +2,17 @@ import { jsx as r, jsxs as h, Fragment as z } from "react/jsx-runtime";
2
2
  import * as o from "react";
3
3
  import { Person as G, Monitor as U, PriorityAlert as q, Locked as O, Reset as B } from "impact-nova-icons";
4
4
  import { cn as p } from "../../../lib/utils.js";
5
+ import { Kbd as $ } from "../../primitives/kbd/kbd.js";
6
+ import { keybindingToString as H } from "../../primitives/kbd/keybinding-display.js";
5
7
  import { OverflowTooltip as A } from "../../feedback/tooltip/overflow-tooltip.js";
6
- import { ModuleRegistry as $, AllCommunityModule as H } from "ag-grid-community";
7
- import { AllEnterpriseModule as V } from "ag-grid-enterprise";
8
- import { DataTable as J, DataTableContent as Q } from "../../data/data-table/data-table.js";
8
+ import { ModuleRegistry as V, AllCommunityModule as J } from "ag-grid-community";
9
+ import { AllEnterpriseModule as Q } from "ag-grid-enterprise";
10
+ import { DataTable as X, DataTableContent as Y } from "../../data/data-table/data-table.js";
9
11
  import { AG_CELL_NO_PADDING as F } from "../../data/ag-grid-react/cell-renderers/index.js";
10
- import { Kbd as X } from "../../primitives/kbd/kbd.js";
11
- import { keybindingToString as Y } from "../../primitives/kbd/keybinding-display.js";
12
12
  import { useCommandPalette as Z } from "./use-command-palette.js";
13
13
  import { COMMAND_SOURCE_LABELS as m, keybindingFromEvent as W, isReservedShortcut as ee } from "./utils.js";
14
14
  import { BadgeCellRenderer as te } from "../../data/ag-grid-react/cell-renderers/badge-cell-renderer.js";
15
- $.registerModules([H, V]);
15
+ V.registerModules([J, Q]);
16
16
  function re(a) {
17
17
  const t = a.data;
18
18
  return t ? /* @__PURE__ */ h("div", { className: "flex items-center gap-2 min-w-0 h-full", children: [
@@ -69,7 +69,7 @@ function ne(a) {
69
69
  "flex items-center justify-end h-full w-full text-end",
70
70
  t.customisable ? "cursor-pointer" : "cursor-default opacity-70"
71
71
  ),
72
- children: /* @__PURE__ */ r(X, { keybinding: t.keybinding, size: "sm" })
72
+ children: /* @__PURE__ */ r($, { keybinding: t.keybinding, size: "sm" })
73
73
  }
74
74
  ) : t.customisable ? /* @__PURE__ */ r(
75
75
  "button",
@@ -133,7 +133,7 @@ function le({
133
133
  description: e.description || "",
134
134
  category: e.category || "General",
135
135
  keybinding: i,
136
- keybindingDisplay: i ? Y(i) : "",
136
+ keybindingDisplay: i ? H(i) : "",
137
137
  scope: e.scope,
138
138
  source: D,
139
139
  sourceColor: T ? "primary" : "neutral",
@@ -278,10 +278,10 @@ function le({
278
278
  u?.type === "conflict" ? /* @__PURE__ */ r(q, { className: "h-3.5 w-3.5 shrink-0" }) : u?.type === "reserved" ? /* @__PURE__ */ r(O, { className: "h-3.5 w-3.5 shrink-0" }) : c ? /* @__PURE__ */ r("span", { className: "shrink-0 text-base", children: "⌨️" }) : null,
279
279
  /* @__PURE__ */ r("span", { children: u ? u.text : L })
280
280
  ] }) : null;
281
- return /* @__PURE__ */ h(J, { className: p("flex flex-col w-full h-full border-t-0", a), children: [
281
+ return /* @__PURE__ */ h(X, { className: p("flex flex-col w-full h-full border-t-0", a), children: [
282
282
  s ? s(E) : E,
283
283
  /* @__PURE__ */ r(
284
- Q,
284
+ Y,
285
285
  {
286
286
  rowData: y,
287
287
  columnDefs: I,
@@ -6,8 +6,8 @@ import { cn as o } from "../../../lib/utils.js";
6
6
  import { MultiColorFilter as F, Cross as P, InfoBadge as u } from "impact-nova-icons";
7
7
  import { Button as D } from "../../primitives/button/button.js";
8
8
  import { Tooltip as c, TooltipTrigger as f, TooltipContent as h } from "../../feedback/tooltip/tooltip.js";
9
- import { OverflowTooltip as S } from "../../feedback/tooltip/overflow-tooltip.js";
10
- import { Kbd as j } from "../../primitives/kbd/kbd.js";
9
+ import { Kbd as S } from "../../primitives/kbd/kbd.js";
10
+ import { OverflowTooltip as j } from "../../feedback/tooltip/overflow-tooltip.js";
11
11
  import { useImpactNovaI18n as v } from "../../../i18n/use-impact-nova-i18n.js";
12
12
  import { useOverlayHostDismissNestedLayersOnNavigation as I } from "../../../lib/overlay/overlay-portal-context.js";
13
13
  import { preventDismissOnTooltipOutside as x } from "../../../lib/overlay/prevent-dismiss-on-tooltip-outside.js";
@@ -145,14 +145,14 @@ const O = ({
145
145
  ),
146
146
  /* @__PURE__ */ a("div", { className: "flex items-center gap-1 min-w-0", children: [
147
147
  /* @__PURE__ */ e(
148
- S,
148
+ j,
149
149
  {
150
150
  triggerClassName: "truncate font-['Manrope'] block min-w-0",
151
151
  content: t.tooltipKeybinding ? /* @__PURE__ */ a("span", { className: "flex items-center gap-2", children: [
152
152
  t.label,
153
153
  " ",
154
154
  /* @__PURE__ */ e(
155
- j,
155
+ S,
156
156
  {
157
157
  keybinding: t.tooltipKeybinding,
158
158
  size: "sm"
@@ -1,8 +1,9 @@
1
1
  import { jsx as r } from "react/jsx-runtime";
2
2
  import { cn as x } from "../../../../lib/utils.js";
3
+ import "react";
3
4
  import { OverflowTooltip as m } from "../../../feedback/tooltip/overflow-tooltip.js";
4
5
  import { isInvertedSelection as h, isOptionArray as d } from "../utils/select.js";
5
- function w({
6
+ function C({
6
7
  isMulti: u,
7
8
  isDisabled: p,
8
9
  internalValue: o,
@@ -52,5 +53,5 @@ function w({
52
53
  );
53
54
  }
54
55
  export {
55
- w as SelectTriggerValue
56
+ C as SelectTriggerValue
56
57
  };
@@ -1,13 +1,14 @@
1
1
  import { jsxs as s, jsx as t } from "react/jsx-runtime";
2
2
  import * as i from "@radix-ui/react-popover";
3
3
  import { Checkbox as P } from "../../checkbox/checkbox.js";
4
+ import "react";
4
5
  import { OverflowTooltip as y } from "../../../feedback/tooltip/overflow-tooltip.js";
5
6
  import { ChevronRight as A, Checkmark as O } from "impact-nova-icons";
6
7
  import { cn as v } from "../../../../lib/utils.js";
7
8
  import { useOverlayPortalContainer as T } from "../../../../lib/overlay/overlay-portal-context.js";
8
9
  import { OVERLAY_NESTED_FLOATING_INSTANT_HIDE_CLASS as _ } from "../../../../lib/overlay/overlay-host.constants.js";
9
10
  import { useSuppressOptionClickForTextSelection as E } from "../hooks/useSuppressOptionClickForTextSelection.js";
10
- const G = ({
11
+ const R = ({
11
12
  parentOption: n,
12
13
  isMulti: u,
13
14
  isReadOnly: l,
@@ -105,5 +106,5 @@ const G = ({
105
106
  ] });
106
107
  };
107
108
  export {
108
- G as Submenu
109
+ R as Submenu
109
110
  };