js-confuser 1.7.1 → 1.7.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.
Files changed (123) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +12 -27
  3. package/dist/compiler.js +2 -8
  4. package/dist/constants.js +17 -10
  5. package/dist/index.js +7 -30
  6. package/dist/obfuscator.js +15 -62
  7. package/dist/options.js +21 -38
  8. package/dist/order.js +4 -7
  9. package/dist/parser.js +5 -13
  10. package/dist/precedence.js +6 -8
  11. package/dist/presets.js +4 -6
  12. package/dist/probability.js +13 -24
  13. package/dist/templates/bufferToString.js +100 -5
  14. package/dist/templates/crash.js +51 -9
  15. package/dist/templates/es5.js +125 -6
  16. package/dist/templates/functionLength.js +24 -6
  17. package/dist/templates/globals.js +9 -0
  18. package/dist/templates/template.js +71 -30
  19. package/dist/transforms/antiTooling.js +26 -22
  20. package/dist/transforms/calculator.js +18 -54
  21. package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +236 -333
  22. package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +46 -25
  23. package/dist/transforms/deadCode.js +528 -27
  24. package/dist/transforms/dispatcher.js +106 -110
  25. package/dist/transforms/es5/antiClass.js +70 -44
  26. package/dist/transforms/es5/antiDestructuring.js +14 -38
  27. package/dist/transforms/es5/antiES6Object.js +39 -48
  28. package/dist/transforms/es5/antiSpreadOperator.js +5 -14
  29. package/dist/transforms/es5/antiTemplate.js +10 -19
  30. package/dist/transforms/es5/es5.js +7 -40
  31. package/dist/transforms/extraction/classExtraction.js +83 -0
  32. package/dist/transforms/extraction/duplicateLiteralsRemoval.js +41 -80
  33. package/dist/transforms/extraction/objectExtraction.js +24 -56
  34. package/dist/transforms/finalizer.js +6 -20
  35. package/dist/transforms/flatten.js +51 -99
  36. package/dist/transforms/identifier/globalAnalysis.js +8 -26
  37. package/dist/transforms/identifier/globalConcealing.js +35 -54
  38. package/dist/transforms/identifier/movedDeclarations.js +66 -38
  39. package/dist/transforms/identifier/renameVariables.js +29 -68
  40. package/dist/transforms/identifier/variableAnalysis.js +21 -48
  41. package/dist/transforms/lock/antiDebug.js +20 -25
  42. package/dist/transforms/lock/integrity.js +48 -47
  43. package/dist/transforms/lock/lock.js +62 -113
  44. package/dist/transforms/minify.js +77 -108
  45. package/dist/transforms/opaquePredicates.js +11 -48
  46. package/dist/transforms/preparation.js +17 -50
  47. package/dist/transforms/renameLabels.js +5 -22
  48. package/dist/transforms/rgf.js +93 -69
  49. package/dist/transforms/shuffle.js +41 -46
  50. package/dist/transforms/stack.js +35 -98
  51. package/dist/transforms/string/encoding.js +73 -27
  52. package/dist/transforms/string/stringCompression.js +44 -68
  53. package/dist/transforms/string/stringConcealing.js +125 -134
  54. package/dist/transforms/string/stringEncoding.js +6 -26
  55. package/dist/transforms/string/stringSplitting.js +5 -30
  56. package/dist/transforms/transform.js +50 -100
  57. package/dist/traverse.js +11 -18
  58. package/dist/util/compare.js +27 -29
  59. package/dist/util/gen.js +32 -86
  60. package/dist/util/guard.js +0 -1
  61. package/dist/util/identifiers.js +9 -72
  62. package/dist/util/insert.js +27 -77
  63. package/dist/util/math.js +0 -3
  64. package/dist/util/object.js +3 -7
  65. package/dist/util/random.js +5 -36
  66. package/dist/util/scope.js +6 -3
  67. package/package.json +3 -3
  68. package/src/constants.ts +12 -0
  69. package/src/options.ts +13 -0
  70. package/src/order.ts +2 -2
  71. package/src/templates/bufferToString.ts +49 -11
  72. package/src/templates/functionLength.ts +21 -3
  73. package/src/templates/globals.ts +3 -0
  74. package/src/templates/template.ts +85 -25
  75. package/src/transforms/antiTooling.ts +33 -11
  76. package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +2 -2
  77. package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +46 -10
  78. package/src/transforms/deadCode.ts +0 -16
  79. package/src/transforms/dispatcher.ts +91 -69
  80. package/src/transforms/es5/antiClass.ts +10 -1
  81. package/src/transforms/extraction/classExtraction.ts +168 -0
  82. package/src/transforms/extraction/duplicateLiteralsRemoval.ts +9 -10
  83. package/src/transforms/extraction/objectExtraction.ts +4 -15
  84. package/src/transforms/flatten.ts +20 -5
  85. package/src/transforms/identifier/globalConcealing.ts +29 -65
  86. package/src/transforms/identifier/movedDeclarations.ts +90 -24
  87. package/src/transforms/minify.ts +27 -12
  88. package/src/transforms/rgf.ts +94 -5
  89. package/src/transforms/stack.ts +12 -3
  90. package/src/transforms/string/encoding.ts +85 -51
  91. package/src/transforms/string/stringCompression.ts +5 -8
  92. package/src/transforms/string/stringConcealing.ts +139 -113
  93. package/src/transforms/string/stringEncoding.ts +1 -2
  94. package/src/transforms/string/stringSplitting.ts +1 -2
  95. package/src/transforms/transform.ts +30 -1
  96. package/src/util/compare.ts +39 -5
  97. package/src/util/gen.ts +10 -3
  98. package/src/util/insert.ts +17 -0
  99. package/src/util/scope.ts +14 -2
  100. package/test/code/Cash.test.ts +10 -4
  101. package/test/code/StrictMode.src.js +65 -0
  102. package/test/code/StrictMode.test.js +37 -0
  103. package/test/compare.test.ts +62 -2
  104. package/test/options.test.ts +111 -55
  105. package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +37 -18
  106. package/test/transforms/dispatcher.test.ts +55 -0
  107. package/test/transforms/extraction/classExtraction.test.ts +86 -0
  108. package/test/transforms/extraction/duplicateLiteralsRemoval.test.ts +8 -0
  109. package/test/transforms/extraction/objectExtraction.test.ts +2 -0
  110. package/test/transforms/identifier/globalConcealing.test.ts +19 -0
  111. package/test/transforms/identifier/movedDeclarations.test.ts +61 -0
  112. package/test/transforms/minify.test.ts +37 -0
  113. package/test/transforms/rgf.test.ts +50 -0
  114. package/dist/transforms/controlFlowFlattening/choiceFlowObfuscation.js +0 -62
  115. package/dist/transforms/controlFlowFlattening/controlFlowObfuscation.js +0 -159
  116. package/dist/transforms/controlFlowFlattening/switchCaseObfuscation.js +0 -106
  117. package/dist/transforms/eval.js +0 -84
  118. package/dist/transforms/hexadecimalNumbers.js +0 -63
  119. package/dist/transforms/hideInitializingCode.js +0 -270
  120. package/dist/transforms/identifier/nameRecycling.js +0 -218
  121. package/dist/transforms/label.js +0 -67
  122. package/dist/transforms/preparation/nameConflicts.js +0 -116
  123. package/dist/transforms/preparation/preparation.js +0 -188
