@datagrok-libraries/utils 0.0.6 → 0.0.7

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/src/spe.js ADDED
@@ -0,0 +1,151 @@
1
+ import { calculateEuclideanDistance, calcDistanceMatrix, fillRandomMatrix, vectorAdd, randomInt } from './operations';
2
+ /**
3
+ * Implements stochastic proximity embedding.
4
+ *
5
+ * @export
6
+ * @class SPEBase
7
+ * @link doi:10.1016/S1093-3263(03)00155-4
8
+ */
9
+ export class SPEBase {
10
+ /**
11
+ * Creates an instance of SPEBase.
12
+ * @param {Options} [options] Options to pass to the constructor.
13
+ * @memberof SPEBase
14
+ */
15
+ constructor(options) {
16
+ var _a, _b, _c, _d, _e, _f, _g;
17
+ this.steps = (_a = options === null || options === void 0 ? void 0 : options.steps) !== null && _a !== void 0 ? _a : 0;
18
+ this.cycles = (_b = options === null || options === void 0 ? void 0 : options.cycles) !== null && _b !== void 0 ? _b : 1e6;
19
+ // Select a cutoff distance {cutoff} and ...
20
+ this.cutoff = (_c = options === null || options === void 0 ? void 0 : options.cutoff) !== null && _c !== void 0 ? _c : 0;
21
+ // ... an initial learning rate {lambda} > 0
22
+ this.lambda = (_d = options === null || options === void 0 ? void 0 : options.lambda) !== null && _d !== void 0 ? _d : 2.0;
23
+ this.dlambda = (_e = options === null || options === void 0 ? void 0 : options.dlambda) !== null && _e !== void 0 ? _e : 0.01;
24
+ this.lambda2 = this.lambda / 2.;
25
+ this.dlambda2 = this.dlambda / 2.;
26
+ this.epsilon = (_f = options === null || options === void 0 ? void 0 : options.epsilon) !== null && _f !== void 0 ? _f : 1e-10;
27
+ // eslint-disable-next-line brace-style
28
+ this.distanceFunction = (_g = options === null || options === void 0 ? void 0 : options.distance) !== null && _g !== void 0 ? _g : calculateEuclideanDistance;
29
+ this.distance = [];
30
+ }
31
+ /**
32
+ * Initializes distance matrix.
33
+ *
34
+ * @protected
35
+ * @param {Vectors} vectors Input vectors to calculate distance between.
36
+ * @memberof SPEBase
37
+ */
38
+ initDistance(vectors) {
39
+ this.distance = calcDistanceMatrix(vectors, this.distanceFunction);
40
+ }
41
+ /**
42
+ * Calculates distance between the two vectors given.
43
+ *
44
+ * @param {Vectors} vectors Set of vectors to calculate distances between.
45
+ * @param {number} index1 Index of the first vector of the pair.
46
+ * @param {number} index2 Index of the second vector of the pair.
47
+ * @return {number} Distance between these two vectors.
48
+ */
49
+ calcDistance(vectors, index1, index2) {
50
+ return this.distance[index1][index2];
51
+ }
52
+ /**
53
+ * Embeds the vectors given into a two-dimensional space.
54
+ *
55
+ * @param {Vectors} vectors D-dimensional coordinates.
56
+ * @return {Coordinates} SPE coordinates in D space.
57
+ */
58
+ embed(vectors) {
59
+ const nItems = vectors.length;
60
+ const areaWidth = 40;
61
+ // Initialize the D-dimensional coordinates of the N points.
62
+ const coordinates = fillRandomMatrix(nItems, SPEBase.dimension, areaWidth);
63
+ let lambda2 = this.lambda2;
64
+ if (this.steps == 0) {
65
+ this.steps = vectors.length - 1;
66
+ }
67
+ this.initDistance(vectors);
68
+ for (let cycle = 0; cycle < this.cycles; ++cycle) {
69
+ for (let step = 0; step < this.steps; ++step) {
70
+ // Select two points, i and j, at random, ...
71
+ const i = randomInt(nItems);
72
+ let j = randomInt(nItems);
73
+ while (i == j)
74
+ j = randomInt(nItems);
75
+ const rowi = coordinates[i];
76
+ const rowj = coordinates[j];
77
+ // ... retrieve (or evaluate) their proximity in the input space, rij and ...
78
+ const r = this.calcDistance(vectors, i, j);
79
+ // ... compute their Euclidean distance on the D-dimensional map, dij.
80
+ const d = calculateEuclideanDistance(rowi, rowj);
81
+ // If rij <= rc, or if rij > rc and dij < rij ...
82
+ if ((this.cutoff == 0) || (r <= this.cutoff) || (d < r)) {
83
+ const multiplier = lambda2 * (r - d) / (d + this.epsilon);
84
+ // ... update the coordinates xi and xj.
85
+ const diffIJ = vectorAdd(rowi, rowj, -1);
86
+ coordinates[i] = vectorAdd(rowi, diffIJ, multiplier);
87
+ coordinates[j] = vectorAdd(rowj, diffIJ, -multiplier);
88
+ }
89
+ }
90
+ // Decrease the learning rate {lambda} by a prescribed {dlambda}.
91
+ lambda2 -= this.dlambda2;
92
+ if (lambda2 <= 0.) {
93
+ break;
94
+ }
95
+ }
96
+ return coordinates;
97
+ }
98
+ }
99
+ SPEBase.dimension = 2;
100
+ /**
101
+ * Implements modified stochastic proximity embedding.
102
+ *
103
+ * @export
104
+ * @class PSPEBase
105
+ * @link doi:10.1016/S1093-3263(03)00155-4
106
+ */
107
+ export class PSPEBase extends SPEBase {
108
+ /**
109
+ * Embeds the vectors given into a two-dimensional space using a modified update rule.
110
+ *
111
+ * @param {Vectors} vectors D-dimensional coordinates.
112
+ * @return {Coordinates} SPE coordinates in D space.
113
+ */
114
+ embed(vectors) {
115
+ const nItems = vectors.length;
116
+ const areaWidth = 40;
117
+ // Initialize the D-dimensional coordinates of the N points.
118
+ const coordinates = fillRandomMatrix(nItems, PSPEBase.dimension, areaWidth);
119
+ let lambda = this.lambda;
120
+ this.initDistance(vectors);
121
+ for (let cycle = 0; cycle < this.cycles; ++cycle) {
122
+ // Select a point, i, at random (pivot).
123
+ const i = randomInt(nItems);
124
+ const rowi = coordinates[i];
125
+ // For every point j != i ...
126
+ for (let j = 0; j < nItems; ++j) {
127
+ if (i == j)
128
+ continue;
129
+ const rowj = coordinates[j];
130
+ // ... retrieve (or evaluate) its proximity to i in the input space, rij ...
131
+ const r = this.calcDistance(vectors, i, j);
132
+ // ... and compute their Euclidean distance on the D-dimensional map, dij.
133
+ const d = calculateEuclideanDistance(rowi, rowj);
134
+ // If rij <= rc, or if rij > rc and dij < rij ...
135
+ if ((this.cutoff == 0) || (r <= this.cutoff) || (d < r)) {
136
+ const multiplier = lambda * (r - d) / (d + this.epsilon);
137
+ const diffIJ = vectorAdd(rowi, rowj, -1);
138
+ // ... update the coordinates xj.
139
+ coordinates[j] = vectorAdd(rowj, diffIJ, -multiplier);
140
+ }
141
+ }
142
+ // Decrease the learning rate {lambda} by a prescribed {dlambda}.
143
+ lambda -= this.dlambda;
144
+ if (lambda <= 0.) {
145
+ break;
146
+ }
147
+ }
148
+ return coordinates;
149
+ }
150
+ }
151
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3BlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBQywwQkFBMEIsRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRXBIOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxPQUFPO0lBYWxCOzs7O09BSUc7SUFDSCxZQUFZLE9BQWlCOztRQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLEtBQUssbUNBQUksQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsTUFBTSxtQ0FBSSxHQUFHLENBQUM7UUFDckMsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsTUFBTSxtQ0FBSSxDQUFDLENBQUM7UUFDbkMsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsTUFBTSxtQ0FBSSxHQUFHLENBQUM7UUFDckMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxPQUFPLG1DQUFJLElBQUksQ0FBQztRQUN4QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUMsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBQyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxPQUFPLG1DQUFJLEtBQUssQ0FBQztRQUN6Qyx1Q0FBdUM7UUFDdkMsSUFB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QUE0RTtnQkFDNUUsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzQywwRUFBMEU7Z0JBQzFFLE1BQU0sQ0FBQyxHQUFHLDBCQUEwQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDakQsaURBQWlEO2dCQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7b0JBQ3ZELE1BQU0sVUFBVSxHQUFHLE1BQU0sR0FBQyxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsR0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ2pELE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3pDLGlDQUFpQztvQkFDakMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ3ZEO2FBQ0Y7WUFDRCxpRUFBaUU7WUFDakUsTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDdkIsSUFBSSxNQUFNLElBQUksRUFBRSxFQUFFO2dCQUNoQixNQUFNO2FBQ1A7U0FDRjtRQUNELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7T3B0aW9ucywgQ29vcmRpbmF0ZXMsIFZlY3RvcnMsIERpc3RhbmNlTWV0cmljfSBmcm9tICcuL3R5cGVfZGVjbGFyYXRpb25zJztcclxuaW1wb3J0IHtjYWxjdWxhdGVFdWNsaWRlYW5EaXN0YW5jZSwgY2FsY0Rpc3RhbmNlTWF0cml4LCBmaWxsUmFuZG9tTWF0cml4LCB2ZWN0b3JBZGQsIHJhbmRvbUludH0gZnJvbSAnLi9vcGVyYXRpb25zJztcclxuXHJcbi8qKlxyXG4gKiBJbXBsZW1lbnRzIHN0b2NoYXN0aWMgcHJveGltaXR5IGVtYmVkZGluZy5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAY2xhc3MgU1BFQmFzZVxyXG4gKiBAbGluayBkb2k6MTAuMTAxNi9TMTA5My0zMjYzKDAzKTAwMTU1LTRcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTUEVCYXNlIHtcclxuICBwcm90ZWN0ZWQgc3RhdGljIGRpbWVuc2lvbiA9IDI7XHJcbiAgcHJvdGVjdGVkIHN0ZXBzOiBudW1iZXI7XHJcbiAgcHJvdGVjdGVkIGN5Y2xlczogbnVtYmVyO1xyXG4gIHByb3RlY3RlZCBjdXRvZmY6IG51bWJlcjtcclxuICBwcm90ZWN0ZWQgbGFtYmRhOiBudW1iZXI7XHJcbiAgcHJvdGVjdGVkIGRsYW1iZGE6IG51bWJlcjtcclxuICBwcm90ZWN0ZWQgbGFtYmRhMjogbnVtYmVyO1xyXG4gIHByb3RlY3RlZCBkbGFtYmRhMjogbnVtYmVyO1xyXG4gIHByb3RlY3RlZCBlcHNpbG9uOiBudW1iZXI7XHJcbiAgcHJvdGVjdGVkIGRpc3RhbmNlRnVuY3Rpb246IERpc3RhbmNlTWV0cmljO1xyXG4gIHByb3RlY3RlZCBkaXN0YW5jZTogQ29vcmRpbmF0ZXM7XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgU1BFQmFzZS5cclxuICAgKiBAcGFyYW0ge09wdGlvbnN9IFtvcHRpb25zXSBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yLlxyXG4gICAqIEBtZW1iZXJvZiBTUEVCYXNlXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE9wdGlvbnMpIHtcclxuICAgIHRoaXMuc3RlcHMgPSBvcHRpb25zPy5zdGVwcyA/PyAwO1xyXG4gICAgdGhpcy5jeWNsZXMgPSBvcHRpb25zPy5jeWNsZXMgPz8gMWU2O1xyXG4gICAgLy8gU2VsZWN0IGEgY3V0b2ZmIGRpc3RhbmNlIHtjdXRvZmZ9IGFuZCAuLi5cclxuICAgIHRoaXMuY3V0b2ZmID0gb3B0aW9ucz8uY3V0b2ZmID8/IDA7XHJcbiAgICAvLyAuLi4gYW4gaW5pdGlhbCBsZWFybmluZyByYXRlIHtsYW1iZGF9ID4gMFxyXG4gICAgdGhpcy5sYW1iZGEgPSBvcHRpb25zPy5sYW1iZGEgPz8gMi4wO1xyXG4gICAgdGhpcy5kbGFtYmRhID0gb3B0aW9ucz8uZGxhbWJkYSA/PyAwLjAxO1xyXG4gICAgdGhpcy5sYW1iZGEyID0gdGhpcy5sYW1iZGEvMi47XHJcbiAgICB0aGlzLmRsYW1iZGEyID0gdGhpcy5kbGFtYmRhLzIuO1xyXG4gICAgdGhpcy5lcHNpbG9uID0gb3B0aW9ucz8uZXBzaWxvbiA/PyAxZS0xMDtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBicmFjZS1zdHlsZVxyXG4gICAgdGhpcy5kaXN0YW5jZUZ1bmN0aW9uID0gb3B0aW9ucz8uZGlzdGFuY2UgPz8gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2U7XHJcbiAgICB0aGlzLmRpc3RhbmNlID0gW107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbml0aWFsaXplcyBkaXN0YW5jZSBtYXRyaXguXHJcbiAgICpcclxuICAgKiBAcHJvdGVjdGVkXHJcbiAgICogQHBhcmFtIHtWZWN0b3JzfSB2ZWN0b3JzIElucHV0IHZlY3RvcnMgdG8gY2FsY3VsYXRlIGRpc3RhbmNlIGJldHdlZW4uXHJcbiAgICogQG1lbWJlcm9mIFNQRUJhc2VcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgaW5pdERpc3RhbmNlKHZlY3RvcnM6IFZlY3RvcnMpIHtcclxuICAgIHRoaXMuZGlzdGFuY2UgPSBjYWxjRGlzdGFuY2VNYXRyaXgodmVjdG9ycywgdGhpcy5kaXN0YW5jZUZ1bmN0aW9uKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGN1bGF0ZXMgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHZlY3RvcnMgZ2l2ZW4uXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtWZWN0b3JzfSB2ZWN0b3JzIFNldCBvZiB2ZWN0b3JzIHRvIGNhbGN1bGF0ZSBkaXN0YW5jZXMgYmV0d2Vlbi5cclxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXgxIEluZGV4IG9mIHRoZSBmaXJzdCB2ZWN0b3Igb2YgdGhlIHBhaXIuXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4MiBJbmRleCBvZiB0aGUgc2Vjb25kIHZlY3RvciBvZiB0aGUgcGFpci5cclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IERpc3RhbmNlIGJldHdlZW4gdGhlc2UgdHdvIHZlY3RvcnMuXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGNhbGNEaXN0YW5jZSh2ZWN0b3JzOiBWZWN0b3JzLCBpbmRleDE6IG51bWJlciwgaW5kZXgyOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzdGFuY2VbaW5kZXgxXVtpbmRleDJdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW1iZWRzIHRoZSB2ZWN0b3JzIGdpdmVuIGludG8gYSB0d28tZGltZW5zaW9uYWwgc3BhY2UuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtWZWN0b3JzfSB2ZWN0b3JzIEQtZGltZW5zaW9uYWwgY29vcmRpbmF0ZXMuXHJcbiAgICogQHJldHVybiB7Q29vcmRpbmF0ZXN9IFNQRSBjb29yZGluYXRlcyBpbiBEIHNwYWNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBlbWJlZCh2ZWN0b3JzOiBWZWN0b3JzKTogQ29vcmRpbmF0ZXMge1xyXG4gICAgY29uc3Qgbkl0ZW1zID0gdmVjdG9ycy5sZW5ndGg7XHJcbiAgICBjb25zdCBhcmVhV2lkdGggPSA0MDtcclxuICAgIC8vIEluaXRpYWxpemUgdGhlIEQtZGltZW5zaW9uYWwgY29vcmRpbmF0ZXMgb2YgdGhlIE4gcG9pbnRzLlxyXG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBmaWxsUmFuZG9tTWF0cml4KG5JdGVtcywgU1BFQmFzZS5kaW1lbnNpb24sIGFyZWFXaWR0aCk7XHJcblxyXG4gICAgbGV0IGxhbWJkYTIgPSB0aGlzLmxhbWJkYTI7XHJcblxyXG4gICAgaWYgKHRoaXMuc3RlcHMgPT0gMCkge1xyXG4gICAgICB0aGlzLnN0ZXBzID0gdmVjdG9ycy5sZW5ndGgtMTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluaXREaXN0YW5jZSh2ZWN0b3JzKTtcclxuXHJcbiAgICBmb3IgKGxldCBjeWNsZSA9IDA7IGN5Y2xlIDwgdGhpcy5jeWNsZXM7ICsrY3ljbGUpIHtcclxuICAgICAgZm9yIChsZXQgc3RlcCA9IDA7IHN0ZXAgPCB0aGlzLnN0ZXBzOyArK3N0ZXApIHtcclxuICAgICAgICAvLyBTZWxlY3QgdHdvIHBvaW50cywgaSBhbmQgaiwgYXQgcmFuZG9tLCAuLi5cclxuICAgICAgICBjb25zdCBpID0gcmFuZG9tSW50KG5JdGVtcyk7IGxldCBqID0gcmFuZG9tSW50KG5JdGVtcyk7XHJcbiAgICAgICAgd2hpbGUgKGkgPT0gaikgaiA9IHJhbmRvbUludChuSXRlbXMpO1xyXG5cclxuICAgICAgICBjb25zdCByb3dpID0gY29vcmRpbmF0ZXNbaV07IGNvbnN0IHJvd2ogPSBjb29yZGluYXRlc1tqXTtcclxuXHJcbiAgICAgICAgLy8gLi4uIHJldHJpZXZlIChvciBldmFsdWF0ZSkgdGhlaXIgcHJveGltaXR5IGluIHRoZSBpbnB1dCBzcGFjZSwgcmlqIGFuZCAuLi5cclxuICAgICAgICBjb25zdCByID0gdGhpcy5jYWxjRGlzdGFuY2UodmVjdG9ycywgaSwgaik7XHJcbiAgICAgICAgLy8gLi4uIGNvbXB1dGUgdGhlaXIgRXVjbGlkZWFuIGRpc3RhbmNlIG9uIHRoZSBELWRpbWVuc2lvbmFsIG1hcCwgZGlqLlxyXG4gICAgICAgIGNvbnN0IGQgPSBjYWxjdWxhdGVFdWNsaWRlYW5EaXN0YW5jZShyb3dpLCByb3dqKTtcclxuXHJcbiAgICAgICAgLy8gSWYgcmlqIDw9IHJjLCBvciBpZiByaWogPiByYyBhbmQgZGlqIDwgcmlqIC4uLlxyXG4gICAgICAgIGlmICgodGhpcy5jdXRvZmYgPT0gMCkgfHwgKHIgPD0gdGhpcy5jdXRvZmYpIHx8IChkIDwgcikpIHtcclxuICAgICAgICAgIGNvbnN0IG11bHRpcGxpZXIgPSBsYW1iZGEyKihyLWQpLyhkK3RoaXMuZXBzaWxvbik7XHJcbiAgICAgICAgICAvLyAuLi4gdXBkYXRlIHRoZSBjb29yZGluYXRlcyB4aSBhbmQgeGouXHJcbiAgICAgICAgICBjb25zdCBkaWZmSUogPSB2ZWN0b3JBZGQocm93aSwgcm93aiwgLTEpO1xyXG4gICAgICAgICAgY29vcmRpbmF0ZXNbaV0gPSB2ZWN0b3JBZGQocm93aSwgZGlmZklKLCBtdWx0aXBsaWVyKTtcclxuICAgICAgICAgIGNvb3JkaW5hdGVzW2pdID0gdmVjdG9yQWRkKHJvd2osIGRpZmZJSiwgLW11bHRpcGxpZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBEZWNyZWFzZSB0aGUgbGVhcm5pbmcgcmF0ZSB7bGFtYmRhfSBieSBhIHByZXNjcmliZWQge2RsYW1iZGF9LlxyXG4gICAgICBsYW1iZGEyIC09IHRoaXMuZGxhbWJkYTI7XHJcbiAgICAgIGlmIChsYW1iZGEyIDw9IDAuKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjb29yZGluYXRlcztcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJbXBsZW1lbnRzIG1vZGlmaWVkIHN0b2NoYXN0aWMgcHJveGltaXR5IGVtYmVkZGluZy5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAY2xhc3MgUFNQRUJhc2VcclxuICogQGxpbmsgZG9pOjEwLjEwMTYvUzEwOTMtMzI2MygwMykwMDE1NS00XHJcbiAqL1xyXG4gZXhwb3J0IGNsYXNzIFBTUEVCYXNlIGV4dGVuZHMgU1BFQmFzZSB7XHJcbiAgLyoqXHJcbiAgICogRW1iZWRzIHRoZSB2ZWN0b3JzIGdpdmVuIGludG8gYSB0d28tZGltZW5zaW9uYWwgc3BhY2UgdXNpbmcgYSBtb2RpZmllZCB1cGRhdGUgcnVsZS5cclxuICAgKiBcclxuICAgKiBAcGFyYW0ge1ZlY3RvcnN9IHZlY3RvcnMgRC1kaW1lbnNpb25hbCBjb29yZGluYXRlcy5cclxuICAgKiBAcmV0dXJuIHtDb29yZGluYXRlc30gU1BFIGNvb3JkaW5hdGVzIGluIEQgc3BhY2UuXHJcbiAgICovXHJcbiAgcHVibGljIGVtYmVkKHZlY3RvcnM6IFZlY3RvcnMpOiBDb29yZGluYXRlcyB7XHJcbiAgICBjb25zdCBuSXRlbXMgPSB2ZWN0b3JzLmxlbmd0aDtcclxuICAgIGNvbnN0IGFyZWFXaWR0aCA9IDQwO1xyXG4gICAgLy8gIEluaXRpYWxpemUgdGhlIEQtZGltZW5zaW9uYWwgY29vcmRpbmF0ZXMgb2YgdGhlIE4gcG9pbnRzLlxyXG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBmaWxsUmFuZG9tTWF0cml4KG5JdGVtcywgUFNQRUJhc2UuZGltZW5zaW9uLCBhcmVhV2lkdGgpO1xyXG4gICAgbGV0IGxhbWJkYSA9IHRoaXMubGFtYmRhO1xyXG5cclxuICAgIHRoaXMuaW5pdERpc3RhbmNlKHZlY3RvcnMpO1xyXG5cclxuICAgIGZvciAobGV0IGN5Y2xlID0gMDsgY3ljbGUgPCB0aGlzLmN5Y2xlczsgKytjeWNsZSkge1xyXG4gICAgICAvLyBTZWxlY3QgYSBwb2ludCwgaSwgYXQgcmFuZG9tIChwaXZvdCkuXHJcbiAgICAgIGNvbnN0IGk6IG51bWJlciA9IHJhbmRvbUludChuSXRlbXMpO1xyXG4gICAgICBjb25zdCByb3dpID0gY29vcmRpbmF0ZXNbaV07XHJcblxyXG4gICAgICAvLyBGb3IgZXZlcnkgcG9pbnQgaiAhPSBpIC4uLlxyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5JdGVtczsgKytqKSB7XHJcbiAgICAgICAgaWYgKGkgPT0gaikgY29udGludWU7XHJcbiAgICAgICAgY29uc3Qgcm93aiA9IGNvb3JkaW5hdGVzW2pdO1xyXG4gICAgICAgIC8vIC4uLiByZXRyaWV2ZSAob3IgZXZhbHVhdGUpIGl0cyBwcm94aW1pdHkgdG8gaSBpbiB0aGUgaW5wdXQgc3BhY2UsIHJpaiAuLi5cclxuICAgICAgICBjb25zdCByID0gdGhpcy5jYWxjRGlzdGFuY2UodmVjdG9ycywgaSwgaik7XHJcbiAgICAgICAgLy8gLi4uIGFuZCBjb21wdXRlIHRoZWlyIEV1Y2xpZGVhbiBkaXN0YW5jZSBvbiB0aGUgRC1kaW1lbnNpb25hbCBtYXAsIGRpai5cclxuICAgICAgICBjb25zdCBkID0gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2Uocm93aSwgcm93aik7XHJcbiAgICAgICAgLy8gSWYgcmlqIDw9IHJjLCBvciBpZiByaWogPiByYyBhbmQgZGlqIDwgcmlqIC4uLlxyXG4gICAgICAgIGlmICgodGhpcy5jdXRvZmYgPT0gMCkgfHwgKHIgPD0gdGhpcy5jdXRvZmYpIHx8IChkIDwgcikpIHtcclxuICAgICAgICAgIGNvbnN0IG11bHRpcGxpZXIgPSBsYW1iZGEqKHItZCkvKGQrdGhpcy5lcHNpbG9uKTtcclxuICAgICAgICAgIGNvbnN0IGRpZmZJSiA9IHZlY3RvckFkZChyb3dpLCByb3dqLCAtMSk7XHJcbiAgICAgICAgICAvLyAuLi4gdXBkYXRlIHRoZSBjb29yZGluYXRlcyB4ai5cclxuICAgICAgICAgIGNvb3JkaW5hdGVzW2pdID0gdmVjdG9yQWRkKHJvd2osIGRpZmZJSiwgLW11bHRpcGxpZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBEZWNyZWFzZSB0aGUgbGVhcm5pbmcgcmF0ZSB7bGFtYmRhfSBieSBhIHByZXNjcmliZWQge2RsYW1iZGF9LlxyXG4gICAgICBsYW1iZGEgLT0gdGhpcy5kbGFtYmRhO1xyXG4gICAgICBpZiAobGFtYmRhIDw9IDAuKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjb29yZGluYXRlcztcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,46 @@
1
+ import * as fl from 'fastest-levenshtein';
2
+ import { jaroWinkler } from 'jaro-winkler-typescript';
3
+ import { assert } from './operations';
4
+ /**
5
+ * Unified class implementing the different string measures.
6
+ *
7
+ * @export
8
+ * @class Measurer
9
+ */
10
+ export class Measurer {
11
+ /**
12
+ * Creates an instance of Measurer.
13
+ * @param {string} method Method to calculate distance between strings.
14
+ * @memberof Measurer
15
+ */
16
+ constructor(method) {
17
+ assert(Measurer.availableMeasures.includes(method), 'The ${method} was not found.');
18
+ this.method = method;
19
+ }
20
+ /**
21
+ * Returns custom string distance function specified.
22
+ * @return {DistanceMetric} Callback of the measure chosen.
23
+ */
24
+ getMeasure() {
25
+ return Measurer.receipt[this.method];
26
+ }
27
+ /**
28
+ * Returns available string distance metrics.
29
+ *
30
+ * @readonly
31
+ * @type {string[]}
32
+ * @memberof Measurer
33
+ */
34
+ static get availableMeasures() {
35
+ let keys = [];
36
+ for (let key in Measurer.receipt) {
37
+ keys.push(key);
38
+ }
39
+ return keys;
40
+ }
41
+ }
42
+ Measurer.receipt = {
43
+ 'Levenshtein': fl.distance,
44
+ 'Jaro-Winkler': jaroWinkler,
45
+ };
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLW1lYXN1cmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdHJpbmctbWVhc3VyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUdwRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRXBDOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFPakI7Ozs7T0FJRztJQUNILFlBQVksTUFBYztRQUN4QixNQUFNLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSw4QkFBOEIsQ0FBQyxDQUFBO1FBQ25GLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxVQUFVO1FBQ2YsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksTUFBTSxLQUFLLGlCQUFpQjtRQUNqQyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7UUFFZCxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNoQjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7QUFyQ2EsZ0JBQU8sR0FBcUM7SUFDeEQsYUFBYSxFQUFFLEVBQUUsQ0FBQyxRQUFRO0lBQzFCLGNBQWMsRUFBRSxXQUFXO0NBQzVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmbCBmcm9tICdmYXN0ZXN0LWxldmVuc2h0ZWluJztcclxuaW1wb3J0IHtqYXJvV2lua2xlcn0gZnJvbSAnamFyby13aW5rbGVyLXR5cGVzY3JpcHQnO1xyXG5cclxuaW1wb3J0IHtEaXN0YW5jZU1ldHJpY30gZnJvbSAnLi90eXBlX2RlY2xhcmF0aW9ucyc7XHJcbmltcG9ydCB7YXNzZXJ0fSBmcm9tICcuL29wZXJhdGlvbnMnO1xyXG5cclxuLyoqXHJcbiAqIFVuaWZpZWQgY2xhc3MgaW1wbGVtZW50aW5nIHRoZSBkaWZmZXJlbnQgc3RyaW5nIG1lYXN1cmVzLlxyXG4gKlxyXG4gKiBAZXhwb3J0XHJcbiAqIEBjbGFzcyBNZWFzdXJlclxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE1lYXN1cmVyIHtcclxuICAgIHByb3RlY3RlZCBtZXRob2Q6IHN0cmluZztcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVjZWlwdDoge1tuYW1lOiBzdHJpbmddOiBEaXN0YW5jZU1ldHJpY30gPSB7XHJcbiAgICAgICdMZXZlbnNodGVpbic6IGZsLmRpc3RhbmNlLFxyXG4gICAgICAnSmFyby1XaW5rbGVyJzogamFyb1dpbmtsZXIsXHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBNZWFzdXJlci5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgTWV0aG9kIHRvIGNhbGN1bGF0ZSBkaXN0YW5jZSBiZXR3ZWVuIHN0cmluZ3MuXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVhc3VyZXJcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IobWV0aG9kOiBzdHJpbmcpIHtcclxuICAgICAgYXNzZXJ0KE1lYXN1cmVyLmF2YWlsYWJsZU1lYXN1cmVzLmluY2x1ZGVzKG1ldGhvZCksICdUaGUgJHttZXRob2R9IHdhcyBub3QgZm91bmQuJylcclxuICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGN1c3RvbSBzdHJpbmcgZGlzdGFuY2UgZnVuY3Rpb24gc3BlY2lmaWVkLlxyXG4gICAgICogQHJldHVybiB7RGlzdGFuY2VNZXRyaWN9IENhbGxiYWNrIG9mIHRoZSBtZWFzdXJlIGNob3Nlbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE1lYXN1cmUoKTogRGlzdGFuY2VNZXRyaWMge1xyXG4gICAgICByZXR1cm4gTWVhc3VyZXIucmVjZWlwdFt0aGlzLm1ldGhvZF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGF2YWlsYWJsZSBzdHJpbmcgZGlzdGFuY2UgbWV0cmljcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEB0eXBlIHtzdHJpbmdbXX1cclxuICAgICAqIEBtZW1iZXJvZiBNZWFzdXJlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBhdmFpbGFibGVNZWFzdXJlcygpIDogc3RyaW5nW10ge1xyXG4gICAgICBsZXQga2V5cyA9IFtdO1xyXG5cclxuICAgICAgZm9yIChsZXQga2V5IGluIE1lYXN1cmVyLnJlY2VpcHQpIHtcclxuICAgICAgICBrZXlzLnB1c2goa2V5KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4ga2V5cztcclxuICAgIH1cclxuICAgIFxyXG59XHJcbiJdfQ==
@@ -0,0 +1,9 @@
1
+ export function tryParseJson(s) {
2
+ try {
3
+ return JSON.parse(s);
4
+ }
5
+ catch (_) {
6
+ return null;
7
+ }
8
+ }
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RyaW5nLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sVUFBVSxZQUFZLENBQUMsQ0FBUztJQUNsQyxJQUFJO1FBQ0EsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3hCO0lBQ0QsT0FBTyxDQUFDLEVBQUU7UUFDTixPQUFPLElBQUksQ0FBQztLQUNmO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiB0cnlQYXJzZUpzb24oczogc3RyaW5nKSA6IGFueSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHMpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKF8pIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxufSJdfQ==
@@ -0,0 +1,47 @@
1
+ import * as DG from "datagrok-api/dg";
2
+ // @ts-ignore
3
+ let ruleSet = {
4
+ name: 'SDTM DM rules',
5
+ rules: [
6
+ {
7
+ column: 'age',
8
+ type: 'int',
9
+ pattern: '18-90'
10
+ },
11
+ {
12
+ column: 'height',
13
+ type: 'numerical',
14
+ pattern: '18-90'
15
+ },
16
+ {
17
+ column: 'sex',
18
+ type: 'string',
19
+ pattern: 'in (F, M)'
20
+ },
21
+ {
22
+ column: 'started',
23
+ type: 'datetime',
24
+ pattern: '> 1/1/1900'
25
+ }
26
+ ]
27
+ };
28
+ /** Returns error message, or null if valid. */
29
+ function validateCell(cell, ruleset) {
30
+ var _a;
31
+ let name = cell.column.name.toLowerCase();
32
+ for (let rule of ruleset.rules)
33
+ if (rule.column == name) {
34
+ rule.matcher = (_a = rule.matcher) !== null && _a !== void 0 ? _a : DG.ValueMatcher.forColumn(cell.column, rule.pattern);
35
+ let error = rule.matcher.validate(cell.value);
36
+ if (error !== null)
37
+ return error;
38
+ }
39
+ return null;
40
+ }
41
+ function main() {
42
+ console.log('foo');
43
+ }
44
+ let cell = { column: { name: 'age' }, value: 999 };
45
+ validateCell(cell, ruleSet);
46
+ console.log('ddd');
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtdmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRhYmxlLXZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQWN0QyxhQUFhO0FBQ2IsSUFBSSxPQUFPLEdBQVk7SUFDckIsSUFBSSxFQUFFLGVBQWU7SUFDckIsS0FBSyxFQUFFO1FBQ0w7WUFDRSxNQUFNLEVBQUUsS0FBSztZQUNiLElBQUksRUFBRSxLQUFLO1lBQ1gsT0FBTyxFQUFFLE9BQU87U0FDakI7UUFDRDtZQUNFLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLElBQUksRUFBRSxXQUFXO1lBQ2pCLE9BQU8sRUFBRSxPQUFPO1NBQ2pCO1FBQ0Q7WUFDRSxNQUFNLEVBQUUsS0FBSztZQUNiLElBQUksRUFBRSxRQUFRO1lBQ2QsT0FBTyxFQUFFLFdBQVc7U0FDckI7UUFDRDtZQUNFLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLElBQUksRUFBRSxVQUFVO1lBQ2hCLE9BQU8sRUFBRSxZQUFZO1NBQ3RCO0tBQ0Y7Q0FDRixDQUFDO0FBRUYsK0NBQStDO0FBQy9DLFNBQVMsWUFBWSxDQUFDLElBQVMsRUFBRSxPQUFnQjs7SUFDL0MsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFFMUMsS0FBSyxJQUFJLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSztRQUM1QixJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBQSxJQUFJLENBQUMsT0FBTyxtQ0FBSSxFQUFFLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwRixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUMsSUFBSSxLQUFLLEtBQUssSUFBSTtnQkFDaEIsT0FBTyxLQUFLLENBQUM7U0FDaEI7SUFFSCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxTQUFTLElBQUk7SUFDWCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxJQUFJLElBQUksR0FBRyxFQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbEQsWUFBWSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUU1QixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogRG8gbm90IGNoYW5nZSB0aGVzZSBpbXBvcnQgbGluZXMuIERhdGFncm9rIHdpbGwgaW1wb3J0IEFQSSBsaWJyYXJ5IGluIGV4YWN0bHkgdGhlIHNhbWUgbWFubmVyICovXHJcbmltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xyXG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xyXG5pbXBvcnQgKiBhcyBERyBmcm9tIFwiZGF0YWdyb2stYXBpL2RnXCI7XHJcblxyXG5pbnRlcmZhY2UgUnVsZSB7XHJcbiAgY29sdW1uOiBzdHJpbmc7XHJcbiAgdHlwZTogc3RyaW5nO1xyXG4gIHBhdHRlcm46IHN0cmluZztcclxuICBtYXRjaGVyPzogYW55O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgUnVsZVNldCB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIHJ1bGVzOiBSdWxlW107XHJcbn1cclxuXHJcbi8vIEB0cy1pZ25vcmVcclxubGV0IHJ1bGVTZXQ6IFJ1bGVTZXQgPSB7XHJcbiAgbmFtZTogJ1NEVE0gRE0gcnVsZXMnLFxyXG4gIHJ1bGVzOiBbXHJcbiAgICB7XHJcbiAgICAgIGNvbHVtbjogJ2FnZScsXHJcbiAgICAgIHR5cGU6ICdpbnQnLFxyXG4gICAgICBwYXR0ZXJuOiAnMTgtOTAnXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBjb2x1bW46ICdoZWlnaHQnLFxyXG4gICAgICB0eXBlOiAnbnVtZXJpY2FsJyxcclxuICAgICAgcGF0dGVybjogJzE4LTkwJ1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgY29sdW1uOiAnc2V4JyxcclxuICAgICAgdHlwZTogJ3N0cmluZycsXHJcbiAgICAgIHBhdHRlcm46ICdpbiAoRiwgTSknXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBjb2x1bW46ICdzdGFydGVkJyxcclxuICAgICAgdHlwZTogJ2RhdGV0aW1lJyxcclxuICAgICAgcGF0dGVybjogJz4gMS8xLzE5MDAnXHJcbiAgICB9XHJcbiAgXVxyXG59O1xyXG5cclxuLyoqIFJldHVybnMgZXJyb3IgbWVzc2FnZSwgb3IgbnVsbCBpZiB2YWxpZC4gKi9cclxuZnVuY3Rpb24gdmFsaWRhdGVDZWxsKGNlbGw6IGFueSwgcnVsZXNldDogUnVsZVNldCkgOiBzdHJpbmcgfCBudWxsIHtcclxuICBsZXQgbmFtZSA9IGNlbGwuY29sdW1uLm5hbWUudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgZm9yIChsZXQgcnVsZSBvZiBydWxlc2V0LnJ1bGVzKVxyXG4gICAgaWYgKHJ1bGUuY29sdW1uID09IG5hbWUpIHtcclxuICAgICAgcnVsZS5tYXRjaGVyID0gcnVsZS5tYXRjaGVyID8/IERHLlZhbHVlTWF0Y2hlci5mb3JDb2x1bW4oY2VsbC5jb2x1bW4sIHJ1bGUucGF0dGVybik7XHJcbiAgICAgIGxldCBlcnJvciA9IHJ1bGUubWF0Y2hlci52YWxpZGF0ZShjZWxsLnZhbHVlKTtcclxuICAgICAgaWYgKGVycm9yICE9PSBudWxsKVxyXG4gICAgICAgIHJldHVybiBlcnJvcjtcclxuICAgIH1cclxuXHJcbiAgcmV0dXJuIG51bGw7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG1haW4oKSA6IHZvaWQge1xyXG4gIGNvbnNvbGUubG9nKCdmb28nKTtcclxufVxyXG5cclxubGV0IGNlbGwgPSB7Y29sdW1uOiB7IG5hbWU6ICdhZ2UnIH0sIHZhbHVlOiA5OTkgfTtcclxudmFsaWRhdGVDZWxsKGNlbGwsIHJ1bGVTZXQpO1xyXG5cclxuY29uc29sZS5sb2coJ2RkZCcpOyJdfQ==
@@ -0,0 +1,81 @@
1
+ import * as path from "path";
2
+ import * as os from "os";
3
+ import * as fs from "fs";
4
+ // @ts-ignore
5
+ import * as yaml from 'js-yaml';
6
+ const fetch = require('node-fetch');
7
+ export async function getToken(url, key) {
8
+ let response = await fetch(`${url}/users/login/dev/${key}`, { method: 'POST' });
9
+ let json = await response.json();
10
+ if (json.isSuccess == true)
11
+ return json.token;
12
+ else
13
+ throw 'Unable to login to server. Check your dev key';
14
+ }
15
+ export async function getWebUrl(url, token) {
16
+ let response = await fetch(`${url}/admin/plugins/admin/settings`, { headers: { Authorization: token } });
17
+ let json = await response.json();
18
+ return json.settings.webRoot;
19
+ }
20
+ const grokDir = path.join(os.homedir(), '.grok');
21
+ const confPath = path.join(grokDir, 'config.yaml');
22
+ function mapURL(conf) {
23
+ let urls = {};
24
+ for (let server in conf.servers) {
25
+ urls[conf['servers'][server]['url']] = conf['servers'][server];
26
+ }
27
+ return urls;
28
+ }
29
+ export function getDevKey(hostKey) {
30
+ let config = yaml.load(fs.readFileSync(confPath, 'utf8'));
31
+ let host = hostKey == '' ? config.default : hostKey;
32
+ host = host.trim();
33
+ let urls = mapURL(config);
34
+ let key = '';
35
+ let url = '';
36
+ try {
37
+ let url = new URL(host).href;
38
+ if (url.endsWith('/'))
39
+ url = url.slice(0, -1);
40
+ if (url in urls)
41
+ key = config['servers'][urls[url]]['key'];
42
+ }
43
+ catch (error) {
44
+ if (config['servers'][host] == null)
45
+ throw `Unknown server alias. Please add it to ${confPath}`;
46
+ url = config['servers'][host]['url'];
47
+ key = config['servers'][host]['key'];
48
+ }
49
+ return { url, key };
50
+ }
51
+ export async function getBrowserPage(puppeteer) {
52
+ var _a;
53
+ let url = (_a = process.env.HOST) !== null && _a !== void 0 ? _a : '';
54
+ let cfg = getDevKey(url);
55
+ url = cfg.url;
56
+ let key = cfg.key;
57
+ let token = await getToken(url, key);
58
+ url = await getWebUrl(url, token);
59
+ console.log(`Using web root: ${url}`);
60
+ let browser = await puppeteer.launch({
61
+ args: ['--disable-dev-shm-usage', '--disable-features=site-per-process'],
62
+ ignoreHTTPSErrors: true,
63
+ });
64
+ let page = await browser.newPage();
65
+ await page.goto(`${url}/oauth/`);
66
+ await page.setCookie({ name: 'auth', value: token });
67
+ await page.evaluate((token) => {
68
+ window.localStorage.setItem('auth', token);
69
+ }, token);
70
+ await page.goto(url);
71
+ try {
72
+ await page.waitForSelector('.grok-preloader');
73
+ console.log('got preloader');
74
+ await page.waitForFunction(() => document.querySelector('.grok-preloader') == null, { timeout: 100000 });
75
+ }
76
+ catch (error) {
77
+ throw error;
78
+ }
79
+ return { browser, page };
80
+ }
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsYUFBYTtBQUNiLE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBQ2hDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUVwQyxNQUFNLENBQUMsS0FBSyxVQUFVLFFBQVEsQ0FBQyxHQUFXLEVBQUUsR0FBVztJQUNyRCxJQUFJLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsb0JBQW9CLEdBQUcsRUFBRSxFQUFFLEVBQUMsTUFBTSxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUM7SUFDOUUsSUFBSSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDakMsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUk7UUFDeEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDOztRQUVsQixNQUFNLCtDQUErQyxDQUFDO0FBQzFELENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLFNBQVMsQ0FBQyxHQUFXLEVBQUUsS0FBYTtJQUN4RCxJQUFJLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsK0JBQStCLEVBQUUsRUFBQyxPQUFPLEVBQUUsRUFBQyxhQUFhLEVBQUUsS0FBSyxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQ3JHLElBQUksSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2pDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7QUFDL0IsQ0FBQztBQUVELE1BQU0sT0FBTyxHQUFHLElBQUks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QUMseUJBQXlCLEVBQUUscUNBQXFDLENBQUM7UUFDeEUsaUJBQWlCLEVBQUUsSUFBSTtLQUN4QixDQUFDLENBQUM7SUFFSCxJQUFJLElBQUksR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNuQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7SUFDbkQsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7UUFDakMsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNWLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQixJQUFJO1FBQ0YsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDOUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM3QixNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFDO0tBQ3hHO0lBQUMsT0FBTyxLQUFLLEVBQUU7UUFDZCxNQUFNLEtBQUssQ0FBQztLQUNiO0lBQ0QsT0FBTyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsQ0FBQztBQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xyXG5pbXBvcnQgKiBhcyBvcyBmcm9tIFwib3NcIjtcclxuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XHJcbi8vIEB0cy1pZ25vcmVcclxuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcclxuY29uc3QgZmV0Y2ggPSByZXF1aXJlKCdub2RlLWZldGNoJyk7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VG9rZW4odXJsOiBzdHJpbmcsIGtleTogc3RyaW5nKSB7XHJcbiAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dXJsfS91c2Vycy9sb2dpbi9kZXYvJHtrZXl9YCwge21ldGhvZDogJ1BPU1QnfSk7XHJcbiAgbGV0IGpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgaWYgKGpzb24uaXNTdWNjZXNzID09IHRydWUpXHJcbiAgICByZXR1cm4ganNvbi50b2tlbjtcclxuICBlbHNlXHJcbiAgICB0aHJvdyAnVW5hYmxlIHRvIGxvZ2luIHRvIHNlcnZlci4gQ2hlY2sgeW91ciBkZXYga2V5JztcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFdlYlVybCh1cmw6IHN0cmluZywgdG9rZW46IHN0cmluZykge1xyXG4gIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke3VybH0vYWRtaW4vcGx1Z2lucy9hZG1pbi9zZXR0aW5nc2AsIHtoZWFkZXJzOiB7QXV0aG9yaXphdGlvbjogdG9rZW59fSk7XHJcbiAgbGV0IGpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgcmV0dXJuIGpzb24uc2V0dGluZ3Mud2ViUm9vdDtcclxufVxyXG5cclxuY29uc3QgZ3Jva0RpciA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuZ3JvaycpO1xyXG5jb25zdCBjb25mUGF0aCA9IHBhdGguam9pbihncm9rRGlyLCAnY29uZmlnLnlhbWwnKTtcclxuXHJcbmZ1bmN0aW9uIG1hcFVSTChjb25mOiBDb25maWcpOiBJbmRleGFibGUge1xyXG4gIGxldCB1cmxzOiBJbmRleGFibGUgPSB7fTtcclxuICBmb3IgKGxldCBzZXJ2ZXIgaW4gY29uZi5zZXJ2ZXJzKSB7XHJcbiAgICB1cmxzW2NvbmZbJ3NlcnZlcnMnXVtzZXJ2ZXJdWyd1cmwnXV0gPSBjb25mWydzZXJ2ZXJzJ11bc2VydmVyXTtcclxuICB9XHJcbiAgcmV0dXJuIHVybHM7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREZXZLZXkoaG9zdEtleTogc3RyaW5nKToge3VybDogc3RyaW5nLCBrZXk6IHN0cmluZ30ge1xyXG4gIGxldCBjb25maWcgPSB5YW1sLmxvYWQoZnMucmVhZEZpbGVTeW5jKGNvbmZQYXRoLCAndXRmOCcpKSBhcyBhbnk7XHJcbiAgbGV0IGhvc3QgPSBob3N0S2V5ID09ICcnID8gY29uZmlnLmRlZmF1bHQgOiBob3N0S2V5O1xyXG4gIGhvc3QgPSBob3N0LnRyaW0oKTtcclxuICBsZXQgdXJscyA9IG1hcFVSTChjb25maWcpO1xyXG4gIGxldCBrZXkgPSAnJztcclxuICBsZXQgdXJsID0gJyc7XHJcbiAgdHJ5IHtcclxuICAgIGxldCB1cmwgPSBuZXcgVVJMKGhvc3QpLmhyZWY7XHJcbiAgICBpZiAodXJsLmVuZHNXaXRoKCcvJykpIHVybCA9IHVybC5zbGljZSgwLCAtMSk7XHJcbiAgICBpZiAodXJsIGluIHVybHMpIGtleSA9IGNvbmZpZ1snc2VydmVycyddW3VybHNbdXJsXV1bJ2tleSddO1xyXG4gIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICBpZiAoY29uZmlnWydzZXJ2ZXJzJ11baG9zdF0gPT0gbnVsbClcclxuICAgICAgdGhyb3cgYFVua25vd24gc2VydmVyIGFsaWFzLiBQbGVhc2UgYWRkIGl0IHRvICR7Y29uZlBhdGh9YDtcclxuICAgIHVybCA9IGNvbmZpZ1snc2VydmVycyddW2hvc3RdWyd1cmwnXTtcclxuICAgIGtleSA9IGNvbmZpZ1snc2VydmVycyddW2hvc3RdWydrZXknXTtcclxuICB9XHJcbiAgcmV0dXJuIHt1cmwsIGtleX07XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRCcm93c2VyUGFnZShwdXBwZXRlZXI6IGFueSk6IFByb21pc2U8e2Jyb3dzZXI6IGFueSwgcGFnZTogYW55fT4ge1xyXG4gIGxldCB1cmw6c3RyaW5nID0gcHJvY2Vzcy5lbnYuSE9TVCA/PyAnJztcclxuICBsZXQgY2ZnID0gZ2V0RGV2S2V5KHVybCk7XHJcbiAgdXJsID0gY2ZnLnVybDtcclxuXHJcbiAgbGV0IGtleSA9IGNmZy5rZXk7XHJcbiAgbGV0IHRva2VuID0gYXdhaXQgZ2V0VG9rZW4odXJsLCBrZXkpO1xyXG4gIHVybCA9IGF3YWl0IGdldFdlYlVybCh1cmwsIHRva2VuKTtcclxuICBjb25zb2xlLmxvZyhgVXNpbmcgd2ViIHJvb3Q6ICR7dXJsfWApO1xyXG5cclxuICBsZXQgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goe1xyXG4gICAgYXJnczogWyctLWRpc2FibGUtZGV2LXNobS11c2FnZScsICctLWRpc2FibGUtZmVhdHVyZXM9c2l0ZS1wZXItcHJvY2VzcyddLFxyXG4gICAgaWdub3JlSFRUUFNFcnJvcnM6IHRydWUsXHJcbiAgfSk7XHJcblxyXG4gIGxldCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XHJcbiAgYXdhaXQgcGFnZS5nb3RvKGAke3VybH0vb2F1dGgvYCk7XHJcbiAgYXdhaXQgcGFnZS5zZXRDb29raWUoe25hbWU6ICdhdXRoJywgdmFsdWU6IHRva2VufSk7XHJcbiAgYXdhaXQgcGFnZS5ldmFsdWF0ZSgodG9rZW46IGFueSkgPT4ge1xyXG4gICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKCdhdXRoJywgdG9rZW4pO1xyXG4gIH0sIHRva2VuKTtcclxuICBhd2FpdCBwYWdlLmdvdG8odXJsKTtcclxuICB0cnkge1xyXG4gICAgYXdhaXQgcGFnZS53YWl0Rm9yU2VsZWN0b3IoJy5ncm9rLXByZWxvYWRlcicpO1xyXG4gICAgY29uc29sZS5sb2coJ2dvdCBwcmVsb2FkZXInKTtcclxuICAgIGF3YWl0IHBhZ2Uud2FpdEZvckZ1bmN0aW9uKCgpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5ncm9rLXByZWxvYWRlcicpID09IG51bGwsIHt0aW1lb3V0OiAxMDAwMDB9KTtcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgdGhyb3cgZXJyb3I7XHJcbiAgfVxyXG4gIHJldHVybiB7YnJvd3NlciwgcGFnZX07XHJcbn1cclxuXHJcblxyXG5pbnRlcmZhY2UgQ29uZmlnIHtcclxuICBzZXJ2ZXJzOiB7XHJcbiAgICBbYWxpYXM6IHN0cmluZ106IHtcclxuICAgICAgdXJsOiBzdHJpbmcsXHJcbiAgICAgIGtleTogc3RyaW5nXHJcbiAgICB9XHJcbiAgfSxcclxuICBkZWZhdWx0OiBzdHJpbmcsXHJcbn1cclxuXHJcbmludGVyZmFjZSBJbmRleGFibGUgeyBba2V5OiBzdHJpbmddOiBhbnkgfVxyXG4iXX0=
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Denotes a vector of floating poit values.
3
+ *
4
+ * @export
5
+ * @class Vector
6
+ * @extends {Float32Array}
7
+ */
8
+ export class Vector extends Float32Array {
9
+ }
10
+ /**
11
+ * Denotes a two-dimensional matrix.
12
+ *
13
+ * @export
14
+ * @class Matrix
15
+ * @extends {Array<Vector>}
16
+ */
17
+ export class Matrix extends Array {
18
+ }
19
+ /**
20
+ * Denotes cartesian coordinates.
21
+ *
22
+ * @export
23
+ * @class Coordinates
24
+ * @extends {Matrix}
25
+ */
26
+ export class Coordinates extends Matrix {
27
+ }
28
+ /**
29
+ * Denotes an array of arbitrary-typed vectors.
30
+ *
31
+ * @export
32
+ * @class Vectors
33
+ * @extends {Array<any>}
34
+ */
35
+ export class Vectors extends Array {
36
+ }
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZV9kZWNsYXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlX2RlY2xhcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLFlBQVk7Q0FBRztBQUUzQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLEtBQWE7Q0FBRztBQUU1Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sV0FBWSxTQUFRLE1BQU07Q0FBRztBQUUxQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sT0FBUSxTQUFRLEtBQVU7Q0FBRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBEZW5vdGVzIGEgdmVjdG9yIG9mIGZsb2F0aW5nIHBvaXQgdmFsdWVzLlxyXG4gKlxyXG4gKiBAZXhwb3J0XHJcbiAqIEBjbGFzcyBWZWN0b3JcclxuICogQGV4dGVuZHMge0Zsb2F0MzJBcnJheX1cclxuICovXHJcbmV4cG9ydCBjbGFzcyBWZWN0b3IgZXh0ZW5kcyBGbG9hdDMyQXJyYXkge31cclxuXHJcbi8qKlxyXG4gKiBEZW5vdGVzIGEgdHdvLWRpbWVuc2lvbmFsIG1hdHJpeC5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAY2xhc3MgTWF0cml4XHJcbiAqIEBleHRlbmRzIHtBcnJheTxWZWN0b3I+fVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE1hdHJpeCBleHRlbmRzIEFycmF5PFZlY3Rvcj4ge31cclxuXHJcbi8qKlxyXG4gKiBEZW5vdGVzIGNhcnRlc2lhbiBjb29yZGluYXRlcy5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAY2xhc3MgQ29vcmRpbmF0ZXNcclxuICogQGV4dGVuZHMge01hdHJpeH1cclxuICovXHJcbmV4cG9ydCBjbGFzcyBDb29yZGluYXRlcyBleHRlbmRzIE1hdHJpeCB7fVxyXG5cclxuLyoqXHJcbiAqIERlbm90ZXMgYW4gYXJyYXkgb2YgYXJiaXRyYXJ5LXR5cGVkIHZlY3RvcnMuXHJcbiAqXHJcbiAqIEBleHBvcnRcclxuICogQGNsYXNzIFZlY3RvcnNcclxuICogQGV4dGVuZHMge0FycmF5PGFueT59XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVmVjdG9ycyBleHRlbmRzIEFycmF5PGFueT4ge31cclxuXHJcbi8qKlxyXG4gKiBEZW5vdGVzIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGZ1bmN0aW9uIG9wdGlvbnMuXHJcbiAqXHJcbiAqIEBleHBvcnRcclxuICogQHR5cGUgT3B0aW9uc1xyXG4gKi9cclxuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtbbmFtZTogc3RyaW5nXTogYW55fTtcclxuXHJcbi8qKlxyXG4gKiBEZW5vdGVzIGN1c3RvbSBkaXN0YW5jZSBtZXRyaWMgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHZlY3RvcnMuXHJcbiAqXHJcbiAqIEBleHBvcnRcclxuICogQHR5cGUgRGlzdGFuY2VNZXRyaWNcclxuICogQHBhcmFtIHthbnl9IHYxIFRoZSBmaXJzdCB2ZWN0b3IuXHJcbiAqIEBwYXJhbSB7YW55fSB2MiBUaGUgc2Vjb25kIHZlY3Rvci5cclxuICogQHJldHVybiB7bnVtYmVyfSBEaXN0YW5jZSBiZXR3ZWVuIHRoZXNlIHR3byB2ZWN0b3JzLlxyXG4gKi9cclxuIGV4cG9ydCB0eXBlIERpc3RhbmNlTWV0cmljID0gKHYxOiBhbnksIHYyOiBhbnkpID0+IChudW1iZXIpO1xyXG4iXX0=