treege 3.0.0-beta.75 → 3.0.0-beta.77
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/README.md +62 -18
- package/dist/{DefaultSubmitButton-BT4AxAnR.js → DefaultSubmitButton-Bk5U_6Qm.js} +749 -758
- package/dist/{ThemeContext-CSH4Fupd.js → ThemeContext-DeWmeqHK.js} +14 -0
- package/dist/editor/features/TreegeEditor/TreegeEditor.d.ts +1 -1
- package/dist/editor/features/TreegeEditor/forms/HttpConfigForm.d.ts +4 -1
- package/dist/editor/features/TreegeEditor/listeners/FlowChangeEmitter.d.ts +19 -0
- package/dist/editor/types/editor.d.ts +9 -0
- package/dist/{editor-B0Yir2zE.js → editor-BuJn5otY.js} +1319 -1300
- package/dist/editor.js +2 -2
- package/dist/main.js +6 -6
- package/dist/renderer/features/TreegeRenderer/native/components/DefaultInputLabel.d.ts +10 -0
- package/dist/renderer/features/TreegeRenderer/web/components/DefaultInputLabel.d.ts +9 -0
- package/dist/renderer/hooks/useRenderNode.d.ts +2 -1
- package/dist/renderer/index.d.ts +1 -0
- package/dist/renderer/index.native.d.ts +1 -0
- package/dist/renderer/types/renderer.d.ts +37 -0
- package/dist/renderer-DOEjomS9.js +256 -0
- package/dist/renderer-native.js +1156 -1274
- package/dist/renderer.js +5 -5
- package/dist/shared/locales/ar.json.d.ts +2 -0
- package/dist/shared/locales/de.json.d.ts +2 -0
- package/dist/shared/locales/en.json.d.ts +2 -0
- package/dist/shared/locales/es.json.d.ts +2 -0
- package/dist/shared/locales/fr.json.d.ts +2 -0
- package/dist/shared/locales/it.json.d.ts +2 -0
- package/dist/shared/locales/pt.json.d.ts +2 -0
- package/dist/{useRenderNode-GobhZp-Y.js → useRenderNode-DJ0mFozt.js} +66 -65
- package/package.json +1 -1
- package/dist/renderer-D9Yaxr2H.js +0 -255
package/dist/renderer.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { B as e, M as t, N as n, a as r, c as i, g as a, h as o, i as s, l as c, m as l, n as u, o as d, r as f, s as p, t as m } from "./ThemeContext-
|
|
2
|
-
import { C as h,
|
|
3
|
-
import { a as
|
|
4
|
-
import { i as
|
|
5
|
-
export { h as DefaultAddressInput,
|
|
1
|
+
import { B as e, M as t, N as n, a as r, c as i, g as a, h as o, i as s, l as c, m as l, n as u, o as d, r as f, s as p, t as m } from "./ThemeContext-DeWmeqHK.js";
|
|
2
|
+
import { C as h, L as g, S as _, _ as v, a as y, b, c as x, d as S, g as C, h as w, i as T, m as E, n as D, o as O, r as k, u as A, v as j, x as M, y as N } from "./DefaultSubmitButton-Bk5U_6Qm.js";
|
|
3
|
+
import { a as P, c as F, i as I, l as L, n as R, o as z, r as B, s as V } from "./useRenderNode-DJ0mFozt.js";
|
|
4
|
+
import { i as H, n as U, r as W, t as G } from "./renderer-DOEjomS9.js";
|
|
5
|
+
export { h as DefaultAddressInput, _ as DefaultAutocompleteInput, M as DefaultCheckboxInput, b as DefaultDateInput, N as DefaultDateRangeInput, j as DefaultFileInput, v as DefaultHiddenInput, C as DefaultHttpInput, g as DefaultInputLabel, w as DefaultNumberInput, E as DefaultPasswordInput, S as DefaultRadioInput, A as DefaultSelectInput, x as DefaultSwitchInput, O as DefaultTextAreaInput, y as DefaultTextInput, T as DefaultTimeInput, k as DefaultTimeRangeInput, U as Divider, m as ThemeProvider, W as Title, G as TreegeRenderer, F as TreegeRendererProvider, f as applyReferenceTransformation, s as buildInitialFormValues, r as calculateReferenceFieldUpdates, d as checkFormFieldHasValue, p as convertFormValuesToNamedFormat, D as defaultInputRenderers, H as defaultUI, z as evaluateCondition, V as evaluateConditions, l as fileToSerializable, o as filesToSerializable, B as findStartNode, I as getFlowRenderState, e as getTranslatedText, i as isFieldEmpty, P as isStartNode, c as resolveNodeDefaultValue, t as sanitize, n as sanitizeHttpResponse, a as serializableToFile, u as useTheme, R as useTreegeRenderer, L as useTreegeRendererConfig };
|
|
@@ -435,6 +435,8 @@ declare const _default: {
|
|
|
435
435
|
"selectDateRange": "اختر نطاق التاريخ",
|
|
436
436
|
"selectFile": "اختر ملف",
|
|
437
437
|
"selectFiles": "اختر ملفات",
|
|
438
|
+
"selectTime": "اختر الوقت",
|
|
439
|
+
"selectTimeRange": "اختر نطاق الوقت",
|
|
438
440
|
"startDate": "تاريخ البدء",
|
|
439
441
|
"startTime": "وقت البدء"
|
|
440
442
|
},
|
|
@@ -435,6 +435,8 @@ declare const _default: {
|
|
|
435
435
|
"selectDateRange": "Datumsbereich auswählen",
|
|
436
436
|
"selectFile": "Datei auswählen",
|
|
437
437
|
"selectFiles": "Dateien auswählen",
|
|
438
|
+
"selectTime": "Uhrzeit auswählen",
|
|
439
|
+
"selectTimeRange": "Zeitbereich auswählen",
|
|
438
440
|
"startDate": "Startdatum",
|
|
439
441
|
"startTime": "Startzeit"
|
|
440
442
|
},
|
|
@@ -435,6 +435,8 @@ declare const _default: {
|
|
|
435
435
|
"selectDateRange": "Select date range",
|
|
436
436
|
"selectFile": "Select file",
|
|
437
437
|
"selectFiles": "Select files",
|
|
438
|
+
"selectTime": "Select time",
|
|
439
|
+
"selectTimeRange": "Select time range",
|
|
438
440
|
"startDate": "Start date",
|
|
439
441
|
"startTime": "Start time"
|
|
440
442
|
},
|
|
@@ -435,6 +435,8 @@ declare const _default: {
|
|
|
435
435
|
"selectDateRange": "Seleccionar rango de fechas",
|
|
436
436
|
"selectFile": "Seleccionar archivo",
|
|
437
437
|
"selectFiles": "Seleccionar archivos",
|
|
438
|
+
"selectTime": "Seleccionar hora",
|
|
439
|
+
"selectTimeRange": "Seleccionar rango de horas",
|
|
438
440
|
"startDate": "Fecha de inicio",
|
|
439
441
|
"startTime": "Hora de inicio"
|
|
440
442
|
},
|
|
@@ -435,6 +435,8 @@ declare const _default: {
|
|
|
435
435
|
"selectDateRange": "Sélectionner une plage de dates",
|
|
436
436
|
"selectFile": "Sélectionner un fichier",
|
|
437
437
|
"selectFiles": "Sélectionner des fichiers",
|
|
438
|
+
"selectTime": "Sélectionner une heure",
|
|
439
|
+
"selectTimeRange": "Sélectionner une plage horaire",
|
|
438
440
|
"startDate": "Date de début",
|
|
439
441
|
"startTime": "Heure de début"
|
|
440
442
|
},
|
|
@@ -435,6 +435,8 @@ declare const _default: {
|
|
|
435
435
|
"selectDateRange": "Seleziona intervallo di date",
|
|
436
436
|
"selectFile": "Seleziona file",
|
|
437
437
|
"selectFiles": "Seleziona file",
|
|
438
|
+
"selectTime": "Seleziona ora",
|
|
439
|
+
"selectTimeRange": "Seleziona intervallo di orari",
|
|
438
440
|
"startDate": "Data di inizio",
|
|
439
441
|
"startTime": "Ora di inizio"
|
|
440
442
|
},
|
|
@@ -435,6 +435,8 @@ declare const _default: {
|
|
|
435
435
|
"selectDateRange": "Selecionar intervalo de datas",
|
|
436
436
|
"selectFile": "Selecionar arquivo",
|
|
437
437
|
"selectFiles": "Selecionar arquivos",
|
|
438
|
+
"selectTime": "Selecionar hora",
|
|
439
|
+
"selectTimeRange": "Selecionar intervalo de horas",
|
|
438
440
|
"startDate": "Data de início",
|
|
439
441
|
"startTime": "Hora de início"
|
|
440
442
|
},
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { B as e, D as t, E as n, H as r, I as i, L as a, M as o, O as s, T as c, U as l, V as u, a as d, c as f, d as p, f as m, i as h, j as
|
|
1
|
+
import { B as e, D as t, E as n, H as r, I as i, L as a, M as o, O as s, T as c, U as l, V as u, a as d, c as f, d as p, f as m, i as h, j as g, k as _, l as v, o as y, p as b, s as x, u as S, w as C, y as ee } from "./ThemeContext-DeWmeqHK.js";
|
|
2
2
|
import { Fragment as w, createContext as T, useCallback as E, useContext as D, useEffect as O, useMemo as k, useRef as A, useState as j } from "react";
|
|
3
3
|
import { jsx as M } from "react/jsx-runtime";
|
|
4
4
|
//#region src/renderer/context/TreegeRendererProvider.tsx
|
|
@@ -10,13 +10,13 @@ var N = T(void 0), te = () => D(N), P = ({ children: e, ...t }) => /* @__PURE__
|
|
|
10
10
|
error: "No URL configured for submission",
|
|
11
11
|
success: !1
|
|
12
12
|
};
|
|
13
|
-
let l =
|
|
13
|
+
let l = _(t(e.url, r, { encode: !0 }), o);
|
|
14
14
|
if (!l || l.trim() === "") return {
|
|
15
15
|
error: "Invalid URL after template replacement",
|
|
16
16
|
success: !1
|
|
17
17
|
};
|
|
18
|
-
let u = e.payloadTemplate ?
|
|
19
|
-
body: u === void 0 ? e.sendAllFormValues ? JSON.stringify(
|
|
18
|
+
let u = e.payloadTemplate ? ee(e.payloadTemplate, r, i) : void 0, d = await C({
|
|
19
|
+
body: u === void 0 ? e.sendAllFormValues ? JSON.stringify(x(r, i)) : void 0 : JSON.stringify(u),
|
|
20
20
|
headers: c(s(a, r), s(e.headers, r)),
|
|
21
21
|
method: e.method || "POST",
|
|
22
22
|
queryParams: s(e.queryParams, r),
|
|
@@ -169,7 +169,7 @@ var N = T(void 0), te = () => D(N), P = ({ children: e, ...t }) => /* @__PURE__
|
|
|
169
169
|
return i ? i.every((e) => {
|
|
170
170
|
if (!e.field) return !0;
|
|
171
171
|
let i = n.get(e.field);
|
|
172
|
-
return
|
|
172
|
+
return y(r(i) ? i.id : e.field, t);
|
|
173
173
|
}) : !1;
|
|
174
174
|
})) return o.length > 0 && s.push(...o), {
|
|
175
175
|
edgesToFollow: s,
|
|
@@ -246,52 +246,52 @@ var N = T(void 0), te = () => D(N), P = ({ children: e, ...t }) => /* @__PURE__
|
|
|
246
246
|
if (Array.isArray(e)) return `[${e.map(G).join(",")}]`;
|
|
247
247
|
let t = e;
|
|
248
248
|
return `{${Object.keys(t).sort().map((e) => `${JSON.stringify(e)}:${G(t[e])}`).join(",")}}`;
|
|
249
|
-
}, K = ({ baseUrl: e, components: t, flow: n, googleApiKey: i, headers: a, language: o, onChange: s, onSubmit: l, showPoweredBy: p, theme: m, validate:
|
|
250
|
-
let
|
|
251
|
-
baseUrl: e ??
|
|
249
|
+
}, K = ({ baseUrl: e, components: t, flow: n, googleApiKey: i, headers: a, language: o, onChange: s, onSubmit: l, showPoweredBy: p, theme: m, validate: _, validationMode: y, initialValues: b = {} }) => {
|
|
250
|
+
let C = te(), w = k(() => ({
|
|
251
|
+
baseUrl: e ?? C?.baseUrl,
|
|
252
252
|
components: {
|
|
253
|
-
form: t?.form ??
|
|
253
|
+
form: t?.form ?? C?.components?.form,
|
|
254
254
|
inputs: {
|
|
255
|
-
...
|
|
255
|
+
...C?.components?.inputs,
|
|
256
256
|
...t?.inputs
|
|
257
257
|
},
|
|
258
|
-
loadingSkeleton: t?.loadingSkeleton ??
|
|
259
|
-
step: t?.step ??
|
|
260
|
-
submitButton: t?.submitButton ??
|
|
261
|
-
submitButtonWrapper: t?.submitButtonWrapper ??
|
|
258
|
+
loadingSkeleton: t?.loadingSkeleton ?? C?.components?.loadingSkeleton,
|
|
259
|
+
step: t?.step ?? C?.components?.step,
|
|
260
|
+
submitButton: t?.submitButton ?? C?.components?.submitButton,
|
|
261
|
+
submitButtonWrapper: t?.submitButtonWrapper ?? C?.components?.submitButtonWrapper,
|
|
262
262
|
ui: {
|
|
263
|
-
...
|
|
263
|
+
...C?.components?.ui,
|
|
264
264
|
...t?.ui
|
|
265
265
|
}
|
|
266
266
|
},
|
|
267
|
-
googleApiKey: i ??
|
|
268
|
-
headers: c(
|
|
269
|
-
language: o ??
|
|
270
|
-
showPoweredBy: p ??
|
|
271
|
-
theme: m ??
|
|
272
|
-
validationMode:
|
|
267
|
+
googleApiKey: i ?? C?.googleApiKey,
|
|
268
|
+
headers: c(C?.headers, a),
|
|
269
|
+
language: o ?? C?.language ?? "en",
|
|
270
|
+
showPoweredBy: p ?? C?.showPoweredBy ?? !0,
|
|
271
|
+
theme: m ?? C?.theme ?? "dark",
|
|
272
|
+
validationMode: y ?? C?.validationMode ?? "onSubmit"
|
|
273
273
|
}), [
|
|
274
274
|
e,
|
|
275
275
|
t,
|
|
276
|
-
|
|
276
|
+
C,
|
|
277
277
|
i,
|
|
278
278
|
a,
|
|
279
279
|
o,
|
|
280
280
|
p,
|
|
281
281
|
m,
|
|
282
|
-
|
|
283
|
-
]), T = k(() => n?.nodes ?? [], [n]), D = k(() => n?.edges ?? [], [n]), M = k(() =>
|
|
282
|
+
y
|
|
283
|
+
]), T = k(() => n?.nodes ?? [], [n]), D = k(() => n?.edges ?? [], [n]), M = k(() => S(T), [T]), N = g(w.language), P = A({}), F = A(null), [I, L] = j({}), [R, z] = j(() => h(b, M)), B = k(() => G(b), [b]), V = A(B), { endOfPathReached: re, visibleNodes: H, visibleRootNodes: U } = k(() => ie(T, D, R), [
|
|
284
284
|
T,
|
|
285
285
|
D,
|
|
286
286
|
R
|
|
287
|
-
]), W = k(() =>
|
|
287
|
+
]), W = k(() => S(H), [H]), K = k(() => ae(H), [H]), oe = k(() => {
|
|
288
288
|
let e = /* @__PURE__ */ new Map();
|
|
289
289
|
return T.forEach((t) => {
|
|
290
290
|
u(t) && e.set(t.id, t);
|
|
291
291
|
}), e;
|
|
292
|
-
}, [T]), [q, J] = j(0), Y = K.length === 0 ? 0 : Math.min(q, K.length - 1), X = K[Y], se = X?.groupId ? oe.get(X.groupId) : void 0, ce = Y === 0, le = K.length === 0 || Y >= K.length - 1, { clearSubmitMessage: ue, handleSubmitWithConfig: de, hasSubmitConfig: fe, isSubmitting: pe, submitButtonNode: me, submitMessage: he } = ne(H, R, w.language, W, w.headers, w.baseUrl), ge = A(s), _e = A(
|
|
292
|
+
}, [T]), [q, J] = j(0), Y = K.length === 0 ? 0 : Math.min(q, K.length - 1), X = K[Y], se = X?.groupId ? oe.get(X.groupId) : void 0, ce = Y === 0, le = K.length === 0 || Y >= K.length - 1, { clearSubmitMessage: ue, handleSubmitWithConfig: de, hasSubmitConfig: fe, isSubmitting: pe, submitButtonNode: me, submitMessage: he } = ne(H, R, w.language, W, w.headers, w.baseUrl), ge = A(s), _e = A(_), Z = k(() => x(R, W), [R, W]), Q = k(() => {
|
|
293
293
|
let e = me?.data?.submitConfig?.payloadTemplate;
|
|
294
|
-
return e ?
|
|
294
|
+
return e ? ee(e, R, W) ?? Z : Z;
|
|
295
295
|
}, [
|
|
296
296
|
me,
|
|
297
297
|
R,
|
|
@@ -388,8 +388,8 @@ var N = T(void 0), te = () => D(N), P = ({ children: e, ...t }) => /* @__PURE__
|
|
|
388
388
|
}, [K.length, q]), O(() => {
|
|
389
389
|
ge.current = s;
|
|
390
390
|
}, [s]), O(() => {
|
|
391
|
-
_e.current =
|
|
392
|
-
}, [
|
|
391
|
+
_e.current = _;
|
|
392
|
+
}, [_]), O(() => {
|
|
393
393
|
ge.current?.(Z);
|
|
394
394
|
}, [Z]), O(() => {
|
|
395
395
|
w.validationMode === "onChange" && $(_e.current);
|
|
@@ -406,7 +406,7 @@ var N = T(void 0), te = () => D(N), P = ({ children: e, ...t }) => /* @__PURE__
|
|
|
406
406
|
let n = [...e].filter((e) => !t.has(e)), r = {};
|
|
407
407
|
W.forEach((t) => {
|
|
408
408
|
if (e.has(t.id) || R[t.id] !== void 0) return;
|
|
409
|
-
let n =
|
|
409
|
+
let n = v(t, R);
|
|
410
410
|
n !== void 0 && (r[t.id] = n);
|
|
411
411
|
}), !(n.length === 0 && Object.keys(r).length === 0) && (z((e) => {
|
|
412
412
|
let t = {
|
|
@@ -423,10 +423,10 @@ var N = T(void 0), te = () => D(N), P = ({ children: e, ...t }) => /* @__PURE__
|
|
|
423
423
|
}), t ? r : e;
|
|
424
424
|
}));
|
|
425
425
|
}, [W, R]), O(() => {
|
|
426
|
-
V.current !== B && (V.current = B, z(h(
|
|
426
|
+
V.current !== B && (V.current = B, z(h(b, M)), L({}), F.current = null);
|
|
427
427
|
}, [
|
|
428
428
|
B,
|
|
429
|
-
|
|
429
|
+
b,
|
|
430
430
|
M
|
|
431
431
|
]), {
|
|
432
432
|
canContinueStep: Te,
|
|
@@ -472,64 +472,65 @@ var N = T(void 0), te = () => D(N), P = ({ children: e, ...t }) => /* @__PURE__
|
|
|
472
472
|
let t = n.find((t) => t.id === e);
|
|
473
473
|
return {
|
|
474
474
|
id: e,
|
|
475
|
-
label: t ?
|
|
475
|
+
label: t ? b(t, r) : e
|
|
476
476
|
};
|
|
477
|
-
}), se = ({ DefaultFormWrapper: t,
|
|
478
|
-
let
|
|
477
|
+
}), se = ({ DefaultFormWrapper: t, DefaultInputLabel: n, DefaultInputWrapper: a, DefaultSubmitButton: s, DefaultSubmitButtonWrapper: c, config: u, defaultInputRenderers: d, defaultUI: f, formErrors: h, formValues: g, inputNodes: _, isSubmitting: v, missingRequiredFields: y, setFieldValue: b }) => {
|
|
478
|
+
let x = k(() => u.components.form || t, [u.components.form, t]), S = k(() => u.components.submitButton || s, [u.components.submitButton, s]), C = k(() => u.components.submitButtonWrapper || c || w, [u.components.submitButtonWrapper, c]), ee = k(() => u.components.inputLabel || n, [u.components.inputLabel, n]);
|
|
479
479
|
return {
|
|
480
|
-
FormWrapper:
|
|
480
|
+
FormWrapper: x,
|
|
481
481
|
renderNode: E(function(t) {
|
|
482
|
-
let { type:
|
|
483
|
-
switch (
|
|
482
|
+
let { type: n } = t;
|
|
483
|
+
switch (n) {
|
|
484
484
|
case i.input: {
|
|
485
485
|
if (!r(t)) return null;
|
|
486
|
-
let
|
|
487
|
-
return
|
|
486
|
+
let n = t.data, i = n.type || "text", s = u.components.inputs?.[i], c = d[i], l = s || c, f = t.id, x = (e) => b(f, e), S = g[f], C = h[f], w = e(n.label, u.language), T = p(n, u.language), E = e(n.helperText, u.language), D = m(t), O = o(w), k = o(T), A = o(E);
|
|
487
|
+
return l ? /* @__PURE__ */ M(a, {
|
|
488
488
|
node: t,
|
|
489
|
-
children: /* @__PURE__ */ M(
|
|
489
|
+
children: /* @__PURE__ */ M(l, {
|
|
490
490
|
field: {
|
|
491
|
-
"aria-invalid":
|
|
491
|
+
"aria-invalid": C ? !0 : void 0,
|
|
492
492
|
id: t.id,
|
|
493
|
-
name:
|
|
494
|
-
placeholder:
|
|
495
|
-
required:
|
|
496
|
-
value:
|
|
493
|
+
name: D,
|
|
494
|
+
placeholder: k,
|
|
495
|
+
required: n.required,
|
|
496
|
+
value: S
|
|
497
497
|
},
|
|
498
498
|
extra: {
|
|
499
|
-
error:
|
|
500
|
-
helperText:
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
499
|
+
error: C,
|
|
500
|
+
helperText: A,
|
|
501
|
+
InputLabel: ee,
|
|
502
|
+
isSubmitting: v,
|
|
503
|
+
label: O,
|
|
504
|
+
missingDependencies: X(t, g, _, u.language),
|
|
505
|
+
missingRequiredFields: y,
|
|
505
506
|
node: t,
|
|
506
|
-
setValue:
|
|
507
|
+
setValue: x
|
|
507
508
|
}
|
|
508
|
-
},
|
|
509
|
-
}, t.id) : (console.warn("No renderer found for input type:",
|
|
509
|
+
}, i)
|
|
510
|
+
}, t.id) : (console.warn("No renderer found for input type:", i), null);
|
|
510
511
|
}
|
|
511
512
|
case i.group: return null;
|
|
512
513
|
case i.ui: {
|
|
513
514
|
if (!l(t)) return null;
|
|
514
|
-
let e = t.data.type || "title", n =
|
|
515
|
+
let e = t.data.type || "title", n = u.components.ui?.[e], r = f[e], i = n || r;
|
|
515
516
|
return i ? /* @__PURE__ */ M(i, { node: t }, t.id) : null;
|
|
516
517
|
}
|
|
517
|
-
default: return console.warn("Unknown node type:",
|
|
518
|
+
default: return console.warn("Unknown node type:", n), null;
|
|
518
519
|
}
|
|
519
520
|
}, [
|
|
520
|
-
|
|
521
|
+
u,
|
|
522
|
+
g,
|
|
521
523
|
h,
|
|
522
|
-
|
|
524
|
+
b,
|
|
523
525
|
v,
|
|
524
|
-
|
|
526
|
+
y,
|
|
525
527
|
_,
|
|
526
|
-
ee,
|
|
527
|
-
u,
|
|
528
528
|
d,
|
|
529
|
-
|
|
529
|
+
f,
|
|
530
|
+
a
|
|
530
531
|
]),
|
|
531
|
-
SubmitButton:
|
|
532
|
-
SubmitButtonWrapper:
|
|
532
|
+
SubmitButton: S,
|
|
533
|
+
SubmitButtonWrapper: C
|
|
533
534
|
};
|
|
534
535
|
};
|
|
535
536
|
//#endregion
|