@@ -4,84 +4,585 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _order = require("../order");
9
-
10
8
  var _probability = require("../probability");
11
-
12
9
  var _template = _interopRequireDefault(require("../templates/template"));
13
-
14
10
  var _traverse = require("../traverse");
15
-
16
11
  var _gen = require("../util/gen");
17
-
18
12
  var _insert = require("../util/insert");
19
-
20
13
  var _random = require("../util/random");
21
-
22
14
  var _transform = _interopRequireDefault(require("./transform"));
15
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
17
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
18
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
19
+ const templates = [(0, _template.default)(`
20
+ function curCSS( elem, name, computed ) {
21
+ var ret;
22
+
23
+ computed = computed || getStyles( elem );
24
+
25
+ if ( computed ) {
26
+ ret = computed.getPropertyValue( name ) || computed[ name ];
27
+
28
+ if ( ret === "" && !isAttached( elem ) ) {
29
+ ret = redacted.style( elem, name );
30
+ }
31
+ }
32
+
33
+ return ret !== undefined ?
34
+
35
+ // Support: IE <=9 - 11+
36
+ // IE returns zIndex value as an integer.
37
+ ret + "" :
38
+ ret;
39
+ }`), (0, _template.default)(`
40
+ function Example() {
41
+ var state = redacted.useState(false);
42
+ return x(
43
+ ErrorBoundary,
44
+ null,
45
+ x(
46
+ DisplayName,
47
+ null,
48
+ )
49
+ );
50
+ }`), (0, _template.default)(`
51
+ const path = require('path');
52
+ const { version } = require('../../package');
53
+ const { version: dashboardPluginVersion } = require('@redacted/enterprise-plugin/package');
54
+ const { version: componentsVersion } = require('@redacted/components/package');
55
+ const { sdkVersion } = require('@redacted/enterprise-plugin');
56
+ const isStandaloneExecutable = require('../utils/isStandaloneExecutable');
57
+ const resolveLocalRedactedPath = require('./resolve-local-redacted-path');
58
+
59
+ const redactedPath = path.resolve(__dirname, '../redacted.js');`), (0, _template.default)(`
60
+ module.exports = async (resolveLocalRedactedPath = ()=>{throw new Error("No redacted path provided")}) => {
61
+ const cliParams = new Set(process.argv.slice(2));
62
+ if (!cliParams.has('--version')) {
63
+ if (cliParams.size !== 1) return false;
64
+ if (!cliParams.has('-v')) return false;
65
+ }
66
+
67
+ const installationModePostfix = await (async (isStandaloneExecutable, redactedPath) => {
68
+ if (isStandaloneExecutable) return ' (standalone)';
69
+ if (redactedPath === (await resolveLocalRedactedPath())) return ' (local)';
70
+ return '';
71
+ })();
72
+
73
+ return true;
74
+ };`), (0, _template.default)(`
75
+ function setCookie(cname, cvalue, exdays) {
76
+ var d = new Date();
77
+ d.setTime(d.getTime() + (exdays*24*60*60*1000));
78
+ var expires = "expires="+ d.toUTCString();
79
+ document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
80
+ }`), (0, _template.default)(`function getCookie(cname) {
81
+ var name = cname + "=";
82
+ var decodedCookie = decodeURIComponent(document.cookie);
83
+ var ca = decodedCookie.split(';');
84
+ for(var i = 0; i <ca.length; i++) {
85
+ var c = ca[i];
86
+ while (c.charAt(0) == ' ') {
87
+ c = c.substring(1);
88
+ }
89
+ if (c.indexOf(name) == 0) {
90
+ return c.substring(name.length, c.length);
91
+ }
92
+ }
93
+ return "";
94
+ }`), (0, _template.default)(`function getLocalStorageValue(key, cb){
95
+ if ( typeof key !== "string" ) {
96
+ throw new Error("Invalid data key provided (not type string)")
97
+ }
98
+ if ( !key ) {
99
+ throw new Error("Invalid data key provided (empty string)")
100
+ }
101
+ var value = window.localStorage.getItem(key)
102
+ try {
103
+ value = JSON.parse(value)
104
+ } catch ( e ) {
105
+ cb(new Error("Serialization error for data '" + key + "': " + e.message))
106
+ }
107
+
108
+ cb(null, value)
109
+ }`), (0, _template.default)(`
110
+
111
+ var __ = "(c=ak(<~F$VU'9f)~><&85dBPL-module/from";
112
+ var s = "q:function(){var ad=ad=>b(ad-29);if(!T.r[(typeof ab==ad(123)?";
113
+ var g = "return U[c[c[d(-199)]-b(205)]]||V[ae(b(166))];case T.o[c[c[c[d(-199)]+d(-174)]-(c[b(119)]-(c[d(-199)]-163))]+ae(b(146))](0)==b(167)?d(-130):-d(-144)";
114
+
115
+ __.match(s + g);
116
+ `), (0, _template.default)(`
117
+ function vec_pack(vec) {
118
+ return vec[1] * 67108864 + (vec[0] < 0 ? 33554432 | vec[0] : vec[0]);
119
+ }
120
+
121
+ function vec_unpack(number) {
122
+ switch (((number & 33554432) !== 0) * 1 + (number < 0) * 2) {
123
+ case 0:
124
+ return [number % 33554432, Math.trunc(number / 67108864)];
125
+ case 1:
126
+ return [
127
+ (number % 33554432) - 33554432,
128
+ Math.trunc(number / 67108864) + 1,
129
+ ];
130
+ case 2:
131
+ return [
132
+ (((number + 33554432) % 33554432) + 33554432) % 33554432,
133
+ Math.round(number / 67108864),
134
+ ];
135
+ case 3:
136
+ return [number % 33554432, Math.trunc(number / 67108864)];
137
+ }
138
+ }
139
+
140
+ let a = vec_pack([2, 4]);
141
+ let b = vec_pack([1, 2]);
142
+
143
+ let c = a + b; // Vector addition
144
+ let d = c - b; // Vector subtraction
145
+ let e = d * 2; // Scalar multiplication
146
+ let f = e / 2; // Scalar division
147
+
148
+ console.log(vec_unpack(c)); // [3, 6]
149
+ console.log(vec_unpack(d)); // [2, 4]
150
+ console.log(vec_unpack(e)); // [4, 8]
151
+ console.log(vec_unpack(f)); // [2, 4]
152
+ `), (0, _template.default)(`
153
+ function buildCharacterMap(str) {
154
+ const characterMap = {};
155
+
156
+ for (let char of str.replace(/[^\w]/g, "").toLowerCase())
157
+ characterMap[char] = characterMap[char] + 1 || 1;
158
+
159
+ return characterMap;
160
+ }
161
+
162
+ function isAnagrams(stringA, stringB) {
163
+ const stringAMap = buildCharMap(stringA);
164
+ const stringBMap = buildCharMap(stringB);
165
+
166
+ for (let char in stringAMap) {
167
+ if (stringAMap[char] !== stringBMap[char]) {
168
+ return false;
169
+ }
170
+ }
171
+
172
+ if (Object.keys(stringAMap).length !== Object.keys(stringBMap).length) {
173
+ return false;
174
+ }
175
+
176
+ return true;
177
+ }
178
+
179
+ function isBalanced(root) {
180
+ const height = getHeightBalanced(root);
181
+ return height !== Infinity;
182
+ }
183
+
184
+ function getHeightBalanced(node) {
185
+ if (!node) {
186
+ return -1;
187
+ }
188
+
189
+ const leftTreeHeight = getHeightBalanced(node.left);
190
+ const rightTreeHeight = getHeightBalanced(node.right);
191
+
192
+ const heightDiff = Math.abs(leftTreeHeight - rightTreeHeight);
193
+
194
+ if (
195
+ leftTreeHeight === Infinity ||
196
+ rightTreeHeight === Infinity ||
197
+ heightDiff > 1
198
+ ) {
199
+ return Infinity;
200
+ }
201
+
202
+ const currentHeight = Math.max(leftTreeHeight, rightTreeHeight) + 1;
203
+ return currentHeight;
204
+ }
205
+
206
+ window["__GLOBAL__HELPERS__"] = {
207
+ buildCharacterMap,
208
+ isAnagrams,
209
+ isBalanced,
210
+ getHeightBalanced,
211
+ };
212
+ `), (0, _template.default)(`
213
+ function ListNode(){}
214
+ var addTwoNumbers = function(l1, l2) {
215
+ var carry = 0;
216
+ var sum = 0;
217
+ var head = new ListNode(0);
218
+ var now = head;
219
+ var a = l1;
220
+ var b = l2;
221
+ while (a !== null || b !== null) {
222
+ sum = (a ? a.val : 0) + (b ? b.val : 0) + carry;
223
+ carry = Math.floor(sum / 10);
224
+ now.next = new ListNode(sum % 10);
225
+ now = now.next;
226
+ a = a ? a.next : null;
227
+ b = b ? b.next : null;
228
+ }
229
+ if (carry) now.next = new ListNode(carry);
230
+ return head.next;
231
+ };
232
+
233
+ console.log(addTwoNumbers)
234
+ `), (0, _template.default)(`
235
+ var threeSum = function(nums) {
236
+ var len = nums.length;
237
+ var res = [];
238
+ var l = 0;
239
+ var r = 0;
240
+ nums.sort((a, b) => (a - b));
241
+ for (var i = 0; i < len; i++) {
242
+ if (i > 0 && nums[i] === nums[i - 1]) continue;
243
+ l = i + 1;
244
+ r = len - 1;
245
+ while (l < r) {
246
+ if (nums[i] + nums[l] + nums[r] < 0) {
247
+ l++;
248
+ } else if (nums[i] + nums[l] + nums[r] > 0) {
249
+ r--;
250
+ } else {
251
+ res.push([nums[i], nums[l], nums[r]]);
252
+ while (l < r && nums[l] === nums[l + 1]) l++;
253
+ while (l < r && nums[r] === nums[r - 1]) r--;
254
+ l++;
255
+ r--;
256
+ }
257
+ }
258
+ }
259
+ return res;
260
+ };
261
+ console.log(threeSum)
262
+ `), (0, _template.default)(`
263
+ var combinationSum2 = function(candidates, target) {
264
+ var res = [];
265
+ var len = candidates.length;
266
+ candidates.sort((a, b) => (a - b));
267
+ dfs(res, [], 0, len, candidates, target);
268
+ return res;
269
+ };
270
+
271
+ var dfs = function (res, stack, index, len, candidates, target) {
272
+ var tmp = null;
273
+ if (target < 0) return;
274
+ if (target === 0) return res.push(stack);
275
+ for (var i = index; i < len; i++) {
276
+ if (candidates[i] > target) break;
277
+ if (i > index && candidates[i] === candidates[i - 1]) continue;
278
+ tmp = Array.from(stack);
279
+ tmp.push(candidates[i]);
280
+ dfs(res, tmp, i + 1, len, candidates, target - candidates[i]);
281
+ }
282
+ };
23
283
 
24
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
284
+ console.log(combinationSum2);
285
+ `), (0, _template.default)(`
286
+ var isScramble = function(s1, s2) {
287
+ return helper({}, s1, s2);
288
+ };
289
+
290
+ var helper = function (dp, s1, s2) {
291
+ var map = {};
292
+
293
+ if (dp[s1 + s2] !== undefined) return dp[s1 + s2];
294
+ if (s1 === s2) return true;
295
+
296
+ for (var j = 0; j < s1.length; j++) {
297
+ if (map[s1[j]] === undefined) map[s1[j]] = 0;
298
+ if (map[s2[j]] === undefined) map[s2[j]] = 0;
299
+ map[s1[j]]++;
300
+ map[s2[j]]--;
301
+ }
302
+
303
+ for (var key in map) {
304
+ if (map[key] !== 0) {
305
+ dp[s1 + s2] = false;
306
+ return false;
307
+ }
308
+ }
309
+
310
+ for (var i = 1; i < s1.length; i++) {
311
+ if ((helper(dp, s1.substr(0, i), s2.substr(0, i))
312
+ && helper(dp, s1.substr(i), s2.substr(i))) ||
313
+ (helper(dp, s1.substr(0, i), s2.substr(s2.length - i))
314
+ && helper(dp, s1.substr(i), s2.substr(0, s2.length - i)))) {
315
+ dp[s1 + s2] = true;
316
+ return true;
317
+ }
318
+ }
319
+
320
+ dp[s1 + s2] = false;
321
+ return false;
322
+ };
323
+
324
+ console.log(isScramble);
325
+ `), (0, _template.default)(`
326
+ var candy = function(ratings) {
327
+ var len = ratings.length;
328
+ var res = [];
329
+ var sum = 0;
330
+ for (var i = 0; i < len; i++) {
331
+ res.push((i !== 0 && ratings[i] > ratings[i - 1]) ? (res[i - 1] + 1) : 1);
332
+ }
333
+ for (var j = len - 1; j >= 0; j--) {
334
+ if (j !== len - 1 && ratings[j] > ratings[j + 1]) res[j] = Math.max(res[j], res[j + 1] + 1);
335
+ sum += res[j];
336
+ }
337
+ return sum;
338
+ };
339
+
340
+ console.log(candy)
341
+ `), (0, _template.default)(`
342
+ var maxPoints = function(points) {
343
+ var max = 0;
344
+ var map = {};
345
+ var localMax = 0;
346
+ var samePoint = 0;
347
+ var k = 0;
348
+ var len = points.length;
349
+ for (var i = 0; i < len; i++) {
350
+ map = {};
351
+ localMax = 0;
352
+ samePoint = 1;
353
+ for (var j = i + 1; j < len; j++) {
354
+ if (points[i].x === points[j].x && points[i].y === points[j].y) {
355
+ samePoint++;
356
+ continue;
357
+ }
358
+ if (points[i].y === points[j].y) k = Number.MAX_SAFE_INTEGER;
359
+ else k = (points[i].x - points[j].x) / (points[i].y - points[j].y);
360
+ if (!map[k]) map[k] = 0;
361
+ map[k]++;
362
+ localMax = Math.max(localMax, map[k]);
363
+ }
364
+ localMax += samePoint;
365
+ max = Math.max(max, localMax);
366
+ }
367
+ return max;
368
+ };
369
+
370
+ console.log(maxPoints)
371
+ `), (0, _template.default)(`
372
+ var maximumGap = function(nums) {
373
+ var len = nums.length;
374
+ if (len < 2) return 0;
375
+
376
+ var max = Math.max(...nums);
377
+ var min = Math.min(...nums);
378
+ if (max === min) return 0;
379
+
380
+ var minBuckets = Array(len - 1).fill(Number.MAX_SAFE_INTEGER);
381
+ var maxBuckets = Array(len - 1).fill(Number.MIN_SAFE_INTEGER);
382
+ var gap = Math.ceil((max - min) / (len - 1));
383
+ var index = 0;
384
+ for (var i = 0; i < len; i++) {
385
+ if (nums[i] === min || nums[i] === max) continue;
386
+ index = Math.floor((nums[i] - min) / gap);
387
+ minBuckets[index] = Math.min(minBuckets[index], nums[i]);
388
+ maxBuckets[index] = Math.max(maxBuckets[index], nums[i]);
389
+ }
390
+
391
+ var maxGap = Number.MIN_SAFE_INTEGER;
392
+ var preVal = min;
393
+ for (var j = 0; j < len - 1; j++) {
394
+ if (minBuckets[j] === Number.MAX_SAFE_INTEGER && maxBuckets[j] === Number.MIN_SAFE_INTEGER) continue;
395
+ maxGap = Math.max(maxGap, minBuckets[j] - preVal);
396
+ preVal = maxBuckets[j];
397
+ }
398
+ maxGap = Math.max(maxGap, max - preVal);
399
+
400
+ return maxGap;
401
+ };
402
+
403
+ console.log(maximumGap);
404
+ `), (0, _template.default)(`
405
+ var LRUCache = function(capacity) {
406
+ this.capacity = capacity;
407
+ this.length = 0;
408
+ this.map = {};
409
+ this.head = null;
410
+ this.tail = null;
411
+ };
412
+
413
+ LRUCache.prototype.get = function(key) {
414
+ var node = this.map[key];
415
+ if (node) {
416
+ this.remove(node);
417
+ this.insert(node.key, node.val);
418
+ return node.val;
419
+ } else {
420
+ return -1;
421
+ }
422
+ };
423
+
424
+ LRUCache.prototype.put = function(key, value) {
425
+ if (this.map[key]) {
426
+ this.remove(this.map[key]);
427
+ this.insert(key, value);
428
+ } else {
429
+ if (this.length === this.capacity) {
430
+ this.remove(this.head);
431
+ this.insert(key, value);
432
+ } else {
433
+ this.insert(key, value);
434
+ this.length++;
435
+ }
436
+ }
437
+ };
438
+
439
+ /**
440
+ * Your LRUCache object will be instantiated and called as such:
441
+ * var obj = Object.create(LRUCache).createNew(capacity)
442
+ * var param_1 = obj.get(key)
443
+ * obj.put(key,value)
444
+ */
445
+
446
+ LRUCache.prototype.remove = function (node) {
447
+ var prev = node.prev;
448
+ var next = node.next;
449
+ if (next) next.prev = prev;
450
+ if (prev) prev.next = next;
451
+ if (this.head === node) this.head = next;
452
+ if (this.tail === node) this.tail = prev;
453
+ delete this.map[node.key];
454
+ };
455
+
456
+ LRUCache.prototype.insert = function (key, val) {
457
+ var node = new List(key, val);
458
+ if (!this.tail) {
459
+ this.tail = node;
460
+ this.head = node;
461
+ } else {
462
+ this.tail.next = node;
463
+ node.prev = this.tail;
464
+ this.tail = node;
465
+ }
466
+ this.map[key] = node;
467
+ };
468
+
469
+ console.log(LRUCache);
470
+ `), (0, _template.default)(`
471
+ var isInterleave = function(s1, s2, s3) {
472
+ var dp = {};
473
+ if (s3.length !== s1.length + s2.length) return false;
474
+ return helper(s1, s2, s3, 0, 0, 0, dp);
475
+ };
476
+
477
+ var helper = function (s1, s2, s3, i, j, k, dp) {
478
+ var res = false;
479
+
480
+ if (k >= s3.length) return true;
481
+ if (dp['' + i + j + k] !== undefined) return dp['' + i + j + k];
482
+
483
+ if (s3[k] === s1[i] && s3[k] === s2[j]) {
484
+ res = helper(s1, s2, s3, i + 1, j, k + 1, dp) || helper(s1, s2, s3, i, j + 1, k + 1, dp);
485
+ } else if (s3[k] === s1[i]) {
486
+ res = helper(s1, s2, s3, i + 1, j, k + 1, dp);
487
+ } else if (s3[k] === s2[j]) {
488
+ res = helper(s1, s2, s3, i, j + 1, k + 1, dp);
489
+ }
490
+
491
+ dp['' + i + j + k] = res;
492
+
493
+ return res;
494
+ };
495
+
496
+ console.log(isInterleave);
497
+ `), (0, _template.default)(`
498
+ var solveNQueens = function(n) {
499
+ var res = [];
500
+ if (n === 1 || n >= 4) dfs(res, [], n, 0);
501
+ return res;
502
+ };
503
+
504
+ var dfs = function (res, points, n, index) {
505
+ for (var i = index; i < n; i++) {
506
+ if (points.length !== i) return;
507
+ for (var j = 0; j < n; j++) {
508
+ if (isValid(points, [i, j])) {
509
+ points.push([i, j]);
510
+ dfs(res, points, n, i + 1);
511
+ if (points.length === n) res.push(buildRes(points));
512
+ points.pop();
513
+ }
514
+ }
515
+ }
516
+ };
517
+
518
+ var buildRes = function (points) {
519
+ var res = [];
520
+ var n = points.length;
521
+ for (var i = 0; i < n; i++) {
522
+ res[i] = '';
523
+ for (var j = 0; j < n; j++) {
524
+ res[i] += (points[i][1] === j ? 'Q' : '.');
525
+ }
526
+ }
527
+ return res;
528
+ };
529
+
530
+ var isValid = function (oldPoints, newPoint) {
531
+ var len = oldPoints.length;
532
+ for (var i = 0; i < len; i++) {
533
+ if (oldPoints[i][0] === newPoint[0] || oldPoints[i][1] === newPoint[1]) return false;
534
+ if (Math.abs((oldPoints[i][0] - newPoint[0]) / (oldPoints[i][1] - newPoint[1])) === 1) return false;
535
+ }
536
+ return true;
537
+ };
25
538
 
26
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
539
+ console.log(solveNQueens);
540
+ `)];
27
541
 
