@okeyamy/lua 5.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +552 -0
- package/build/es5/__tests__/ai-personalize.test.js +811 -0
- package/build/es5/__tests__/lua.js +134 -0
- package/build/es5/__tests__/original-roughly.js +197 -0
- package/build/es5/__tests__/original.js +174 -0
- package/build/es5/__tests__/unit.js +72 -0
- package/build/es5/__tests__/weighted-history.test.js +376 -0
- package/build/es5/ai-personalize.js +641 -0
- package/build/es5/index.js +30 -0
- package/build/es5/lua.js +366 -0
- package/build/es5/personalization.js +811 -0
- package/build/es5/prompts/personalization-prompts.js +260 -0
- package/build/es5/storage/weighted-history.js +384 -0
- package/build/es5/stores/browser-cookie.js +25 -0
- package/build/es5/stores/local.js +29 -0
- package/build/es5/stores/memory.js +22 -0
- package/build/es5/utils.js +54 -0
- package/build/es5/utm-personalize.js +817 -0
- package/build/es5/utm.js +304 -0
- package/build/lua.dev.js +1574 -0
- package/build/lua.es.js +1566 -0
- package/build/lua.js +1574 -0
- package/build/lua.min.js +8 -0
- package/package.json +68 -0
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
5
|
+
/**
|
|
6
|
+
* Weighted History Manager
|
|
7
|
+
* ========================
|
|
8
|
+
* Manages localStorage for user visit history with exponential decay.
|
|
9
|
+
* Tracks user visits with timestamps, UTM params, intents, and selected variants.
|
|
10
|
+
* Applies configurable exponential decay so recent visits carry more weight.
|
|
11
|
+
*
|
|
12
|
+
* Storage key: 'lua_personalize_history'
|
|
13
|
+
* Registers on window.LuaWeightedHistory
|
|
14
|
+
*
|
|
15
|
+
* No ES6 imports. Self-contained IIFE.
|
|
16
|
+
*/
|
|
17
|
+
;
|
|
18
|
+
(function (root) {
|
|
19
|
+
'use strict';
|
|
20
|
+
|
|
21
|
+
// ===================================================================
|
|
22
|
+
// Constants
|
|
23
|
+
// ===================================================================
|
|
24
|
+
var STORAGE_KEY = 'lua_personalize_history';
|
|
25
|
+
var DEFAULT_DECAY_RATE = 0.9;
|
|
26
|
+
var DEFAULT_MAX_HISTORY = 10;
|
|
27
|
+
var DEFAULT_MAX_WEIGHTED = 5;
|
|
28
|
+
var MS_PER_DAY = 1000 * 60 * 60 * 24;
|
|
29
|
+
|
|
30
|
+
// ===================================================================
|
|
31
|
+
// UUID Generator (simple, no crypto dependency)
|
|
32
|
+
// ===================================================================
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Generate a simple UUID v4
|
|
36
|
+
* Uses crypto.getRandomValues when available, Math.random fallback
|
|
37
|
+
* @returns {string} - UUID string
|
|
38
|
+
*/
|
|
39
|
+
function generateUUID() {
|
|
40
|
+
try {
|
|
41
|
+
if (typeof crypto !== 'undefined' && crypto.getRandomValues) {
|
|
42
|
+
var buf = new Uint8Array(16);
|
|
43
|
+
crypto.getRandomValues(buf);
|
|
44
|
+
buf[6] = buf[6] & 0x0f | 0x40;
|
|
45
|
+
buf[8] = buf[8] & 0x3f | 0x80;
|
|
46
|
+
var hex = '';
|
|
47
|
+
for (var i = 0; i < 16; i++) {
|
|
48
|
+
var h = buf[i].toString(16);
|
|
49
|
+
hex += h.length === 1 ? '0' + h : h;
|
|
50
|
+
}
|
|
51
|
+
return hex.substring(0, 8) + '-' + hex.substring(8, 12) + '-' + hex.substring(12, 16) + '-' + hex.substring(16, 20) + '-' + hex.substring(20, 32);
|
|
52
|
+
}
|
|
53
|
+
} catch (e) {
|
|
54
|
+
// Fallback below
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Math.random fallback
|
|
58
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
|
59
|
+
var r = Math.random() * 16 | 0;
|
|
60
|
+
var v = c === 'x' ? r : r & 0x3 | 0x8;
|
|
61
|
+
return v.toString(16);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// ===================================================================
|
|
66
|
+
// LocalStorage Helpers
|
|
67
|
+
// ===================================================================
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Check if localStorage is available
|
|
71
|
+
* @returns {boolean}
|
|
72
|
+
*/
|
|
73
|
+
function isLocalStorageAvailable() {
|
|
74
|
+
try {
|
|
75
|
+
if (typeof localStorage === 'undefined') return false;
|
|
76
|
+
var testKey = '__lua_test__';
|
|
77
|
+
localStorage.setItem(testKey, '1');
|
|
78
|
+
localStorage.removeItem(testKey);
|
|
79
|
+
return true;
|
|
80
|
+
} catch (e) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Read history from localStorage
|
|
87
|
+
* @returns {Object|null} - Parsed history object or null
|
|
88
|
+
*/
|
|
89
|
+
function readFromStorage() {
|
|
90
|
+
if (!isLocalStorageAvailable()) return null;
|
|
91
|
+
try {
|
|
92
|
+
var raw = localStorage.getItem(STORAGE_KEY);
|
|
93
|
+
if (!raw) return null;
|
|
94
|
+
var parsed = JSON.parse(raw);
|
|
95
|
+
if (parsed && (0, _typeof2.default)(parsed) === 'object' && Array.isArray(parsed.visits)) {
|
|
96
|
+
return parsed;
|
|
97
|
+
}
|
|
98
|
+
return null;
|
|
99
|
+
} catch (e) {
|
|
100
|
+
console.warn('[Lua History] Failed to read history:', e);
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Write history to localStorage
|
|
107
|
+
* @param {Object} history - History object to persist
|
|
108
|
+
* @returns {boolean} - Whether the write was successful
|
|
109
|
+
*/
|
|
110
|
+
function writeToStorage(history) {
|
|
111
|
+
if (!isLocalStorageAvailable()) return false;
|
|
112
|
+
try {
|
|
113
|
+
localStorage.setItem(STORAGE_KEY, JSON.stringify(history));
|
|
114
|
+
return true;
|
|
115
|
+
} catch (e) {
|
|
116
|
+
console.warn('[Lua History] Failed to write history:', e);
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// ===================================================================
|
|
122
|
+
// Weighted Decay Functions
|
|
123
|
+
// ===================================================================
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Calculate the weight of a visit based on its age using exponential decay
|
|
127
|
+
* Weight = decayRate ^ daysAgo
|
|
128
|
+
* Example: decayRate=0.9, 1 day ago = 0.9, 7 days ago = 0.478, 30 days ago = 0.042
|
|
129
|
+
*
|
|
130
|
+
* @param {number} timestamp - Visit timestamp in ms
|
|
131
|
+
* @param {number} [decayRate] - Decay rate per day (0-1, default: 0.9)
|
|
132
|
+
* @returns {number} - Weight between 0 and 1
|
|
133
|
+
*/
|
|
134
|
+
function calculateWeight(timestamp, decayRate) {
|
|
135
|
+
decayRate = typeof decayRate === 'number' ? decayRate : DEFAULT_DECAY_RATE;
|
|
136
|
+
var now = Date.now();
|
|
137
|
+
var daysAgo = Math.max(0, (now - timestamp) / MS_PER_DAY);
|
|
138
|
+
return Math.pow(decayRate, daysAgo);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Build weighted context from visit history
|
|
143
|
+
* Returns the most relevant visits sorted by weight (highest first)
|
|
144
|
+
*
|
|
145
|
+
* @param {Object} history - History object with visits array
|
|
146
|
+
* @param {Object} [options] - Configuration
|
|
147
|
+
* @param {number} [options.decayRate] - Decay rate (default: 0.9)
|
|
148
|
+
* @param {number} [options.maxWeighted] - Max results to return (default: 5)
|
|
149
|
+
* @returns {Array} - Weighted visits sorted by relevance
|
|
150
|
+
*/
|
|
151
|
+
function buildWeightedContext(history, options) {
|
|
152
|
+
options = options || {};
|
|
153
|
+
var decayRate = options.decayRate || DEFAULT_DECAY_RATE;
|
|
154
|
+
var maxWeighted = options.maxWeighted || DEFAULT_MAX_WEIGHTED;
|
|
155
|
+
if (!history || !Array.isArray(history.visits) || history.visits.length === 0) {
|
|
156
|
+
return [];
|
|
157
|
+
}
|
|
158
|
+
var weighted = [];
|
|
159
|
+
for (var i = 0; i < history.visits.length; i++) {
|
|
160
|
+
var visit = history.visits[i];
|
|
161
|
+
var weight = calculateWeight(visit.timestamp, decayRate);
|
|
162
|
+
weighted.push({
|
|
163
|
+
timestamp: visit.timestamp,
|
|
164
|
+
weight: Math.round(weight * 1000) / 1000,
|
|
165
|
+
intent: visit.intent || 'unknown',
|
|
166
|
+
selectedVariant: visit.selectedVariant || null,
|
|
167
|
+
source: visit.source || 'unknown',
|
|
168
|
+
aiDecision: visit.aiDecision || false,
|
|
169
|
+
context: visit.context || {}
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Sort by weight descending (most recent / relevant first)
|
|
174
|
+
weighted.sort(function (a, b) {
|
|
175
|
+
return b.weight - a.weight;
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
// Return top N results
|
|
179
|
+
return weighted.slice(0, maxWeighted);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Aggregate intent preferences from weighted history
|
|
184
|
+
* Produces a score map of intents weighted by recency
|
|
185
|
+
*
|
|
186
|
+
* @param {Array} weightedVisits - Output of buildWeightedContext
|
|
187
|
+
* @returns {Object} - Intent -> score mapping
|
|
188
|
+
*/
|
|
189
|
+
function aggregatePreferences(weightedVisits) {
|
|
190
|
+
var scores = {};
|
|
191
|
+
for (var i = 0; i < weightedVisits.length; i++) {
|
|
192
|
+
var visit = weightedVisits[i];
|
|
193
|
+
var intent = visit.intent;
|
|
194
|
+
if (!intent || intent === 'unknown' || intent === 'default') continue;
|
|
195
|
+
if (!scores[intent]) {
|
|
196
|
+
scores[intent] = 0;
|
|
197
|
+
}
|
|
198
|
+
scores[intent] += visit.weight;
|
|
199
|
+
}
|
|
200
|
+
return scores;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// ===================================================================
|
|
204
|
+
// History Management
|
|
205
|
+
// ===================================================================
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Initialize or retrieve existing history
|
|
209
|
+
* Creates a new history object with a UUID if none exists
|
|
210
|
+
*
|
|
211
|
+
* @returns {Object} - History object
|
|
212
|
+
*/
|
|
213
|
+
function getHistory() {
|
|
214
|
+
var history = readFromStorage();
|
|
215
|
+
if (!history) {
|
|
216
|
+
history = {
|
|
217
|
+
userId: generateUUID(),
|
|
218
|
+
createdAt: Date.now(),
|
|
219
|
+
visits: [],
|
|
220
|
+
preferences: {}
|
|
221
|
+
};
|
|
222
|
+
writeToStorage(history);
|
|
223
|
+
}
|
|
224
|
+
return history;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Record a new visit to history
|
|
229
|
+
*
|
|
230
|
+
* @param {Object} visitData - Visit data to record
|
|
231
|
+
* @param {Object} visitData.context - UTM context (utm, referrer, userAgent)
|
|
232
|
+
* @param {string} visitData.intent - Inferred or AI-selected intent
|
|
233
|
+
* @param {string} visitData.selectedVariant - Selected template/variant key
|
|
234
|
+
* @param {string} visitData.source - Decision source ('ai', 'utm', 'referrer', 'random-ab', etc.)
|
|
235
|
+
* @param {boolean} [visitData.aiDecision] - Whether AI made this decision
|
|
236
|
+
* @param {Object} [options] - Configuration
|
|
237
|
+
* @param {number} [options.maxHistorySize] - Max visits to keep (default: 10)
|
|
238
|
+
* @returns {Object} - Updated history object
|
|
239
|
+
*/
|
|
240
|
+
function recordVisit(visitData, options) {
|
|
241
|
+
options = options || {};
|
|
242
|
+
var maxHistorySize = options.maxHistorySize || DEFAULT_MAX_HISTORY;
|
|
243
|
+
var history = getHistory();
|
|
244
|
+
|
|
245
|
+
// Build a minimal context to store (avoid storing sensitive/large data)
|
|
246
|
+
var minimalContext = {};
|
|
247
|
+
if (visitData.context) {
|
|
248
|
+
if (visitData.context.utm) {
|
|
249
|
+
minimalContext.utm = visitData.context.utm;
|
|
250
|
+
}
|
|
251
|
+
if (visitData.context.referrer) {
|
|
252
|
+
minimalContext.referrer = {
|
|
253
|
+
source: visitData.context.referrer.source,
|
|
254
|
+
category: visitData.context.referrer.category
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
if (visitData.context.userAgent) {
|
|
258
|
+
minimalContext.device = visitData.context.userAgent.isMobile ? 'mobile' : visitData.context.userAgent.isTablet ? 'tablet' : 'desktop';
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
var visit = {
|
|
262
|
+
timestamp: Date.now(),
|
|
263
|
+
context: minimalContext,
|
|
264
|
+
intent: visitData.intent || 'unknown',
|
|
265
|
+
selectedVariant: visitData.selectedVariant || null,
|
|
266
|
+
source: visitData.source || 'unknown',
|
|
267
|
+
aiDecision: !!visitData.aiDecision
|
|
268
|
+
};
|
|
269
|
+
history.visits.push(visit);
|
|
270
|
+
|
|
271
|
+
// Trim to max size (keep most recent)
|
|
272
|
+
if (history.visits.length > maxHistorySize) {
|
|
273
|
+
history.visits = history.visits.slice(-maxHistorySize);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Update aggregated preferences
|
|
277
|
+
var weighted = buildWeightedContext(history, options);
|
|
278
|
+
history.preferences = aggregatePreferences(weighted);
|
|
279
|
+
writeToStorage(history);
|
|
280
|
+
return history;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Get the user ID from history (creates one if needed)
|
|
285
|
+
* @returns {string} - User UUID
|
|
286
|
+
*/
|
|
287
|
+
function getUserId() {
|
|
288
|
+
var history = getHistory();
|
|
289
|
+
return history.userId;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Check if this is a returning user (has previous visits)
|
|
294
|
+
* @returns {boolean}
|
|
295
|
+
*/
|
|
296
|
+
function isReturningUser() {
|
|
297
|
+
var history = readFromStorage();
|
|
298
|
+
return history !== null && Array.isArray(history.visits) && history.visits.length > 0;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Get the most recent visit from history
|
|
303
|
+
* @returns {Object|null} - Most recent visit or null
|
|
304
|
+
*/
|
|
305
|
+
function getLastVisit() {
|
|
306
|
+
var history = readFromStorage();
|
|
307
|
+
if (!history || !Array.isArray(history.visits) || history.visits.length === 0) {
|
|
308
|
+
return null;
|
|
309
|
+
}
|
|
310
|
+
return history.visits[history.visits.length - 1];
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Format weighted history as a human-readable string for AI prompts
|
|
315
|
+
* @param {Array} weightedVisits - Output of buildWeightedContext
|
|
316
|
+
* @returns {string} - Formatted string
|
|
317
|
+
*/
|
|
318
|
+
function formatForPrompt(weightedVisits) {
|
|
319
|
+
if (!weightedVisits || weightedVisits.length === 0) {
|
|
320
|
+
return 'No previous visit history available. This is a new visitor.';
|
|
321
|
+
}
|
|
322
|
+
var lines = [];
|
|
323
|
+
lines.push('Previous visits (' + weightedVisits.length + ' recorded, weighted by recency):');
|
|
324
|
+
for (var i = 0; i < weightedVisits.length; i++) {
|
|
325
|
+
var v = weightedVisits[i];
|
|
326
|
+
var date = new Date(v.timestamp);
|
|
327
|
+
var dateStr = date.toISOString().split('T')[0];
|
|
328
|
+
var line = ' - [' + dateStr + '] ';
|
|
329
|
+
line += 'Intent: ' + v.intent;
|
|
330
|
+
if (v.selectedVariant) line += ', Variant: ' + v.selectedVariant;
|
|
331
|
+
line += ', Source: ' + v.source;
|
|
332
|
+
line += ', Weight: ' + v.weight;
|
|
333
|
+
if (v.context && v.context.utm && v.context.utm.utm_source) {
|
|
334
|
+
line += ', UTM: ' + v.context.utm.utm_source;
|
|
335
|
+
}
|
|
336
|
+
lines.push(line);
|
|
337
|
+
}
|
|
338
|
+
return lines.join('\n');
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* Clear all history (useful for testing or user request)
|
|
343
|
+
* @returns {boolean} - Whether the clear was successful
|
|
344
|
+
*/
|
|
345
|
+
function clearHistory() {
|
|
346
|
+
if (!isLocalStorageAvailable()) return false;
|
|
347
|
+
try {
|
|
348
|
+
localStorage.removeItem(STORAGE_KEY);
|
|
349
|
+
return true;
|
|
350
|
+
} catch (e) {
|
|
351
|
+
return false;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
// ===================================================================
|
|
356
|
+
// Public API
|
|
357
|
+
// ===================================================================
|
|
358
|
+
|
|
359
|
+
var LuaWeightedHistory = {
|
|
360
|
+
// Core functions
|
|
361
|
+
getHistory: getHistory,
|
|
362
|
+
recordVisit: recordVisit,
|
|
363
|
+
getUserId: getUserId,
|
|
364
|
+
isReturningUser: isReturningUser,
|
|
365
|
+
getLastVisit: getLastVisit,
|
|
366
|
+
clearHistory: clearHistory,
|
|
367
|
+
// Weighted context
|
|
368
|
+
calculateWeight: calculateWeight,
|
|
369
|
+
buildWeightedContext: buildWeightedContext,
|
|
370
|
+
aggregatePreferences: aggregatePreferences,
|
|
371
|
+
formatForPrompt: formatForPrompt,
|
|
372
|
+
// Utilities
|
|
373
|
+
isLocalStorageAvailable: isLocalStorageAvailable,
|
|
374
|
+
generateUUID: generateUUID,
|
|
375
|
+
// Constants
|
|
376
|
+
STORAGE_KEY: STORAGE_KEY,
|
|
377
|
+
DEFAULT_DECAY_RATE: DEFAULT_DECAY_RATE,
|
|
378
|
+
DEFAULT_MAX_HISTORY: DEFAULT_MAX_HISTORY
|
|
379
|
+
};
|
|
380
|
+
|
|
381
|
+
// Register globally
|
|
382
|
+
root.LuaWeightedHistory = LuaWeightedHistory;
|
|
383
|
+
})(typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : void 0);
|
|
384
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyb290IiwiU1RPUkFHRV9LRVkiLCJERUZBVUxUX0RFQ0FZX1JBVEUiLCJERUZBVUxUX01BWF9ISVNUT1JZIiwiREVGQVVMVF9NQVhfV0VJR0hURUQiLCJNU19QRVJfREFZIiwiZ2VuZXJhdGVVVUlEIiwiY3J5cHRvIiwiZ2V0UmFuZG9tVmFsdWVzIiwiYnVmIiwiVWludDhBcnJheSIsImhleCIsImkiLCJoIiwidG9TdHJpbmciLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJlIiwicmVwbGFjZSIsImMiLCJyIiwiTWF0aCIsInJhbmRvbSIsInYiLCJpc0xvY2FsU3RvcmFnZUF2YWlsYWJsZSIsImxvY2FsU3RvcmFnZSIsInRlc3RLZXkiLCJzZXRJdGVtIiwicmVtb3ZlSXRlbSIsInJlYWRGcm9tU3RvcmFnZSIsInJhdyIsImdldEl0ZW0iLCJwYXJzZWQiLCJKU09OIiwicGFyc2UiLCJfdHlwZW9mMiIsImRlZmF1bHQiLCJBcnJheSIsImlzQXJyYXkiLCJ2aXNpdHMiLCJjb25zb2xlIiwid2FybiIsIndyaXRlVG9TdG9yYWdlIiwiaGlzdG9yeSIsInN0cmluZ2lmeSIsImNhbGN1bGF0ZVdlaWdodCIsInRpbWVzdGFtcCIsImRlY2F5UmF0ZSIsIm5vdyIsIkRhdGUiLCJkYXlzQWdvIiwibWF4IiwicG93IiwiYnVpbGRXZWlnaHRlZENvbnRleHQiLCJvcHRpb25zIiwibWF4V2VpZ2h0ZWQiLCJ3ZWlnaHRlZCIsInZpc2l0Iiwid2VpZ2h0IiwicHVzaCIsInJvdW5kIiwiaW50ZW50Iiwic2VsZWN0ZWRWYXJpYW50Iiwic291cmNlIiwiYWlEZWNpc2lvbiIsImNvbnRleHQiLCJzb3J0IiwiYSIsImIiLCJzbGljZSIsImFnZ3JlZ2F0ZVByZWZlcmVuY2VzIiwid2VpZ2h0ZWRWaXNpdHMiLCJzY29yZXMiLCJnZXRIaXN0b3J5IiwidXNlcklkIiwiY3JlYXRlZEF0IiwicHJlZmVyZW5jZXMiLCJyZWNvcmRWaXNpdCIsInZpc2l0RGF0YSIsIm1heEhpc3RvcnlTaXplIiwibWluaW1hbENvbnRleHQiLCJ1dG0iLCJyZWZlcnJlciIsImNhdGVnb3J5IiwidXNlckFnZW50IiwiZGV2aWNlIiwiaXNNb2JpbGUiLCJpc1RhYmxldCIsImdldFVzZXJJZCIsImlzUmV0dXJuaW5nVXNlciIsImdldExhc3RWaXNpdCIsImZvcm1hdEZvclByb21wdCIsImxpbmVzIiwiZGF0ZSIsImRhdGVTdHIiLCJ0b0lTT1N0cmluZyIsInNwbGl0IiwibGluZSIsInV0bV9zb3VyY2UiLCJqb2luIiwiY2xlYXJIaXN0b3J5IiwiTHVhV2VpZ2h0ZWRIaXN0b3J5Iiwid2luZG93IiwiZ2xvYmFsIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N0b3JhZ2Uvd2VpZ2h0ZWQtaGlzdG9yeS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogV2VpZ2h0ZWQgSGlzdG9yeSBNYW5hZ2VyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIE1hbmFnZXMgbG9jYWxTdG9yYWdlIGZvciB1c2VyIHZpc2l0IGhpc3Rvcnkgd2l0aCBleHBvbmVudGlhbCBkZWNheS5cbiAqIFRyYWNrcyB1c2VyIHZpc2l0cyB3aXRoIHRpbWVzdGFtcHMsIFVUTSBwYXJhbXMsIGludGVudHMsIGFuZCBzZWxlY3RlZCB2YXJpYW50cy5cbiAqIEFwcGxpZXMgY29uZmlndXJhYmxlIGV4cG9uZW50aWFsIGRlY2F5IHNvIHJlY2VudCB2aXNpdHMgY2FycnkgbW9yZSB3ZWlnaHQuXG4gKlxuICogU3RvcmFnZSBrZXk6ICdsdWFfcGVyc29uYWxpemVfaGlzdG9yeSdcbiAqIFJlZ2lzdGVycyBvbiB3aW5kb3cuTHVhV2VpZ2h0ZWRIaXN0b3J5XG4gKlxuICogTm8gRVM2IGltcG9ydHMuIFNlbGYtY29udGFpbmVkIElJRkUuXG4gKi9cbjsoZnVuY3Rpb24gKHJvb3QpIHtcbiAgICAndXNlIHN0cmljdCdcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBDb25zdGFudHNcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICB2YXIgU1RPUkFHRV9LRVkgPSAnbHVhX3BlcnNvbmFsaXplX2hpc3RvcnknXG4gICAgdmFyIERFRkFVTFRfREVDQVlfUkFURSA9IDAuOVxuICAgIHZhciBERUZBVUxUX01BWF9ISVNUT1JZID0gMTBcbiAgICB2YXIgREVGQVVMVF9NQVhfV0VJR0hURUQgPSA1XG4gICAgdmFyIE1TX1BFUl9EQVkgPSAxMDAwICogNjAgKiA2MCAqIDI0XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gVVVJRCBHZW5lcmF0b3IgKHNpbXBsZSwgbm8gY3J5cHRvIGRlcGVuZGVuY3kpXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgYSBzaW1wbGUgVVVJRCB2NFxuICAgICAqIFVzZXMgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyB3aGVuIGF2YWlsYWJsZSwgTWF0aC5yYW5kb20gZmFsbGJhY2tcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFVVSUQgc3RyaW5nXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVVVUlEKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICB2YXIgYnVmID0gbmV3IFVpbnQ4QXJyYXkoMTYpXG4gICAgICAgICAgICAgICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhidWYpXG4gICAgICAgICAgICAgICAgYnVmWzZdID0gKGJ1Zls2XSAmIDB4MGYpIHwgMHg0MFxuICAgICAgICAgICAgICAgIGJ1Zls4XSA9IChidWZbOF0gJiAweDNmKSB8IDB4ODBcbiAgICAgICAgICAgICAgICB2YXIgaGV4ID0gJydcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGggPSBidWZbaV0udG9TdHJpbmcoMTYpXG4gICAgICAgICAgICAgICAgICAgIGhleCArPSBoLmxlbmd0aCA9PT0gMSA/ICcwJyArIGggOiBoXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIGhleC5zdWJzdHJpbmcoMCwgOCkgKyAnLScgK1xuICAgICAgICAgICAgICAgICAgICBoZXguc3Vic3RyaW5nKDgsIDEyKSArICctJyArXG4gICAgICAgICAgICAgICAgICAgIGhleC5zdWJzdHJpbmcoMTIsIDE2KSArICctJyArXG4gICAgICAgICAgICAgICAgICAgIGhleC5zdWJzdHJpbmcoMTYsIDIwKSArICctJyArXG4gICAgICAgICAgICAgICAgICAgIGhleC5zdWJzdHJpbmcoMjAsIDMyKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gRmFsbGJhY2sgYmVsb3dcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hdGgucmFuZG9tIGZhbGxiYWNrXG4gICAgICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgICB2YXIgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMFxuICAgICAgICAgICAgdmFyIHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMpIHwgMHg4XG4gICAgICAgICAgICByZXR1cm4gdi50b1N0cmluZygxNilcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gTG9jYWxTdG9yYWdlIEhlbHBlcnNcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBsb2NhbFN0b3JhZ2UgaXMgYXZhaWxhYmxlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGxvY2FsU3RvcmFnZSA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgdmFyIHRlc3RLZXkgPSAnX19sdWFfdGVzdF9fJ1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGVzdEtleSwgJzEnKVxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGVzdEtleSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVhZCBoaXN0b3J5IGZyb20gbG9jYWxTdG9yYWdlXG4gICAgICogQHJldHVybnMge09iamVjdHxudWxsfSAtIFBhcnNlZCBoaXN0b3J5IG9iamVjdCBvciBudWxsXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVhZEZyb21TdG9yYWdlKCkge1xuICAgICAgICBpZiAoIWlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlKCkpIHJldHVybiBudWxsXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU1RPUkFHRV9LRVkpXG4gICAgICAgICAgICBpZiAoIXJhdykgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIHZhciBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdylcbiAgICAgICAgICAgIGlmIChwYXJzZWQgJiYgdHlwZW9mIHBhcnNlZCA9PT0gJ29iamVjdCcgJiYgQXJyYXkuaXNBcnJheShwYXJzZWQudmlzaXRzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW0x1YSBIaXN0b3J5XSBGYWlsZWQgdG8gcmVhZCBoaXN0b3J5OicsIGUpXG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV3JpdGUgaGlzdG9yeSB0byBsb2NhbFN0b3JhZ2VcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaGlzdG9yeSAtIEhpc3Rvcnkgb2JqZWN0IHRvIHBlcnNpc3RcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSB3cml0ZSB3YXMgc3VjY2Vzc2Z1bFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyaXRlVG9TdG9yYWdlKGhpc3RvcnkpIHtcbiAgICAgICAgaWYgKCFpc0xvY2FsU3RvcmFnZUF2YWlsYWJsZSgpKSByZXR1cm4gZmFsc2VcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeShoaXN0b3J5KSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW0x1YSBIaXN0b3J5XSBGYWlsZWQgdG8gd3JpdGUgaGlzdG9yeTonLCBlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gV2VpZ2h0ZWQgRGVjYXkgRnVuY3Rpb25zXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIHRoZSB3ZWlnaHQgb2YgYSB2aXNpdCBiYXNlZCBvbiBpdHMgYWdlIHVzaW5nIGV4cG9uZW50aWFsIGRlY2F5XG4gICAgICogV2VpZ2h0ID0gZGVjYXlSYXRlIF4gZGF5c0Fnb1xuICAgICAqIEV4YW1wbGU6IGRlY2F5UmF0ZT0wLjksIDEgZGF5IGFnbyA9IDAuOSwgNyBkYXlzIGFnbyA9IDAuNDc4LCAzMCBkYXlzIGFnbyA9IDAuMDQyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZXN0YW1wIC0gVmlzaXQgdGltZXN0YW1wIGluIG1zXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWNheVJhdGVdIC0gRGVjYXkgcmF0ZSBwZXIgZGF5ICgwLTEsIGRlZmF1bHQ6IDAuOSlcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIFdlaWdodCBiZXR3ZWVuIDAgYW5kIDFcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYWxjdWxhdGVXZWlnaHQodGltZXN0YW1wLCBkZWNheVJhdGUpIHtcbiAgICAgICAgZGVjYXlSYXRlID0gdHlwZW9mIGRlY2F5UmF0ZSA9PT0gJ251bWJlcicgPyBkZWNheVJhdGUgOiBERUZBVUxUX0RFQ0FZX1JBVEVcbiAgICAgICAgdmFyIG5vdyA9IERhdGUubm93KClcbiAgICAgICAgdmFyIGRheXNBZ28gPSBNYXRoLm1heCgwLCAobm93IC0gdGltZXN0YW1wKSAvIE1TX1BFUl9EQVkpXG4gICAgICAgIHJldHVybiBNYXRoLnBvdyhkZWNheVJhdGUsIGRheXNBZ28pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGQgd2VpZ2h0ZWQgY29udGV4dCBmcm9tIHZpc2l0IGhpc3RvcnlcbiAgICAgKiBSZXR1cm5zIHRoZSBtb3N0IHJlbGV2YW50IHZpc2l0cyBzb3J0ZWQgYnkgd2VpZ2h0IChoaWdoZXN0IGZpcnN0KVxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGhpc3RvcnkgLSBIaXN0b3J5IG9iamVjdCB3aXRoIHZpc2l0cyBhcnJheVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBDb25maWd1cmF0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmRlY2F5UmF0ZV0gLSBEZWNheSByYXRlIChkZWZhdWx0OiAwLjkpXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdlaWdodGVkXSAtIE1heCByZXN1bHRzIHRvIHJldHVybiAoZGVmYXVsdDogNSlcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IC0gV2VpZ2h0ZWQgdmlzaXRzIHNvcnRlZCBieSByZWxldmFuY2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBidWlsZFdlaWdodGVkQ29udGV4dChoaXN0b3J5LCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gICAgICAgIHZhciBkZWNheVJhdGUgPSBvcHRpb25zLmRlY2F5UmF0ZSB8fCBERUZBVUxUX0RFQ0FZX1JBVEVcbiAgICAgICAgdmFyIG1heFdlaWdodGVkID0gb3B0aW9ucy5tYXhXZWlnaHRlZCB8fCBERUZBVUxUX01BWF9XRUlHSFRFRFxuXG4gICAgICAgIGlmICghaGlzdG9yeSB8fCAhQXJyYXkuaXNBcnJheShoaXN0b3J5LnZpc2l0cykgfHwgaGlzdG9yeS52aXNpdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gW11cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB3ZWlnaHRlZCA9IFtdXG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoaXN0b3J5LnZpc2l0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHZpc2l0ID0gaGlzdG9yeS52aXNpdHNbaV1cbiAgICAgICAgICAgIHZhciB3ZWlnaHQgPSBjYWxjdWxhdGVXZWlnaHQodmlzaXQudGltZXN0YW1wLCBkZWNheVJhdGUpXG5cbiAgICAgICAgICAgIHdlaWdodGVkLnB1c2goe1xuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogdmlzaXQudGltZXN0YW1wLFxuICAgICAgICAgICAgICAgIHdlaWdodDogTWF0aC5yb3VuZCh3ZWlnaHQgKiAxMDAwKSAvIDEwMDAsXG4gICAgICAgICAgICAgICAgaW50ZW50OiB2aXNpdC5pbnRlbnQgfHwgJ3Vua25vd24nLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVmFyaWFudDogdmlzaXQuc2VsZWN0ZWRWYXJpYW50IHx8IG51bGwsXG4gICAgICAgICAgICAgICAgc291cmNlOiB2aXNpdC5zb3VyY2UgfHwgJ3Vua25vd24nLFxuICAgICAgICAgICAgICAgIGFpRGVjaXNpb246IHZpc2l0LmFpRGVjaXNpb24gfHwgZmFsc2UsXG4gICAgICAgICAgICAgICAgY29udGV4dDogdmlzaXQuY29udGV4dCB8fCB7fVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNvcnQgYnkgd2VpZ2h0IGRlc2NlbmRpbmcgKG1vc3QgcmVjZW50IC8gcmVsZXZhbnQgZmlyc3QpXG4gICAgICAgIHdlaWdodGVkLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiLndlaWdodCAtIGEud2VpZ2h0XG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gUmV0dXJuIHRvcCBOIHJlc3VsdHNcbiAgICAgICAgcmV0dXJuIHdlaWdodGVkLnNsaWNlKDAsIG1heFdlaWdodGVkKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFnZ3JlZ2F0ZSBpbnRlbnQgcHJlZmVyZW5jZXMgZnJvbSB3ZWlnaHRlZCBoaXN0b3J5XG4gICAgICogUHJvZHVjZXMgYSBzY29yZSBtYXAgb2YgaW50ZW50cyB3ZWlnaHRlZCBieSByZWNlbmN5XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5fSB3ZWlnaHRlZFZpc2l0cyAtIE91dHB1dCBvZiBidWlsZFdlaWdodGVkQ29udGV4dFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IC0gSW50ZW50IC0+IHNjb3JlIG1hcHBpbmdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhZ2dyZWdhdGVQcmVmZXJlbmNlcyh3ZWlnaHRlZFZpc2l0cykge1xuICAgICAgICB2YXIgc2NvcmVzID0ge31cblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdlaWdodGVkVmlzaXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdmlzaXQgPSB3ZWlnaHRlZFZpc2l0c1tpXVxuICAgICAgICAgICAgdmFyIGludGVudCA9IHZpc2l0LmludGVudFxuICAgICAgICAgICAgaWYgKCFpbnRlbnQgfHwgaW50ZW50ID09PSAndW5rbm93bicgfHwgaW50ZW50ID09PSAnZGVmYXVsdCcpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIGlmICghc2NvcmVzW2ludGVudF0pIHtcbiAgICAgICAgICAgICAgICBzY29yZXNbaW50ZW50XSA9IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3Jlc1tpbnRlbnRdICs9IHZpc2l0LndlaWdodFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNjb3Jlc1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBIaXN0b3J5IE1hbmFnZW1lbnRcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIG9yIHJldHJpZXZlIGV4aXN0aW5nIGhpc3RvcnlcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGhpc3Rvcnkgb2JqZWN0IHdpdGggYSBVVUlEIGlmIG5vbmUgZXhpc3RzXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtIEhpc3Rvcnkgb2JqZWN0XG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0SGlzdG9yeSgpIHtcbiAgICAgICAgdmFyIGhpc3RvcnkgPSByZWFkRnJvbVN0b3JhZ2UoKVxuXG4gICAgICAgIGlmICghaGlzdG9yeSkge1xuICAgICAgICAgICAgaGlzdG9yeSA9IHtcbiAgICAgICAgICAgICAgICB1c2VySWQ6IGdlbmVyYXRlVVVJRCgpLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICB2aXNpdHM6IFtdLFxuICAgICAgICAgICAgICAgIHByZWZlcmVuY2VzOiB7fVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd3JpdGVUb1N0b3JhZ2UoaGlzdG9yeSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoaXN0b3J5XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjb3JkIGEgbmV3IHZpc2l0IHRvIGhpc3RvcnlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB2aXNpdERhdGEgLSBWaXNpdCBkYXRhIHRvIHJlY29yZFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB2aXNpdERhdGEuY29udGV4dCAtIFVUTSBjb250ZXh0ICh1dG0sIHJlZmVycmVyLCB1c2VyQWdlbnQpXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZpc2l0RGF0YS5pbnRlbnQgLSBJbmZlcnJlZCBvciBBSS1zZWxlY3RlZCBpbnRlbnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmlzaXREYXRhLnNlbGVjdGVkVmFyaWFudCAtIFNlbGVjdGVkIHRlbXBsYXRlL3ZhcmlhbnQga2V5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZpc2l0RGF0YS5zb3VyY2UgLSBEZWNpc2lvbiBzb3VyY2UgKCdhaScsICd1dG0nLCAncmVmZXJyZXInLCAncmFuZG9tLWFiJywgZXRjLilcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt2aXNpdERhdGEuYWlEZWNpc2lvbl0gLSBXaGV0aGVyIEFJIG1hZGUgdGhpcyBkZWNpc2lvblxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBDb25maWd1cmF0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heEhpc3RvcnlTaXplXSAtIE1heCB2aXNpdHMgdG8ga2VlcCAoZGVmYXVsdDogMTApXG4gICAgICogQHJldHVybnMge09iamVjdH0gLSBVcGRhdGVkIGhpc3Rvcnkgb2JqZWN0XG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVjb3JkVmlzaXQodmlzaXREYXRhLCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gICAgICAgIHZhciBtYXhIaXN0b3J5U2l6ZSA9IG9wdGlvbnMubWF4SGlzdG9yeVNpemUgfHwgREVGQVVMVF9NQVhfSElTVE9SWVxuXG4gICAgICAgIHZhciBoaXN0b3J5ID0gZ2V0SGlzdG9yeSgpXG5cbiAgICAgICAgLy8gQnVpbGQgYSBtaW5pbWFsIGNvbnRleHQgdG8gc3RvcmUgKGF2b2lkIHN0b3Jpbmcgc2Vuc2l0aXZlL2xhcmdlIGRhdGEpXG4gICAgICAgIHZhciBtaW5pbWFsQ29udGV4dCA9IHt9XG4gICAgICAgIGlmICh2aXNpdERhdGEuY29udGV4dCkge1xuICAgICAgICAgICAgaWYgKHZpc2l0RGF0YS5jb250ZXh0LnV0bSkge1xuICAgICAgICAgICAgICAgIG1pbmltYWxDb250ZXh0LnV0bSA9IHZpc2l0RGF0YS5jb250ZXh0LnV0bVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZpc2l0RGF0YS5jb250ZXh0LnJlZmVycmVyKSB7XG4gICAgICAgICAgICAgICAgbWluaW1hbENvbnRleHQucmVmZXJyZXIgPSB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdmlzaXREYXRhLmNvbnRleHQucmVmZXJyZXIuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeTogdmlzaXREYXRhLmNvbnRleHQucmVmZXJyZXIuY2F0ZWdvcnlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmlzaXREYXRhLmNvbnRleHQudXNlckFnZW50KSB7XG4gICAgICAgICAgICAgICAgbWluaW1hbENvbnRleHQuZGV2aWNlID0gdmlzaXREYXRhLmNvbnRleHQudXNlckFnZW50LmlzTW9iaWxlXG4gICAgICAgICAgICAgICAgICAgID8gJ21vYmlsZSdcbiAgICAgICAgICAgICAgICAgICAgOiB2aXNpdERhdGEuY29udGV4dC51c2VyQWdlbnQuaXNUYWJsZXRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RhYmxldCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJ2Rlc2t0b3AnXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdmlzaXQgPSB7XG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICBjb250ZXh0OiBtaW5pbWFsQ29udGV4dCxcbiAgICAgICAgICAgIGludGVudDogdmlzaXREYXRhLmludGVudCB8fCAndW5rbm93bicsXG4gICAgICAgICAgICBzZWxlY3RlZFZhcmlhbnQ6IHZpc2l0RGF0YS5zZWxlY3RlZFZhcmlhbnQgfHwgbnVsbCxcbiAgICAgICAgICAgIHNvdXJjZTogdmlzaXREYXRhLnNvdXJjZSB8fCAndW5rbm93bicsXG4gICAgICAgICAgICBhaURlY2lzaW9uOiAhIXZpc2l0RGF0YS5haURlY2lzaW9uXG4gICAgICAgIH1cblxuICAgICAgICBoaXN0b3J5LnZpc2l0cy5wdXNoKHZpc2l0KVxuXG4gICAgICAgIC8vIFRyaW0gdG8gbWF4IHNpemUgKGtlZXAgbW9zdCByZWNlbnQpXG4gICAgICAgIGlmIChoaXN0b3J5LnZpc2l0cy5sZW5ndGggPiBtYXhIaXN0b3J5U2l6ZSkge1xuICAgICAgICAgICAgaGlzdG9yeS52aXNpdHMgPSBoaXN0b3J5LnZpc2l0cy5zbGljZSgtbWF4SGlzdG9yeVNpemUpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgYWdncmVnYXRlZCBwcmVmZXJlbmNlc1xuICAgICAgICB2YXIgd2VpZ2h0ZWQgPSBidWlsZFdlaWdodGVkQ29udGV4dChoaXN0b3J5LCBvcHRpb25zKVxuICAgICAgICBoaXN0b3J5LnByZWZlcmVuY2VzID0gYWdncmVnYXRlUHJlZmVyZW5jZXMod2VpZ2h0ZWQpXG5cbiAgICAgICAgd3JpdGVUb1N0b3JhZ2UoaGlzdG9yeSlcblxuICAgICAgICByZXR1cm4gaGlzdG9yeVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdXNlciBJRCBmcm9tIGhpc3RvcnkgKGNyZWF0ZXMgb25lIGlmIG5lZWRlZClcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFVzZXIgVVVJRFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFVzZXJJZCgpIHtcbiAgICAgICAgdmFyIGhpc3RvcnkgPSBnZXRIaXN0b3J5KClcbiAgICAgICAgcmV0dXJuIGhpc3RvcnkudXNlcklkXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhpcyBpcyBhIHJldHVybmluZyB1c2VyIChoYXMgcHJldmlvdXMgdmlzaXRzKVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzUmV0dXJuaW5nVXNlcigpIHtcbiAgICAgICAgdmFyIGhpc3RvcnkgPSByZWFkRnJvbVN0b3JhZ2UoKVxuICAgICAgICByZXR1cm4gaGlzdG9yeSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KGhpc3RvcnkudmlzaXRzKSAmJiBoaXN0b3J5LnZpc2l0cy5sZW5ndGggPiAwXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBtb3N0IHJlY2VudCB2aXNpdCBmcm9tIGhpc3RvcnlcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fG51bGx9IC0gTW9zdCByZWNlbnQgdmlzaXQgb3IgbnVsbFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldExhc3RWaXNpdCgpIHtcbiAgICAgICAgdmFyIGhpc3RvcnkgPSByZWFkRnJvbVN0b3JhZ2UoKVxuICAgICAgICBpZiAoIWhpc3RvcnkgfHwgIUFycmF5LmlzQXJyYXkoaGlzdG9yeS52aXNpdHMpIHx8IGhpc3RvcnkudmlzaXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGlzdG9yeS52aXNpdHNbaGlzdG9yeS52aXNpdHMubGVuZ3RoIC0gMV1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXQgd2VpZ2h0ZWQgaGlzdG9yeSBhcyBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBmb3IgQUkgcHJvbXB0c1xuICAgICAqIEBwYXJhbSB7QXJyYXl9IHdlaWdodGVkVmlzaXRzIC0gT3V0cHV0IG9mIGJ1aWxkV2VpZ2h0ZWRDb250ZXh0XG4gICAgICogQHJldHVybnMge3N0cmluZ30gLSBGb3JtYXR0ZWQgc3RyaW5nXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9ybWF0Rm9yUHJvbXB0KHdlaWdodGVkVmlzaXRzKSB7XG4gICAgICAgIGlmICghd2VpZ2h0ZWRWaXNpdHMgfHwgd2VpZ2h0ZWRWaXNpdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gJ05vIHByZXZpb3VzIHZpc2l0IGhpc3RvcnkgYXZhaWxhYmxlLiBUaGlzIGlzIGEgbmV3IHZpc2l0b3IuJ1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGxpbmVzID0gW11cbiAgICAgICAgbGluZXMucHVzaCgnUHJldmlvdXMgdmlzaXRzICgnICsgd2VpZ2h0ZWRWaXNpdHMubGVuZ3RoICsgJyByZWNvcmRlZCwgd2VpZ2h0ZWQgYnkgcmVjZW5jeSk6JylcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdlaWdodGVkVmlzaXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdiA9IHdlaWdodGVkVmlzaXRzW2ldXG4gICAgICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHYudGltZXN0YW1wKVxuICAgICAgICAgICAgdmFyIGRhdGVTdHIgPSBkYXRlLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXVxuICAgICAgICAgICAgdmFyIGxpbmUgPSAnICAtIFsnICsgZGF0ZVN0ciArICddICdcbiAgICAgICAgICAgIGxpbmUgKz0gJ0ludGVudDogJyArIHYuaW50ZW50XG4gICAgICAgICAgICBpZiAodi5zZWxlY3RlZFZhcmlhbnQpIGxpbmUgKz0gJywgVmFyaWFudDogJyArIHYuc2VsZWN0ZWRWYXJpYW50XG4gICAgICAgICAgICBsaW5lICs9ICcsIFNvdXJjZTogJyArIHYuc291cmNlXG4gICAgICAgICAgICBsaW5lICs9ICcsIFdlaWdodDogJyArIHYud2VpZ2h0XG4gICAgICAgICAgICBpZiAodi5jb250ZXh0ICYmIHYuY29udGV4dC51dG0gJiYgdi5jb250ZXh0LnV0bS51dG1fc291cmNlKSB7XG4gICAgICAgICAgICAgICAgbGluZSArPSAnLCBVVE06ICcgKyB2LmNvbnRleHQudXRtLnV0bV9zb3VyY2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxpbmVzLnB1c2gobGluZSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIGFsbCBoaXN0b3J5ICh1c2VmdWwgZm9yIHRlc3Rpbmcgb3IgdXNlciByZXF1ZXN0KVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGNsZWFyIHdhcyBzdWNjZXNzZnVsXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xlYXJIaXN0b3J5KCkge1xuICAgICAgICBpZiAoIWlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlKCkpIHJldHVybiBmYWxzZVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oU1RPUkFHRV9LRVkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBQdWJsaWMgQVBJXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgdmFyIEx1YVdlaWdodGVkSGlzdG9yeSA9IHtcbiAgICAgICAgLy8gQ29yZSBmdW5jdGlvbnNcbiAgICAgICAgZ2V0SGlzdG9yeTogZ2V0SGlzdG9yeSxcbiAgICAgICAgcmVjb3JkVmlzaXQ6IHJlY29yZFZpc2l0LFxuICAgICAgICBnZXRVc2VySWQ6IGdldFVzZXJJZCxcbiAgICAgICAgaXNSZXR1cm5pbmdVc2VyOiBpc1JldHVybmluZ1VzZXIsXG4gICAgICAgIGdldExhc3RWaXNpdDogZ2V0TGFzdFZpc2l0LFxuICAgICAgICBjbGVhckhpc3Rvcnk6IGNsZWFySGlzdG9yeSxcblxuICAgICAgICAvLyBXZWlnaHRlZCBjb250ZXh0XG4gICAgICAgIGNhbGN1bGF0ZVdlaWdodDogY2FsY3VsYXRlV2VpZ2h0LFxuICAgICAgICBidWlsZFdlaWdodGVkQ29udGV4dDogYnVpbGRXZWlnaHRlZENvbnRleHQsXG4gICAgICAgIGFnZ3JlZ2F0ZVByZWZlcmVuY2VzOiBhZ2dyZWdhdGVQcmVmZXJlbmNlcyxcbiAgICAgICAgZm9ybWF0Rm9yUHJvbXB0OiBmb3JtYXRGb3JQcm9tcHQsXG5cbiAgICAgICAgLy8gVXRpbGl0aWVzXG4gICAgICAgIGlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlOiBpc0xvY2FsU3RvcmFnZUF2YWlsYWJsZSxcbiAgICAgICAgZ2VuZXJhdGVVVUlEOiBnZW5lcmF0ZVVVSUQsXG5cbiAgICAgICAgLy8gQ29uc3RhbnRzXG4gICAgICAgIFNUT1JBR0VfS0VZOiBTVE9SQUdFX0tFWSxcbiAgICAgICAgREVGQVVMVF9ERUNBWV9SQVRFOiBERUZBVUxUX0RFQ0FZX1JBVEUsXG4gICAgICAgIERFRkFVTFRfTUFYX0hJU1RPUlk6IERFRkFVTFRfTUFYX0hJU1RPUllcbiAgICB9XG5cbiAgICAvLyBSZWdpc3RlciBnbG9iYWxseVxuICAgIHJvb3QuTHVhV2VpZ2h0ZWRIaXN0b3J5ID0gTHVhV2VpZ2h0ZWRIaXN0b3J5XG5cbn0pKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB0aGlzKVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQyxDQUFDLFVBQVVBLElBQUksRUFBRTtFQUNkLFlBQVk7O0VBRVo7RUFDQTtFQUNBO0VBRUEsSUFBSUMsV0FBVyxHQUFHLHlCQUF5QjtFQUMzQyxJQUFJQyxrQkFBa0IsR0FBRyxHQUFHO0VBQzVCLElBQUlDLG1CQUFtQixHQUFHLEVBQUU7RUFDNUIsSUFBSUMsb0JBQW9CLEdBQUcsQ0FBQztFQUM1QixJQUFJQyxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTs7RUFFcEM7RUFDQTtFQUNBOztFQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFDSSxTQUFTQyxZQUFZQSxDQUFBLEVBQUc7SUFDcEIsSUFBSTtNQUNBLElBQUksT0FBT0MsTUFBTSxLQUFLLFdBQVcsSUFBSUEsTUFBTSxDQUFDQyxlQUFlLEVBQUU7UUFDekQsSUFBSUMs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
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
// NOTE: use a module
|
|
8
|
+
var _default = exports.default = function _default() {
|
|
9
|
+
return {
|
|
10
|
+
type: 'browserCookie',
|
|
11
|
+
/*eslint-disable */
|
|
12
|
+
get: function get(key) {
|
|
13
|
+
return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;
|
|
14
|
+
},
|
|
15
|
+
set: function set(key, val) {
|
|
16
|
+
var expirationDate = new Date('12/31/9999').toUTCString();
|
|
17
|
+
document.cookie = "".concat(encodeURIComponent(key), "=").concat(encodeURIComponent(val), "; expires=").concat(expirationDate, "; path=/");
|
|
18
|
+
},
|
|
19
|
+
/* eslint-enable */
|
|
20
|
+
isSupported: function isSupported() {
|
|
21
|
+
return typeof document !== 'undefined';
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZGVmYXVsdCIsImV4cG9ydHMiLCJkZWZhdWx0IiwidHlwZSIsImdldCIsImtleSIsImRlY29kZVVSSUNvbXBvbmVudCIsImRvY3VtZW50IiwiY29va2llIiwicmVwbGFjZSIsIlJlZ0V4cCIsImVuY29kZVVSSUNvbXBvbmVudCIsInNldCIsInZhbCIsImV4cGlyYXRpb25EYXRlIiwiRGF0ZSIsInRvVVRDU3RyaW5nIiwiY29uY2F0IiwiaXNTdXBwb3J0ZWQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3RvcmVzL2Jyb3dzZXItY29va2llLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlxuLy8gTk9URTogdXNlIGEgbW9kdWxlXG5leHBvcnQgZGVmYXVsdCAoKSA9PiAoe1xuICB0eXBlOiAnYnJvd3NlckNvb2tpZScsXG4gIC8qZXNsaW50LWRpc2FibGUgKi9cbiAgZ2V0OiBrZXkgPT4gZGVjb2RlVVJJQ29tcG9uZW50KGRvY3VtZW50LmNvb2tpZS5yZXBsYWNlKG5ldyBSZWdFeHAoXCIoPzooPzpefC4qOylcXFxccypcIiArIGVuY29kZVVSSUNvbXBvbmVudChrZXkpLnJlcGxhY2UoL1tcXC1cXC5cXCtcXCpdL2csIFwiXFxcXCQmXCIpICsgXCJcXFxccypcXFxcPVxcXFxzKihbXjtdKikuKiQpfF4uKiRcIiksIFwiJDFcIikpIHx8IG51bGwsXG4gIHNldDogKGtleSwgdmFsKSA9PiB7XG4gICAgY29uc3QgZXhwaXJhdGlvbkRhdGUgPSBuZXcgRGF0ZSgnMTIvMzEvOTk5OScpLnRvVVRDU3RyaW5nKClcbiAgICBkb2N1bWVudC5jb29raWUgPSBgJHtlbmNvZGVVUklDb21wb25lbnQoa2V5KX09JHtlbmNvZGVVUklDb21wb25lbnQodmFsKX07IGV4cGlyZXM9JHtleHBpcmF0aW9uRGF0ZX07IHBhdGg9L2BcbiAgfSxcbiAgLyogZXNsaW50LWVuYWJsZSAqL1xuICBpc1N1cHBvcnRlZDogKCkgPT4gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyxcbn0pXG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBO0FBQUEsSUFBQUEsUUFBQSxHQUFBQyxPQUFBLENBQUFDLE9BQUEsR0FDZSxTQUFBRixTQUFBO0VBQUEsT0FBTztJQUNwQkcsSUFBSSxFQUFFLGVBQWU7SUFDckI7SUFDQUMsR0FBRyxFQUFFLFNBQUxBLEdBQUdBLENBQUVDLEdBQUc7TUFBQSxPQUFJQyxrQkFBa0IsQ0FBQ0MsUUFBUSxDQUFDQyxNQUFNLENBQUNDLE9BQU8sQ0FBQyxJQUFJQyxNQUFNLENBQUMsa0JBQWtCLEdBQUdDLGtCQUFrQixDQUFDTixHQUFHLENBQUMsQ0FBQ0ksT0FBTyxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsR0FBRyw2QkFBNkIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSTtJQUFBO0lBQzlMRyxHQUFHLEVBQUUsU0FBTEEsR0FBR0EsQ0FBR1AsR0FBRyxFQUFFUSxHQUFHLEVBQUs7TUFDakIsSUFBTUMsY0FBYyxHQUFHLElBQUlDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQ0MsV0FBVyxDQUFDLENBQUM7TUFDM0RULFFBQVEsQ0FBQ0MsTUFBTSxNQUFBUyxNQUFBLENBQU1OLGtCQUFrQixDQUFDTixHQUFHLENBQUMsT0FBQVksTUFBQSxDQUFJTixrQkFBa0IsQ0FBQ0UsR0FBRyxDQUFDLGdCQUFBSSxNQUFBLENBQWFILGNBQWMsYUFBVTtJQUM5RyxDQUFDO0lBQ0Q7SUFDQUksV0FBVyxFQUFFLFNBQWJBLFdBQVdBLENBQUE7TUFBQSxPQUFRLE9BQU9YLFFBQVEsS0FBSyxXQUFXO0lBQUE7RUFDcEQsQ0FBQztBQUFBLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _default = exports.default = function _default() {
|
|
8
|
+
return {
|
|
9
|
+
type: 'local',
|
|
10
|
+
get: function get(key) {
|
|
11
|
+
return localStorage.getItem(key);
|
|
12
|
+
},
|
|
13
|
+
set: function set(key, val) {
|
|
14
|
+
return localStorage.setItem(key, val);
|
|
15
|
+
},
|
|
16
|
+
isSupported: function isSupported() {
|
|
17
|
+
if (typeof localStorage !== 'undefined') return true;
|
|
18
|
+
var uid = new Date();
|
|
19
|
+
try {
|
|
20
|
+
localStorage.setItem(uid, uid);
|
|
21
|
+
localStorage.removeItem(uid);
|
|
22
|
+
return true;
|
|
23
|
+
} catch (e) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZGVmYXVsdCIsInR5cGUiLCJnZXQiLCJrZXkiLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwic2V0IiwidmFsIiwic2V0SXRlbSIsImlzU3VwcG9ydGVkIiwidWlkIiwiRGF0ZSIsInJlbW92ZUl0ZW0iLCJlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N0b3Jlcy9sb2NhbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbmV4cG9ydCBkZWZhdWx0ICgpID0+ICh7XG4gIHR5cGU6ICdsb2NhbCcsXG4gIGdldDoga2V5ID0+IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSksXG4gIHNldDogKGtleSwgdmFsKSA9PiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbCksXG4gIGlzU3VwcG9ydGVkOiAoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBsb2NhbFN0b3JhZ2UgIT09ICd1bmRlZmluZWQnKSByZXR1cm4gdHJ1ZVxuICAgIGNvbnN0IHVpZCA9IG5ldyBEYXRlKClcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odWlkLCB1aWQpXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh1aWQpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfSxcbn0pXG4iXSwibWFwcGluZ3MiOiI7Ozs7OztpQ0FDZSxTQUFBQSxTQUFBO0VBQUEsT0FBTztJQUNwQkMsSUFBSSxFQUFFLE9BQU87SUFDYkMsR0FBRyxFQUFFLFNBQUxBLEdBQUdBLENBQUVDLEdBQUc7TUFBQSxPQUFJQyxZQUFZLENBQUNDLE9BQU8sQ0FBQ0YsR0FBRyxDQUFDO0lBQUE7SUFDckNHLEdBQUcsRUFBRSxTQUFMQSxHQUFHQSxDQUFHSCxHQUFHLEVBQUVJLEdBQUc7TUFBQSxPQUFLSCxZQUFZLENBQUNJLE9BQU8sQ0FBQ0wsR0FBRyxFQUFFSSxHQUFHLENBQUM7SUFBQTtJQUNqREUsV0FBVyxFQUFFLFNBQWJBLFdBQVdBLENBQUEsRUFBUTtNQUNqQixJQUFJLE9BQU9MLFlBQVksS0FBSyxXQUFXLEVBQUUsT0FBTyxJQUFJO01BQ3BELElBQU1NLEdBQUcsR0FBRyxJQUFJQyxJQUFJLENBQUMsQ0FBQztNQUN0QixJQUFJO1FBQ0ZQLFlBQVksQ0FBQ0ksT0FBTyxDQUFDRSxHQUFHLEVBQUVBLEdBQUcsQ0FBQztRQUM5Qk4sWUFBWSxDQUFDUSxVQUFVLENBQUNGLEdBQUcsQ0FBQztRQUM1QixPQUFPLElBQUk7TUFDYixDQUFDLENBQUMsT0FBT0csQ0FBQyxFQUFFO1FBQ1YsT0FBTyxLQUFLO01BQ2Q7SUFDRjtFQUNGLENBQUM7QUFBQSxDQUFDIiwiaWdub3JlTGlzdCI6W119
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _default = exports.default = function _default() {
|
|
8
|
+
var store = Object.create(null);
|
|
9
|
+
return {
|
|
10
|
+
type: 'memory',
|
|
11
|
+
get: function get(key) {
|
|
12
|
+
return store[key];
|
|
13
|
+
},
|
|
14
|
+
set: function set(key, val) {
|
|
15
|
+
store[key] = val;
|
|
16
|
+
},
|
|
17
|
+
isSupported: function isSupported() {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZGVmYXVsdCIsInN0b3JlIiwiT2JqZWN0IiwiY3JlYXRlIiwidHlwZSIsImdldCIsImtleSIsInNldCIsInZhbCIsImlzU3VwcG9ydGVkIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N0b3Jlcy9tZW1vcnkuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXG5leHBvcnQgZGVmYXVsdCAoKSA9PiB7XG4gIGNvbnN0IHN0b3JlID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ21lbW9yeScsXG4gICAgZ2V0OiBrZXkgPT4gc3RvcmVba2V5XSxcbiAgICBzZXQ6IChrZXksIHZhbCkgPT4ge1xuICAgICAgc3RvcmVba2V5XSA9IHZhbFxuICAgIH0sXG4gICAgaXNTdXBwb3J0ZWQ6ICgpID0+IHRydWUsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O2lDQUNlLFNBQUFBLFNBQUEsRUFBTTtFQUNuQixJQUFNQyxLQUFLLEdBQUdDLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDLElBQUksQ0FBQztFQUVqQyxPQUFPO0lBQ0xDLElBQUksRUFBRSxRQUFRO0lBQ2RDLEdBQUcsRUFBRSxTQUFMQSxHQUFHQSxDQUFFQyxHQUFHO01BQUEsT0FBSUwsS0FBSyxDQUFDSyxHQUFHLENBQUM7SUFBQTtJQUN0QkMsR0FBRyxFQUFFLFNBQUxBLEdBQUdBLENBQUdELEdBQUcsRUFBRUUsR0FBRyxFQUFLO01BQ2pCUCxLQUFLLENBQUNLLEdBQUcsQ0FBQyxHQUFHRSxHQUFHO0lBQ2xCLENBQUM7SUFDREMsV0FBVyxFQUFFLFNBQWJBLFdBQVdBLENBQUE7TUFBQSxPQUFRLElBQUk7SUFBQTtFQUN6QixDQUFDO0FBQ0gsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.validateStore = exports.rand = exports.getRandomAssignment = exports.getDefaultBucket = exports.chooseWeightedItem = void 0;
|
|
7
|
+
var rand = exports.rand = function rand(min, max) {
|
|
8
|
+
return Math.random() * (max - min) + min;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
// choose a random value with the specified weights
|
|
12
|
+
var chooseWeightedItem = exports.chooseWeightedItem = function chooseWeightedItem(names, weights) {
|
|
13
|
+
if (names.length !== weights.length) throw new Error('names and weights must have equal length!');
|
|
14
|
+
var sum = weights.reduce(function (a, b) {
|
|
15
|
+
return a + b;
|
|
16
|
+
}, 0);
|
|
17
|
+
var limit = 0;
|
|
18
|
+
var n = rand(0, sum);
|
|
19
|
+
for (var i = 0; i < names.length; i++) {
|
|
20
|
+
limit += weights[i];
|
|
21
|
+
if (n <= limit) return names[i];
|
|
22
|
+
}
|
|
23
|
+
// by default, return the last weight
|
|
24
|
+
return names[names.length - 1];
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// get the default bucket,
|
|
28
|
+
// which is either the default/winner,
|
|
29
|
+
// otherwise whichever is returned first
|
|
30
|
+
var getDefaultBucket = exports.getDefaultBucket = function getDefaultBucket(buckets) {
|
|
31
|
+
var defaultBuckets = Object.keys(buckets).filter(function (name) {
|
|
32
|
+
var x = buckets[name];
|
|
33
|
+
return x.default || x.winner;
|
|
34
|
+
});
|
|
35
|
+
return defaultBuckets[0] || Object.keys(buckets)[0];
|
|
36
|
+
};
|
|
37
|
+
var validateStore = exports.validateStore = function validateStore(store) {
|
|
38
|
+
if (!store) throw new Error('You must supply a store!');
|
|
39
|
+
if (typeof store.get !== 'function') throw new Error('The store must implement .get()');
|
|
40
|
+
if (typeof store.set !== 'function') throw new Error('The store must implement .set()');
|
|
41
|
+
if (typeof store.isSupported !== 'function') throw new Error('The store must implement .isSupported()');
|
|
42
|
+
if (!store.isSupported()) throw new Error('The store is not supported.');
|
|
43
|
+
};
|
|
44
|
+
var getRandomAssignment = exports.getRandomAssignment = function getRandomAssignment(test) {
|
|
45
|
+
var names = Object.keys(test.buckets);
|
|
46
|
+
var weights = [];
|
|
47
|
+
names.forEach(function (innerBucketName) {
|
|
48
|
+
var weight = test.buckets[innerBucketName].weight;
|
|
49
|
+
if (weight == null) weight = 1;
|
|
50
|
+
weights.push(weight);
|
|
51
|
+
});
|
|
52
|
+
return chooseWeightedItem(names, weights);
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyYW5kIiwiZXhwb3J0cyIsIm1pbiIsIm1heCIsIk1hdGgiLCJyYW5kb20iLCJjaG9vc2VXZWlnaHRlZEl0ZW0iLCJuYW1lcyIsIndlaWdodHMiLCJsZW5ndGgiLCJFcnJvciIsInN1bSIsInJlZHVjZSIsImEiLCJiIiwibGltaXQiLCJuIiwiaSIsImdldERlZmF1bHRCdWNrZXQiLCJidWNrZXRzIiwiZGVmYXVsdEJ1Y2tldHMiLCJPYmplY3QiLCJrZXlzIiwiZmlsdGVyIiwibmFtZSIsIngiLCJkZWZhdWx0Iiwid2lubmVyIiwidmFsaWRhdGVTdG9yZSIsInN0b3JlIiwiZ2V0Iiwic2V0IiwiaXNTdXBwb3J0ZWQiLCJnZXRSYW5kb21Bc3NpZ25tZW50IiwidGVzdCIsImZvckVhY2giLCJpbm5lckJ1Y2tldE5hbWUiLCJ3ZWlnaHQiLCJwdXNoIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlxuZXhwb3J0IGNvbnN0IHJhbmQgPSAobWluLCBtYXgpID0+IChNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikpICsgbWluXG5cbi8vIGNob29zZSBhIHJhbmRvbSB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQgd2VpZ2h0c1xuZXhwb3J0IGNvbnN0IGNob29zZVdlaWdodGVkSXRlbSA9IChuYW1lcywgd2VpZ2h0cykgPT4ge1xuICBpZiAobmFtZXMubGVuZ3RoICE9PSB3ZWlnaHRzLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCduYW1lcyBhbmQgd2VpZ2h0cyBtdXN0IGhhdmUgZXF1YWwgbGVuZ3RoIScpXG4gIGNvbnN0IHN1bSA9IHdlaWdodHMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMClcbiAgbGV0IGxpbWl0ID0gMFxuICBjb25zdCBuID0gcmFuZCgwLCBzdW0pXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICBsaW1pdCArPSB3ZWlnaHRzW2ldXG4gICAgaWYgKG4gPD0gbGltaXQpIHJldHVybiBuYW1lc1tpXVxuICB9XG4gIC8vIGJ5IGRlZmF1bHQsIHJldHVybiB0aGUgbGFzdCB3ZWlnaHRcbiAgcmV0dXJuIG5hbWVzW25hbWVzLmxlbmd0aCAtIDFdXG59XG5cbi8vIGdldCB0aGUgZGVmYXVsdCBidWNrZXQsXG4vLyB3aGljaCBpcyBlaXRoZXIgdGhlIGRlZmF1bHQvd2lubmVyLFxuLy8gb3RoZXJ3aXNlIHdoaWNoZXZlciBpcyByZXR1cm5lZCBmaXJzdFxuZXhwb3J0IGNvbnN0IGdldERlZmF1bHRCdWNrZXQgPSAoYnVja2V0cykgPT4ge1xuICBjb25zdCBkZWZhdWx0QnVja2V0cyA9IE9iamVjdC5rZXlzKGJ1Y2tldHMpLmZpbHRlcigobmFtZSkgPT4ge1xuICAgIGNvbnN0IHggPSBidWNrZXRzW25hbWVdXG4gICAgcmV0dXJuIHguZGVmYXVsdCB8fCB4Lndpbm5lclxuICB9KVxuICByZXR1cm4gZGVmYXVsdEJ1Y2tldHNbMF0gfHwgT2JqZWN0LmtleXMoYnVja2V0cylbMF1cbn1cblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlU3RvcmUgPSAoc3RvcmUpID0+IHtcbiAgaWYgKCFzdG9yZSkgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBzdXBwbHkgYSBzdG9yZSEnKVxuICBpZiAodHlwZW9mIHN0b3JlLmdldCAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IEVycm9yKCdUaGUgc3RvcmUgbXVzdCBpbXBsZW1lbnQgLmdldCgpJylcbiAgaWYgKHR5cGVvZiBzdG9yZS5zZXQgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBFcnJvcignVGhlIHN0b3JlIG11c3QgaW1wbGVtZW50IC5zZXQoKScpXG4gIGlmICh0eXBlb2Ygc3RvcmUuaXNTdXBwb3J0ZWQgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBFcnJvcignVGhlIHN0b3JlIG11c3QgaW1wbGVtZW50IC5pc1N1cHBvcnRlZCgpJylcbiAgaWYgKCFzdG9yZS5pc1N1cHBvcnRlZCgpKSB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBzdG9yZSBpcyBub3Qgc3VwcG9ydGVkLicpXG59XG5cbmV4cG9ydCBjb25zdCBnZXRSYW5kb21Bc3NpZ25tZW50ID0gKHRlc3QpID0+IHtcbiAgY29uc3QgbmFtZXMgPSBPYmplY3Qua2V5cyh0ZXN0LmJ1Y2tldHMpXG4gIGNvbnN0IHdlaWdodHMgPSBbXVxuXG4gIG5hbWVzLmZvckVhY2goKGlubmVyQnVja2V0TmFtZSkgPT4ge1xuICAgIGxldCB3ZWlnaHQgPSB0ZXN0LmJ1Y2tldHNbaW5uZXJCdWNrZXROYW1lXS53ZWlnaHRcbiAgICBpZiAod2VpZ2h0ID09IG51bGwpIHdlaWdodCA9IDFcbiAgICB3ZWlnaHRzLnB1c2god2VpZ2h0KVxuICB9KVxuXG4gIHJldHVybiBjaG9vc2VXZWlnaHRlZEl0ZW0obmFtZXMsIHdlaWdodHMpXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNPLElBQU1BLElBQUksR0FBQUMsT0FBQSxDQUFBRCxJQUFBLEdBQUcsU0FBUEEsSUFBSUEsQ0FBSUUsR0FBRyxFQUFFQyxHQUFHO0VBQUEsT0FBTUMsSUFBSSxDQUFDQyxNQUFNLENBQUMsQ0FBQyxJQUFJRixHQUFHLEdBQUdELEdBQUcsQ0FBQyxHQUFJQSxHQUFHO0FBQUE7O0FBRXJFO0FBQ08sSUFBTUksa0JBQWtCLEdBQUFMLE9BQUEsQ0FBQUssa0JBQUEsR0FBRyxTQUFyQkEsa0JBQWtCQSxDQUFJQyxLQUFLLEVBQUVDLE9BQU8sRUFBSztFQUNwRCxJQUFJRCxLQUFLLENBQUNFLE1BQU0sS0FBS0QsT0FBTyxDQUFDQyxNQUFNLEVBQUUsTUFBTSxJQUFJQyxLQUFLLENBQUMsMkNBQTJDLENBQUM7RUFDakcsSUFBTUMsR0FBRyxHQUFHSCxPQUFPLENBQUNJLE1BQU0sQ0FBQyxVQUFDQyxDQUFDLEVBQUVDLENBQUM7SUFBQSxPQUFLRCxDQUFDLEdBQUdDLENBQUM7RUFBQSxHQUFFLENBQUMsQ0FBQztFQUM5QyxJQUFJQyxLQUFLLEdBQUcsQ0FBQztFQUNiLElBQU1DLENBQUMsR0FBR2hCLElBQUksQ0FBQyxDQUFD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
|