devexpress-richedit 26.1.2-beta → 26.1.3
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.
- package/bin/gulpfile.js +1 -1
- package/bin/index-custom.js +1 -1
- package/bin/localization-builder.js +1 -1
- package/bin/nspell-index.js +1 -1
- package/bin/nspell.webpack.config.js +1 -1
- package/bin/webpack-externals.js +1 -1
- package/bin/webpack.config.js +1 -1
- package/dist/dx.richedit.css +26 -0
- package/dist/dx.richedit.d.ts +1 -1
- package/dist/dx.richedit.js +6016 -5627
- package/dist/dx.richedit.min.js +3 -3
- package/dist/pdfkit.js +21908 -22350
- package/dist/pdfkit.min.js +1 -1
- package/index.d.ts +1 -1
- package/index.js +1 -1
- package/lib/client/client-rich-edit.d.ts +0 -1
- package/lib/client/client-rich-edit.js +2 -25
- package/lib/client/default-localization.js +1 -0
- package/lib/common/canvas/canvas-manager.d.ts +1 -1
- package/lib/common/canvas/canvas-manager.js +7 -3
- package/lib/common/canvas/double-tap-detector.d.ts +10 -0
- package/lib/common/canvas/double-tap-detector.js +28 -0
- package/lib/common/canvas/renderer-class-names.d.ts +2 -0
- package/lib/common/canvas/renderer-class-names.js +2 -0
- package/lib/common/canvas/renderes/common/document-renderer.d.ts +20 -7
- package/lib/common/canvas/renderes/common/document-renderer.js +236 -47
- package/lib/common/canvas/renderes/common/simple-view-renderer.d.ts +3 -1
- package/lib/common/canvas/renderes/common/simple-view-renderer.js +35 -2
- package/lib/common/canvas/renderes/view-manager.d.ts +3 -0
- package/lib/common/canvas/renderes/view-manager.js +34 -7
- package/lib/common/commands/border-command-options.d.ts +7 -0
- package/lib/common/commands/border-command-options.js +8 -0
- package/lib/common/commands/dialogs/dialog-border-shading-command.js +13 -6
- package/lib/common/commands/dialogs/dialog-custom-numbering-list-command.js +1 -1
- package/lib/common/commands/tables/toggle-table-cells-border-command.d.ts +1 -1
- package/lib/common/commands/tables/toggle-table-cells-border-command.js +10 -3
- package/lib/common/event-manager.js +2 -0
- package/lib/common/layout/main-structures/layout-boxes/layout-box.js +1 -1
- package/lib/common/layout/main-structures/layout-column.d.ts +1 -0
- package/lib/common/layout/main-structures/layout-column.js +3 -0
- package/lib/common/layout/selection/layout-selection-items.d.ts +3 -0
- package/lib/common/layout/selection/layout-selection-items.js +5 -0
- package/lib/common/layout-engine/selection/selection-formatter.js +7 -3
- package/lib/common/layout-formatter/box/generator/box-infos-generator.js +8 -4
- package/lib/common/layout-formatter/row/result.d.ts +1 -0
- package/lib/common/layout-formatter/row/result.js +11 -1
- package/lib/common/layout-formatter/row/size-engine/row-formatting-info.d.ts +2 -1
- package/lib/common/layout-formatter/row/size-engine/row-formatting-info.js +7 -4
- package/lib/common/model/sub-document.d.ts +12 -5
- package/lib/common/model/sub-document.js +36 -31
- package/lib/common/rich-edit-core.js +1 -1
- package/lib/common/screen-reader-manager.d.ts +6 -3
- package/lib/common/screen-reader-manager.js +66 -49
- package/lib/common/string-resources.d.ts +23 -0
- package/lib/common/string-resources.js +43 -0
- package/package.json +3 -3
package/index.d.ts
CHANGED
package/index.js
CHANGED
|
@@ -94,7 +94,6 @@ export declare class ClientRichEdit implements IControlOwner {
|
|
|
94
94
|
private initBars;
|
|
95
95
|
initRibbon(ribbon: Ribbon, fonts: FontsSettings): void;
|
|
96
96
|
private initDialogManager;
|
|
97
|
-
private getStringResources;
|
|
98
97
|
private initLosingChangesWatcher;
|
|
99
98
|
private attachEvents;
|
|
100
99
|
private canUseResizeObserver;
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import { formatMessage } from 'devextreme/localization';
|
|
2
1
|
import { currentTheme } from 'devextreme/viz/themes';
|
|
3
2
|
import { RichEditClientCommand } from '../common/commands/client-command';
|
|
4
3
|
import { DocumentInfo } from '../common/rich-edit-core';
|
|
5
4
|
import { IsModified } from '../common/model/json/enums/json-top-level-enums';
|
|
6
5
|
import { RichOptions } from '../common/model/options/rich-options';
|
|
7
6
|
import { StylesManager } from '../common/model/styles-manager';
|
|
8
|
-
import { StringResources } from '../common/string-resources';
|
|
9
7
|
import { Browser } from '@devexpress/utils/lib/browser';
|
|
10
8
|
import { DomEventHandlersHolder } from '@devexpress/utils/lib/class/event-handlers-holder';
|
|
11
9
|
import { DomUtils } from '@devexpress/utils/lib/utils/dom';
|
|
@@ -33,6 +31,7 @@ import { FullScreenHelper } from './ui/full-screen-helper';
|
|
|
33
31
|
import config from 'devextreme/core/config';
|
|
34
32
|
import { SizeUtils } from '../common/utils/size-utils';
|
|
35
33
|
import { DocumentCapability } from '../common/model/options/control';
|
|
34
|
+
import { getStringResources } from '../common/string-resources';
|
|
36
35
|
export class ClientRichEdit {
|
|
37
36
|
get clientQuickSearchPanel() {
|
|
38
37
|
if (!this._clientQuickSearchPanel)
|
|
@@ -168,7 +167,7 @@ export class ClientRichEdit {
|
|
|
168
167
|
options.spellChecker = settings.spellCheck;
|
|
169
168
|
options.nonce = settings.nonce;
|
|
170
169
|
options.control.allowZoom = settings.view.allowZoom ? DocumentCapability.Enabled : DocumentCapability.Disabled;
|
|
171
|
-
this.core = new ClientRichEditCore(this, this.name, this.element, Math.random().toString(), settings.readOnly, this.barHolder, settings.unit, this.rulerSettings, options, settings.view,
|
|
170
|
+
this.core = new ClientRichEditCore(this, this.name, this.element, Math.random().toString(), settings.readOnly, this.barHolder, settings.unit, this.rulerSettings, options, settings.view, getStringResources());
|
|
172
171
|
}
|
|
173
172
|
initCore() {
|
|
174
173
|
const documentInfo = new DocumentInfo("", false);
|
|
@@ -264,28 +263,6 @@ export class ClientRichEdit {
|
|
|
264
263
|
initDialogManager() {
|
|
265
264
|
this.dialogManager = new DialogManager(this.element, this.core);
|
|
266
265
|
}
|
|
267
|
-
getStringResources() {
|
|
268
|
-
const sr = new StringResources();
|
|
269
|
-
sr.headerFooter.evenPageFooter = formatMessage('XtraRichEditStringId.Caption_EvenPageFooter');
|
|
270
|
-
sr.headerFooter.evenPageHeader = formatMessage('XtraRichEditStringId.Caption_EvenPageHeader');
|
|
271
|
-
sr.headerFooter.firstPageFooter = formatMessage('XtraRichEditStringId.Caption_FirstPageFooter');
|
|
272
|
-
sr.headerFooter.firstPageHeader = formatMessage('XtraRichEditStringId.Caption_FirstPageHeader');
|
|
273
|
-
sr.headerFooter.footer = formatMessage('XtraRichEditStringId.Caption_PageFooter');
|
|
274
|
-
sr.headerFooter.header = formatMessage('XtraRichEditStringId.Caption_PageHeader');
|
|
275
|
-
sr.headerFooter.oddPageFooter = formatMessage('XtraRichEditStringId.Caption_OddPageFooter');
|
|
276
|
-
sr.headerFooter.oddPageHeader = formatMessage('XtraRichEditStringId.Caption_OddPageHeader');
|
|
277
|
-
sr.headerFooter.sameAsPrevious = formatMessage('XtraRichEditStringId.Caption_SameAsPrevious');
|
|
278
|
-
sr.seqCaptionPrefixes.figurePrefix = formatMessage('XtraRichEditStringId.Caption_CaptionPrefixFigure');
|
|
279
|
-
sr.seqCaptionPrefixes.tablePrefix = formatMessage('XtraRichEditStringId.Caption_CaptionPrefixTable');
|
|
280
|
-
sr.seqCaptionPrefixes.equationPrefix = formatMessage('XtraRichEditStringId.Caption_CaptionPrefixEquation');
|
|
281
|
-
sr.commonLabels.noTocEntriesFound = formatMessage('XtraRichEditStringId.Msg_NoTocEntriesFound');
|
|
282
|
-
sr.commonLabels.clickToFollowHyperlink = formatMessage('XtraRichEditStringId.Msg_ClickToFollowHyperlink');
|
|
283
|
-
sr.commonLabels.currentDocumentHyperlinkTooltip = formatMessage('XtraRichEditStringId.Caption_CurrentDocumentHyperlinkTooltip');
|
|
284
|
-
sr.quickSearchPanel.of = formatMessage('ASPxRichEditStringId.FindReplace_Of');
|
|
285
|
-
sr.quickSearchPanel.items = formatMessage('ASPxRichEditStringId.FindReplace_Items');
|
|
286
|
-
sr.quickSearchPanel.noMatches = formatMessage('ASPxRichEditStringId.FindReplace_NoMatches');
|
|
287
|
-
return sr;
|
|
288
|
-
}
|
|
289
266
|
initLosingChangesWatcher(settings) {
|
|
290
267
|
this.losingChangesWatcher = new LosingChangesWatcher(settings.enabled ?
|
|
291
268
|
() => this.core.getModifiedState() == IsModified.True :
|
|
@@ -2239,6 +2239,7 @@ export function loadDefaultMessages() {
|
|
|
2239
2239
|
"AspNetCoreRichEditStringId.LinkAnnouncement": "link",
|
|
2240
2240
|
"AspNetCoreRichEditStringId.OutOfLinkAnnouncement": "out of link",
|
|
2241
2241
|
"AspNetCoreRichEditStringId.BlankAnnouncement": "blank",
|
|
2242
|
+
"AspNetCoreRichEditStringId.PageBreakAnnouncement": "page break",
|
|
2242
2243
|
}
|
|
2243
2244
|
});
|
|
2244
2245
|
}
|
|
@@ -12,7 +12,7 @@ export declare class CanvasManager extends BatchUpdatableObject {
|
|
|
12
12
|
private scrollIntervalID;
|
|
13
13
|
private lastMousePosition;
|
|
14
14
|
private canvasPosition;
|
|
15
|
-
private
|
|
15
|
+
private doubleTapDetector;
|
|
16
16
|
private pointer;
|
|
17
17
|
private blockNotPointerEvents;
|
|
18
18
|
private lastPointerPosition;
|
|
@@ -10,6 +10,7 @@ import { PopupUtils } from '@devexpress/utils/lib/utils/popup';
|
|
|
10
10
|
import { RichMouseEvent } from '../event-manager';
|
|
11
11
|
import { MouseEventSource } from '../mouse-handler/mouse-event-source';
|
|
12
12
|
import { CursorPointer } from '../mouse-handler/mouse-handler/mouse-handler';
|
|
13
|
+
import { DoubleTapDetector } from './double-tap-detector';
|
|
13
14
|
import { ResizeBoxListener } from './listeners/resize-box-listener';
|
|
14
15
|
import { SimpleViewCanvasSizeManager } from './renderes/common/document-renderer';
|
|
15
16
|
import { SizeUtils } from '../utils/size-utils';
|
|
@@ -19,6 +20,8 @@ const CSSCLASS_FOCUSED = "dxreInFocus";
|
|
|
19
20
|
const AUTOSCROLL_AREA_SIZE = 10;
|
|
20
21
|
const AUTOSCROLL_STEP = 10;
|
|
21
22
|
const MSTOUCH_MOVE_SENSITIVITY = 5;
|
|
23
|
+
const DOUBLE_TAP_MAX_DISTANCE = 20;
|
|
24
|
+
const DOUBLE_TAP_MAX_INTERVAL = 600;
|
|
22
25
|
export class CanvasManager extends BatchUpdatableObject {
|
|
23
26
|
get sizes() { return this.viewManager.sizes; }
|
|
24
27
|
get scroll() { return this.viewManager.scroll; }
|
|
@@ -27,6 +30,7 @@ export class CanvasManager extends BatchUpdatableObject {
|
|
|
27
30
|
super();
|
|
28
31
|
this.lastMousePosition = { x: -1, y: -1 };
|
|
29
32
|
this.canvasPosition = { x: -1, y: -1 };
|
|
33
|
+
this.doubleTapDetector = new DoubleTapDetector(DOUBLE_TAP_MAX_DISTANCE, DOUBLE_TAP_MAX_INTERVAL);
|
|
30
34
|
this.pointer = CursorPointer.Auto;
|
|
31
35
|
this.blockNotPointerEvents = false;
|
|
32
36
|
this.lastPointerPosition = { x: -1, y: -1 };
|
|
@@ -137,12 +141,12 @@ export class CanvasManager extends BatchUpdatableObject {
|
|
|
137
141
|
onCanvasTouchStartInternal(evt) {
|
|
138
142
|
this.saveMousePosition(evt);
|
|
139
143
|
let richMouseEvent = new RichMouseEvent(evt, this.getLayoutPoint(evt, true), CanvasManager.getMouseEventSource(EvtUtils.getEventSource(evt)), this.scroll.lastScrollTop, this.scroll.lastScrollLeft);
|
|
140
|
-
|
|
141
|
-
|
|
144
|
+
const evtX = EvtUtils.getEventX(evt);
|
|
145
|
+
const evtY = EvtUtils.getEventY(evt);
|
|
146
|
+
if (this.doubleTapDetector.isDoubleTap(evtX, evtY)) {
|
|
142
147
|
this.onCanvasDoubleTap(richMouseEvent);
|
|
143
148
|
}
|
|
144
149
|
else {
|
|
145
|
-
this.doubleTapStartDate = new Date();
|
|
146
150
|
this.eventManager.onTouchStart(richMouseEvent);
|
|
147
151
|
}
|
|
148
152
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare class DoubleTapDetector {
|
|
2
|
+
private readonly maxDistance;
|
|
3
|
+
private readonly maxInterval;
|
|
4
|
+
private lastTime;
|
|
5
|
+
private lastX;
|
|
6
|
+
private lastY;
|
|
7
|
+
constructor(maxDistance: number, maxInterval: number);
|
|
8
|
+
isDoubleTap(x: number, y: number): boolean;
|
|
9
|
+
reset(): void;
|
|
10
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export class DoubleTapDetector {
|
|
2
|
+
constructor(maxDistance, maxInterval) {
|
|
3
|
+
this.maxDistance = maxDistance;
|
|
4
|
+
this.maxInterval = maxInterval;
|
|
5
|
+
this.lastTime = null;
|
|
6
|
+
this.lastX = -1;
|
|
7
|
+
this.lastY = -1;
|
|
8
|
+
}
|
|
9
|
+
isDoubleTap(x, y) {
|
|
10
|
+
const now = Date.now();
|
|
11
|
+
const result = this.lastTime !== null &&
|
|
12
|
+
(now - this.lastTime) < this.maxInterval &&
|
|
13
|
+
Math.abs(x - this.lastX) <= this.maxDistance &&
|
|
14
|
+
Math.abs(y - this.lastY) <= this.maxDistance;
|
|
15
|
+
if (result) {
|
|
16
|
+
this.reset();
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
this.lastTime = now;
|
|
20
|
+
this.lastX = x;
|
|
21
|
+
this.lastY = y;
|
|
22
|
+
}
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
reset() {
|
|
26
|
+
this.lastTime = null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -37,6 +37,7 @@ export declare const RendererClassNames: {
|
|
|
37
37
|
FIELD_BOX_LEVEL3: string;
|
|
38
38
|
BOX_SPACE: string;
|
|
39
39
|
BOX: string;
|
|
40
|
+
BOX_SELECTED: string;
|
|
40
41
|
HIDDEN_BOX: string;
|
|
41
42
|
PICTURE: string;
|
|
42
43
|
START_BOOKMARK: string;
|
|
@@ -46,6 +47,7 @@ export declare const RendererClassNames: {
|
|
|
46
47
|
SELECTION_MISSPELLED: string;
|
|
47
48
|
SELECTION_SEARCH: string;
|
|
48
49
|
SELECTION_ROW: string;
|
|
50
|
+
SELECTION_PICTURE_ROW: string;
|
|
49
51
|
SELECTION_CURSOR: string;
|
|
50
52
|
SELECTION_FLOATING_OBJECTS: string;
|
|
51
53
|
ANCHOR: string;
|
|
@@ -37,6 +37,7 @@ export const RendererClassNames = {
|
|
|
37
37
|
FIELD_BOX_LEVEL3: "dxreFieldBoxLevel3",
|
|
38
38
|
BOX_SPACE: "dxreBoxSpace",
|
|
39
39
|
BOX: "dxreBox",
|
|
40
|
+
BOX_SELECTED: "dxreBoxSelected",
|
|
40
41
|
HIDDEN_BOX: "dxreHiddenBox",
|
|
41
42
|
PICTURE: "dxrePic",
|
|
42
43
|
START_BOOKMARK: "dxreStartBookmark",
|
|
@@ -46,6 +47,7 @@ export const RendererClassNames = {
|
|
|
46
47
|
SELECTION_MISSPELLED: "dxreSelMisspelled",
|
|
47
48
|
SELECTION_SEARCH: "dxreSelSearch",
|
|
48
49
|
SELECTION_ROW: "dxreSelRow",
|
|
50
|
+
SELECTION_PICTURE_ROW: "dxreSelRowPic",
|
|
49
51
|
SELECTION_CURSOR: "dxreSelCursor",
|
|
50
52
|
SELECTION_FLOATING_OBJECTS: "dxreSelFloatingObjects",
|
|
51
53
|
ANCHOR: "dxreAnchor",
|
|
@@ -22,6 +22,7 @@ import { CacheImageInfo as existingInfo } from '../../../model/caches/images';
|
|
|
22
22
|
import { Shape } from '../../../model/shapes/shape';
|
|
23
23
|
import { Rectangle } from '@devexpress/utils/lib/geometry/rectangle';
|
|
24
24
|
import { Size } from '@devexpress/utils/lib/geometry/size';
|
|
25
|
+
import { FixedInterval } from '@devexpress/utils/lib/intervals/fixed';
|
|
25
26
|
import { CanvasManager } from '../../canvas-manager';
|
|
26
27
|
import { ViewManager } from '../view-manager';
|
|
27
28
|
import { IRichEditControl } from '../../../interfaces/i-rich-edit-core';
|
|
@@ -45,14 +46,20 @@ export declare class SimpleViewCanvasSizeManager implements IModelChangesListene
|
|
|
45
46
|
}
|
|
46
47
|
export declare abstract class DocumentRenderer implements IPictureRenderer {
|
|
47
48
|
protected viewManager: ViewManager;
|
|
49
|
+
protected isForcedColorsModeActive: boolean;
|
|
50
|
+
private selectionSegmentBoxesCache;
|
|
51
|
+
protected isSelectionChangeCacheEnabled: boolean;
|
|
48
52
|
private get cache();
|
|
49
53
|
constructor(viewManager: ViewManager);
|
|
50
54
|
onViewTypeChanged(): void;
|
|
51
55
|
applyPageChange(layoutPage: LayoutPage, pageChange: PageChange): void;
|
|
56
|
+
updateSelectedIntervalsPageChanges(layoutPage: LayoutPage, pageIndex: number, intervals?: FixedInterval[], isMain?: boolean): void;
|
|
57
|
+
private addSelectedPageAreaChange;
|
|
58
|
+
private findIntersectingLayoutElement;
|
|
52
59
|
protected applyAnchorPictureChange(cache: DocumentRendererPageCache, layoutPage: LayoutPage, ancPicChange: AnchoredPictureChange): void;
|
|
53
60
|
protected applyMainPageAreaChange(pageCache: DocumentRendererPageCache, layoutPage: LayoutPage, pageAreaChange: PageAreaChange): void;
|
|
54
61
|
protected applyOtherPageAreaChange(cache: DocumentRendererPageCache, layoutPage: LayoutPage, pageAreaChange: PageAreaChange): void;
|
|
55
|
-
protected applyColumnChange(pageAreaElement: Node, layoutPageArea: LayoutPageArea, columnChange: ColumnChange, level: number): void;
|
|
62
|
+
protected applyColumnChange(pageAreaElement: Node, layoutPageArea: LayoutPageArea, columnChange: ColumnChange, level: number, pageAreaModelOffset: number): void;
|
|
56
63
|
static applyChange(topLevelNode: Node, change: LayoutChangeBase, getContainer: GetSomeCanvasElementContainer, getRenderedElement: () => HTMLElement): void;
|
|
57
64
|
getPageRender(layoutPageIndex: number, layoutPage: LayoutPage): HTMLElement;
|
|
58
65
|
renderPage(layoutPage: LayoutPage, layoutPageIndex: number, renderInnerContent: boolean): void;
|
|
@@ -65,11 +72,17 @@ export declare abstract class DocumentRenderer implements IPictureRenderer {
|
|
|
65
72
|
protected renderPageContent(page: LayoutPage, pageIndex: number): void;
|
|
66
73
|
protected static updatePageColor(pageElement: HTMLElement, newColor: number): void;
|
|
67
74
|
protected static getPageAreaClassname(area: LayoutPageArea): string;
|
|
68
|
-
protected renderPageArea(renderLevelCalculator: RenderLevelCalculator, pageCache: DocumentRendererPageCache, area: LayoutPageArea, textBox: LayoutAnchoredTextBox,
|
|
69
|
-
protected renderColumn(column: LayoutColumn, level: number, _isMainPageArea: boolean): HTMLElement;
|
|
70
|
-
renderRow(row: LayoutRow, level: number): HTMLElement;
|
|
75
|
+
protected renderPageArea(renderLevelCalculator: RenderLevelCalculator, pageCache: DocumentRendererPageCache, area: LayoutPageArea, textBox: LayoutAnchoredTextBox, pageStartPosition?: number): HTMLElement;
|
|
76
|
+
protected renderColumn(column: LayoutColumn, level: number, pageAreaModelOffset: number, _isMainPageArea: boolean): HTMLElement;
|
|
77
|
+
renderRow(row: LayoutRow, level: number, columnModelOffset?: number): HTMLElement;
|
|
71
78
|
private boxHasNormalScriptedUnderline;
|
|
72
|
-
protected renderBox(row: LayoutRow, box: LayoutBox, level: number, skipUnderlineAndStrikeout: boolean, skipUnderlineScript?: boolean): BoxRenderResult;
|
|
79
|
+
protected renderBox(row: LayoutRow, box: LayoutBox, level: number, skipUnderlineAndStrikeout: boolean, rowModelOffset: number, skipUnderlineScript?: boolean): BoxRenderResult;
|
|
80
|
+
updateForcedColorsModeState(): boolean;
|
|
81
|
+
private renderSingleBox;
|
|
82
|
+
private getSelectedIntervalsForBox;
|
|
83
|
+
private getSelectionSegmentBoxes;
|
|
84
|
+
private getOrCreateSelectionSegmentBox;
|
|
85
|
+
private createSelectionSegmentBox;
|
|
73
86
|
private renderVerticalAlignContainer;
|
|
74
87
|
private renderColorContainer;
|
|
75
88
|
private renderStrikeoutContainer;
|
|
@@ -129,8 +142,8 @@ export declare class DocumentRendererPageCache {
|
|
|
129
142
|
protected init(): void;
|
|
130
143
|
}
|
|
131
144
|
export declare class BoxRenderResult {
|
|
132
|
-
html:
|
|
145
|
+
html: DocumentFragment;
|
|
133
146
|
increaseRowHeight: boolean;
|
|
134
|
-
constructor(html:
|
|
147
|
+
constructor(html: DocumentFragment, increaseRowHeight: boolean);
|
|
135
148
|
toString(): string;
|
|
136
149
|
}
|