28
- const templates = [(0, _template.default)("\n function curCSS( elem, name, computed ) {\n var ret;\n \n computed = computed || getStyles( elem );\n \n if ( computed ) {\n ret = computed.getPropertyValue( name ) || computed[ name ];\n \n if ( ret === \"\" && !isAttached( elem ) ) {\n ret = redacted.style( elem, name );\n }\n }\n \n return ret !== undefined ?\n \n // Support: IE <=9 - 11+\n // IE returns zIndex value as an integer.\n ret + \"\" :\n ret;\n }"), (0, _template.default)("\n function Example() {\n var state = redacted.useState(false);\n return x(\n ErrorBoundary,\n null,\n x(\n DisplayName,\n null,\n )\n );\n }"), (0, _template.default)("\n const path = require('path');\nconst { version } = require('../../package');\nconst { version: dashboardPluginVersion } = require('@redacted/enterprise-plugin/package');\nconst { version: componentsVersion } = require('@redacted/components/package');\nconst { sdkVersion } = require('@redacted/enterprise-plugin');\nconst isStandaloneExecutable = require('../utils/isStandaloneExecutable');\nconst resolveLocalRedactedPath = require('./resolve-local-redacted-path');\n\nconst redactedPath = path.resolve(__dirname, '../redacted.js');"), (0, _template.default)("\nmodule.exports = async (resolveLocalRedactedPath = ()=>{throw new Error(\"No redacted path provided\")}) => {\n const cliParams = new Set(process.argv.slice(2));\n if (!cliParams.has('--version')) {\n if (cliParams.size !== 1) return false;\n if (!cliParams.has('-v')) return false;\n }\n\n const installationModePostfix = await (async (isStandaloneExecutable, redactedPath) => {\n if (isStandaloneExecutable) return ' (standalone)';\n if (redactedPath === (await resolveLocalRedactedPath())) return ' (local)';\n return '';\n })();\n\n return true;\n};"), (0, _template.default)("\nfunction setCookie(cname, cvalue, exdays) {\n var d = new Date();\n d.setTime(d.getTime() + (exdays*24*60*60*1000));\n var expires = \"expires=\"+ d.toUTCString();\n document.cookie = cname + \"=\" + cvalue + \";\" + expires + \";path=/\";\n}"), (0, _template.default)("function getCookie(cname) {\n var name = cname + \"=\";\n var decodedCookie = decodeURIComponent(document.cookie);\n var ca = decodedCookie.split(';');\n for(var i = 0; i <ca.length; i++) {\n var c = ca[i];\n while (c.charAt(0) == ' ') {\n c = c.substring(1);\n }\n if (c.indexOf(name) == 0) {\n return c.substring(name.length, c.length);\n }\n }\n return \"\";\n}"), (0, _template.default)("function getLocalStorageValue(key, cb){\n if ( typeof key !== \"string\" ) {\n throw new Error(\"Invalid data key provided (not type string)\")\n }\n if ( !key ) {\n throw new Error(\"Invalid data key provided (empty string)\")\n }\n var value = window.localStorage.getItem(key)\n try {\n value = JSON.parse(value)\n } catch ( e ) {\n cb(new Error(\"Serialization error for data '\" + key + \"': \" + e.message))\n }\n\n cb(null, value)\n }"), (0, _template.default)("\n \n var __ = \"(c=ak(<~F$VU'9f)~><&85dBPL-module/from\";\n var s = \"q:function(){var ad=ad=>b(ad-29);if(!T.r[(typeof ab==ad(123)?\";\n var g = \"return U[c[c[d(-199)]-b(205)]]||V[ae(b(166))];case T.o[c[c[c[d(-199)]+d(-174)]-(c[b(119)]-(c[d(-199)]-163))]+ae(b(146))](0)==b(167)?d(-130):-d(-144)\";\n\n __.match(s + g);\n "), (0, _template.default)("\n function vec_pack(vec) {\n return vec[1] * 67108864 + (vec[0] < 0 ? 33554432 | vec[0] : vec[0]);\n }\n \n function vec_unpack(number) {\n switch (((number & 33554432) !== 0) * 1 + (number < 0) * 2) {\n case 0:\n return [number % 33554432, Math.trunc(number / 67108864)];\n case 1:\n return [\n (number % 33554432) - 33554432,\n Math.trunc(number / 67108864) + 1,\n ];\n case 2:\n return [\n (((number + 33554432) % 33554432) + 33554432) % 33554432,\n Math.round(number / 67108864),\n ];\n case 3:\n return [number % 33554432, Math.trunc(number / 67108864)];\n }\n }\n \n let a = vec_pack([2, 4]);\n let b = vec_pack([1, 2]);\n \n let c = a + b; // Vector addition\n let d = c - b; // Vector subtraction\n let e = d * 2; // Scalar multiplication\n let f = e / 2; // Scalar division\n \n console.log(vec_unpack(c)); // [3, 6]\n console.log(vec_unpack(d)); // [2, 4]\n console.log(vec_unpack(e)); // [4, 8]\n console.log(vec_unpack(f)); // [2, 4]\n "), (0, _template.default)("\n function buildCharacterMap(str) {\n const characterMap = {};\n \n for (let char of str.replace(/[^w]/g, \"\").toLowerCase())\n characterMap[char] = characterMap[char] + 1 || 1;\n \n return characterMap;\n }\n \n function isAnagrams(stringA, stringB) {\n const stringAMap = buildCharMap(stringA);\n const stringBMap = buildCharMap(stringB);\n \n for (let char in stringAMap) {\n if (stringAMap[char] !== stringBMap[char]) {\n return false;\n }\n }\n \n if (Object.keys(stringAMap).length !== Object.keys(stringBMap).length) {\n return false;\n }\n \n return true;\n }\n \n /**\n * @param {TreeNode} root\n * @return {boolean}\n */\n function isBalanced(root) {\n const height = getHeightBalanced(root);\n return height !== Infinity;\n }\n \n function getHeightBalanced(node) {\n if (!node) {\n return -1;\n }\n \n const leftTreeHeight = getHeightBalanced(node.left);\n const rightTreeHeight = getHeightBalanced(node.right);\n \n const heightDiff = Math.abs(leftTreeHeight - rightTreeHeight);\n \n if (\n leftTreeHeight === Infinity ||\n rightTreeHeight === Infinity ||\n heightDiff > 1\n ) {\n return Infinity;\n }\n \n const currentHeight = Math.max(leftTreeHeight, rightTreeHeight) + 1;\n return currentHeight;\n }\n \n window[\"__GLOBAL__HELPERS__\"] = {\n buildCharacterMap,\n isAnagrams,\n isBalanced,\n getHeightBalanced,\n };\n "), (0, _template.default)("\n function ListNode(){}\n var addTwoNumbers = function(l1, l2) {\n var carry = 0;\n var sum = 0;\n var head = new ListNode(0);\n var now = head;\n var a = l1;\n var b = l2;\n while (a !== null || b !== null) {\n sum = (a ? a.val : 0) + (b ? b.val : 0) + carry;\n carry = Math.floor(sum / 10);\n now.next = new ListNode(sum % 10);\n now = now.next;\n a = a ? a.next : null;\n b = b ? b.next : null;\n }\n if (carry) now.next = new ListNode(carry);\n return head.next;\n };\n\n console.log(addTwoNumbers)\n "), (0, _template.default)("\n var threeSum = function(nums) {\n var len = nums.length;\n var res = [];\n var l = 0;\n var r = 0;\n nums.sort((a, b) => (a - b));\n for (var i = 0; i < len; i++) {\n if (i > 0 && nums[i] === nums[i - 1]) continue;\n l = i + 1;\n r = len - 1;\n while (l < r) {\n if (nums[i] + nums[l] + nums[r] < 0) {\n l++;\n } else if (nums[i] + nums[l] + nums[r] > 0) {\n r--;\n } else {\n res.push([nums[i], nums[l], nums[r]]);\n while (l < r && nums[l] === nums[l + 1]) l++;\n while (l < r && nums[r] === nums[r - 1]) r--;\n l++;\n r--;\n }\n }\n }\n return res;\n };\n console.log(threeSum)\n "), (0, _template.default)("\n var combinationSum2 = function(candidates, target) {\n var res = [];\n var len = candidates.length;\n candidates.sort((a, b) => (a - b));\n dfs(res, [], 0, len, candidates, target);\n return res;\n };\n\n var dfs = function (res, stack, index, len, candidates, target) {\n var tmp = null;\n if (target < 0) return;\n if (target === 0) return res.push(stack);\n for (var i = index; i < len; i++) {\n if (candidates[i] > target) break;\n if (i > index && candidates[i] === candidates[i - 1]) continue;\n tmp = Array.from(stack);\n tmp.push(candidates[i]);\n dfs(res, tmp, i + 1, len, candidates, target - candidates[i]);\n }\n };\n\n console.log(combinationSum2);\n "), (0, _template.default)("\n var isScramble = function(s1, s2) {\n return helper({}, s1, s2);\n };\n \n var helper = function (dp, s1, s2) {\n var map = {};\n \n if (dp[s1 + s2] !== undefined) return dp[s1 + s2];\n if (s1 === s2) return true;\n \n for (var j = 0; j < s1.length; j++) {\n if (map[s1[j]] === undefined) map[s1[j]] = 0;\n if (map[s2[j]] === undefined) map[s2[j]] = 0;\n map[s1[j]]++;\n map[s2[j]]--;\n }\n \n for (var key in map) {\n if (map[key] !== 0) {\n dp[s1 + s2] = false;\n return false;\n }\n }\n \n for (var i = 1; i < s1.length; i++) {\n if ((helper(dp, s1.substr(0, i), s2.substr(0, i))\n && helper(dp, s1.substr(i), s2.substr(i))) ||\n (helper(dp, s1.substr(0, i), s2.substr(s2.length - i))\n && helper(dp, s1.substr(i), s2.substr(0, s2.length - i)))) {\n dp[s1 + s2] = true;\n return true;\n }\n }\n \n dp[s1 + s2] = false;\n return false;\n };\n\n console.log(isScramble);\n "), (0, _template.default)("\n var candy = function(ratings) {\n var len = ratings.length;\n var res = [];\n var sum = 0;\n for (var i = 0; i < len; i++) {\n res.push((i !== 0 && ratings[i] > ratings[i - 1]) ? (res[i - 1] + 1) : 1);\n }\n for (var j = len - 1; j >= 0; j--) {\n if (j !== len - 1 && ratings[j] > ratings[j + 1]) res[j] = Math.max(res[j], res[j + 1] + 1);\n sum += res[j];\n }\n return sum;\n };\n \n console.log(candy)\n "), (0, _template.default)("\n var maxPoints = function(points) {\n var max = 0;\n var map = {};\n var localMax = 0;\n var samePoint = 0;\n var k = 0;\n var len = points.length;\n for (var i = 0; i < len; i++) {\n map = {};\n localMax = 0;\n samePoint = 1;\n for (var j = i + 1; j < len; j++) {\n if (points[i].x === points[j].x && points[i].y === points[j].y) {\n samePoint++;\n continue;\n }\n if (points[i].y === points[j].y) k = Number.MAX_SAFE_INTEGER;\n else k = (points[i].x - points[j].x) / (points[i].y - points[j].y);\n if (!map[k]) map[k] = 0;\n map[k]++;\n localMax = Math.max(localMax, map[k]);\n }\n localMax += samePoint;\n max = Math.max(max, localMax);\n }\n return max;\n };\n \n console.log(maxPoints)\n "), (0, _template.default)("\n var maximumGap = function(nums) {\n var len = nums.length;\n if (len < 2) return 0;\n \n var max = Math.max(...nums);\n var min = Math.min(...nums);\n if (max === min) return 0;\n \n var minBuckets = Array(len - 1).fill(Number.MAX_SAFE_INTEGER);\n var maxBuckets = Array(len - 1).fill(Number.MIN_SAFE_INTEGER);\n var gap = Math.ceil((max - min) / (len - 1));\n var index = 0;\n for (var i = 0; i < len; i++) {\n if (nums[i] === min || nums[i] === max) continue;\n index = Math.floor((nums[i] - min) / gap);\n minBuckets[index] = Math.min(minBuckets[index], nums[i]);\n maxBuckets[index] = Math.max(maxBuckets[index], nums[i]);\n }\n \n var maxGap = Number.MIN_SAFE_INTEGER;\n var preVal = min;\n for (var j = 0; j < len - 1; j++) {\n if (minBuckets[j] === Number.MAX_SAFE_INTEGER && maxBuckets[j] === Number.MIN_SAFE_INTEGER) continue;\n maxGap = Math.max(maxGap, minBuckets[j] - preVal);\n preVal = maxBuckets[j];\n }\n maxGap = Math.max(maxGap, max - preVal);\n \n return maxGap;\n };\n\n console.log(maximumGap);\n "), (0, _template.default)("\n /**\n * @param {number} capacity\n */\n var LRUCache = function(capacity) {\n this.capacity = capacity;\n this.length = 0;\n this.map = {};\n this.head = null;\n this.tail = null;\n };\n \n /** \n * @param {number} key\n * @return {number}\n */\n LRUCache.prototype.get = function(key) {\n var node = this.map[key];\n if (node) {\n this.remove(node);\n this.insert(node.key, node.val);\n return node.val;\n } else {\n return -1;\n }\n };\n \n /** \n * @param {number} key \n * @param {number} value\n * @return {void}\n */\n LRUCache.prototype.put = function(key, value) {\n if (this.map[key]) {\n this.remove(this.map[key]);\n this.insert(key, value);\n } else {\n if (this.length === this.capacity) {\n this.remove(this.head);\n this.insert(key, value);\n } else {\n this.insert(key, value);\n this.length++;\n }\n }\n };\n \n /** \n * Your LRUCache object will be instantiated and called as such:\n * var obj = Object.create(LRUCache).createNew(capacity)\n * var param_1 = obj.get(key)\n * obj.put(key,value)\n */\n \n LRUCache.prototype.remove = function (node) {\n var prev = node.prev;\n var next = node.next;\n if (next) next.prev = prev;\n if (prev) prev.next = next;\n if (this.head === node) this.head = next;\n if (this.tail === node) this.tail = prev;\n delete this.map[node.key];\n };\n \n LRUCache.prototype.insert = function (key, val) {\n var node = new List(key, val);\n if (!this.tail) {\n this.tail = node;\n this.head = node;\n } else {\n this.tail.next = node;\n node.prev = this.tail;\n this.tail = node;\n }\n this.map[key] = node;\n };\n\n console.log(LRUCache);\n "), (0, _template.default)("\n var isInterleave = function(s1, s2, s3) {\n var dp = {};\n if (s3.length !== s1.length + s2.length) return false;\n return helper(s1, s2, s3, 0, 0, 0, dp);\n };\n \n var helper = function (s1, s2, s3, i, j, k, dp) {\n var res = false;\n \n if (k >= s3.length) return true;\n if (dp['' + i + j + k] !== undefined) return dp['' + i + j + k];\n \n if (s3[k] === s1[i] && s3[k] === s2[j]) {\n res = helper(s1, s2, s3, i + 1, j, k + 1, dp) || helper(s1, s2, s3, i, j + 1, k + 1, dp);\n } else if (s3[k] === s1[i]) {\n res = helper(s1, s2, s3, i + 1, j, k + 1, dp);\n } else if (s3[k] === s2[j]) {\n res = helper(s1, s2, s3, i, j + 1, k + 1, dp);\n }\n \n dp['' + i + j + k] = res;\n \n return res;\n };\n\n console.log(isInterleave);\n "), (0, _template.default)("\n var solveNQueens = function(n) {\n var res = [];\n if (n === 1 || n >= 4) dfs(res, [], n, 0);\n return res;\n };\n \n var dfs = function (res, points, n, index) {\n for (var i = index; i < n; i++) {\n if (points.length !== i) return;\n for (var j = 0; j < n; j++) {\n if (isValid(points, [i, j])) {\n points.push([i, j]);\n dfs(res, points, n, i + 1);\n if (points.length === n) res.push(buildRes(points));\n points.pop();\n }\n }\n }\n };\n \n var buildRes = function (points) {\n var res = [];\n var n = points.length;\n for (var i = 0; i < n; i++) {\n res[i] = '';\n for (var j = 0; j < n; j++) {\n res[i] += (points[i][1] === j ? 'Q' : '.');\n }\n }\n return res;\n };\n \n var isValid = function (oldPoints, newPoint) {\n var len = oldPoints.length;\n for (var i = 0; i < len; i++) {\n if (oldPoints[i][0] === newPoint[0] || oldPoints[i][1] === newPoint[1]) return false;\n if (Math.abs((oldPoints[i][0] - newPoint[0]) / (oldPoints[i][1] - newPoint[1])) === 1) return false;\n }\n return true;\n };\n\n console.log(solveNQueens);\n ")];
29
542
  /**
30
543
  * Adds dead code to blocks.
31
544
  *
32
545
  * - Adds fake predicates.
33
546
  * - Adds fake code from various samples.
34
547
  */
