@discordeno/rest 19.0.0-next.e70a178 → 19.0.0-next.e7d32e4

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 (50) hide show
  1. package/dist/cjs/index.cjs +23 -0
  2. package/dist/cjs/invalidBucket.cjs +84 -0
  3. package/dist/cjs/manager.cjs +1325 -0
  4. package/dist/cjs/queue.cjs +165 -0
  5. package/dist/cjs/routes.cjs +533 -0
  6. package/dist/cjs/types.cjs +6 -0
  7. package/dist/cjs/typings/routes.cjs +6 -0
  8. package/dist/esm/index.js +8 -0
  9. package/dist/esm/invalidBucket.js +82 -0
  10. package/dist/esm/manager.js +1303 -0
  11. package/dist/esm/queue.js +157 -0
  12. package/dist/esm/routes.js +525 -0
  13. package/dist/esm/types.js +3 -0
  14. package/dist/esm/typings/routes.js +3 -0
  15. package/dist/types/index.d.ts.map +1 -0
  16. package/dist/types/invalidBucket.d.ts.map +1 -0
  17. package/dist/types/manager.d.ts.map +1 -0
  18. package/dist/{queue.d.ts → types/queue.d.ts} +5 -0
  19. package/dist/types/queue.d.ts.map +1 -0
  20. package/dist/types/routes.d.ts.map +1 -0
  21. package/dist/{types.d.ts → types/types.d.ts} +213 -14
  22. package/dist/types/types.d.ts.map +1 -0
  23. package/dist/{typings → types/typings}/routes.d.ts +24 -4
  24. package/dist/types/typings/routes.d.ts.map +1 -0
  25. package/package.json +13 -7
  26. package/dist/index.d.ts.map +0 -1
  27. package/dist/index.js +0 -8
  28. package/dist/index.js.map +0 -1
  29. package/dist/invalidBucket.d.ts.map +0 -1
  30. package/dist/invalidBucket.js +0 -82
  31. package/dist/invalidBucket.js.map +0 -1
  32. package/dist/manager.d.ts.map +0 -1
  33. package/dist/manager.js +0 -1139
  34. package/dist/manager.js.map +0 -1
  35. package/dist/queue.d.ts.map +0 -1
  36. package/dist/queue.js +0 -153
  37. package/dist/queue.js.map +0 -1
  38. package/dist/routes.d.ts.map +0 -1
  39. package/dist/routes.js +0 -487
  40. package/dist/routes.js.map +0 -1
  41. package/dist/types.d.ts.map +0 -1
  42. package/dist/types.js +0 -3
  43. package/dist/types.js.map +0 -1
  44. package/dist/typings/routes.d.ts.map +0 -1
  45. package/dist/typings/routes.js +0 -3
  46. package/dist/typings/routes.js.map +0 -1
  47. /package/dist/{index.d.ts → types/index.d.ts} +0 -0
  48. /package/dist/{invalidBucket.d.ts → types/invalidBucket.d.ts} +0 -0
  49. /package/dist/{manager.d.ts → types/manager.d.ts} +0 -0
  50. /package/dist/{routes.d.ts → types/routes.d.ts} +0 -0
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ _exportStar(require("./typings/routes.cjs"), exports);
6
+ _exportStar(require("./invalidBucket.cjs"), exports);
7
+ _exportStar(require("./manager.cjs"), exports);
8
+ _exportStar(require("./queue.cjs"), exports);
9
+ _exportStar(require("./routes.cjs"), exports);
10
+ _exportStar(require("./types.cjs"), exports);
11
+ function _exportStar(from, to) {
12
+ Object.keys(from).forEach(function(k) {
13
+ if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) Object.defineProperty(to, k, {
14
+ enumerable: true,
15
+ get: function() {
16
+ return from[k];
17
+ }
18
+ });
19
+ });
20
+ return from;
21
+ }
22
+
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3R5cGluZ3Mvcm91dGVzLmpzJ1xuZXhwb3J0ICogZnJvbSAnLi9pbnZhbGlkQnVja2V0LmpzJ1xuZXhwb3J0ICogZnJvbSAnLi9tYW5hZ2VyLmpzJ1xuZXhwb3J0ICogZnJvbSAnLi9xdWV1ZS5qcydcbmV4cG9ydCAqIGZyb20gJy4vcm91dGVzLmpzJ1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcy5qcydcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O29CQUFjO29CQUNBO29CQUNBO29CQUNBO29CQUNBO29CQUNBIn0=
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "createInvalidRequestBucket", {
6
+ enumerable: true,
7
+ get: ()=>createInvalidRequestBucket
8
+ });
9
+ const _utils = require("@discordeno/utils");
10
+ function createInvalidRequestBucket(options) {
11
+ const bucket = {
12
+ invalidRequests: options.current ?? 0,
13
+ max: options.max ?? 10000,
14
+ interval: options.interval ?? 600_000,
15
+ resetAt: options.resetAt,
16
+ safety: options.safety ?? 1,
17
+ errorStatuses: options.errorStatuses ?? [
18
+ 401,
19
+ 403,
20
+ 429
21
+ ],
22
+ activeRequests: options.requested ?? 0,
23
+ processing: false,
24
+ waiting: [],
25
+ requestsAllowed: function() {
26
+ if (bucket.resetAt !== undefined && Date.now() >= bucket.resetAt) {
27
+ bucket.invalidRequests = 0;
28
+ bucket.resetAt = Date.now() + bucket.interval;
29
+ }
30
+ return bucket.max - bucket.invalidRequests - bucket.activeRequests - bucket.safety;
31
+ },
32
+ isRequestAllowed: function() {
33
+ return bucket.requestsAllowed() > 0;
34
+ },
35
+ waitUntilRequestAvailable: async function() {
36
+ // eslint-disable-next-line no-async-promise-executor
37
+ return await new Promise(async (resolve)=>{
38
+ // If whatever amount of requests is left is more than the safety margin, allow the request
39
+ if (bucket.isRequestAllowed()) {
40
+ bucket.activeRequests += 1;
41
+ resolve();
42
+ } else {
43
+ bucket.waiting.push(resolve);
44
+ await bucket.processWaiting();
45
+ }
46
+ });
47
+ },
48
+ processWaiting: async function() {
49
+ // If already processing, that loop will handle all waiting requests.
50
+ if (bucket.processing) return;
51
+ // Mark as processing so other loops don't start
52
+ bucket.processing = true;
53
+ while(bucket.waiting.length > 0){
54
+ _utils.logger.info(`[InvalidBucket] processing waiting queue while loop ran with ${bucket.waiting.length} pending requests to be made. ${JSON.stringify(bucket)}`);
55
+ if (!bucket.isRequestAllowed() && bucket.resetAt !== undefined) {
56
+ _utils.logger.warn(`[InvalidBucket] processing waiting queue is now paused until more requests are available. ${bucket.waiting.length} pending requests. ${JSON.stringify(bucket)}`);
57
+ await (0, _utils.delay)(bucket.resetAt - Date.now());
58
+ }
59
+ bucket.activeRequests += 1;
60
+ // Resolve the next item in the queue
61
+ bucket.waiting.shift()?.();
62
+ }
63
+ // Mark as false so next pending request can be triggered by new loop.
64
+ bucket.processing = false;
65
+ },
66
+ handleCompletedRequest: function(code, sharedScope) {
67
+ // Since request is complete, we can remove one from requested.
68
+ bucket.activeRequests -= 1;
69
+ // Since it is as a valid request, we don't need to do anything
70
+ if (!bucket.errorStatuses.includes(code)) return;
71
+ // Shared scope is not considered invalid
72
+ if (code === 429 && sharedScope) return;
73
+ // INVALID REQUEST WAS MADE
74
+ if (bucket.resetAt === undefined) {
75
+ bucket.resetAt = Date.now() + bucket.interval;
76
+ }
77
+ bucket.invalidRequests += 1;
78
+ _utils.logger.warn(`[InvalidBucket] an invalid request was made. Increasing invalidRequests count to ${bucket.invalidRequests}`);
79
+ }
80
+ };
81
+ return bucket;
82
+ }
83
+
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbnZhbGlkQnVja2V0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlbGF5LCBsb2dnZXIgfSBmcm9tICdAZGlzY29yZGVuby91dGlscydcblxuLyoqXG4gKiBBIGludmFsaWQgcmVxdWVzdCBidWNrZXQgaXMgdXNlZCBpbiBhIHNpbWlsYXIgbWFubmVyIGFzIGEgbGVha3kgYnVja2V0IGJ1dCBhIGludmFsaWQgcmVxdWVzdCBidWNrZXQgY2FuIGJlIHJlZmlsbGVkIGFzIG5lZWRlZC5cbiAqIEl0J3MgcHVycG9zZSBpcyB0byBtYWtlIHN1cmUgdGhlIGJvdCBkb2VzIG5vdCBoaXQgdGhlIGxpbWl0IHRvIGdldHRpbmcgYSAxIGhyIGJhbi5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGlzIGJ1Y2tldC5cbiAqIEByZXR1cm5zIFJlZmlsbGluZ0J1Y2tldFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQob3B0aW9uczogSW52YWxpZFJlcXVlc3RCdWNrZXRPcHRpb25zKTogSW52YWxpZFJlcXVlc3RCdWNrZXQge1xuICBjb25zdCBidWNrZXQ6IEludmFsaWRSZXF1ZXN0QnVja2V0ID0ge1xuICAgIGludmFsaWRSZXF1ZXN0czogb3B0aW9ucy5jdXJyZW50ID8/IDAsXG4gICAgbWF4OiBvcHRpb25zLm1heCA/PyAxMDAwMCxcbiAgICBpbnRlcnZhbDogb3B0aW9ucy5pbnRlcnZhbCA/PyA2MDBfMDAwLCAvLyAxMCBtaW51dGVzXG4gICAgcmVzZXRBdDogb3B0aW9ucy5yZXNldEF0LFxuICAgIHNhZmV0eTogb3B0aW9ucy5zYWZldHkgPz8gMSxcbiAgICBlcnJvclN0YXR1c2VzOiBvcHRpb25zLmVycm9yU3RhdHVzZXMgPz8gWzQwMSwgNDAzLCA0MjldLFxuICAgIGFjdGl2ZVJlcXVlc3RzOiBvcHRpb25zLnJlcXVlc3RlZCA/PyAwLFxuICAgIHByb2Nlc3Npbmc6IGZhbHNlLFxuXG4gICAgd2FpdGluZzogW10sXG5cbiAgICByZXF1ZXN0c0FsbG93ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChidWNrZXQucmVzZXRBdCAhPT0gdW5kZWZpbmVkICYmIERhdGUubm93KCkgPj0gYnVja2V0LnJlc2V0QXQpIHtcbiAgICAgICAgYnVja2V0LmludmFsaWRSZXF1ZXN0cyA9IDBcbiAgICAgICAgYnVja2V0LnJlc2V0QXQgPSBEYXRlLm5vdygpICsgYnVja2V0LmludGVydmFsXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBidWNrZXQubWF4IC0gYnVja2V0LmludmFsaWRSZXF1ZXN0cyAtIGJ1Y2tldC5hY3RpdmVSZXF1ZXN0cyAtIGJ1Y2tldC5zYWZldHlcbiAgICB9LFxuXG4gICAgaXNSZXF1ZXN0QWxsb3dlZDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGJ1Y2tldC5yZXF1ZXN0c0FsbG93ZWQoKSA+IDBcbiAgICB9LFxuXG4gICAgd2FpdFVudGlsUmVxdWVzdEF2YWlsYWJsZTogYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgICAgICAvLyBJZiB3aGF0ZXZlciBhbW91bnQgb2YgcmVxdWVzdHMgaXMgbGVmdCBpcyBtb3JlIHRoYW4gdGhlIHNhZmV0eSBtYXJnaW4sIGFsbG93IHRoZSByZXF1ZXN0XG4gICAgICAgIGlmIChidWNrZXQuaXNSZXF1ZXN0QWxsb3dlZCgpKSB7XG4gICAgICAgICAgYnVja2V0LmFjdGl2ZVJlcXVlc3RzICs9IDFcbiAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidWNrZXQud2FpdGluZy5wdXNoKHJlc29sdmUpXG4gICAgICAgICAgYXdhaXQgYnVja2V0LnByb2Nlc3NXYWl0aW5nKClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgcHJvY2Vzc1dhaXRpbmc6IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIElmIGFscmVhZHkgcHJvY2Vzc2luZywgdGhhdCBsb29wIHdpbGwgaGFuZGxlIGFsbCB3YWl0aW5nIHJlcXVlc3RzLlxuICAgICAgaWYgKGJ1Y2tldC5wcm9jZXNzaW5nKSByZXR1cm5cblxuICAgICAgLy8gTWFyayBhcyBwcm9jZXNzaW5nIHNvIG90aGVyIGxvb3BzIGRvbid0IHN0YXJ0XG4gICAgICBidWNrZXQucHJvY2Vzc2luZyA9IHRydWVcblxuICAgICAgd2hpbGUgKGJ1Y2tldC53YWl0aW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgYFtJbnZhbGlkQnVja2V0XSBwcm9jZXNzaW5nIHdhaXRpbmcgcXVldWUgd2hpbGUgbG9vcCByYW4gd2l0aCAke2J1Y2tldC53YWl0aW5nLmxlbmd0aH0gcGVuZGluZyByZXF1ZXN0cyB0byBiZSBtYWRlLiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgYnVja2V0LFxuICAgICAgICAgICl9YCxcbiAgICAgICAgKVxuXG4gICAgICAgIGlmICghYnVja2V0LmlzUmVxdWVzdEFsbG93ZWQoKSAmJiBidWNrZXQucmVzZXRBdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgW0ludmFsaWRCdWNrZXRdIHByb2Nlc3Npbmcgd2FpdGluZyBxdWV1ZSBpcyBub3cgcGF1c2VkIHVudGlsIG1vcmUgcmVxdWVzdHMgYXJlIGF2YWlsYWJsZS4gJHtcbiAgICAgICAgICAgICAgYnVja2V0LndhaXRpbmcubGVuZ3RoXG4gICAgICAgICAgICB9IHBlbmRpbmcgcmVxdWVzdHMuICR7SlNPTi5zdHJpbmdpZnkoYnVja2V0KX1gLFxuICAgICAgICAgIClcbiAgICAgICAgICBhd2FpdCBkZWxheShidWNrZXQucmVzZXRBdCAtIERhdGUubm93KCkpXG4gICAgICAgIH1cblxuICAgICAgICBidWNrZXQuYWN0aXZlUmVxdWVzdHMgKz0gMVxuICAgICAgICAvLyBSZXNvbHZlIHRoZSBuZXh0IGl0ZW0gaW4gdGhlIHF1ZXVlXG4gICAgICAgIGJ1Y2tldC53YWl0aW5nLnNoaWZ0KCk/LigpXG4gICAgICB9XG5cbiAgICAgIC8vIE1hcmsgYXMgZmFsc2Ugc28gbmV4dCBwZW5kaW5nIHJlcXVlc3QgY2FuIGJlIHRyaWdnZXJlZCBieSBuZXcgbG9vcC5cbiAgICAgIGJ1Y2tldC5wcm9jZXNzaW5nID0gZmFsc2VcbiAgICB9LFxuXG4gICAgaGFuZGxlQ29tcGxldGVkUmVxdWVzdDogZnVuY3Rpb24gKGNvZGUsIHNoYXJlZFNjb3BlKSB7XG4gICAgICAvLyBTaW5jZSByZXF1ZXN0IGlzIGNvbXBsZXRlLCB3ZSBjYW4gcmVtb3ZlIG9uZSBmcm9tIHJlcXVlc3RlZC5cbiAgICAgIGJ1Y2tldC5hY3RpdmVSZXF1ZXN0cyAtPSAxXG4gICAgICAvLyBTaW5jZSBpdCBpcyBhcyBhIHZhbGlkIHJlcXVlc3QsIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmdcbiAgICAgIGlmICghYnVja2V0LmVycm9yU3RhdHVzZXMuaW5jbHVkZXMoY29kZSkpIHJldHVyblxuICAgICAgLy8gU2hhcmVkIHNjb3BlIGlzIG5vdCBjb25zaWRlcmVkIGludmFsaWRcbiAgICAgIGlmIChjb2RlID09PSA0MjkgJiYgc2hhcmVkU2NvcGUpIHJldHVyblxuXG4gICAgICAvLyBJTlZBTElEIFJFUVVFU1QgV0FTIE1BREVcbiAgICAgIGlmIChidWNrZXQucmVzZXRBdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGJ1Y2tldC5yZXNldEF0ID0gRGF0ZS5ub3coKSArIGJ1Y2tldC5pbnRlcnZhbFxuICAgICAgfVxuXG4gICAgICBidWNrZXQuaW52YWxpZFJlcXVlc3RzICs9IDFcbiAgICAgIGxvZ2dlci53YXJuKGBbSW52YWxpZEJ1Y2tldF0gYW4gaW52YWxpZCByZXF1ZXN0IHdhcyBtYWRlLiBJbmNyZWFzaW5nIGludmFsaWRSZXF1ZXN0cyBjb3VudCB0byAke2J1Y2tldC5pbnZhbGlkUmVxdWVzdHN9YClcbiAgICB9LFxuICB9XG5cbiAgcmV0dXJuIGJ1Y2tldFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludmFsaWRSZXF1ZXN0QnVja2V0T3B0aW9ucyB7XG4gIC8qKiBjdXJyZW50IGludmFsaWQgYW1vdW50ICovXG4gIGN1cnJlbnQ/OiBudW1iZXJcbiAgLyoqIG1heCBpbnZhbGlkIHJlcXVlc3RzIGFsbG93ZWQgdW50aWwgYmFuLiBEZWZhdWx0cyB0byAxMCwwMDAgKi9cbiAgbWF4PzogbnVtYmVyXG4gIC8qKiBUaGUgdGltZSB0aGF0IGRpc2NvcmQgYWxsb3dzIHRvIG1ha2UgdGhlIG1heCBudW1iZXIgb2YgaW52YWxpZCByZXF1ZXN0cy4gRGVmYXVsdHMgdG8gMTAgbWludXRlcyAqL1xuICBpbnRlcnZhbD86IG51bWJlclxuICAvKiogV2hlbiB0aGUgdGltZW91dCBmb3IgdGhlIGJ1Y2tldCBoYXMgc3RhcnRlZCBhdC4gKi9cbiAgcmVzZXRBdD86IG51bWJlclxuICAvKiogaG93IHNhZmUgdG8gYmUgZnJvbSBtYXguIERlZmF1bHRzIHRvIDEgKi9cbiAgc2FmZXR5PzogbnVtYmVyXG4gIC8qKiBUaGUgcmVxdWVzdCBzdGF0dXNlcyB0aGF0IGNvdW50IGFzIGFuIGludmFsaWQgcmVxdWVzdC4gKi9cbiAgZXJyb3JTdGF0dXNlcz86IG51bWJlcltdXG4gIC8qKiBUaGUgYW1vdW50IG9mIHJlcXVlc3RzIHRoYXQgd2VyZSByZXF1ZXN0ZWQgZnJvbSB0aGlzIGJ1Y2tldC4gKi9cbiAgcmVxdWVzdGVkPzogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW52YWxpZFJlcXVlc3RCdWNrZXQge1xuICAvKiogY3VycmVudCBpbnZhbGlkIGFtb3VudCAqL1xuICBpbnZhbGlkUmVxdWVzdHM6IG51bWJlclxuICAvKiogbWF4IGludmFsaWQgcmVxdWVzdHMgYWxsb3dlZCB1bnRpbCBiYW4uIERlZmF1bHRzIHRvIDEwLDAwMCAqL1xuICBtYXg6IG51bWJlclxuICAvKiogVGhlIHRpbWUgdGhhdCBkaXNjb3JkIGFsbG93cyB0byBtYWtlIHRoZSBtYXggbnVtYmVyIG9mIGludmFsaWQgcmVxdWVzdHMuIERlZmF1bHRzIHRvIDEwIG1pbnV0ZXMgKi9cbiAgaW50ZXJ2YWw6IG51bWJlclxuICAvKiogV2hlbiB0aGUgdGltZW91dCBmb3IgdGhpcyBidWNrZXQgaGFzIHN0YXJ0ZWQgYXQuICovXG4gIHJlc2V0QXQ6IG51bWJlciB8IHVuZGVmaW5lZFxuICAvKiogaG93IHNhZmUgdG8gYmUgZnJvbSBtYXguIERlZmF1bHRzIHRvIDEgKi9cbiAgc2FmZXR5OiBudW1iZXJcbiAgLyoqIFRoZSByZXF1ZXN0IHN0YXR1c2VzIHRoYXQgY291bnQgYXMgYW4gaW52YWxpZCByZXF1ZXN0LiAqL1xuICBlcnJvclN0YXR1c2VzOiBudW1iZXJbXVxuICAvKiogVGhlIGFtb3VudCBvZiByZXF1ZXN0cyB0aGF0IHdlcmUgcmVxdWVzdGVkIGZyb20gdGhpcyBidWNrZXQuICovXG4gIGFjdGl2ZVJlcXVlc3RzOiBudW1iZXJcbiAgLyoqIFRoZSByZXF1ZXN0cyB0aGF0IGFyZSBjdXJyZW50bHkgcGVuZGluZy4gKi9cbiAgd2FpdGluZzogQXJyYXk8KHZhbHVlOiB2b2lkIHwgUHJvbWlzZUxpa2U8dm9pZD4pID0+IHZvaWQ+XG4gIC8qKiBXaGV0aGVyIG9yIG5vdCB0aGUgd2FpdGluZyBxdWV1ZSBpcyBhbHJlYWR5IHByb2Nlc3NpbmcuICovXG4gIHByb2Nlc3Npbmc6IGJvb2xlYW5cblxuICAvKiogR2l2ZXMgdGhlIG51bWJlciBvZiByZXF1ZXN0cyB0aGF0IGFyZSBjdXJyZW50bHkgYWxsb3dlZC4gKi9cbiAgcmVxdWVzdHNBbGxvd2VkOiAoKSA9PiBudW1iZXJcbiAgLyoqIENoZWNrcyBpZiBhIHJlcXVlc3QgaXMgYWxsb3dlZCBhdCB0aGlzIHRpbWUuICovXG4gIGlzUmVxdWVzdEFsbG93ZWQ6ICgpID0+IGJvb2xlYW5cbiAgLyoqIFdhaXRzIHVudGlsIGEgcmVxdWVzdCBpcyBhdmFpbGFibGUgKi9cbiAgd2FpdFVudGlsUmVxdWVzdEF2YWlsYWJsZTogKCkgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogQmVnaW5zIHByb2Nlc3NpbmcgdGhlIHdhaXRpbmcgcXVldWUgb2YgcmVxdWVzdHMuICovXG4gIHByb2Nlc3NXYWl0aW5nOiAoKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBIYW5kbGVyIGZvciB3aGVuZXZlciBhIHJlcXVlc3QgaXMgdmFsaWRhdGVkLiBUaGlzIHNob3VsZCB1cGRhdGUgdGhlIHJlcXVlc3RlZCB2YWx1ZXMgb3IgdHJpZ2dlciBhbnkgb3RoZXIgbmVjZXNzYXJ5IHN0dWZmLiAqL1xuICBoYW5kbGVDb21wbGV0ZWRSZXF1ZXN0OiAoY29kZTogbnVtYmVyLCBzaGFyZWRTY29wZTogYm9vbGVhbikgPT4gdm9pZFxufVxuIl0sIm5hbWVzIjpbImNyZWF0ZUludmFsaWRSZXF1ZXN0QnVja2V0Iiwib3B0aW9ucyIsImJ1Y2tldCIsImludmFsaWRSZXF1ZXN0cyIsImN1cnJlbnQiLCJtYXgiLCJpbnRlcnZhbCIsInJlc2V0QXQiLCJzYWZldHkiLCJlcnJvclN0YXR1c2VzIiwiYWN0aXZlUmVxdWVzdHMiLCJyZXF1ZXN0ZWQiLCJwcm9jZXNzaW5nIiwid2FpdGluZyIsInJlcXVlc3RzQWxsb3dlZCIsInVuZGVmaW5lZCIsIkRhdGUiLCJub3ciLCJpc1JlcXVlc3RBbGxvd2VkIiwid2FpdFVudGlsUmVxdWVzdEF2YWlsYWJsZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicHVzaCIsInByb2Nlc3NXYWl0aW5nIiwibGVuZ3RoIiwibG9nZ2VyIiwiaW5mbyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ3YXJuIiwiZGVsYXkiLCJzaGlmdCIsImhhbmRsZUNvbXBsZXRlZFJlcXVlc3QiLCJjb2RlIiwic2hhcmVkU2NvcGUiLCJpbmNsdWRlcyJdLCJtYXBwaW5ncyI6Ijs7OzsrQkFTZ0JB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