aiwaf-js 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/npm-publish.yml +8 -4
- package/lib/anomalyDetector.js +22 -33
- package/lib/featureUtils.js +20 -0
- package/lib/isolationForest.js +109 -89
- package/lib/wafMiddleware.js +17 -17
- package/package.json +1 -1
- package/resources/model.json +1 -0
- package/test/waf.test.js +13 -3
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
name: Publish to npm
|
|
2
|
+
|
|
1
3
|
on:
|
|
2
4
|
release:
|
|
3
5
|
types: [created]
|
|
4
|
-
|
|
5
|
-
branches: [ "main" ]
|
|
6
|
+
workflow_dispatch:
|
|
6
7
|
|
|
7
8
|
jobs:
|
|
8
9
|
build-and-publish:
|
|
@@ -10,13 +11,16 @@ jobs:
|
|
|
10
11
|
|
|
11
12
|
steps:
|
|
12
13
|
- uses: actions/checkout@v4
|
|
14
|
+
with:
|
|
15
|
+
fetch-depth: 0
|
|
16
|
+
|
|
13
17
|
- uses: actions/setup-node@v4
|
|
14
18
|
with:
|
|
15
19
|
node-version: 20
|
|
16
20
|
registry-url: https://registry.npmjs.org/
|
|
17
21
|
|
|
18
|
-
- run: npm
|
|
19
|
-
- run: npm
|
|
22
|
+
- run: npm ci
|
|
23
|
+
- run: npm test
|
|
20
24
|
- run: npm publish --access public
|
|
21
25
|
env:
|
|
22
26
|
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
package/lib/anomalyDetector.js
CHANGED
|
@@ -1,47 +1,36 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const path = require('path');
|
|
3
3
|
const { IsolationForest } = require('./isolationForest');
|
|
4
|
+
|
|
4
5
|
let model;
|
|
5
6
|
let trained = false;
|
|
6
7
|
|
|
8
|
+
const modelPath = path.join(__dirname, '..', 'resources', 'model.json');
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
const data = fs.readFileSync(modelPath, 'utf-8');
|
|
12
|
+
model = IsolationForest.fromJSON(JSON.parse(data));
|
|
13
|
+
trained = true;
|
|
14
|
+
console.log('✅ Pretrained anomaly model loaded.');
|
|
15
|
+
} catch (err) {
|
|
16
|
+
console.warn('⚠️ Failed to load pretrained model:', err);
|
|
17
|
+
}
|
|
18
|
+
|
|
7
19
|
module.exports = {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
* @param {number} opts.sampleSize Subsample size per tree (default 256)
|
|
13
|
-
*/
|
|
14
|
-
init({ nTrees = 100, sampleSize = 256 } = {}) {
|
|
15
|
-
model = new IsolationForest({ nTrees, sampleSize });
|
|
16
|
-
trained = false;
|
|
20
|
+
init(opts = {}) {
|
|
21
|
+
if (!model) {
|
|
22
|
+
model = new IsolationForest({ nTrees: opts.nTrees || 100, sampleSize: opts.sampleSize || 256 });
|
|
23
|
+
}
|
|
17
24
|
},
|
|
18
25
|
|
|
19
|
-
/**
|
|
20
|
-
* Train the isolation forest on feature vectors.
|
|
21
|
-
* @param {Array<Array<number>>} data Array of feature vectors.
|
|
22
|
-
*/
|
|
23
26
|
train(data) {
|
|
24
|
-
if (!model) this.init(); // ensure model initialized
|
|
25
27
|
model.fit(data);
|
|
26
28
|
trained = true;
|
|
27
29
|
},
|
|
28
30
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
* @param {Object} req Express request object
|
|
32
|
-
* @returns {boolean} true if anomalous, false otherwise
|
|
33
|
-
*/
|
|
34
|
-
isAnomalous(req) {
|
|
31
|
+
// ✅ Now expects a vector, not a request
|
|
32
|
+
isAnomalous(features, threshold = 0.5) {
|
|
35
33
|
if (!trained) return false;
|
|
36
|
-
|
|
37
|
-
const feat = [
|
|
38
|
-
req.path.length, // path length
|
|
39
|
-
0, // placeholder: keyword hits
|
|
40
|
-
0, // placeholder: status code index
|
|
41
|
-
0, // placeholder: response time
|
|
42
|
-
0, // placeholder: burst count
|
|
43
|
-
0 // placeholder: total 404s
|
|
44
|
-
];
|
|
45
|
-
return model.isAnomaly(feat);
|
|
34
|
+
return model.isAnomaly(features, threshold);
|
|
46
35
|
}
|
|
47
|
-
};
|
|
36
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const STATIC_KW = ['.php', '.xmlrpc', 'wp-', '.env', '.git', '.bak', 'shell'];
|
|
2
|
+
const STATUS_IDX = ['200', '403', '404', '500'];
|
|
3
|
+
|
|
4
|
+
function extractFeatures(req) {
|
|
5
|
+
const uri = req.path.toLowerCase();
|
|
6
|
+
const pathLen = uri.length;
|
|
7
|
+
|
|
8
|
+
const kwHits = STATIC_KW.reduce(
|
|
9
|
+
(count, kw) => count + (uri.includes(kw) ? 1 : 0), 0
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
const statusIdx = STATUS_IDX.indexOf(String(req.res?.statusCode || 200));
|
|
13
|
+
const rt = parseFloat(req.headers['x-response-time'] || '0');
|
|
14
|
+
const burst = 0;
|
|
15
|
+
const total404 = 0;
|
|
16
|
+
|
|
17
|
+
return [pathLen, kwHits, statusIdx, rt, burst, total404];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
module.exports = { extractFeatures };
|
package/lib/isolationForest.js
CHANGED
|
@@ -1,97 +1,117 @@
|
|
|
1
|
-
// lib/isolationForest.js
|
|
2
|
-
|
|
3
1
|
class IsolationTree {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
this.splitValue = min + Math.random() * (max - min);
|
|
27
|
-
// partition data
|
|
28
|
-
const leftData = [], rightData = [];
|
|
29
|
-
for (let row of data) {
|
|
30
|
-
(row[this.splitAttr] < this.splitValue ? leftData : rightData).push(row);
|
|
31
|
-
}
|
|
32
|
-
// build subtrees
|
|
33
|
-
this.left = new IsolationTree(this.depth+1, this.maxDepth);
|
|
34
|
-
this.right = new IsolationTree(this.depth+1, this.maxDepth);
|
|
35
|
-
this.left.fit(leftData);
|
|
36
|
-
this.right.fit(rightData);
|
|
2
|
+
constructor(depth = 0, maxDepth = 0) {
|
|
3
|
+
this.depth = depth;
|
|
4
|
+
this.maxDepth = maxDepth;
|
|
5
|
+
this.left = null;
|
|
6
|
+
this.right = null;
|
|
7
|
+
this.splitAttr = null;
|
|
8
|
+
this.splitValue = null;
|
|
9
|
+
this.size = 0;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
fit(data) {
|
|
13
|
+
this.size = data.length;
|
|
14
|
+
if (this.depth >= this.maxDepth || data.length <= 1) return;
|
|
15
|
+
const numFeatures = data[0].length;
|
|
16
|
+
this.splitAttr = Math.floor(Math.random() * numFeatures);
|
|
17
|
+
let vals = data.map(row => row[this.splitAttr]);
|
|
18
|
+
const min = Math.min(...vals), max = Math.max(...vals);
|
|
19
|
+
if (min === max) return;
|
|
20
|
+
this.splitValue = min + Math.random() * (max - min);
|
|
21
|
+
const leftData = [], rightData = [];
|
|
22
|
+
for (let row of data) {
|
|
23
|
+
(row[this.splitAttr] < this.splitValue ? leftData : rightData).push(row);
|
|
37
24
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
return this.left.pathLength(point);
|
|
48
|
-
} else {
|
|
49
|
-
return this.right.pathLength(point);
|
|
50
|
-
}
|
|
25
|
+
this.left = new IsolationTree(this.depth + 1, this.maxDepth);
|
|
26
|
+
this.right = new IsolationTree(this.depth + 1, this.maxDepth);
|
|
27
|
+
this.left.fit(leftData);
|
|
28
|
+
this.right.fit(rightData);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
pathLength(point) {
|
|
32
|
+
if (!this.left || !this.right) {
|
|
33
|
+
return this.depth + c(this.size);
|
|
51
34
|
}
|
|
35
|
+
return point[this.splitAttr] < this.splitValue
|
|
36
|
+
? this.left.pathLength(point)
|
|
37
|
+
: this.right.pathLength(point);
|
|
52
38
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
39
|
+
|
|
40
|
+
serialize() {
|
|
41
|
+
return {
|
|
42
|
+
depth: this.depth,
|
|
43
|
+
maxDepth: this.maxDepth,
|
|
44
|
+
splitAttr: this.splitAttr,
|
|
45
|
+
splitValue: this.splitValue,
|
|
46
|
+
size: this.size,
|
|
47
|
+
left: this.left ? this.left.serialize() : null,
|
|
48
|
+
right: this.right ? this.right.serialize() : null
|
|
49
|
+
};
|
|
58
50
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
51
|
+
|
|
52
|
+
static deserialize(obj) {
|
|
53
|
+
const tree = new IsolationTree(obj.depth, obj.maxDepth);
|
|
54
|
+
tree.splitAttr = obj.splitAttr;
|
|
55
|
+
tree.splitValue = obj.splitValue;
|
|
56
|
+
tree.size = obj.size;
|
|
57
|
+
tree.left = obj.left ? IsolationTree.deserialize(obj.left) : null;
|
|
58
|
+
tree.right = obj.right ? IsolationTree.deserialize(obj.right) : null;
|
|
59
|
+
return tree;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Average path length
|
|
64
|
+
function c(n) {
|
|
65
|
+
if (n <= 1) return 1;
|
|
66
|
+
return 2 * (Math.log(n - 1) + 0.5772156649) - (2 * (n - 1) / n);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
class IsolationForest {
|
|
70
|
+
constructor({ nTrees = 100, sampleSize = 256 } = {}) {
|
|
71
|
+
this.nTrees = nTrees;
|
|
72
|
+
this.sampleSize = sampleSize;
|
|
73
|
+
this.trees = [];
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
fit(data) {
|
|
77
|
+
const heightLimit = Math.ceil(Math.log2(this.sampleSize));
|
|
78
|
+
for (let i = 0; i < this.nTrees; i++) {
|
|
79
|
+
const sample = [];
|
|
80
|
+
for (let j = 0; j < this.sampleSize; j++) {
|
|
81
|
+
sample.push(data[Math.floor(Math.random() * data.length)]);
|
|
78
82
|
}
|
|
83
|
+
const tree = new IsolationTree(0, heightLimit);
|
|
84
|
+
tree.fit(sample);
|
|
85
|
+
this.trees.push(tree);
|
|
79
86
|
}
|
|
80
|
-
|
|
81
|
-
anomalyScore(point) {
|
|
82
|
-
// average path length
|
|
83
|
-
const pathLens = this.trees.map(t => t.pathLength(point));
|
|
84
|
-
const avgPath = pathLens.reduce((a,b) => a+b, 0) / this.nTrees;
|
|
85
|
-
// score: 2^(-E[h(x)]/c(sampleSize))
|
|
86
|
-
const cn = c(this.sampleSize);
|
|
87
|
-
return Math.pow(2, -avgPath / cn);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// simple threshold helper
|
|
91
|
-
isAnomaly(point, thresh = 0.5) {
|
|
92
|
-
return this.anomalyScore(point) > thresh;
|
|
93
|
-
}
|
|
94
87
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
88
|
+
|
|
89
|
+
anomalyScore(point) {
|
|
90
|
+
const pathLens = this.trees.map(t => t.pathLength(point));
|
|
91
|
+
const avgPath = pathLens.reduce((a, b) => a + b, 0) / this.nTrees;
|
|
92
|
+
return Math.pow(2, -avgPath / c(this.sampleSize));
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
isAnomaly(point, thresh = 0.5) {
|
|
96
|
+
return this.anomalyScore(point) > thresh;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
toJSON() {
|
|
100
|
+
return {
|
|
101
|
+
nTrees: this.nTrees,
|
|
102
|
+
sampleSize: this.sampleSize,
|
|
103
|
+
trees: this.trees.map(t => t.serialize())
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
static fromJSON(obj) {
|
|
108
|
+
const forest = new IsolationForest({
|
|
109
|
+
nTrees: obj.nTrees,
|
|
110
|
+
sampleSize: obj.sampleSize
|
|
111
|
+
});
|
|
112
|
+
forest.trees = obj.trees.map(IsolationTree.deserialize);
|
|
113
|
+
return forest;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
module.exports = { IsolationForest };
|
package/lib/wafMiddleware.js
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
// lib/wafMiddleware.js
|
|
2
|
-
|
|
3
1
|
const rateLimiter = require('./rateLimiter');
|
|
4
2
|
const blacklistManager = require('./blacklistManager');
|
|
5
3
|
const keywordDetector = require('./keywordDetector');
|
|
@@ -7,9 +5,9 @@ const dynamicKeyword = require('./dynamicKeyword');
|
|
|
7
5
|
const honeypotDetector = require('./honeypotDetector');
|
|
8
6
|
const uuidDetector = require('./uuidDetector');
|
|
9
7
|
const anomalyDetector = require('./anomalyDetector');
|
|
8
|
+
const { extractFeatures } = require('./featureUtils');
|
|
10
9
|
|
|
11
10
|
module.exports = function aiwaf(opts = {}) {
|
|
12
|
-
// initialize all sub‑modules
|
|
13
11
|
rateLimiter.init(opts);
|
|
14
12
|
keywordDetector.init(opts);
|
|
15
13
|
dynamicKeyword.init(opts);
|
|
@@ -18,29 +16,23 @@ module.exports = function aiwaf(opts = {}) {
|
|
|
18
16
|
anomalyDetector.init(opts);
|
|
19
17
|
|
|
20
18
|
return async (req, res, next) => {
|
|
21
|
-
// honor X‑Forwarded‑For for tests or real proxies
|
|
22
19
|
const ipHdr = req.headers['x-forwarded-for'];
|
|
23
20
|
const ip = ipHdr ? ipHdr.split(',')[0].trim() : req.ip;
|
|
24
21
|
const path = req.path.toLowerCase();
|
|
25
22
|
|
|
26
|
-
// learn every request for dynamic keywords
|
|
27
23
|
dynamicKeyword.learn(path);
|
|
28
24
|
|
|
29
|
-
// 1) IP blacklist
|
|
30
25
|
if (await blacklistManager.isBlocked(ip)) {
|
|
31
26
|
return res.status(403).json({ error: 'blocked' });
|
|
32
27
|
}
|
|
33
28
|
|
|
34
|
-
// 2) Honeypot trap
|
|
35
29
|
if (honeypotDetector.isTriggered(req)) {
|
|
36
30
|
await blacklistManager.block(ip, 'honeypot');
|
|
37
31
|
return res.status(403).json({ error: 'bot_detected' });
|
|
38
32
|
}
|
|
39
33
|
|
|
40
|
-
// 3) Rate limiting
|
|
41
34
|
await rateLimiter.record(ip);
|
|
42
35
|
|
|
43
|
-
// If recs > MAX_REQ but not yet blacklisted (flood), return 429
|
|
44
36
|
if (await rateLimiter.isBlocked(ip)) {
|
|
45
37
|
if (await blacklistManager.isBlocked(ip)) {
|
|
46
38
|
return res.status(403).json({ error: 'blocked' });
|
|
@@ -48,33 +40,41 @@ module.exports = function aiwaf(opts = {}) {
|
|
|
48
40
|
return res.status(429).json({ error: 'too_many_requests' });
|
|
49
41
|
}
|
|
50
42
|
|
|
51
|
-
// 4) Static keyword
|
|
52
43
|
const sk = keywordDetector.check(path);
|
|
53
44
|
if (sk) {
|
|
54
45
|
await blacklistManager.block(ip, `static:${sk}`);
|
|
55
46
|
return res.status(403).json({ error: 'blocked' });
|
|
56
47
|
}
|
|
57
48
|
|
|
58
|
-
// 5) Dynamic keyword
|
|
59
49
|
const dk = dynamicKeyword.check(path);
|
|
60
50
|
if (dk) {
|
|
61
51
|
await blacklistManager.block(ip, `dynamic:${dk}`);
|
|
62
52
|
return res.status(403).json({ error: 'blocked' });
|
|
63
53
|
}
|
|
64
54
|
|
|
65
|
-
// 6) UUID tamper
|
|
66
55
|
if (uuidDetector.isSuspicious(req)) {
|
|
67
56
|
await blacklistManager.block(ip, 'uuid');
|
|
68
57
|
return res.status(403).json({ error: 'blocked' });
|
|
69
58
|
}
|
|
70
59
|
|
|
71
|
-
//
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
60
|
+
// ✅ Anomaly detection only for unknown routes
|
|
61
|
+
const knownRoutes = req.app._router.stack
|
|
62
|
+
.filter(r => r.route && r.route.path)
|
|
63
|
+
.map(r => r.route.path);
|
|
64
|
+
|
|
65
|
+
const matchesKnown = knownRoutes.some(route => {
|
|
66
|
+
const pattern = new RegExp('^' + route.replace(/:\w+/g, '[^/]+') + '$');
|
|
67
|
+
return pattern.test(req.path);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
if (!matchesKnown) {
|
|
71
|
+
const features = extractFeatures(req);
|
|
72
|
+
if (await anomalyDetector.isAnomalous(features)) {
|
|
73
|
+
await blacklistManager.block(ip, 'anomaly');
|
|
74
|
+
return res.status(403).json({ error: 'blocked' });
|
|
75
|
+
}
|
|
75
76
|
}
|
|
76
77
|
|
|
77
|
-
// no block, pass through
|
|
78
78
|
next();
|
|
79
79
|
};
|
|
80
80
|
};
|
package/package.json
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"nTrees":100,"sampleSize":256,"trees":[{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":232},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":3},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":2},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":2,"splitValue":1.0390695353859254,"size":3},"splitAttr":3,"splitValue":0.018154897807514576,"size":6},"splitAttr":1,"splitValue":2.5072251084527197,"size":238},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":18},"splitAttr":3,"splitValue":0.13069383372266463,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":135},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":40},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":16},"splitAttr":3,"splitValue":0.0430664097585193,"size":56},"splitAttr":3,"splitValue":0.03166407432894987,"size":191},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":38},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":4},"right":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":3},"splitAttr":2,"splitValue":1.151363098194917,"size":4},"splitAttr":1,"splitValue":0.8101772926202886,"size":8},"right":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":29.874439471196087,"size":2},"splitAttr":0,"splitValue":15.029812721842989,"size":10},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":2},"splitAttr":3,"splitValue":0.09202337400228641,"size":12},"splitAttr":2,"splitValue":0.012479075014248497,"size":50},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":15},"splitAttr":1,"splitValue":1.4288226318448667,"size":65},"splitAttr":3,"splitValue":0.05124370335825135,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":251},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":3},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":0,"splitValue":null,"size":2},"splitAttr":0,"splitValue":63.91449458179204,"size":5},"splitAttr":1,"splitValue":2.9626728533025015,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":3,"splitValue":null,"size":2},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":63},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":132},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":1,"splitValue":2.8262553668417865,"size":133},"splitAttr":2,"splitValue":0.516652735969785,"size":196},"splitAttr":2,"splitValue":-0.9971780377960271,"size":198},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":13},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":4},"splitAttr":3,"splitValue":0.23000441458097365,"size":17},"splitAttr":3,"splitValue":0.1049780733522879,"size":215},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":24},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":36.57423064280308,"size":25},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":9},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":4},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":3},"splitAttr":1,"splitValue":2.9689709806745235,"size":7},"splitAttr":0,"splitValue":31.01404506563697,"size":16},"splitAttr":1,"splitValue":1.4953014181330289,"size":41},"splitAttr":2,"splitValue":1.2761051150608833,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":31},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":4},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":10},"splitAttr":0,"splitValue":1.3078586893875466,"size":14},"splitAttr":3,"splitValue":0.07124879352849997,"size":45},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":59},"splitAttr":1,"splitValue":0.3034477039866519,"size":104},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":10},"splitAttr":1,"splitValue":1.6569847317875421,"size":114},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":142},"splitAttr":0,"splitValue":19.864835367880048,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":83},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":167},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":6},"splitAttr":3,"splitValue":0.18792721666453335,"size":173},"splitAttr":0,"splitValue":13.68099605373191,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":254},"splitAttr":2,"splitValue":-0.25362718897911507,"size":255},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.4949980848097649,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":16},"right":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":24},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":28},"splitAttr":0,"splitValue":28.08997725184874,"size":52},"splitAttr":0,"splitValue":7.821001172130293,"size":68},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":9},"splitAttr":2,"splitValue":1.0319406522633239,"size":77},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":72},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":55.82453077193347,"size":73},"splitAttr":1,"splitValue":0.24116319502618522,"size":150},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":2},"splitAttr":0,"splitValue":66.03755079181694,"size":152},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":78},"right":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":83.6142439384943,"size":79},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":9},"splitAttr":2,"splitValue":1.068890671249742,"size":88},"right":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":2},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":3},"splitAttr":2,"splitValue":1.2422981262658392,"size":5},"splitAttr":3,"splitValue":0.04566405752683591,"size":93},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":7},"splitAttr":1,"splitValue":2.8019117659418598,"size":100},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":3},"splitAttr":3,"splitValue":0.07648942860995323,"size":103},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.1316823223374119,"size":104},"splitAttr":1,"splitValue":1.1666367559774224,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":70},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":178},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":7},"splitAttr":3,"splitValue":0.22961521702902454,"size":8},"splitAttr":3,"splitValue":0.1737170126418322,"size":186},"splitAttr":3,"splitValue":0.01428414241207198,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":74},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":182},"splitAttr":1,"splitValue":0.2167504931923987,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":157},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":1,"splitValue":2.442588976124597,"size":158},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":32},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":62},"splitAttr":1,"splitValue":1.3649558454955375,"size":94},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.01863200623479045,"size":2},"splitAttr":3,"splitValue":0.010934693418344991,"size":3},"splitAttr":0,"splitValue":52.18274668018073,"size":97},"splitAttr":0,"splitValue":28.463987540095093,"size":255},"splitAttr":2,"splitValue":-0.052428451607588356,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":251},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":5},"splitAttr":0,"splitValue":53.299507312909654,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":209},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":4},"splitAttr":3,"splitValue":0.2519962785548923,"size":213},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":43},"splitAttr":2,"splitValue":1.8373851073730623,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":53},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":67},"splitAttr":2,"splitValue":0.24443438107691873,"size":120},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":88},"splitAttr":1,"splitValue":1.2032725456328324,"size":208},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":44},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":3,"splitValue":null,"size":2},"splitAttr":1,"splitValue":2.746076870790678,"size":46},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":2},"splitAttr":0,"splitValue":42.03346636116573,"size":48},"splitAttr":2,"splitValue":1.40161287005381,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":51},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":205},"splitAttr":2,"splitValue":0.7732338594870884,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":3,"splitValue":null,"size":3},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":103},"splitAttr":2,"splitValue":0.3095983000367035,"size":106},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":6},"splitAttr":0,"splitValue":43.97600409516369,"size":112},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":3},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":13},"splitAttr":2,"splitValue":0.2748343929927244,"size":16},"splitAttr":3,"splitValue":0.02390215318305431,"size":128},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":72},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":9},"splitAttr":3,"splitValue":0.103341343963202,"size":81},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":4},"splitAttr":3,"splitValue":0.2560545352067961,"size":85},"splitAttr":3,"splitValue":0.030899968952326808,"size":213},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":43},"splitAttr":2,"splitValue":1.6218760853727616,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":254},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":2},"splitAttr":3,"splitValue":0.4620246973402094,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":168},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":58},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":15},"splitAttr":0,"splitValue":39.612533913327496,"size":73},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":65.76624532901687,"size":74},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":9},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":5},"splitAttr":0,"splitValue":42.095863823510946,"size":14},"splitAttr":2,"splitValue":1.3707610133214527,"size":88},"splitAttr":0,"splitValue":28.751409638567146,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":253},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":2},"splitAttr":0,"splitValue":82.02059724420617,"size":255},"splitAttr":2,"splitValue":-0.42007286600349825,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":136},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":120},"splitAttr":1,"splitValue":1.4579218216989465,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":254},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":3,"splitValue":null,"size":2},"splitAttr":3,"splitValue":0.31049527547845096,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":2},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":34.92795359039633,"size":3},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":48},"splitAttr":3,"splitValue":0.02351120337257634,"size":51},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":127},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":62},"splitAttr":0,"splitValue":34.546250843308655,"size":189},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.12963784890961924,"size":190},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":3},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.060252821368077074,"size":4},"splitAttr":1,"splitValue":2.521172532125446,"size":194},"splitAttr":2,"splitValue":0.2861222865281494,"size":245},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":11},"splitAttr":3,"splitValue":0.19239833605228607,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":3},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":7},"splitAttr":1,"splitValue":1.7653303057961667,"size":10},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":12},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":6},"splitAttr":3,"splitValue":0.04162311586079971,"size":18},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":29},"splitAttr":3,"splitValue":0.05098968298068611,"size":47},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":3},"splitAttr":3,"splitValue":0.2227421200418095,"size":50},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":125},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":69},"splitAttr":0,"splitValue":31.465616843655614,"size":194},"splitAttr":2,"splitValue":0.6383811993579056,"size":244},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":2},"splitAttr":0,"splitValue":79.78908468285371,"size":246},"splitAttr":3,"splitValue":0.009973313058177773,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":246},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":7},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":3},"splitAttr":3,"splitValue":0.20002065033319458,"size":10},"splitAttr":1,"splitValue":2.8641818259292497,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":79},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":177},"splitAttr":3,"splitValue":0.01689738881109126,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":14},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":42},"splitAttr":0,"splitValue":1.932013286701094,"size":56},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":2},"splitAttr":3,"splitValue":0.22817921333918315,"size":58},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":197},"splitAttr":2,"splitValue":0.9552450231388354,"size":255},"splitAttr":2,"splitValue":-0.609764232826616,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":52},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":120},"splitAttr":1,"splitValue":0.9880755750302734,"size":172},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":18},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":4},"splitAttr":3,"splitValue":0.07623639893191882,"size":22},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.11418145411550693,"size":23},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":2},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.015532044617765157,"size":3},"right":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":29},"right":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.04132337889206499,"size":30},"right":{"depth":7,"maxDepth":8,"left":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":4},"right":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":3},"splitAttr":3,"splitValue":0.030848775313679553,"size":7},"splitAttr":0,"splitValue":42.92277650796948,"size":37},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":8},"splitAttr":2,"splitValue":1.8735670775314226,"size":45},"splitAttr":1,"splitValue":1.4077992440571292,"size":48},"splitAttr":1,"splitValue":0.9832576762095755,"size":71},"splitAttr":0,"splitValue":33.29118805922725,"size":243},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":3},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":31.756177610197383,"size":4},"splitAttr":0,"splitValue":30.81965992299928,"size":5},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":2},"splitAttr":3,"splitValue":0.02870160410159593,"size":7},"splitAttr":1,"splitValue":2.4590389413163942,"size":250},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":0,"splitValue":null,"size":2},"splitAttr":0,"splitValue":32.21327563923714,"size":3},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":3},"splitAttr":1,"splitValue":0.7597906134894123,"size":6},"splitAttr":3,"splitValue":0.20974284083839478,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":82},"splitAttr":2,"splitValue":-0.4212736899846574,"size":83},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":31},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":26},"splitAttr":2,"splitValue":0.2648387407887167,"size":57},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":67},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":42},"splitAttr":0,"splitValue":34.72498096588713,"size":109},"splitAttr":1,"splitValue":1.3981739614443882,"size":166},"splitAttr":0,"splitValue":13.050970436813163,"size":249},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":5},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":54.97805441658472,"size":6},"splitAttr":2,"splitValue":0.9961818951833827,"size":7},"splitAttr":0,"splitValue":48.372341855158695,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":248},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":3},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":5},"splitAttr":3,"splitValue":0.017594350586376165,"size":8},"splitAttr":1,"splitValue":2.2890853929699793,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":138},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":4},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":1,"splitValue":0.9189900330439407,"size":5},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":68.34149050711432,"size":6},"splitAttr":0,"splitValue":43.52192124023985,"size":144},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":112},"splitAttr":1,"splitValue":1.6719552244839135,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":195},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":7},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.12243704294176538,"size":8},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":2},"splitAttr":0,"splitValue":14.902203322966654,"size":10},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":33},"splitAttr":1,"splitValue":0.09895097169380818,"size":43},"splitAttr":2,"splitValue":1.2629289692817611,"size":238},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":5},"splitAttr":0,"splitValue":44.624371109056725,"size":6},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.16979180463623347,"size":7},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":8},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":2},"splitAttr":0,"splitValue":48.99414353707397,"size":10},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.13920302765398074,"size":11},"splitAttr":1,"splitValue":1.275384941935566,"size":18},"splitAttr":0,"splitValue":42.561775607355266,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":80},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":35},"right":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":14},"splitAttr":0,"splitValue":14.26067983682374,"size":49},"right":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":11},"splitAttr":2,"splitValue":1.1244500796571109,"size":60},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":6},"splitAttr":0,"splitValue":23.970835350682428,"size":66},"right":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":14},"right":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":54},"splitAttr":0,"splitValue":20.002133975519826,"size":68},"right":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":17},"right":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":4},"splitAttr":0,"splitValue":36.5828034566161,"size":21},"splitAttr":2,"splitValue":1.4154343063977448,"size":89},"splitAttr":1,"splitValue":1.5159551261604227,"size":155},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":42.634897417603675,"size":156},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":13},"splitAttr":0,"splitValue":43.95151790605535,"size":169},"splitAttr":1,"splitValue":0.3056680395424993,"size":249},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":5},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":2},"splitAttr":2,"splitValue":1.8146883572767845,"size":7},"splitAttr":1,"splitValue":2.245104850712947,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":249},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":3},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":3},"splitAttr":2,"splitValue":1.1634158739994485,"size":6},"splitAttr":1,"splitValue":2.7319709800577057,"size":255},"splitAttr":2,"splitValue":-0.5121795678778942,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":8},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":28},"splitAttr":0,"splitValue":10.08961561099855,"size":36},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":18},"right":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":4},"right":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.13250453384479932,"size":5},"splitAttr":3,"splitValue":0.11753391141453251,"size":23},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":4},"splitAttr":3,"splitValue":0.150271079707112,"size":27},"splitAttr":3,"splitValue":0.06569222015038288,"size":63},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":52},"splitAttr":1,"splitValue":0.9664275865417586,"size":115},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":96},"splitAttr":1,"splitValue":1.7099585314690644,"size":211},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":45},"splitAttr":2,"splitValue":1.1304100109781543,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":28},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":18},"splitAttr":2,"splitValue":0.891286134210417,"size":46},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":3},"splitAttr":3,"splitValue":0.19014991101349354,"size":49},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":54},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":15},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":1,"splitValue":1.2327269773363894,"size":16},"splitAttr":2,"splitValue":1.2231482085291923,"size":70},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.20600029028561154,"size":71},"splitAttr":1,"splitValue":0.4214142020059155,"size":120},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":39},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":97},"splitAttr":1,"splitValue":0.3080812408110605,"size":136},"splitAttr":0,"splitValue":20.6446665143037,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":251},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":5},"splitAttr":0,"splitValue":45.92381281099708,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":84},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":63},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":109},"splitAttr":0,"splitValue":17.3804252489267,"size":172},"splitAttr":1,"splitValue":0.8483675466440606,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":255},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.3104026820785125,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":11.670680941113165,"size":2},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":26},"splitAttr":1,"splitValue":0.16933378813231936,"size":28},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":8},"splitAttr":3,"splitValue":0.018437934580056454,"size":36},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":4},"splitAttr":1,"splitValue":1.1614344844725544,"size":40},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":8},"splitAttr":0,"splitValue":15.681165661374763,"size":48},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":67},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":2.700199320236443,"size":2},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":2},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":2},"splitAttr":3,"splitValue":0.2091514511922493,"size":4},"splitAttr":3,"splitValue":0.15619221190240595,"size":6},"splitAttr":3,"splitValue":0.11115227017682106,"size":73},"splitAttr":3,"splitValue":0.021130878857935638,"size":121},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":135},"splitAttr":0,"splitValue":17.353548030186616,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":247},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":0,"splitValue":null,"size":3},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":3,"splitValue":null,"size":2},"splitAttr":3,"splitValue":0.01121688481141123,"size":5},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":4},"splitAttr":0,"splitValue":61.09646839354064,"size":9},"splitAttr":0,"splitValue":50.181356594619906,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":64},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":2},"splitAttr":0,"splitValue":63.409374115265294,"size":66},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":44},"right":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":7},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":24.2641217899353,"size":8},"splitAttr":3,"splitValue":0.03153497322711089,"size":52},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":89},"splitAttr":1,"splitValue":1.1556590459694789,"size":141},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":47},"splitAttr":2,"splitValue":1.025946105132344,"size":188},"splitAttr":1,"splitValue":0.6224970389618374,"size":254},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.2826237283345496,"size":2},"splitAttr":3,"splitValue":0.2561387789424267,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":18},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":96},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":27},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":4},"splitAttr":0,"splitValue":57.1254976152951,"size":31},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":108},"splitAttr":1,"splitValue":1.5066097697631529,"size":139},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":82.65888720692706,"size":140},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":39.7944282890024,"size":2},"splitAttr":1,"splitValue":2.423566533061533,"size":142},"splitAttr":0,"splitValue":22.757860136671383,"size":238},"splitAttr":0,"splitValue":7.112303384913654,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":196},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":60},"splitAttr":3,"splitValue":0.057982724881625286,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":254},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":2},"splitAttr":0,"splitValue":58.07396379975989,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":245},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":11},"splitAttr":3,"splitValue":0.2055368035865504,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":87},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":3},"splitAttr":3,"splitValue":0.009813745484701873,"size":4},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.01893477005425118,"size":5},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":163},"splitAttr":0,"splitValue":7.327136771655147,"size":168},"splitAttr":1,"splitValue":0.7747176401815887,"size":255},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":80.53469621869499,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":44},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":5},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":11},"splitAttr":0,"splitValue":20.823771121091667,"size":16},"splitAttr":3,"splitValue":0.08185778040685489,"size":60},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":7},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":4},"splitAttr":3,"splitValue":0.03485627705189094,"size":11},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":56},"splitAttr":1,"splitValue":0.5989744366633851,"size":67},"splitAttr":2,"splitValue":0.4601461496958781,"size":127},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":73},"splitAttr":1,"splitValue":1.94455770014195,"size":200},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":56},"splitAttr":2,"splitValue":1.892083753539799,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":57},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":48.408857877068016,"size":58},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":0,"splitValue":null,"size":2},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":19},"splitAttr":0,"splitValue":7.436374336682013,"size":21},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":0,"splitValue":null,"size":2},"splitAttr":0,"splitValue":27.1545273708167,"size":23},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":175},"splitAttr":1,"splitValue":0.49726958771873986,"size":198},"splitAttr":2,"splitValue":0.17331377510649282,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":58},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":139},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":0,"splitValue":null,"size":4},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":16},"splitAttr":1,"splitValue":0.0016824275021889434,"size":17},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":2},"splitAttr":3,"splitValue":0.2694634507483018,"size":19},"splitAttr":0,"splitValue":12.457786746184953,"size":23},"splitAttr":3,"splitValue":0.04019895335837297,"size":162},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":17},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":14},"splitAttr":1,"splitValue":1.2341308427696422,"size":31},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.10439792483972762,"size":32},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":3},"splitAttr":3,"splitValue":0.2541611950835064,"size":4},"splitAttr":3,"splitValue":0.12662711585864414,"size":36},"splitAttr":2,"splitValue":1.8068027404653049,"size":198},"splitAttr":2,"splitValue":0.47365251645657036,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":75},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":69},"splitAttr":1,"splitValue":0.6843578487282118,"size":144},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":112},"splitAttr":1,"splitValue":1.04787872116466,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":254},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":2},"splitAttr":3,"splitValue":0.296756655306395,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":149},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":3,"splitValue":null,"size":2},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":7.891772489036387,"size":3},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":4},"splitAttr":3,"splitValue":0.27027819225547106,"size":7},"splitAttr":3,"splitValue":0.21215603971901129,"size":156},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":74},"splitAttr":1,"splitValue":1.5663400098835136,"size":230},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":26},"splitAttr":0,"splitValue":40.518329615889144,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":201},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.17926403898939727,"size":202},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":4},"splitAttr":3,"splitValue":0.1958556708102756,"size":206},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":50},"splitAttr":2,"splitValue":1.4935857311629253,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":207},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":17},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":4},"splitAttr":3,"splitValue":0.06826887072497154,"size":21},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":5},"splitAttr":0,"splitValue":33.27986398413898,"size":26},"splitAttr":2,"splitValue":1.6801804359437158,"size":233},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":7},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":13},"splitAttr":0,"splitValue":5.205589611580348,"size":20},"splitAttr":3,"splitValue":0.10624978790400946,"size":253},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":2},"splitAttr":0,"splitValue":84.72358420912005,"size":3},"splitAttr":0,"splitValue":82.42137174471901,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":36},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":220},"splitAttr":0,"splitValue":9.499820492796712,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":212},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":44},"splitAttr":2,"splitValue":1.6031290693056017,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":165},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":19},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":13},"splitAttr":0,"splitValue":15.37529429438514,"size":32},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":27},"splitAttr":2,"splitValue":1.4574868617854535,"size":59},"splitAttr":3,"splitValue":0.057835522773905544,"size":224},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":2},"splitAttr":0,"splitValue":12.752864869747626,"size":3},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":28.38920437452901,"size":4},"splitAttr":3,"splitValue":0.2217186704628454,"size":228},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":28},"splitAttr":0,"splitValue":38.62862584744329,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":36},"right":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":3},"splitAttr":3,"splitValue":0.1614110502518954,"size":4},"splitAttr":3,"splitValue":0.1164424790508223,"size":40},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":5},"splitAttr":3,"splitValue":0.21289444714876393,"size":45},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":14},"splitAttr":2,"splitValue":0.1674208941292843,"size":59},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":12},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":42},"splitAttr":3,"splitValue":0.010895627667325151,"size":54},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":29},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":27},"splitAttr":3,"splitValue":0.01820170758426023,"size":56},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":5},"splitAttr":3,"splitValue":0.0736121906266844,"size":61},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":73},"splitAttr":1,"splitValue":1.5679065107041559,"size":134},"splitAttr":3,"splitValue":0.012784648569546198,"size":188},"splitAttr":1,"splitValue":0.5842951982814877,"size":247},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":9},"splitAttr":1,"splitValue":2.130447860314339,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":88},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":52},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":65},"splitAttr":1,"splitValue":1.6567173505061847,"size":117},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":39},"splitAttr":2,"splitValue":1.5062183324286398,"size":156},"splitAttr":1,"splitValue":0.36681001830682813,"size":244},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":7},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":5},"splitAttr":2,"splitValue":1.1622334287194838,"size":12},"splitAttr":1,"splitValue":2.516646938232622,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":10},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":9},"splitAttr":0,"splitValue":4.358468863504891,"size":19},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":16},"right":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":3},"splitAttr":3,"splitValue":0.09674272192713852,"size":19},"right":{"depth":7,"maxDepth":8,"left":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":64},"right":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":8},"splitAttr":3,"splitValue":0.086424727296836,"size":72},"splitAttr":0,"splitValue":8.140685771657534,"size":91},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":3},"splitAttr":3,"splitValue":0.12021408505505186,"size":94},"right":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":47},"right":{"depth":7,"maxDepth":8,"left":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":3},"splitAttr":3,"splitValue":0.09429274845878587,"size":4},"splitAttr":3,"splitValue":0.08612636213024331,"size":51},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":8},"splitAttr":2,"splitValue":1.6617984637971763,"size":59},"splitAttr":0,"splitValue":18.812492064508216,"size":153},"splitAttr":0,"splitValue":7.612557635858257,"size":172},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":0,"splitValue":null,"size":2},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.25951017047707553,"size":3},"splitAttr":3,"splitValue":0.2201374783926,"size":175},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.48389238989975875,"size":176},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":11},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":4},"splitAttr":3,"splitValue":0.08124017361273712,"size":15},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.06516471385942887,"size":2},"splitAttr":0,"splitValue":40.6805877251555,"size":17},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":51},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":12},"splitAttr":3,"splitValue":0.037463391310594875,"size":63},"splitAttr":1,"splitValue":1.8780351043535324,"size":80},"splitAttr":0,"splitValue":29.78598806434138,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":5},"right":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":2},"right":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":9},"splitAttr":0,"splitValue":12.011478044858043,"size":11},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":24},"splitAttr":3,"splitValue":0.03979120289019637,"size":35},"splitAttr":3,"splitValue":0.028231554726716474,"size":40},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":17},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":52},"splitAttr":0,"splitValue":10.511917007815253,"size":69},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":12},"splitAttr":3,"splitValue":0.036450353095731115,"size":81},"splitAttr":2,"splitValue":0.9716327077658213,"size":121},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":9},"right":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":41.0354944420908,"size":10},"right":{"depth":7,"maxDepth":8,"left":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":45},"right":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":7},"splitAttr":3,"splitValue":0.027750716577897266,"size":52},"splitAttr":2,"splitValue":0.09069260560655867,"size":62},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":2},"splitAttr":0,"splitValue":49.70871549882598,"size":64},"right":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":2},"right":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":0,"splitValue":null,"size":2},"splitAttr":1,"splitValue":1.6678920788679468,"size":4},"splitAttr":2,"splitValue":0.17737230152686445,"size":5},"splitAttr":0,"splitValue":50.05133829651629,"size":69},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":4},"splitAttr":3,"splitValue":0.06607061825655096,"size":73},"splitAttr":0,"splitValue":31.879092896682153,"size":194},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":2},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":4},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":2},"splitAttr":3,"splitValue":0.2632758550658744,"size":6},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":2,"splitValue":0.49633596092256593,"size":7},"splitAttr":3,"splitValue":0.17416892688537208,"size":9},"splitAttr":3,"splitValue":0.12208217446342962,"size":203},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":53},"splitAttr":2,"splitValue":1.3290481887930876,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":36},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":2},"splitAttr":0,"splitValue":41.30883587123608,"size":38},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":93},"splitAttr":2,"splitValue":0.20041035398871498,"size":131},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":67},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":13},"splitAttr":3,"splitValue":0.03908753596740887,"size":80},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.01904945398466017,"size":2},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":2},"splitAttr":2,"splitValue":1.875162685631743,"size":4},"splitAttr":1,"splitValue":2.254623510784489,"size":84},"splitAttr":1,"splitValue":1.5378046877489695,"size":215},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":39},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":1,"splitValue":0.32270799373949144,"size":2},"splitAttr":3,"splitValue":0.2621833040292809,"size":41},"splitAttr":3,"splitValue":0.07957786624997337,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":2},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":23},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":36},"splitAttr":0,"splitValue":12.200220474576174,"size":59},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":68.17850348962538,"size":60},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":192},"splitAttr":2,"splitValue":0.7037680654086196,"size":252},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.5044349451988848,"size":2},"splitAttr":3,"splitValue":0.3335510110789435,"size":254},"splitAttr":2,"splitValue":-0.37409868491452714,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":60},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":196},"splitAttr":2,"splitValue":0.5375578964411918,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":5},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":64},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":31.935613338967872,"size":2},"splitAttr":3,"splitValue":0.17707725915452202,"size":66},"splitAttr":3,"splitValue":0.02940098202396065,"size":71},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":2},"splitAttr":3,"splitValue":0.21935027688882194,"size":73},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":146},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":37},"splitAttr":2,"splitValue":1.9818520395045247,"size":183},"splitAttr":1,"splitValue":0.5124416331220034,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":254},"splitAttr":2,"splitValue":-0.694562336296551,"size":255},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":78.74045544798486,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":193},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":61},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":2},"splitAttr":0,"splitValue":75.18588666485599,"size":63},"splitAttr":0,"splitValue":31.4090279741928,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":7},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":48},"splitAttr":0,"splitValue":4.482189511019696,"size":55},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":16},"right":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":2},"splitAttr":2,"splitValue":1.632077692746353,"size":18},"right":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":3},"right":{"depth":7,"maxDepth":8,"left":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":40},"right":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":75},"splitAttr":1,"splitValue":1.6633048219758073,"size":115},"splitAttr":1,"splitValue":0.47871571891140263,"size":118},"splitAttr":0,"splitValue":9.060620039980854,"size":136},"right":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":4},"splitAttr":3,"splitValue":0.05718243709579659,"size":5},"right":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":9},"right":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":10},"splitAttr":3,"splitValue":0.060204641800962286,"size":19},"splitAttr":1,"splitValue":0.3381638007352179,"size":24},"splitAttr":3,"splitValue":0.049031333861810696,"size":160},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":5},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":2},"splitAttr":2,"splitValue":1.2581601522916497,"size":7},"splitAttr":1,"splitValue":2.9465241111172835,"size":167},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":3},"splitAttr":1,"splitValue":0.385929614809021,"size":4},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":3},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":3},"splitAttr":3,"splitValue":0.21257680768484796,"size":6},"splitAttr":3,"splitValue":0.11728708366994596,"size":10},"splitAttr":3,"splitValue":0.08885848982062794,"size":177},"splitAttr":2,"splitValue":0.46872240469532644,"size":232},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":21},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":3},"splitAttr":0,"splitValue":50.77635694038341,"size":24},"splitAttr":0,"splitValue":43.56936005701017,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":256}]}
|
package/test/waf.test.js
CHANGED
|
@@ -3,11 +3,12 @@ const express = require('express');
|
|
|
3
3
|
const path = require('path');
|
|
4
4
|
|
|
5
5
|
process.env.NODE_ENV = 'test';
|
|
6
|
-
jest.setTimeout(15000);
|
|
6
|
+
jest.setTimeout(15000);
|
|
7
7
|
|
|
8
|
-
const db = require('../utils/db');
|
|
8
|
+
const db = require('../utils/db');
|
|
9
9
|
const aiwaf = require('../index');
|
|
10
10
|
const dynamicKeyword = require('../lib/dynamicKeyword');
|
|
11
|
+
const anomalyDetector = require('../lib/anomalyDetector');
|
|
11
12
|
|
|
12
13
|
beforeAll(async () => {
|
|
13
14
|
const hasTable = await db.schema.hasTable('blocked_ips');
|
|
@@ -100,6 +101,15 @@ describe('AIWAF-JS Middleware', () => {
|
|
|
100
101
|
.set('X-Forwarded-For', ip)
|
|
101
102
|
.expect(403, { error: 'blocked' });
|
|
102
103
|
});
|
|
104
|
+
|
|
105
|
+
it('flags and blocks anomalous paths', async () => {
|
|
106
|
+
// Fake a long weird path to trigger the anomaly detector
|
|
107
|
+
const longPath = '/' + 'a'.repeat(200);
|
|
108
|
+
await request(app)
|
|
109
|
+
.get(longPath)
|
|
110
|
+
.set('X-Forwarded-For', ip)
|
|
111
|
+
.expect(403, { error: 'blocked' }); // should be flagged as anomalous
|
|
112
|
+
});
|
|
103
113
|
});
|
|
104
114
|
|
|
105
|
-
afterAll(() => db.destroy());
|
|
115
|
+
afterAll(() => db.destroy());
|