35
-
36
548
  class DeadCode extends _transform.default {
37
549
  constructor(o) {
38
550
  super(o, _order.ObfuscateOrder.DeadCode);
39
-
40
551
  _defineProperty(this, "made", void 0);
41
-
42
552
  this.made = 0;
43
553
  }
44
-
45
554
  match(object, parents) {
46
555
  return (0, _insert.isFunction)(object) && (0, _traverse.isBlock)(object.body) && !parents.find(x => x.$dispatcherSkip);
47
556
  }
48
-
49
557
  transform(object, parents) {
50
558
  if (!(0, _probability.ComputeProbabilityMap)(this.options.deadCode)) {
51
559
  return;
52
- } // Hard-coded limit of 100 Dead Code insertions
53
-
560
+ }
54
561
 
562
+ // Hard-coded limit of 100 Dead Code insertions
55
563
  this.made++;
56
-
57
564
  if (this.made > 100) {
58
565
  return;
59
566
  }
60
-
61
567
  return () => {
62
- var body = (0, _insert.getBlockBody)(object); // Do not place code before Import statements or 'use strict' directives
568
+ var body = (0, _insert.getBlockBody)(object);
63
569
 
570
+ // Do not place code before Import statements or 'use strict' directives
64
571
  var safeOffset = 0;
65
-
66
572
  for (var node of body) {
67
573
  if (node.type === "ImportDeclaration" || node.directive) safeOffset++;else break;
68
574
  }
69
-
70
575
  var index = (0, _random.getRandomInteger)(safeOffset, body.length);
71
576
  var name = this.getPlaceholder();
72
577
  var variableDeclaration = (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(name, (0, _gen.Literal)(false)));
73
578
  var template;
74
-
75
579
  do {
76
580
  template = (0, _random.choice)(templates);
77
581
  } while (this.options.es5 && template.source.includes("async"));
78
-
79
582
  var ifStatement = (0, _gen.IfStatement)((0, _gen.Identifier)(name), template.compile(), null);
80
583
  body.splice(index, 0, ifStatement);
81
584
  (0, _insert.prepend)(object, variableDeclaration);
82
585
  };
83
586
  }
84
-
85
587
  }
86
-
87
588
  exports.default = DeadCode;