@beforeyoubid/logger-adapter 1.0.12 → 2.0.0

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 (37) hide show
  1. package/README.md +55 -127
  2. package/dist/console/logWrapper.d.ts +4 -0
  3. package/dist/index.d.ts +2 -1
  4. package/dist/logger/index.d.ts +1 -1
  5. package/dist/logger/logdnaClient.d.ts +19 -0
  6. package/dist/logger/logger.d.ts +12 -2
  7. package/dist/logger/util.d.ts +11 -0
  8. package/dist/params.d.ts +1 -1
  9. package/dist/src/__tests__/params.spec.js +84 -0
  10. package/dist/src/console/__tests__/consoleLogger.spec.js +18 -0
  11. package/dist/src/console/index.js +44 -0
  12. package/dist/src/console/logWrapper.js +99 -0
  13. package/dist/{consts.js → src/consts.js} +1 -1
  14. package/dist/src/index.js +40 -0
  15. package/dist/src/logger/__tests__/index.spec.js +24 -0
  16. package/dist/src/logger/__tests__/logger.spec.js +139 -0
  17. package/dist/src/logger/__tests__/util.spec.js +81 -0
  18. package/dist/src/logger/index.js +17 -0
  19. package/dist/src/logger/logdnaClient.js +47 -0
  20. package/dist/src/logger/logger.js +61 -0
  21. package/dist/src/logger/util.js +57 -0
  22. package/dist/src/params.js +66 -0
  23. package/dist/src/transports/logdnaWinston.js +267 -0
  24. package/dist/src/util.js +328 -0
  25. package/dist/transports/logdnaWinston.d.ts +28 -0
  26. package/dist/types.d.ts +1 -1
  27. package/dist/util.d.ts +1 -0
  28. package/package.json +10 -10
  29. package/dist/console/index.js +0 -37
  30. package/dist/console/logger.d.ts +0 -4
  31. package/dist/console/logger.js +0 -108
  32. package/dist/index.js +0 -36
  33. package/dist/logger/index.js +0 -16
  34. package/dist/logger/logger.js +0 -51
  35. package/dist/params.js +0 -60
  36. package/dist/util.js +0 -291
  37. /package/dist/{types.js → src/types.js} +0 -0
