@fable-org/fable-library-ts 1.0.0-beta-001

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 (57) hide show
  1. package/Array.ts +1362 -0
  2. package/Async.ts +207 -0
  3. package/AsyncBuilder.ts +222 -0
  4. package/BigInt.ts +337 -0
  5. package/BitConverter.ts +165 -0
  6. package/Boolean.ts +22 -0
  7. package/CHANGELOG.md +15 -0
  8. package/Char.ts +222 -0
  9. package/Choice.ts +300 -0
  10. package/Date.ts +495 -0
  11. package/DateOffset.ts +324 -0
  12. package/DateOnly.ts +146 -0
  13. package/Decimal.ts +250 -0
  14. package/Double.ts +55 -0
  15. package/Encoding.ts +170 -0
  16. package/Event.ts +119 -0
  17. package/FSharp.Collections.ts +34 -0
  18. package/FSharp.Core.CompilerServices.ts +37 -0
  19. package/FSharp.Core.ts +86 -0
  20. package/Global.ts +37 -0
  21. package/Guid.ts +143 -0
  22. package/Int32.ts +156 -0
  23. package/List.ts +1417 -0
  24. package/Long.ts +49 -0
  25. package/MailboxProcessor.ts +125 -0
  26. package/Map.ts +1552 -0
  27. package/MapUtil.ts +120 -0
  28. package/MutableMap.ts +344 -0
  29. package/MutableSet.ts +248 -0
  30. package/Native.ts +11 -0
  31. package/Numeric.ts +80 -0
  32. package/Observable.ts +156 -0
  33. package/Option.ts +137 -0
  34. package/README.md +3 -0
  35. package/Random.ts +196 -0
  36. package/Range.ts +56 -0
  37. package/Reflection.ts +539 -0
  38. package/RegExp.ts +143 -0
  39. package/Result.ts +196 -0
  40. package/Seq.ts +1526 -0
  41. package/Seq2.ts +129 -0
  42. package/Set.ts +1955 -0
  43. package/String.ts +589 -0
  44. package/System.Collections.Generic.ts +380 -0
  45. package/System.Text.ts +137 -0
  46. package/SystemException.ts +7 -0
  47. package/TimeOnly.ts +131 -0
  48. package/TimeSpan.ts +194 -0
  49. package/Timer.ts +80 -0
  50. package/Types.ts +231 -0
  51. package/Unicode.13.0.0.ts +4 -0
  52. package/Uri.ts +206 -0
  53. package/Util.ts +928 -0
  54. package/lib/big.d.ts +338 -0
  55. package/lib/big.js +1054 -0
  56. package/package.json +24 -0
  57. package/tsconfig.json +103 -0
package/TimeSpan.ts ADDED
@@ -0,0 +1,194 @@
1
+ // tslint:disable:max-line-length
2
+ import { FSharpRef } from "./Types.js";
3
+ import { comparePrimitives, padLeftAndRightWithZeros, padWithZeros } from "./Util.js";
4
+ import { toInt64 } from "./BigInt.js";
5
+
6
+ // TimeSpan in runtime just becomes a number representing milliseconds
7
+ export type TimeSpan = number;
8
+
9
+ /**
10
+ * Calls:
11
+ * - `Math.ceil` if the `value` is **negative**
12
+ * - `Math.floor` if the `value` is **positive**
13
+ * @param value Value to round
14
+ */
15
+ function signedRound(value: number) {
16
+ return value < 0 ? Math.ceil(value) : Math.floor(value);
17
+ }
18
+
19
+ export function create(d: number = 0, h: number = 0, m: number = 0, s: number = 0, ms: number = 0) {
20
+ switch (arguments.length) {
21
+ case 1:
22
+ // ticks
23
+ return fromTicks(arguments[0]);
24
+ case 3:
25
+ // h,m,s
26
+ d = 0, h = arguments[0], m = arguments[1], s = arguments[2], ms = 0;
27
+ break;
28
+ default:
29
+ // d,h,m,s,ms
30
+ break;
31
+ }
32
+ return d * 86400000 + h * 3600000 + m * 60000 + s * 1000 + ms;
33
+ }
34
+
35
+ export function fromTicks(ticks: number | bigint) {
36
+ return Number(BigInt(ticks) / 10000n);
37
+ }
38
+
39
+ export function fromDays(d: number) {
40
+ return create(d, 0, 0, 0);
41
+ }
42
+
43
+ export function fromHours(h: number) {
44
+ return create(h, 0, 0);
45
+ }
46
+
47
+ export function fromMinutes(m: number) {
48
+ return create(0, m, 0);
49
+ }
50
+
51
+ export function fromSeconds(s: number) {
52
+ return create(0, 0, s);
53
+ }
54
+
55
+ export function days(ts: TimeSpan) {
56
+ return signedRound(ts / 86400000);
57
+ }
58
+
59
+ export function hours(ts: TimeSpan) {
60
+ return signedRound(ts % 86400000 / 3600000);
61
+ }
62
+
63
+ export function minutes(ts: TimeSpan) {
64
+ return signedRound(ts % 3600000 / 60000);
65
+ }
66
+
67
+ export function seconds(ts: TimeSpan) {
68
+ return signedRound(ts % 60000 / 1000);
69
+ }
70
+
71
+ export function milliseconds(ts: TimeSpan) {
72
+ return signedRound(ts % 1000);
73
+ }
74
+
75
+ export function ticks(ts: TimeSpan) {
76
+ return toInt64(BigInt(ts) * 10000n);
77
+ }
78
+
79
+ export function totalDays(ts: TimeSpan) {
80
+ return ts / 86400000;
81
+ }
82
+
83
+ export function totalHours(ts: TimeSpan) {
84
+ return ts / 3600000;
85
+ }
86
+
87
+ export function totalMinutes(ts: TimeSpan) {
88
+ return ts / 60000;
89
+ }
90
+
91
+ export function totalSeconds(ts: TimeSpan) {
92
+ return ts / 1000;
93
+ }
94
+
95
+ export function negate(ts: TimeSpan) {
96
+ return ts * -1;
97
+ }
98
+
99
+ export function add(ts1: number, ts2: number) {
100
+ return ts1 + ts2;
101
+ }
102
+
103
+ export function subtract(ts1: number, ts2: number) {
104
+ return ts1 - ts2;
105
+ }
106
+
107
+ export function multiply(ts: TimeSpan, factor: number) {
108
+ return ts * factor;
109
+ }
110
+
111
+ export function divide(ts: TimeSpan, b: number) {
112
+ return ts / b;
113
+ }
114
+
115
+ export const op_Addition = add;
116
+ export const op_Subtraction = subtract;
117
+ export const op_Multiply = multiply;
118
+ export const op_Division = divide;
119
+
120
+ export const compare = comparePrimitives;
121
+ export const compareTo = comparePrimitives;
122
+
123
+ export function duration(x: number) {
124
+ return Math.abs(x);
125
+ }
126
+
127
+ export function toString(ts: TimeSpan, format = "c", _provider?: any) {
128
+ if (["c", "g", "G"].indexOf(format) === -1) {
129
+ throw new Error("Custom formats are not supported");
130
+ }
131
+ const d = Math.abs(days(ts));
132
+ const h = Math.abs(hours(ts));
133
+ const m = Math.abs(minutes(ts));
134
+ const s = Math.abs(seconds(ts));
135
+ const ms = Math.abs(milliseconds(ts));
136
+ const sign = ts < 0 ? "-" : "";
137
+ return `${sign}${d === 0 && (format === "c" || format === "g") ? "" : format === "c" ? d + "." : d + ":"}${format === "g" ? h : padWithZeros(h, 2)}:${padWithZeros(m, 2)}:${padWithZeros(s, 2)}${ms === 0 && (format === "c" || format === "g") ? "" : format === "g" ? "." + padWithZeros(ms, 3) : "." + padLeftAndRightWithZeros(ms, 3, 7)}`;
138
+ }
139
+
140
+ export function parse(str: string) {
141
+ const firstDot = str.search("\\.");
142
+ const firstColon = str.search("\\:");
143
+ if (firstDot === -1 && firstColon === -1) { // There is only a day ex: 4
144
+ const d = parseInt(str, 0);
145
+ if (isNaN(d)) {
146
+ throw new Error(`String '${str}' was not recognized as a valid TimeSpan.`);
147
+ } else {
148
+ return create(d, 0, 0, 0, 0);
149
+ }
150
+ }
151
+ if (firstColon > 0) { // process time part
152
+ // WIP: (-?)(((\d+)\.)?([0-9]|0[0-9]|1[0-9]|2[0-3]):(\d+)(:\d+(\.\d{1,7})?)?|\d+(?:(?!\.)))
153
+ const r = /^(-?)((\d+)\.)?(?:0*)([0-9]|0[0-9]|1[0-9]|2[0-3]):(?:0*)([0-5][0-9]|[0-9])(:(?:0*)([0-5][0-9]|[0-9]))?\.?(\d+)?$/.exec(str);
154
+ if (r != null && r[4] != null && r[5] != null) {
155
+ let d = 0;
156
+ let ms = 0;
157
+ let s = 0;
158
+ const sign = r[1] != null && r[1] === "-" ? -1 : 1;
159
+ const h = +r[4];
160
+ const m = +r[5];
161
+ if (r[3] != null) {
162
+ d = +r[3];
163
+ }
164
+ if (r[7] != null) {
165
+ s = +r[7];
166
+ }
167
+ if (r[8] != null) {
168
+ // Depending on the number of decimals passed, we need to adapt the numbers
169
+ switch (r[8].length) {
170
+ case 1: ms = +r[8] * 100; break;
171
+ case 2: ms = +r[8] * 10; break;
172
+ case 3: ms = +r[8]; break;
173
+ case 4: ms = +r[8] / 10; break;
174
+ case 5: ms = +r[8] / 100; break;
175
+ case 6: ms = +r[8] / 1000; break;
176
+ case 7: ms = +r[8] / 10000; break;
177
+ default:
178
+ throw new Error(`String '${str}' was not recognized as a valid TimeSpan.`);
179
+ }
180
+ }
181
+ return sign * create(d, h, m, s, ms);
182
+ }
183
+ }
184
+ throw new Error(`String '${str}' was not recognized as a valid TimeSpan.`);
185
+ }
186
+
187
+ export function tryParse(v: string, defValue: FSharpRef<number>): boolean {
188
+ try {
189
+ defValue.contents = parse(v);
190
+ return true;
191
+ } catch {
192
+ return false;
193
+ }
194
+ }
package/Timer.ts ADDED
@@ -0,0 +1,80 @@
1
+ import { Event } from "./Event.js";
2
+ import { IDisposable } from "./Util.js";
3
+
4
+ export class Timer implements IDisposable {
5
+ public Interval: number;
6
+ public AutoReset: boolean;
7
+
8
+ private _elapsed: Event<Date>;
9
+ private _enabled: boolean = false;
10
+ private _isDisposed: boolean = false;
11
+ private _intervalId: number = 0;
12
+ private _timeoutId: number = 0;
13
+
14
+ constructor(interval?: number) {
15
+ this.Interval = interval && interval > 0 ? interval : 100;
16
+ this.AutoReset = true;
17
+ this._elapsed = new Event<Date>();
18
+ }
19
+
20
+ Elapsed() {
21
+ return this._elapsed.Publish;
22
+ }
23
+
24
+ get Enabled() {
25
+ return this._enabled;
26
+ }
27
+
28
+ set Enabled(x: boolean) {
29
+ if (!this._isDisposed && this._enabled !== x) {
30
+ this._enabled = x;
31
+ if (this._enabled) {
32
+ if (this.AutoReset) {
33
+ this._intervalId = setInterval(() => {
34
+ if (!this.AutoReset) {
35
+ this.Enabled = false;
36
+ }
37
+ this._elapsed.Trigger(new Date());
38
+ }, this.Interval) as any;
39
+ } else {
40
+ this._timeoutId = setTimeout(() => {
41
+ this.Enabled = false;
42
+ this._timeoutId = 0;
43
+ if (this.AutoReset) {
44
+ this.Enabled = true;
45
+ }
46
+ this._elapsed.Trigger(new Date());
47
+ }, this.Interval) as any;
48
+ }
49
+ } else {
50
+ if (this._timeoutId) {
51
+ clearTimeout(this._timeoutId);
52
+ this._timeoutId = 0;
53
+ }
54
+ if (this._intervalId) {
55
+ clearInterval(this._intervalId);
56
+ this._intervalId = 0;
57
+ }
58
+ }
59
+ }
60
+ }
61
+
62
+ public Dispose() {
63
+ this.Enabled = false;
64
+ this._isDisposed = true;
65
+ }
66
+
67
+ public Close() {
68
+ this.Dispose();
69
+ }
70
+
71
+ public Start() {
72
+ this.Enabled = true;
73
+ }
74
+
75
+ public Stop() {
76
+ this.Enabled = false;
77
+ }
78
+ }
79
+
80
+ export default Timer;
package/Types.ts ADDED
@@ -0,0 +1,231 @@
1
+ import { IComparable, IEquatable, IHashable, combineHashCodes, compare, compareArrays, equalArrays, equals, sameConstructor, numberHash, structuralHash } from "./Util.js";
2
+
3
+ // This type is only used internally for .ts files in the library
4
+ // F# Result type is in Choice.fs
5
+ export type Result<T> = { tag: "ok"; value: T } | { tag: "error"; error: string };
6
+
7
+ export function seqToString<T>(self: Iterable<T>): string {
8
+ let count = 0;
9
+ let str = "[";
10
+ for (const x of self) {
11
+ if (count === 0) {
12
+ str += toString(x);
13
+ } else if (count === 100) {
14
+ str += "; ...";
15
+ break;
16
+ } else {
17
+ str += "; " + toString(x);
18
+ }
19
+ count++;
20
+ }
21
+ return str + "]";
22
+ }
23
+
24
+ export function toString(x: any, callStack = 0): string {
25
+ if (x != null && typeof x === "object") {
26
+ if (typeof x.toString === "function") {
27
+ return x.toString();
28
+ } else if (Symbol.iterator in x) {
29
+ return seqToString(x);
30
+ } else { // TODO: Date?
31
+ const cons = Object.getPrototypeOf(x)?.constructor;
32
+ return cons === Object && callStack < 10
33
+ // Same format as recordToString
34
+ ? "{ " + Object.entries(x).map(([k, v]) => k + " = " + toString(v, callStack + 1)).join("\n ") + " }"
35
+ : cons?.name ?? "";
36
+ }
37
+ }
38
+ return String(x);
39
+ }
40
+
41
+ export function unionToString(name: string, fields: any[]) {
42
+ if (fields.length === 0) {
43
+ return name;
44
+ } else {
45
+ let fieldStr;
46
+ let withParens = true;
47
+ if (fields.length === 1) {
48
+ fieldStr = toString(fields[0]);
49
+ withParens = fieldStr.indexOf(" ") >= 0;
50
+ } else {
51
+ fieldStr = fields.map((x: any) => toString(x)).join(", ");
52
+ }
53
+ return name + (withParens ? " (" : " ") + fieldStr + (withParens ? ")" : "");
54
+ }
55
+ }
56
+
57
+ export abstract class Union<Tag extends number, Name extends string> implements IEquatable<Union<Tag, Name>>, IComparable<Union<Tag, Name>> {
58
+ abstract readonly tag: Tag;
59
+ abstract readonly fields: any[];
60
+ abstract cases(): string[];
61
+
62
+ public get name(): Name {
63
+ return this.cases()[this.tag] as Name;
64
+ }
65
+
66
+ public toJSON() {
67
+ return this.fields.length === 0 ? this.name : [this.name].concat(this.fields);
68
+ }
69
+
70
+ public toString() {
71
+ return unionToString(this.name, this.fields);
72
+ }
73
+
74
+ public GetHashCode() {
75
+ const hashes = this.fields.map((x: any) => structuralHash(x));
76
+ hashes.splice(0, 0, numberHash(this.tag));
77
+ return combineHashCodes(hashes);
78
+ }
79
+
80
+ public Equals(other: Union<Tag, Name>) {
81
+ if (this === other) {
82
+ return true;
83
+ } else if (!sameConstructor(this, other)) {
84
+ return false;
85
+ } else if (this.tag === other.tag) {
86
+ return equalArrays(this.fields, other.fields);
87
+ } else {
88
+ return false;
89
+ }
90
+ }
91
+
92
+ public CompareTo(other: Union<Tag, Name>) {
93
+ if (this === other) {
94
+ return 0;
95
+ } else if (!sameConstructor(this, other)) {
96
+ return -1;
97
+ } else if (this.tag === other.tag) {
98
+ return compareArrays(this.fields, other.fields);
99
+ } else {
100
+ return this.tag < other.tag ? -1 : 1;
101
+ }
102
+ }
103
+ }
104
+
105
+ function recordToJSON<T>(self: T) {
106
+ const o: any = {};
107
+ const keys = Object.keys(self as any);
108
+ for (let i = 0; i < keys.length; i++) {
109
+ o[keys[i]] = (self as any)[keys[i]];
110
+ }
111
+ return o;
112
+ }
113
+
114
+ function recordToString<T>(self: T) {
115
+ return "{ " + Object.entries(self as any).map(([k, v]) => k + " = " + toString(v)).join("\n ") + " }";
116
+ }
117
+
118
+ function recordGetHashCode<T>(self: T) {
119
+ const hashes = Object.values(self as any).map((v) => structuralHash(v));
120
+ return combineHashCodes(hashes);
121
+ }
122
+
123
+ function recordEquals<T>(self: T, other: T) {
124
+ if (self === other) {
125
+ return true;
126
+ } else if (!sameConstructor(self, other)) {
127
+ return false;
128
+ } else {
129
+ const thisNames = Object.keys(self as any);
130
+ for (let i = 0; i < thisNames.length; i++) {
131
+ if (!equals((self as any)[thisNames[i]], (other as any)[thisNames[i]])) {
132
+ return false;
133
+ }
134
+ }
135
+ return true;
136
+ }
137
+ }
138
+
139
+ function recordCompareTo<T>(self: T, other: T) {
140
+ if (self === other) {
141
+ return 0;
142
+ } else if (!sameConstructor(self, other)) {
143
+ return -1;
144
+ } else {
145
+ const thisNames = Object.keys(self as any);
146
+ for (let i = 0; i < thisNames.length; i++) {
147
+ const result = compare((self as any)[thisNames[i]], (other as any)[thisNames[i]]);
148
+ if (result !== 0) {
149
+ return result;
150
+ }
151
+ }
152
+ return 0;
153
+ }
154
+ }
155
+
156
+ export abstract class Record implements IEquatable<Record>, IComparable<Record>, IHashable {
157
+ toJSON() { return recordToJSON(this); }
158
+ toString() { return recordToString(this); }
159
+ GetHashCode() { return recordGetHashCode(this); }
160
+ Equals(other: Record) { return recordEquals(this, other); }
161
+ CompareTo(other: Record) { return recordCompareTo(this, other); }
162
+ }
163
+
164
+ export class FSharpRef<T> {
165
+ private readonly getter: () => T;
166
+ private readonly setter: (v: T) => void;
167
+
168
+ get contents() {
169
+ return this.getter();
170
+ }
171
+
172
+ set contents(v) {
173
+ this.setter(v)
174
+ }
175
+
176
+ constructor(contentsOrGetter: T | (() => T), setter?: (v: T) => void) {
177
+ if (typeof setter === "function") {
178
+ this.getter = contentsOrGetter as () => T;
179
+ this.setter = setter
180
+ } else {
181
+ this.getter = () => contentsOrGetter as T;
182
+ this.setter = (v) => { contentsOrGetter = v };
183
+ }
184
+ }
185
+ }
186
+
187
+ // EXCEPTIONS
188
+
189
+ // Exception is intentionally not derived from Error, for performance reasons (see #2160)
190
+ export class Exception {
191
+ constructor(public message?: string) { }
192
+ }
193
+
194
+ export function isException(x: any) {
195
+ return x instanceof Exception || x instanceof Error;
196
+ }
197
+
198
+ export function isPromise(x: any) {
199
+ return x instanceof Promise;
200
+ }
201
+
202
+ export function ensureErrorOrException(e: any) {
203
+ // Exceptionally admitting promises as errors for compatibility with React.suspense (see #3298)
204
+ return (isException(e) || isPromise(e)) ? e : new Error(String(e));
205
+ }
206
+
207
+ export abstract class FSharpException extends Exception
208
+ implements IEquatable<FSharpException>, IComparable<FSharpException> {
209
+ toJSON() { return recordToJSON(this); }
210
+ toString() { return recordToString(this); }
211
+ GetHashCode() { return recordGetHashCode(this); }
212
+ Equals(other: FSharpException) { return recordEquals(this, other); }
213
+ CompareTo(other: FSharpException) { return recordCompareTo(this, other); }
214
+ }
215
+
216
+ export class MatchFailureException extends FSharpException {
217
+ public arg1: string;
218
+ public arg2: number;
219
+ public arg3: number;
220
+
221
+ constructor(arg1: string, arg2: number, arg3: number) {
222
+ super();
223
+ this.arg1 = arg1;
224
+ this.arg2 = arg2 | 0;
225
+ this.arg3 = arg3 | 0;
226
+ this.message = "The match cases were incomplete";
227
+ }
228
+ }
229
+
230
+ export class Attribute {
231
+ }
@@ -0,0 +1,4 @@
1
+ // Unicode 13.0.0 codepoint ranges (delta encoded) and general categories.
2
+ // Integer delta values are offset by 35 and stored as Unicode characters.
3
+ export const rangeDeltas = "#C$&$&$$$$$$%-%&%=$$$$$$=$$$$D$$'$$$$$$$$$$$$%$$%$$$$&$:$*;$+$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%$$$$$$$$$$$$$$$%$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%$$$$&%$$$%$&%'$%$&&%$%$$$$$%$$%$$%$&$$$%%$$&'$$$$$$$$$$$$$$$$$$$$$$$$%$$$$$$$$$$$$$$$$$%$$$$$&$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*%$%%$$'$$$$$$$$h$>5'/1(*$$$4“$$$$$$$$%$&$$'%$$&$$$%$4$,F$%&&$$$$$$$$$$$$$$$$$$$$$$$($$$$$%%VS$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$(%$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%$$$$$$$$$$$$%$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$I%$)L$$%%$$P$$$%$%$$+>''%.)&%$%%.$$$%C$-8-'%$†$$*$$)%%$'%-&%$1$$$$A>%|.$1-D,%$&$%$%9'$,$&$(%2$<&%$$.X8$5.2$C$Y$$$$&+'$%$*-%%-$$2$%$+%%%9$*$$&'%$$&'%%%%$$+$'%$&%%-%%)$$$$$%%$$)'%%9$*$%$%$%%$$&%'%%&&$*'$$*-%&$$-%$$,$&$9$*$%$(%$$&($%$$%$%$2%%%-$$*$)$$%$+%%%9$*$%$(%$$$$$'%%%%$*%$'%$&%%-$$)-$$$)&&$'&%$$$%&%&&&/'%$%&&$&$%$)$1-&)$$($&$+$&$:$3&$&'$&$'*%$&(%%%-*$*$$$%$+$&$:$-$(%$$$$($$%$%%*%*$$%%%-$%0%%,$&$L%$&'$&$&$$$'&$*&%%-,$)$$%$5&;$,$$%*&$'&&$$$+)-%%$/S$%*'$)$+$-%H%$$$($;$$$-$%,$%($$$)%-%'C$&2$$&%)--$$$$$$$$$$%+$G'1$($%(.$G$+$)$%('%HN%'$)$%%%$-))%%'&$&%*&'0$%%)$$$-&$%I$$($%N$$&Ŭ$'%*$$$'%L$'%D$'%*$$$'%2$\\$'%f%&,7&3-)y%)%$ʏ$$4$=$$&n&&+*0$'&.5&%,5%/0$&$%/W%$*+$%.&$&$$$%-)-))$'&$$-)F$X*(%E$$(i-B$&'%&'%$)&'$&%-A%(.O'=)-$&E:%%$%%X$$$*$$$$%+)-%$-)-)*$)%1$%b'$R$$($$($%*'-*-,,&%$A$'%%$&%-O$$%&$$&%+'G++%%&(-&&-A)%,*N%&++&$0$*'$)$%$%$(Ob0$EH]$($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$,$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$,+)%)%++++)%)%+$$$$$$$$++1%++++++($%'$$$&&$%'$&'%%'$&+(&%&$%'$%$.()%$$$%$$$+$$($,$$'%&$$$.$$$-$($-$$%)&$$$-&$$$0&C30'$&/2%$'$%$&%&$$$%$()$$$$$$'$$'$'$%%%($'$$%$$3F$$'$%'((%'$%$%$*$B%%$$$Bį+$$$$7%*$$t$A<K)h<.8_q9Ú$,$Y+’$ě$$$$$$$$$$$$$$AO($$B$$$$$$$$$$3ģ¦$$$$$$$$$$$$$$$$$$$$$$b$$$$C$$ĥS8%)J%C$ŒR$R$$$&%$$$$$$'$$%$)%&$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%)$$$$&$$('$%I$$($%[*$$1$:,*$*$*$*$*$*$*$*$C%$$$$&$$$$$,$%$$$$%$$$$$$$$$$($-%'$$$0%$P=$|/ù=/'$&$$$$$$$$$$$$$$%$$$$$$$$$$%$,'%$(%&$$$%$y%%%%$$}$&$(N$$%'-CG/3B$-A+$2C-J2ţ᧣c删&8$Қ&Z,K)%į$&3-%7$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&$-$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%%i-%)+:,%$$$$$$$$$$$$$&$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$+$$$$%$$$$$$$$$$%$$$$$$$$&$$$$$$$$$$$$$$$$$$$$($($$$$$$$$$$$%$$'$$$M$$$%$*$&$'$:%%$'$&)%$$)W'+%U3%+%-)5)&$$%$-?+%:.%.$@&&$R$%'%%&0$$-'%($$,-($L)%%%%,&$+$$%-%'3$)&$$$$U$$&%%(%$$$;%$%.$%%%$%$$-)%)%),*$*$N$',$%'sF%$%$%$$$%-)⯇/:'T'ࠣᤣƑ%I*/(($$-$0$($$$%$%$34Ǝ$$3c%YK/$$%3*$$$)3$%%$$$$$$$$$$$$$$$$%$$'&&$'$$$$$$$&$$&$$$%'($ª%$$&$&$$$$$$%-%&%=$$$$$$=$$$$$$$$$%-$P%B&)%)%)%&&%$$$%$$'%-&%%/$=$6$%$2%1Ež(&'P&,X'4%&$0&$RP$¥@&T2$>'C',7$+$(I((A$$G'+$(MKKq%-)G'G'K+W.$³Ś,9-+»)%$$O$%&$%:$$+:%*B+,S6$%((9)&$=($c['%%3%Q$&$%(''$&$@%&'$,*,*@%$@&C+$?%'(*,Y&*9%+6(+5*'/*slZV0V*)G'+-ʼnB$M$%$%%q@-$+9.'(y8*7:,$$$X2*'7-2&$P&'%%%$'.$%<*-)&G($+$-'$%$+F$%$,%$S&,%'''$$$-$$$&$7.5$<&&%$$%)$d*$$$'$2$-$)R$&+(-)%%$+%%%9$*$%$($%$%$'%%%&%$)$((%%*&(®X&+%&$$'(-%$$$&AS&)$$'%$%%$$+-ÉR&'%'%$%:'%ES&+%$$%&$.-)06N$$$%)$$$*-Y>%&%'$('-%&$ãO&,$%$‡CC-,/+%$%+$%$;)$%%%$$$$$$$&,-i+%J&'%%'$$$$$>$-K)$$'+$+$)%&Q0$%&$(@\\Ī,$H$*$)$$$(--6&%A%9$$*$%$%l*$%$I)&$$%$*$$+-))$%$C($%$%$$$$*-ř6%%%Ú$28+'40$ν‰’$(.ç૟ђ$,࿪ɪ⇜ɜ*B$-'%ƒA%($-S*(''$$--$*$8(6˓CC:'ˆn'$$Z*'0c%$$$.%1᠛+ӹM,⌚łT&4'+ƯधŽ(0&,*-%$%$'፿ę-J%_%&&)++%*A'^:e&$½7/z,<ª===*$5==$$%%$%%%'$+'$$$*$.==%$'%+$*$=%$'$($$&*$============?%<$<$)<$<$)<$<$)<$<$)<$<$)$$%UȣZ'U+$1$%(2($2ճ*$4%*$%$(øP&**%-'$$ƓO'-($ԣè%,*LEE*$'-'%̴^$&$'oP$2å'$>$%$$%$$-$'$$$$)$'$$$$$$&$%$$%$$$$$$$$$$%$$%'$*$'$'$$$-$4(&$($4W%ıO'‡/2%2$2$H-0Ä[@0O',*%1)½Ğ(˻+0&0&—/|*/7/'[+-)K+A%%qœ$u$ª/1%(&&(*,<**,&0*L¶$ZH-Щ꜁Eၘ.ā%ᚥ1ᵔూɁ؅፮򮳙$Aƒ£ē︳𐀡%𐀡";
4
+ export const categories = "1.;=;78;<;6;+;<;#7;8>5>$7<8<1.;=?;>?'9<2?>?<->$;>-':-;#<#$<$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$'#$'#%$#%$#%$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#%$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$'$&>&>&>&>&>(#$#$&>#$@&$;#@>#;#@#@#$#@#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$<#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$?(*#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$@#@&;$;6@?=@(6(;(;(;(@'@';@2<;=;?(;2@;'&'(+;'(';'(2?(&(?('+'?';@2'('(@'('@+'(&?;&@(='(&(&(&(@;@'(@;@'@'@'@(2()'()(')()()'('(;+;&'()@'@'@'@'@'@'@(')(@)@)('@)@'@'(@+'=-?=';(@()@'@'@'@'@'@'@'@(@)(@(@(@(@'@'@+('(;@()@'@'@'@'@'@'@(')(@()@)(@'@'(@+;=@'(@()@'@'@'@'@'@'@(')()(@)@)(@()@'@'(@+?'-@('@'@'@'@'@'@'@'@'@'@)()@)@)(@'@)@+-?=?@()('@'@'@'@'()@(@(@(@'@'(@+@;-?'();'@'@'@'@'@(')()@()@)(@)@'@'(@+@'@()'@'@'(')(@)@)('?@')-'(@+-?'@()@'@'@'@'@'@(@)(@(@)@+@);@'('(@='&(;+;@'@'@'@'@'@'('('@'@&@(@+@'@'?;?;?(?+-?(?(?(7878)'@'@()(;('(@(@?(?@?;?;@')()()()('+;')('(')')'('()()(')+)(?#@#@#@$;&$'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@(;-@'?@#@$@6'?;'.'78@';,'@'@'(@'(;@'(@'@'@(@'()()()(;&;='(@+@-@;6;(2@+@'&'@'('('@'@'@()()@)()(@?@;+'@'@'@'@+-@?'()(@;')()(@()()()(@(+@+@;&;@(*(@()'()()()()'@+;?(?@()')()()('+'()()()()@;')()(@;+@'+'&;$@#@#;@(;()('('(')('@$&$&$&(@(#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$@#@$#$#$@#@$@#@#@#@#$#$@$%$%$%$@$#%>$>$@$#%>$@$#@>$#>@$@$#%>@.26;9:79:79;/02.;9:;5;<78;<;5;.2@2-&@-<78&-<78@&@=@(*(*(@?#?#?$#$#$?#?<#?#?#?#?#?$#$'$?$#<#$?<?$?-,#$,-?@<?<?<?<?<?<?<?<?<?<?7878?<?78?<?<?<?@?@-?-?<?<?<?<?78787878787878-?<78<7878787878<?<7878787878787878787878<7878<78<?<?<?@?@?#@$@#$#$#$#$#$#$#$#$&#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$?#$#$(#$@;-;$@$@$@'@&;@('@'@'@'@'@'@'@'@'@(;9:9:;9:;9:;6;6;9:;9:78787878;&;6;6;7;?;@?@?@?@?@.;?&',7878787878?78787878678?,()6&?,&';?@'@(>&'6';&'@'@'@?-?'?@'?@-?-?-?-?-?'?'@'&'@?@'&;'&;'+'@#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$'(*;(;&#$#$#$#$#$#$#$#$#$#$#$#$#$#$&(',(;@>&>#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$&$#$#$#$#$#$#$#$&>#$#$'#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$@#$#$#$@#$'&$'('('(')()?(@-?=?@';@)')(@;+@(';';'(+'(;'()@;'@()'()()();@&+@;'(&'+'@'()()(@'('()@+@;'&'?')()'('('('('('@'&;')();'&)(@'@'@'@'@'@$>&$&>@$')()();)(@+@'@'@'@34'@'@$@$@'('<'@'@'@'@'@'>@'87@'@'@'=?@(;78;@(;657878787878787878;78;5;@;6787878;<6<@;=;@'@'@2@;=;78;<;6;+;<;#7;8>5>$7<8<78;78;'&'&'@'@'@'@'@=<>?=@?<?@2?@'@'@'@'@'@'@'@;@-@?,-?-?@?@?@?(@'@'@(-@'-@',',@'(@'@;'@';,@#$'@+@#@$@'@'@;@'@'@'@'@'@'@'@'@'@;-'?-'@-@'@'@-'-@;'@;@'@-'-@-'(@(@('@'@'@(@(-@;@'-;'-@'?'(@-;@'@;'@-'@-'@;@-@'@#@$@-'(@+@-@'@(6@'@'-'@'(-;@'-@'@)()'(;@-+@()')()(;2;@2@'@+@('()(@+;')'@'(;'@()')()';(;)(+';';@-@'@')()()(;(@'@'@'@'@';@'()(@+@()@'@'@'@'@'@'@(')()@)@)@'@)@')@(@(@')()()(';+;@;('@')()()()(';'@+@')(@)()(;'(@')()()(;'@+@;@'()()()('@+@'@()()(@+-;?@')()(;@#$+-@'@'@'@'@')@)@()(')')(;@+@'@')(@()(';')@'('()'(;(@'()('()(;';@'@'@')(@()(';@+-@;'@(@)()()(@'@'@'(@(@(@('(@+@'@'@')@(@)()('@+@'();@'@-?=?@;'@,@;@'@'@2@'@'@'@+@;@'@(;@'(;?&;?@+@-@'@'@#$-;@'@(')@(&@&;&(@)@'@'@'@'@'@'@'@'@'@'@'@?(;2@?@?@?)(?)2(?(?(?@?(?@-@?@-@#$#$@$#$#@#@#@#@#@#$@$@$@$#$#@#@#@#@$#@#@#@#@#@$#$#$#$#$#$#$@#<$<$#<$<$#<$<$#<$<$#<$<$#$@+?(?(?(?(?;@(@(@(@(@(@(@(@'@(&@+@'?@'(+@=@'@-(@#$(&@+@;@-?-=-@-?-@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@<@?@?@?@?@?@?@-?@?@?@?@?@?@?>?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@+@'@'@'@'@'@'@'@2@2@(@4@4@";