package/dist/util.js DELETED
@@ -1,291 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- function _export(target, all) {
6
- for(var name in all)Object.defineProperty(target, name, {
7
- enumerable: true,
8
- get: all[name]
9
- });
10
- }
11
- _export(exports, {
12
- isLogDNAEnabled: function() {
13
- return isLogDNAEnabled;
14
- },
15
- flushAll: function() {
16
- return flushAll;
17
- },
18
- ensureFlushAll: function() {
19
- return ensureFlushAll;
20
- },
21
- ensureFlushAllCallback: function() {
22
- return ensureFlushAllCallback;
23
- }
24
- });
25
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
26
- try {
27
- var info = gen[key](arg);
28
- var value = info.value;
29
- } catch (error) {
30
- reject(error);
31
- return;
32
- }
33
- if (info.done) {
34
- resolve(value);
35
- } else {
36
- Promise.resolve(value).then(_next, _throw);
37
- }
38
- }
39
- function _asyncToGenerator(fn) {
40
- return function() {
41
- var self = this, args = arguments;
42
- return new Promise(function(resolve, reject) {
43
- var gen = fn.apply(self, args);
44
- function _next(value) {
45
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
46
- }
47
- function _throw(err) {
48
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
49
- }
50
- _next(undefined);
51
- });
52
- };
53
- }
54
- var __generator = (void 0) && (void 0).__generator || function(thisArg, body) {
55
- var f, y, t, g, _ = {
56
- label: 0,
57
- sent: function() {
58
- if (t[0] & 1) throw t[1];
59
- return t[1];
60
- },
61
- trys: [],
62
- ops: []
63
- };
64
- return(g = {
65
- next: verb(0),
66
- "throw": verb(1),
67
- "return": verb(2)
68
- }, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
69
- return this;
70
- }), g);
71
- function verb(n) {
72
- return function(v) {
73
- return step([
74
- n,
75
- v
76
- ]);
77
- };
78
- }
79
- function step(op) {
80
- if (f) throw new TypeError("Generator is already executing.");
81
- while(_)try {
82
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
83
- if (y = 0, t) op = [
84
- op[0] & 2,
85
- t.value
86
- ];
87
- switch(op[0]){
88
- case 0:
89
- case 1:
90
- t = op;
91
- break;
92
- case 4:
93
- _.label++;
94
- return {
95
- value: op[1],
96
- done: false
97
- };
98
- case 5:
99
- _.label++;
100
- y = op[1];
101
- op = [
102
- 0
103
- ];
104
- continue;
105
- case 7:
106
- op = _.ops.pop();
107
- _.trys.pop();
108
- continue;
109
- default:
110
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
111
- _ = 0;
112
- continue;
113
- }
114
- if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
115
- _.label = op[1];
116
- break;
117
- }
118
- if (op[0] === 6 && _.label < t[1]) {
119
- _.label = t[1];
120
- t = op;
121
- break;
122
- }
123
- if (t && _.label < t[2]) {
124
- _.label = t[2];
125
- _.ops.push(op);
126
- break;
127
- }
128
- if (t[2]) _.ops.pop();
129
- _.trys.pop();
130
- continue;
131
- }
132
- op = body.call(thisArg, _);
133
- } catch (e) {
134
- op = [
135
- 6,
136
- e
137
- ];
138
- y = 0;
139
- } finally{
140
- f = t = 0;
141
- }
142
- if (op[0] & 5) throw op[1];
143
- return {
144
- value: op[0] ? op[1] : void 0,
145
- done: true
146
- };
147
- }
148
- };
149
- var LogDNALogger = require("logdna");
150
- var debug = require("util").debuglog("logger-adapter");
151
- var FALLBACK_TIMEOUT_AFTER_FLUSHING = require("./consts").FALLBACK_TIMEOUT_AFTER_FLUSHING;
152
- var getLogParams = require("./params").getLogParams;
153
- // timeout
154
- var timeout;
155
- /**
156
- * Handy function to check if we are sending to LogDNA
157
- * @param logDNAKey
158
- * @param sendToRemote
159
- */ var isLogDNAEnabled = function(logDNAKey, sendToRemote) {
160
- return !!logDNAKey && sendToRemote;
161
- };
162
- /**
163
- * REturn if we need to suppress flushAll on a local machine
164
- */ var suppressFlushAll = function() {
165
- var _getLogParams;
166
- return ((_getLogParams = getLogParams()) === null || _getLogParams === void 0 ? void 0 : _getLogParams.logDNASuppressFlushAll) || false;
167
- };
168
- /**
169
- * Send all log messages to LogDNA before lambda is terminated
170
- */ var flushAll = function() {
171
- var _ref = _asyncToGenerator(function() {
172
- return __generator(this, function(_state) {
173
- return [
174
- 2,
175
- new Promise(function(resolve) {
176
- debug("Flushing all logs...");
177
- LogDNALogger.flushAll(function() {
178
- debug("Completed flushing all log messages");
179
- if (timeout) {
180
- clearTimeout(timeout);
181
- }
182
- resolve();
183
- });
184
- })
185
- ];
186
- });
187
- });
188
- return function flushAll() {
189
- return _ref.apply(this, arguments);
190
- };
191
- }();
192
- /**
193
- * Fallback promise just in
194
- */ var timeoutPromise = function() {
195
- return new Promise(function(resolve) {
196
- timeout = setTimeout(function() {
197
- debug("Flushing timeout has reached. Ignore flushing messages...");
198
- resolve();
199
- }, FALLBACK_TIMEOUT_AFTER_FLUSHING);
200
- });
201
- };
202
- /**
203
- * Lambda wrapper to ensure we flush messages before returning the response
204
- * @param lambdaHandler
205
- */ var ensureFlushAll = function(lambdaHandler) {
206
- return function() {
207
- var _ref = _asyncToGenerator(function(event, context) {
208
- var result, e;
209
- return __generator(this, function(_state) {
210
- switch(_state.label){
211
- case 0:
212
- _state.trys.push([
213
- 0,
214
- 4,
215
- ,
216
- 7
217
- ]);
218
- return [
219
- 4,
220
- lambdaHandler(event, context)
221
- ];
222
- case 1:
223
- result = _state.sent();
224
- if (!!suppressFlushAll()) return [
225
- 3,
226
- 3
227
- ];
228
- return [
229
- 4,
230
- Promise.race([
231
- flushAll(),
232
- timeoutPromise()
233
- ])
234
- ];
235
- case 2:
236
- _state.sent();
237
- _state.label = 3;
238
- case 3:
239
- return [
240
- 2,
241
- result
242
- ];
243
- case 4:
244
- e = _state.sent();
245
- if (!!suppressFlushAll()) return [
246
- 3,
247
- 6
248
- ];
249
- return [
250
- 4,
251
- Promise.race([
252
- flushAll(),
253
- timeoutPromise()
254
- ])
255
- ];
256
- case 5:
257
- _state.sent();
258
- _state.label = 6;
259
- case 6:
260
- throw e;
261
- case 7:
262
- return [
263
- 2
264
- ];
265
- }
266
- });
267
- });
268
- return function(event, context) {
269
- return _ref.apply(this, arguments);
270
- };
271
- }();
272
- };
273
- /**
274
- * A Lambda wrapper to ensure we flush messages before a Lambda function get terminated
275
- * NOTE: For non-async handlers, AWS Lambda will wait until the event loop is completed.
276
- * This means after a callback function is called, a Lambda function still run
277
- * and we can catch the final clean up.
278
- * REF: https://docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html
279
- *
280
- * @param lambdaHandler
281
- */ var ensureFlushAllCallback = function(lambdaHandler) {
282
- return function(event, context, callback) {
283
- var thisCallback = function(error, result) {
284
- callback(error, result);
285
- if (!suppressFlushAll()) flushAll();
286
- };
287
- lambdaHandler(event, context, thisCallback);
288
- };
289
- };
290
-
291
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExhbWJkYUhhbmRsZXJXaXRoQXN5bmNGdW5jdGlvbiwgTGFtYmRhSGFuZGxlcldpdGhDYWxsYmFja0Z1bmN0aW9uLCBDYWxsYmFja0Z1bmN0aW9uIH0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IExvZ0ROQUxvZ2dlciA9IHJlcXVpcmUoJ2xvZ2RuYScpO1xuY29uc3QgZGVidWcgPSByZXF1aXJlKCd1dGlsJykuZGVidWdsb2coJ2xvZ2dlci1hZGFwdGVyJyk7XG5jb25zdCB7IEZBTExCQUNLX1RJTUVPVVRfQUZURVJfRkxVU0hJTkcgfSA9IHJlcXVpcmUoJy4vY29uc3RzJyk7XG5jb25zdCB7IGdldExvZ1BhcmFtcyB9ID0gcmVxdWlyZSgnLi9wYXJhbXMnKTtcblxuLy8gdGltZW91dFxubGV0IHRpbWVvdXQ6IE5vZGVKUy5UaW1lb3V0O1xuXG4vKipcbiAqIEhhbmR5IGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHdlIGFyZSBzZW5kaW5nIHRvIExvZ0ROQVxuICogQHBhcmFtIGxvZ0ROQUtleVxuICogQHBhcmFtIHNlbmRUb1JlbW90ZVxuICovXG5jb25zdCBpc0xvZ0ROQUVuYWJsZWQgPSAobG9nRE5BS2V5OiBzdHJpbmcsIHNlbmRUb1JlbW90ZTogYm9vbGVhbik6IGJvb2xlYW4gPT4gISFsb2dETkFLZXkgJiYgc2VuZFRvUmVtb3RlO1xuXG4vKipcbiAqIFJFdHVybiBpZiB3ZSBuZWVkIHRvIHN1cHByZXNzIGZsdXNoQWxsIG9uIGEgbG9jYWwgbWFjaGluZVxuICovXG5jb25zdCBzdXBwcmVzc0ZsdXNoQWxsID0gKCk6IGJvb2xlYW4gPT4gZ2V0TG9nUGFyYW1zKCk/LmxvZ0ROQVN1cHByZXNzRmx1c2hBbGwgfHwgZmFsc2U7XG5cbi8qKlxuICogU2VuZCBhbGwgbG9nIG1lc3NhZ2VzIHRvIExvZ0ROQSBiZWZvcmUgbGFtYmRhIGlzIHRlcm1pbmF0ZWRcbiAqL1xuY29uc3QgZmx1c2hBbGwgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICBkZWJ1ZygnRmx1c2hpbmcgYWxsIGxvZ3MuLi4nKTtcbiAgICBMb2dETkFMb2dnZXIuZmx1c2hBbGwoKCkgPT4ge1xuICAgICAgZGVidWcoJ0NvbXBsZXRlZCBmbHVzaGluZyBhbGwgbG9nIG1lc3NhZ2VzJyk7XG4gICAgICBpZiAodGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBGYWxsYmFjayBwcm9taXNlIGp1c3QgaW5cbiAqL1xuY29uc3QgdGltZW91dFByb21pc2UgPSAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBkZWJ1ZygnRmx1c2hpbmcgdGltZW91dCBoYXMgcmVhY2hlZC4gSWdub3JlIGZsdXNoaW5nIG1lc3NhZ2VzLi4uJyk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSwgRkFMTEJBQ0tfVElNRU9VVF9BRlRFUl9GTFVTSElORyk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBMYW1iZGEgd3JhcHBlciB0byBlbnN1cmUgd2UgZmx1c2ggbWVzc2FnZXMgYmVmb3JlIHJldHVybmluZyB0aGUgcmVzcG9uc2VcbiAqIEBwYXJhbSBsYW1iZGFIYW5kbGVyXG4gKi9cbmNvbnN0IGVuc3VyZUZsdXNoQWxsID0gKGxhbWJkYUhhbmRsZXI6IExhbWJkYUhhbmRsZXJXaXRoQXN5bmNGdW5jdGlvbik6IExhbWJkYUhhbmRsZXJXaXRoQXN5bmNGdW5jdGlvbiA9PiB7XG4gIHJldHVybiBhc3luYyAoZXZlbnQ6IGFueSwgY29udGV4dDogYW55KTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbGFtYmRhSGFuZGxlcihldmVudCwgY29udGV4dCk7XG4gICAgICBpZiAoIXN1cHByZXNzRmx1c2hBbGwoKSkgYXdhaXQgUHJvbWlzZS5yYWNlKFtmbHVzaEFsbCgpLCB0aW1lb3V0UHJvbWlzZSgpXSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICghc3VwcHJlc3NGbHVzaEFsbCgpKSBhd2FpdCBQcm9taXNlLnJhY2UoW2ZsdXNoQWxsKCksIHRpbWVvdXRQcm9taXNlKCldKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBBIExhbWJkYSB3cmFwcGVyIHRvIGVuc3VyZSB3ZSBmbHVzaCBtZXNzYWdlcyBiZWZvcmUgYSBMYW1iZGEgZnVuY3Rpb24gZ2V0IHRlcm1pbmF0ZWRcbiAqIE5PVEU6IEZvciBub24tYXN5bmMgaGFuZGxlcnMsIEFXUyBMYW1iZGEgd2lsbCB3YWl0IHVudGlsIHRoZSBldmVudCBsb29wIGlzIGNvbXBsZXRlZC5cbiAqIFRoaXMgbWVhbnMgYWZ0ZXIgYSBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQsIGEgTGFtYmRhIGZ1bmN0aW9uIHN0aWxsIHJ1blxuICogYW5kIHdlIGNhbiBjYXRjaCB0aGUgZmluYWwgY2xlYW4gdXAuXG4gKiBSRUY6IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYW1iZGEvbGF0ZXN0L2RnL25vZGVqcy1oYW5kbGVyLmh0bWxcbiAqXG4gKiBAcGFyYW0gbGFtYmRhSGFuZGxlclxuICovXG5jb25zdCBlbnN1cmVGbHVzaEFsbENhbGxiYWNrID0gKFxuICBsYW1iZGFIYW5kbGVyOiBMYW1iZGFIYW5kbGVyV2l0aENhbGxiYWNrRnVuY3Rpb25cbik6IExhbWJkYUhhbmRsZXJXaXRoQ2FsbGJhY2tGdW5jdGlvbiA9PiB7XG4gIHJldHVybiAoZXZlbnQ6IGFueSwgY29udGV4dDogYW55LCBjYWxsYmFjazogQ2FsbGJhY2tGdW5jdGlvbik6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHRoaXNDYWxsYmFjayA9IChlcnJvcjogYW55LCByZXN1bHQ6IGFueSk6IHZvaWQgPT4ge1xuICAgICAgY2FsbGJhY2soZXJyb3IsIHJlc3VsdCk7XG4gICAgICBpZiAoIXN1cHByZXNzRmx1c2hBbGwoKSkgZmx1c2hBbGwoKTtcbiAgICB9O1xuICAgIGxhbWJkYUhhbmRsZXIoZXZlbnQsIGNvbnRleHQsIHRoaXNDYWxsYmFjayk7XG4gIH07XG59O1xuXG5leHBvcnQgeyBpc0xvZ0ROQUVuYWJsZWQsIGZsdXNoQWxsLCBlbnN1cmVGbHVzaEFsbCwgZW5zdXJlRmx1c2hBbGxDYWxsYmFjayB9O1xuIl0sIm5hbWVzIjpbImlzTG9nRE5BRW5hYmxlZCIsImZsdXNoQWxsIiwiZW5zdXJlRmx1c2hBbGwiLCJlbnN1cmVGbHVzaEFsbENhbGxiYWNrIiwiTG9nRE5BTG9nZ2VyIiwicmVxdWlyZSIsImRlYnVnIiwiZGVidWdsb2ciLCJGQUxMQkFDS19USU1FT1VUX0FGVEVSX0ZMVVNISU5HIiwiZ2V0TG9nUGFyYW1zIiwidGltZW91dCIsImxvZ0ROQUtleSIsInNlbmRUb1JlbW90ZSIsInN1cHByZXNzRmx1c2hBbGwiLCJsb2dETkFTdXBwcmVzc0ZsdXNoQWxsIiwiUHJvbWlzZSIsInJlc29sdmUiLCJjbGVhclRpbWVvdXQiLCJ0aW1lb3V0UHJvbWlzZSIsInNldFRpbWVvdXQiLCJsYW1iZGFIYW5kbGVyIiwiZXZlbnQiLCJjb250ZXh0IiwicmVzdWx0IiwiZSIsInJhY2UiLCJjYWxsYmFjayIsInRoaXNDYWxsYmFjayIsImVycm9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztJQXdGU0EsZUFBZTtlQUFmQTs7SUFBaUJDLFFBQVE7ZUFBUkE7O0lBQVVDLGNBQWM7ZUFBZEE7O0lBQWdCQyxzQkFBc0I7ZUFBdEJBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdEZwRCxJQUFNQyxlQUFlQyxRQUFRO0FBQzdCLElBQU1DLFFBQVFELFFBQVEsUUFBUUUsUUFBUSxDQUFDO0FBQ3ZDLElBQU0sQUFBRUMsa0NBQW9DSCxRQUFRLFlBQTVDRztBQUNSLElBQU0sQUFBRUMsZUFBaUJKLFFBQVEsWUFBekJJO0FBRVIsVUFBVTtBQUNWLElBQUlDO0FBRUo7Ozs7Q0FJQyxHQUNELElBQU1WLGtCQUFrQixTQUFDVyxXQUFtQkM7V0FBbUMsQ0FBQyxDQUFDRCxhQUFhQzs7QUFFOUY7O0NBRUMsR0FDRCxJQUFNQyxtQkFBbUI7UUFBZUo7SUFBQUEsT0FBQUEsQ0FBQUEsQ0FBQUEsZ0JBQUFBLDRCQUFBQSwyQkFBQUEsS0FBQUEsSUFBQUEsY0FBZ0JLLHNCQUFzQixBQUFELEtBQUssS0FBSzs7QUFFdkY7O0NBRUMsR0FDRCxJQUFNYjtlQUFXLGtCQUFBLFdBQTJCOztZQUMxQzs7Z0JBQU8sSUFBSWMsUUFBUUMsU0FBQUEsU0FBVztvQkFDNUJWLE1BQU07b0JBQ05GLGFBQWFILFFBQVEsQ0FBQyxXQUFNO3dCQUMxQkssTUFBTTt3QkFDTixJQUFJSSxTQUFTOzRCQUNYTyxhQUFhUDt3QkFDZixDQUFDO3dCQUNETTtvQkFDRjtnQkFDRjs7O0lBQ0Y7b0JBWE1mOzs7O0FBYU47O0NBRUMsR0FDRCxJQUFNaUIsaUJBQWlCLFdBQXFCO0lBQzFDLE9BQU8sSUFBSUgsUUFBUUMsU0FBQUEsU0FBVztRQUM1Qk4sVUFBVVMsV0FBVyxXQUFNO1lBQ3pCYixNQUFNO1lBQ05VO1FBQ0YsR0FBR1I7SUFDTDtBQUNGO0FBRUE7OztDQUdDLEdBQ0QsSUFBTU4saUJBQWlCLFNBQUNrQixlQUFrRjtJQUN4RzttQkFBTyxrQkFBQSxTQUFPQyxPQUFZQyxTQUErQjtnQkFFL0NDLFFBR0NDOzs7Ozs7Ozs7O3dCQUhROzs0QkFBTUosY0FBY0MsT0FBT0M7Ozt3QkFBcENDLFNBQVM7NkJBQ1gsQ0FBQ1Ysb0JBQUQ7Ozs7d0JBQXFCOzs0QkFBTUUsUUFBUVUsSUFBSTtnQ0FBRXhCO2dDQUFZaUI7Ozs7d0JBQWhDOzs7d0JBQ3pCOzs0QkFBT0s7Ozt3QkFDQUM7NkJBQ0gsQ0FBQ1gsb0JBQUQ7Ozs7d0JBQXFCOzs0QkFBTUUsUUFBUVUsSUFBSTtnQ0FBRXhCO2dDQUFZaUI7Ozs7d0JBQWhDOzs7d0JBQ3pCLE1BQU1NLEVBQUU7Ozs7Ozs7UUFFWjt3QkFUY0gsT0FBWUM7Ozs7QUFVNUI7QUFFQTs7Ozs7Ozs7Q0FRQyxHQUNELElBQU1uQix5QkFBeUIsU0FDN0JpQixlQUNzQztJQUN0QyxPQUFPLFNBQUNDLE9BQVlDLFNBQWNJLFVBQXFDO1FBQ3JFLElBQU1DLGVBQWUsU0FBQ0MsT0FBWUwsUUFBc0I7WUFDdERHLFNBQVNFLE9BQU9MO1lBQ2hCLElBQUksQ0FBQ1Ysb0JBQW9CWjtRQUMzQjtRQUNBbUIsY0FBY0MsT0FBT0MsU0FBU0s7SUFDaEM7QUFDRiJ9
File without changes