@discordeno/rest 22.0.0-beta.1 → 22.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/queue.d.ts CHANGED
@@ -38,8 +38,8 @@ export declare class Queue {
38
38
  constructor(rest: RestManager, options: QueueOptions);
39
39
  /** Check if there is any remaining requests that are allowed. */
40
40
  isRequestAllowed(): boolean;
41
- /** Pauses the execution until a request is allowed to be made. */
42
- waitUntilRequestAvailable(): Promise<void>;
41
+ /** Pauses the execution until a request is allowed to be made, or until the given signal aborts. */
42
+ waitUntilRequestAvailable(signal?: AbortSignal): Promise<void>;
43
43
  /** Process the queue of requests waiting to be handled. */
44
44
  processWaiting(): Promise<void>;
45
45
  /** Process the queue of all requests pending to be sent. */
@@ -1 +1 @@
1
- {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAEjE,qBAAa,KAAK;IAChB,uBAAuB;IACvB,IAAI,EAAE,WAAW,CAAA;IACjB,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAI;IACrB,iDAAiD;IACjD,GAAG,EAAE,MAAM,CAAI;IACf,qFAAqF;IACrF,QAAQ,EAAE,MAAM,CAAI;IACpB,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC,OAAO,GAAG,SAAS,CAAA;IACrC,+CAA+C;IAC/C,OAAO,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAK;IAC9D,+CAA+C;IAC/C,OAAO,EAAE,kBAAkB,EAAE,CAAK;IAClC,8DAA8D;IAC9D,UAAU,EAAE,OAAO,CAAQ;IAC3B,8DAA8D;IAC9D,iBAAiB,EAAE,OAAO,CAAQ;IAClC,4CAA4C;IAC5C,YAAY,EAAE,OAAO,CAAQ;IAC7B,+DAA+D;IAC/D,GAAG,EAAE,MAAM,CAAA;IACX,qFAAqF;IACrF,QAAQ,EAAE,MAAM,CAAI;IACpB,iHAAiH;IACjH,gBAAgB,EAAE,MAAM,CAAQ;IAChC,iDAAiD;IACjD,kBAAkB,CAAC,EAAE,MAAM,CAAC,OAAO,CAAA;IACnC;;;;;OAKG;IACH,UAAU,EAAE,MAAM,CAAA;gBAEN,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY;IAYpD,iEAAiE;IACjE,gBAAgB,IAAI,OAAO;IAI3B,kEAAkE;IAC5D,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC;IAahD,2DAA2D;IACrD,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBrC,4DAA4D;IACtD,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAyDrC,sBAAsB,CAAC,OAAO,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAkB9F,2HAA2H;IACrH,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7D,gFAAgF;IAChF,OAAO,IAAI,IAAI;IA8Bf,mFAAmF;IACnF,gBAAgB,IAAI,OAAO;IAU3B,IAAI,SAAS,IAAI,MAAM,CAEtB;CACF;AAED,MAAM,WAAW,YAAY;IAC3B,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kEAAkE;IAClE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,6GAA6G;IAC7G,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC,OAAO,CAAA;IAC1B,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAA;IACX,iHAAiH;IACjH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAA;CACnB"}
1
+ {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAElE,qBAAa,KAAK;IAChB,uBAAuB;IACvB,IAAI,EAAE,WAAW,CAAC;IAClB,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAK;IACtB,iDAAiD;IACjD,GAAG,EAAE,MAAM,CAAK;IAChB,qFAAqF;IACrF,QAAQ,EAAE,MAAM,CAAK;IACrB,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC;IACtC,+CAA+C;IAC/C,OAAO,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAM;IAC/D,+CAA+C;IAC/C,OAAO,EAAE,kBAAkB,EAAE,CAAM;IACnC,8DAA8D;IAC9D,UAAU,EAAE,OAAO,CAAS;IAC5B,8DAA8D;IAC9D,iBAAiB,EAAE,OAAO,CAAS;IACnC,4CAA4C;IAC5C,YAAY,EAAE,OAAO,CAAS;IAC9B,+DAA+D;IAC/D,GAAG,EAAE,MAAM,CAAC;IACZ,qFAAqF;IACrF,QAAQ,EAAE,MAAM,CAAK;IACrB,iHAAiH;IACjH,gBAAgB,EAAE,MAAM,CAAS;IACjC,iDAAiD;IACjD,kBAAkB,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC;IACpC;;;;;OAKG;IACH,UAAU,EAAE,MAAM,CAAC;gBAEP,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY;IAYpD,iEAAiE;IACjE,gBAAgB,IAAI,OAAO;IAI3B,oGAAoG;IAC9F,yBAAyB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBpE,2DAA2D;IACrD,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBrC,4DAA4D;IACtD,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAiErC,sBAAsB,CAAC,OAAO,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAkB9F,2HAA2H;IACrH,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAe7D,gFAAgF;IAChF,OAAO,IAAI,IAAI;IA8Bf,mFAAmF;IACnF,gBAAgB,IAAI,OAAO;IAU3B,IAAI,SAAS,IAAI,MAAM,CAEtB;CACF;AAED,MAAM,WAAW,YAAY;IAC3B,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6GAA6G;IAC7G,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC;IAC3B,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,iHAAiH;IACjH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAC;CACpB"}
package/dist/queue.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { setTimeout } from 'node:timers';
1
2
  import { delay } from '@discordeno/utils';
2
3
  export class Queue {
3
4
  constructor(rest, options){
@@ -23,14 +24,27 @@ export class Queue {
23
24
  /** Check if there is any remaining requests that are allowed. */ isRequestAllowed() {
24
25
  return this.remaining > 0;
25
26
  }
26
- /** Pauses the execution until a request is allowed to be made. */ async waitUntilRequestAvailable() {
27
+ /** Pauses the execution until a request is allowed to be made, or until the given signal aborts. */ async waitUntilRequestAvailable(signal) {
27
28
  return await new Promise(async (resolve)=>{
28
29
  // If whatever amount of requests is left is more than the safety margin, allow the request
29
30
  if (this.isRequestAllowed()) {
30
31
  // this.remaining++;
31
32
  resolve();
32
33
  } else {
33
- this.waiting.push(resolve);
34
+ const stopWaiting = ()=>{
35
+ signal?.removeEventListener('abort', onAbort);
36
+ resolve();
37
+ };
38
+ // A caller that gives up is taken back out of the queue right away, so its request and body aren't kept alive until the queue resumes.
39
+ const onAbort = ()=>{
40
+ const index = this.waiting.indexOf(stopWaiting);
41
+ if (index !== -1) this.waiting.splice(index, 1);
42
+ stopWaiting();
43
+ };
44
+ this.waiting.push(stopWaiting);
45
+ signal?.addEventListener('abort', onAbort, {
46
+ once: true
47
+ });
34
48
  await this.processWaiting();
35
49
  }
36
50
  });
@@ -51,6 +65,9 @@ export class Queue {
51
65
  }
52
66
  // Mark as false so next pending request can be triggered by new loop.
53
67
  this.processing = false;
68
+ // The waiting list can empty out without anything moving on to the pending one, when every request in it was cancelled, and nothing would
69
+ // look at this queue again.
70
+ this.cleanup();
54
71
  }
55
72
  /** Process the queue of all requests pending to be sent. */ async processPending() {
56
73
  // If already processing, that loop will handle all pending requests.
@@ -59,6 +76,12 @@ export class Queue {
59
76
  this.processingPending = true;
60
77
  while(this.pending.length > 0){
61
78
  this.rest.logger.debug(`Queue ${this.queueType} ${this.url} process pending while loop ran with ${this.pending.length}.`);
79
+ // Drop the requests whose caller gave up, they were rejected the moment their signal fired. This happens before anything is spent on
80
+ // them: sending them would use up a rate limit slot and delay the requests that are still wanted, and fetch refuses them anyway.
81
+ if (this.pending[0]?.requestBodyOptions?.signal?.aborted) {
82
+ this.pending.shift();
83
+ continue;
84
+ }
62
85
  if (!this.firstRequest && !this.isRequestAllowed()) {
63
86
  const now = Date.now();
64
87
  const future = this.frozenAt + this.interval;
@@ -80,14 +103,21 @@ export class Queue {
80
103
  this.timeoutId ??= setTimeout(()=>{
81
104
  this.remaining = this.max;
82
105
  this.timeoutId = undefined;
83
- }, this.interval);
106
+ }, this.interval).unref();
84
107
  }
85
108
  // Remove from queue, we are executing it.
86
109
  this.pending.shift();
87
110
  // Check if this request is able to be made globally
88
111
  await this.rest.invalidBucket.waitUntilRequestAvailable();
89
- await this.rest.sendRequest(request)// Should be handled in sendRequest, this catch just prevents bots from dying
90
- .catch(()=>null);
112
+ await this.rest.sendRequest(request).catch((e)=>{
113
+ this.rest.logger.debug(`Queue ${this.queueType} ${this.url} encountered an error when sending a request.`, e);
114
+ request.reject({
115
+ ok: false,
116
+ status: 999,
117
+ error: 'The queue encontered an unexpected error sending a request.',
118
+ errorObject: e
119
+ });
120
+ });
91
121
  }
92
122
  }
93
123
  this.rest.logger.debug(`Queue ${this.queueType} ${this.url} process pending while loop exited with ${this.pending.length}.`);
@@ -107,11 +137,17 @@ export class Queue {
107
137
  this.timeoutId ??= setTimeout(()=>{
108
138
  this.remaining = this.max;
109
139
  this.timeoutId = undefined;
110
- }, headers.interval);
140
+ }, headers.interval).unref();
111
141
  }
112
142
  }
113
143
  /** Checks if a request is available and adds it to the queue. Also triggers queue processing if not already processing. */ async makeRequest(options) {
114
- await this.waitUntilRequestAvailable();
144
+ const signal = options.requestBodyOptions?.signal;
145
+ await this.waitUntilRequestAvailable(signal);
146
+ // The caller gave up while this was waiting for a slot, it has already been rejected and there is nothing left to send.
147
+ if (signal?.aborted) {
148
+ this.cleanup();
149
+ return;
150
+ }
115
151
  this.pending.push(options);
116
152
  this.processPending();
117
153
  }
@@ -136,7 +172,7 @@ export class Queue {
136
172
  this.rest.logger.debug(`[Queue] ${this.queueType} ${this.url}. Deleted! Remaining: (${this.rest.queues.size})`, [
137
173
  ...this.rest.queues.values()
138
174
  ].map((queue)=>`${queue.queueType}${queue.url}`));
139
- }, this.deleteQueueDelay);
175
+ }, this.deleteQueueDelay).unref();
140
176
  }
141
177
  /** Simply checks if the queue is able to be cleared or it has requests pending. */ isQueueClearable() {
142
178
  if (this.firstRequest) return false;
@@ -151,4 +187,4 @@ export class Queue {
151
187
  }
152
188
  }
153
189
 
154
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9xdWV1ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWxheSB9IGZyb20gJ0BkaXNjb3JkZW5vL3V0aWxzJ1xuaW1wb3J0IHR5cGUgeyBSZXN0TWFuYWdlciwgU2VuZFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi90eXBlcy5qcydcblxuZXhwb3J0IGNsYXNzIFF1ZXVlIHtcbiAgLyoqIFRoZSByZXN0IG1hbmFnZXIgKi9cbiAgcmVzdDogUmVzdE1hbmFnZXJcbiAgLyoqIEFtb3VudCBvZiByZXF1ZXN0cyB0aGF0IGhhdmUgYXJlIHJlbWFpbmluZy4gRGVmYXVsdHMgdG8gMS4gKi9cbiAgcmVtYWluaW5nOiBudW1iZXIgPSAxXG4gIC8qKiBNYXggcmVxdWVzdHMgZm9yIHRoaXMgdGhpcy4gRGVmYXVsdHMgdG8gMS4gKi9cbiAgbWF4OiBudW1iZXIgPSAxXG4gIC8qKiBUaGUgdGltZSB0aGF0IGRpc2NvcmQgYWxsb3dzIHRvIG1ha2UgdGhlIG1heCBudW1iZXIgb2YgcmVxdWVzdHMuIERlZmF1bHRzIHRvIDAgKi9cbiAgaW50ZXJ2YWw6IG51bWJlciA9IDBcbiAgLyoqIHRpbWVyIHRvIHJlc2V0IHRvIDAgKi9cbiAgdGltZW91dElkOiBOb2RlSlMuVGltZW91dCB8IHVuZGVmaW5lZFxuICAvKiogVGhlIHJlcXVlc3RzIHRoYXQgYXJlIGN1cnJlbnRseSBwZW5kaW5nLiAqL1xuICB3YWl0aW5nOiBBcnJheTwodmFsdWU6IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPikgPT4gdm9pZD4gPSBbXVxuICAvKiogVGhlIHJlcXVlc3RzIHRoYXQgYXJlIGN1cnJlbnRseSBwZW5kaW5nLiAqL1xuICBwZW5kaW5nOiBTZW5kUmVxdWVzdE9wdGlvbnNbXSA9IFtdXG4gIC8qKiBXaGV0aGVyIG9yIG5vdCB0aGUgd2FpdGluZyBxdWV1ZSBpcyBhbHJlYWR5IHByb2Nlc3NpbmcuICovXG4gIHByb2Nlc3Npbmc6IGJvb2xlYW4gPSBmYWxzZVxuICAvKiogV2hldGhlciBvciBub3QgdGhlIHBlbmRpbmcgcXVldWUgaXMgYWxyZWFkeSBwcm9jZXNzaW5nLiAqL1xuICBwcm9jZXNzaW5nUGVuZGluZzogYm9vbGVhbiA9IGZhbHNlXG4gIC8qKiBXaGV0aGVyIHRoZSBmaXJzdCByZXF1ZXN0IGlzIHBlbmRpbmcuICovXG4gIGZpcnN0UmVxdWVzdDogYm9vbGVhbiA9IGZhbHNlXG4gIC8qKiBUaGUgdXJsIHRoYXQgYWxsIHRoZSByZXF1ZXN0cyBpbiB0aGlzIHF1ZXVlIGFyZSBzZW50IHRvLiAqL1xuICB1cmw6IHN0cmluZ1xuICAvKiogV2hlbiByZXF1ZXN0cyBzdGFydGVkIGJlaW5nIG1hZGUgdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIGludGVydmFsIHdpbGwgcmVzZXQgaXQuICovXG4gIGZyb3plbkF0OiBudW1iZXIgPSAwXG4gIC8qKiBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgZGVsZXRpbmcgdGhpcyBxdWV1ZSBpZiBpdCBpcyBlbXB0eS4gRGVmYXVsdHMgdG8gNjAwMDAob25lIG1pbnV0ZSkuICovXG4gIGRlbGV0ZVF1ZXVlRGVsYXk6IG51bWJlciA9IDYwMDAwXG4gIC8qKiBUaGUgdGltZW91dCBmb3IgdGhlIGRlbGV0aW9uIG9mIHRoaXMgcXVldWUgKi9cbiAgZGVsZXRlUXVldWVUaW1lb3V0PzogTm9kZUpTLlRpbWVvdXRcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIGZvciB0aGlzIHJlcXVlc3QsIG1heSBiZSB0aGUgcmVxdWVzdCBhdXRob3JpemF0aW9uIG9yIGZhbGxiYWNrIHRvIHRoZSBib3QgYXV0aFxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBUaGlzIGlzIHVzZWQgdG8gZ2V0IHRoZSBpZGVudGlmeSB0aGlzIHF1ZXVlIGZyb20gdGhlIHF1ZXVlIG1hcHBpbmcgb2YgdGhlIHJlc3QgbWFuYWdlclxuICAgKi9cbiAgaWRlbnRpZmllcjogc3RyaW5nXG5cbiAgY29uc3RydWN0b3IocmVzdDogUmVzdE1hbmFnZXIsIG9wdGlvbnM6IFF1ZXVlT3B0aW9ucykge1xuICAgIHRoaXMucmVzdCA9IHJlc3RcbiAgICB0aGlzLnVybCA9IG9wdGlvbnMudXJsXG4gICAgdGhpcy5pZGVudGlmaWVyID0gb3B0aW9ucy5pZGVudGlmaWVyXG5cbiAgICBpZiAob3B0aW9ucy5pbnRlcnZhbCkgdGhpcy5pbnRlcnZhbCA9IG9wdGlvbnMuaW50ZXJ2YWxcbiAgICBpZiAob3B0aW9ucy5tYXgpIHRoaXMubWF4ID0gb3B0aW9ucy5tYXhcbiAgICBpZiAob3B0aW9ucy5yZW1haW5pbmcpIHRoaXMucmVtYWluaW5nID0gb3B0aW9ucy5yZW1haW5pbmdcbiAgICBpZiAob3B0aW9ucy50aW1lb3V0SWQpIHRoaXMudGltZW91dElkID0gb3B0aW9ucy50aW1lb3V0SWRcbiAgICBpZiAob3B0aW9ucy5kZWxldGVRdWV1ZURlbGF5KSB0aGlzLmRlbGV0ZVF1ZXVlRGVsYXkgPSBvcHRpb25zLmRlbGV0ZVF1ZXVlRGVsYXlcbiAgfVxuXG4gIC8qKiBDaGVjayBpZiB0aGVyZSBpcyBhbnkgcmVtYWluaW5nIHJlcXVlc3RzIHRoYXQgYXJlIGFsbG93ZWQuICovXG4gIGlzUmVxdWVzdEFsbG93ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVtYWluaW5nID4gMFxuICB9XG5cbiAgLyoqIFBhdXNlcyB0aGUgZXhlY3V0aW9uIHVudGlsIGEgcmVxdWVzdCBpcyBhbGxvd2VkIHRvIGJlIG1hZGUuICovXG4gIGFzeW5jIHdhaXRVbnRpbFJlcXVlc3RBdmFpbGFibGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlKSA9PiB7XG4gICAgICAvLyBJZiB3aGF0ZXZlciBhbW91bnQgb2YgcmVxdWVzdHMgaXMgbGVmdCBpcyBtb3JlIHRoYW4gdGhlIHNhZmV0eSBtYXJnaW4sIGFsbG93IHRoZSByZXF1ZXN0XG4gICAgICBpZiAodGhpcy5pc1JlcXVlc3RBbGxvd2VkKCkpIHtcbiAgICAgICAgLy8gdGhpcy5yZW1haW5pbmcrKztcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLndhaXRpbmcucHVzaChyZXNvbHZlKVxuICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NXYWl0aW5nKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqIFByb2Nlc3MgdGhlIHF1ZXVlIG9mIHJlcXVlc3RzIHdhaXRpbmcgdG8gYmUgaGFuZGxlZC4gKi9cbiAgYXN5bmMgcHJvY2Vzc1dhaXRpbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gSWYgYWxyZWFkeSBwcm9jZXNzaW5nLCB0aGF0IGxvb3Agd2lsbCBoYW5kbGUgYWxsIHdhaXRpbmcgcmVxdWVzdHMuXG4gICAgaWYgKHRoaXMucHJvY2Vzc2luZykgcmV0dXJuXG4gICAgLy8gTWFyayBhcyBwcm9jZXNzaW5nIHNvIG90aGVyIGxvb3BzIGRvbid0IHN0YXJ0XG4gICAgdGhpcy5wcm9jZXNzaW5nID0gdHJ1ZVxuXG4gICAgd2hpbGUgKHRoaXMud2FpdGluZy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJlc3QubG9nZ2VyLmRlYnVnKGBbUXVldWVdICR7dGhpcy5xdWV1ZVR5cGV9ICR7dGhpcy51cmx9IHByb2Nlc3Mgd2FpdGluZyB3aGlsZSBsb29wIHJhbi5gKVxuICAgICAgaWYgKHRoaXMuaXNSZXF1ZXN0QWxsb3dlZCgpKSB7XG4gICAgICAgIC8vIFJlc29sdmUgdGhlIG5leHQgaXRlbSBpbiB0aGUgcXVldWVcbiAgICAgICAgdGhpcy53YWl0aW5nLnNoaWZ0KCk/LigpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBkZWxheSgxMDAwKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1hcmsgYXMgZmFsc2Ugc28gbmV4dCBwZW5kaW5nIHJlcXVlc3QgY2FuIGJlIHRyaWdnZXJlZCBieSBuZXcgbG9vcC5cbiAgICB0aGlzLnByb2Nlc3NpbmcgPSBmYWxzZVxuICB9XG5cbiAgLyoqIFByb2Nlc3MgdGhlIHF1ZXVlIG9mIGFsbCByZXF1ZXN0cyBwZW5kaW5nIHRvIGJlIHNlbnQuICovXG4gIGFzeW5jIHByb2Nlc3NQZW5kaW5nKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIElmIGFscmVhZHkgcHJvY2Vzc2luZywgdGhhdCBsb29wIHdpbGwgaGFuZGxlIGFsbCBwZW5kaW5nIHJlcXVlc3RzLlxuICAgIGlmICh0aGlzLnByb2Nlc3NpbmdQZW5kaW5nIHx8ICF0aGlzLnBlbmRpbmcubGVuZ3RoKSByZXR1cm5cblxuICAgIC8vIE1hcmsgYXMgcHJvY2Vzc2luZyBzbyBvdGhlciBsb29wcyBkb24ndCBzdGFydFxuICAgIHRoaXMucHJvY2Vzc2luZ1BlbmRpbmcgPSB0cnVlXG5cbiAgICB3aGlsZSAodGhpcy5wZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMucmVzdC5sb2dnZXIuZGVidWcoYFF1ZXVlICR7dGhpcy5xdWV1ZVR5cGV9ICR7dGhpcy51cmx9IHByb2Nlc3MgcGVuZGluZyB3aGlsZSBsb29wIHJhbiB3aXRoICR7dGhpcy5wZW5kaW5nLmxlbmd0aH0uYClcbiAgICAgIGlmICghdGhpcy5maXJzdFJlcXVlc3QgJiYgIXRoaXMuaXNSZXF1ZXN0QWxsb3dlZCgpKSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgICAgICAgY29uc3QgZnV0dXJlID0gdGhpcy5mcm96ZW5BdCArIHRoaXMuaW50ZXJ2YWxcbiAgICAgICAgYXdhaXQgZGVsYXkoZnV0dXJlID4gbm93ID8gZnV0dXJlIC0gbm93IDogMTAwMClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucGVuZGluZ1swXVxuICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgYmFzaWNVUkwgPSB0aGlzLnJlc3Quc2ltcGxpZnlVcmwocmVxdWVzdC5yb3V0ZSwgcmVxdWVzdC5tZXRob2QpXG5cbiAgICAgICAgLy8gSWYgdGhpcyB1cmwgaXMgc3RpbGwgcmF0ZSBsaW1pdGVkLCB0cnkgYWdhaW5cbiAgICAgICAgY29uc3QgdXJsUmVzZXRJbiA9IHRoaXMucmVzdC5jaGVja1JhdGVMaW1pdHMoYmFzaWNVUkwsIHRoaXMuaWRlbnRpZmllcilcbiAgICAgICAgaWYgKHVybFJlc2V0SW4pIGF3YWl0IGRlbGF5KHVybFJlc2V0SW4pXG5cbiAgICAgICAgLy8gSUYgQSBCVUNLRVQgRVhJU1RTLCBDSEVDSyBUSEUgQlVDS0VUJ1MgUkFURSBMSU1JVFNcbiAgICAgICAgY29uc3QgYnVja2V0UmVzZXRJbiA9IHJlcXVlc3QuYnVja2V0SWQgPyB0aGlzLnJlc3QuY2hlY2tSYXRlTGltaXRzKHJlcXVlc3QuYnVja2V0SWQsIHRoaXMuaWRlbnRpZmllcikgOiBmYWxzZVxuICAgICAgICBpZiAoYnVja2V0UmVzZXRJbikgYXdhaXQgZGVsYXkoYnVja2V0UmVzZXRJbilcblxuICAgICAgICB0aGlzLmZpcnN0UmVxdWVzdCA9IGZhbHNlXG4gICAgICAgIHRoaXMucmVtYWluaW5nLS1cblxuICAgICAgICBpZiAodGhpcy5yZW1haW5pbmcgPT09IDAgJiYgdGhpcy5pbnRlcnZhbCAhPT0gMCkge1xuICAgICAgICAgIHRoaXMudGltZW91dElkID8/PSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVtYWluaW5nID0gdGhpcy5tYXhcbiAgICAgICAgICAgIHRoaXMudGltZW91dElkID0gdW5kZWZpbmVkXG4gICAgICAgICAgfSwgdGhpcy5pbnRlcnZhbClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSBmcm9tIHF1ZXVlLCB3ZSBhcmUgZXhlY3V0aW5nIGl0LlxuICAgICAgICB0aGlzLnBlbmRpbmcuc2hpZnQoKVxuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIHJlcXVlc3QgaXMgYWJsZSB0byBiZSBtYWRlIGdsb2JhbGx5XG4gICAgICAgIGF3YWl0IHRoaXMucmVzdC5pbnZhbGlkQnVja2V0LndhaXRVbnRpbFJlcXVlc3RBdmFpbGFibGUoKVxuXG4gICAgICAgIGF3YWl0IHRoaXMucmVzdFxuICAgICAgICAgIC5zZW5kUmVxdWVzdChyZXF1ZXN0KVxuICAgICAgICAgIC8vIFNob3VsZCBiZSBoYW5kbGVkIGluIHNlbmRSZXF1ZXN0LCB0aGlzIGNhdGNoIGp1c3QgcHJldmVudHMgYm90cyBmcm9tIGR5aW5nXG4gICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5yZXN0LmxvZ2dlci5kZWJ1ZyhgUXVldWUgJHt0aGlzLnF1ZXVlVHlwZX0gJHt0aGlzLnVybH0gcHJvY2VzcyBwZW5kaW5nIHdoaWxlIGxvb3AgZXhpdGVkIHdpdGggJHt0aGlzLnBlbmRpbmcubGVuZ3RofS5gKVxuXG4gICAgLy8gTWFyayBhcyBmYWxzZSBzbyBuZXh0IHBlbmRpbmcgcmVxdWVzdCBjYW4gYmUgdHJpZ2dlcmVkIGJ5IG5ldyBsb29wLlxuICAgIHRoaXMucHJvY2Vzc2luZ1BlbmRpbmcgPSBmYWxzZVxuICAgIHRoaXMuY2xlYW51cCgpXG4gIH1cblxuICBoYW5kbGVDb21wbGV0ZWRSZXF1ZXN0KGhlYWRlcnM6IHsgbWF4PzogbnVtYmVyOyBpbnRlcnZhbD86IG51bWJlcjsgcmVtYWluaW5nPzogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICBpZiAoaGVhZGVycy5tYXggPT09IDApIHtcbiAgICAgIHRoaXMucmVtYWluaW5nKytcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghdGhpcy5mcm96ZW5BdCkgdGhpcy5mcm96ZW5BdCA9IERhdGUubm93KClcbiAgICBpZiAoaGVhZGVycy5pbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB0aGlzLmludGVydmFsID0gaGVhZGVycy5pbnRlcnZhbFxuICAgIGlmIChoZWFkZXJzLnJlbWFpbmluZyAhPT0gdW5kZWZpbmVkKSB0aGlzLnJlbWFpbmluZyA9IGhlYWRlcnMucmVtYWluaW5nXG5cbiAgICBpZiAodGhpcy5yZW1haW5pbmcgPD0gMSkge1xuICAgICAgdGhpcy50aW1lb3V0SWQgPz89IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlbWFpbmluZyA9IHRoaXMubWF4XG4gICAgICAgIHRoaXMudGltZW91dElkID0gdW5kZWZpbmVkXG4gICAgICB9LCBoZWFkZXJzLmludGVydmFsKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBDaGVja3MgaWYgYSByZXF1ZXN0IGlzIGF2YWlsYWJsZSBhbmQgYWRkcyBpdCB0byB0aGUgcXVldWUuIEFsc28gdHJpZ2dlcnMgcXVldWUgcHJvY2Vzc2luZyBpZiBub3QgYWxyZWFkeSBwcm9jZXNzaW5nLiAqL1xuICBhc3luYyBtYWtlUmVxdWVzdChvcHRpb25zOiBTZW5kUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLndhaXRVbnRpbFJlcXVlc3RBdmFpbGFibGUoKVxuICAgIHRoaXMucGVuZGluZy5wdXNoKG9wdGlvbnMpXG4gICAgdGhpcy5wcm9jZXNzUGVuZGluZygpXG4gIH1cblxuICAvKiogQ2xlYW5zIHVwIHRoZSBxdWV1ZSBieSBjaGVja2luZyBpZiB0aGVyZSBpcyBub3RoaW5nIGxlZnQgYW5kIHJlbW92aW5nIGl0LiAqL1xuICBjbGVhbnVwKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1F1ZXVlQ2xlYXJhYmxlKCkpIHtcbiAgICAgIHRoaXMucHJvY2Vzc1BlbmRpbmcoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5yZXN0LmxvZ2dlci5kZWJ1ZyhgW1F1ZXVlXSAke3RoaXMucXVldWVUeXBlfSAke3RoaXMudXJsfS4gRGVsYXlpbmcgZGVsZXRlIGZvciAke3RoaXMuZGVsZXRlUXVldWVEZWxheX1tc2ApXG5cbiAgICAvLyBEZWxldGUgaW4gYSBtaW51dGUgZ2l2aW5nIGEgYml0IG9mIHRpbWUgdG8gYWxsb3cgbmV3IHJlcXVlc3RzIHRoYXQgbWF5IHJldXNlIHRoaXMgcXVldWVcbiAgICBjbGVhclRpbWVvdXQodGhpcy5kZWxldGVRdWV1ZVRpbWVvdXQpXG4gICAgdGhpcy5kZWxldGVRdWV1ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5pc1F1ZXVlQ2xlYXJhYmxlKCkpIHtcbiAgICAgICAgdGhpcy5yZXN0LmxvZ2dlci5kZWJ1ZyhgW1F1ZXVlXSAke3RoaXMucXVldWVUeXBlfSAke3RoaXMudXJsfS4gaXMgbm90IGNsZWFyYWJsZS4gUmVzdGFydGluZyBwcm9jZXNzaW5nIG9mIHF1ZXVlLmApXG4gICAgICAgIHRoaXMucHJvY2Vzc1BlbmRpbmcoKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXN0LmxvZ2dlci5kZWJ1ZyhgW1F1ZXVlXSAke3RoaXMucXVldWVUeXBlfSAke3RoaXMudXJsfS4gRGVsZXRpbmdgKVxuXG4gICAgICBpZiAodGhpcy50aW1lb3V0SWQpIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZClcblxuICAgICAgLy8gTm8gcmVxdWVzdHMgaGF2ZSBiZWVuIHJlcXVlc3RlZCBmb3IgdGhpcyBxdWV1ZSBzbyB3ZSBudWtlIHRoaXMgcXVldWVcbiAgICAgIHRoaXMucmVzdC5xdWV1ZXMuZGVsZXRlKGAke3RoaXMuaWRlbnRpZmllcn0ke3RoaXMudXJsfWApXG4gICAgICB0aGlzLnJlc3QubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgW1F1ZXVlXSAke3RoaXMucXVldWVUeXBlfSAke3RoaXMudXJsfS4gRGVsZXRlZCEgUmVtYWluaW5nOiAoJHt0aGlzLnJlc3QucXVldWVzLnNpemV9KWAsXG4gICAgICAgIFsuLi50aGlzLnJlc3QucXVldWVzLnZhbHVlcygpXS5tYXAoKHF1ZXVlKSA9PiBgJHtxdWV1ZS5xdWV1ZVR5cGV9JHtxdWV1ZS51cmx9YCksXG4gICAgICApXG4gICAgfSwgdGhpcy5kZWxldGVRdWV1ZURlbGF5KVxuICB9XG5cbiAgLyoqIFNpbXBseSBjaGVja3MgaWYgdGhlIHF1ZXVlIGlzIGFibGUgdG8gYmUgY2xlYXJlZCBvciBpdCBoYXMgcmVxdWVzdHMgcGVuZGluZy4gKi9cbiAgaXNRdWV1ZUNsZWFyYWJsZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5maXJzdFJlcXVlc3QpIHJldHVybiBmYWxzZVxuICAgIGlmICh0aGlzLndhaXRpbmcubGVuZ3RoID4gMCkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKHRoaXMucGVuZGluZy5sZW5ndGggPiAwKSByZXR1cm4gZmFsc2VcbiAgICBpZiAodGhpcy5wcm9jZXNzaW5nKSByZXR1cm4gZmFsc2VcbiAgICBpZiAodGhpcy5wcm9jZXNzaW5nUGVuZGluZykgcmV0dXJuIGZhbHNlXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgZ2V0IHF1ZXVlVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkZW50aWZpZXIuc2xpY2UoMCwgdGhpcy5pZGVudGlmaWVyLmluZGV4T2YoJyAnKSlcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXVlT3B0aW9ucyB7XG4gIC8qKiBIb3cgbWFueSByZXF1ZXN0cyBhcmUgcmVtYWluaW5nLiBEZWZhdWx0cyB0byAxICovXG4gIHJlbWFpbmluZz86IG51bWJlclxuICAvKiogTWF4IG51bWJlciBvZiByZXF1ZXN0cyBhbGxvd2VkIGluIHRoaXMgdGhpcy4gRGVmYXVsdHMgdG8gMS4gKi9cbiAgbWF4PzogbnVtYmVyXG4gIC8qKiBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgdGhhdCBkaXNjb3JkIGFsbG93cyB0byBtYWtlIHRoZSBtYXggbnVtYmVyIG9mIGludmFsaWQgcmVxdWVzdHMuIERlZmF1bHRzIHRvIDAgKi9cbiAgaW50ZXJ2YWw/OiBudW1iZXJcbiAgLyoqIHRpbWVyIHRvIHJlc2V0IHRvIDAgKi9cbiAgdGltZW91dElkPzogTm9kZUpTLlRpbWVvdXRcbiAgLyoqIFRoZSB1cmwgdGhpcyBxdWV1ZSB3aWxsIGJlIGhhbmRsaW5nLiAqL1xuICB1cmw6IHN0cmluZ1xuICAvKiogVGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGRlbGV0aW5nIHRoaXMgcXVldWUgaWYgaXQgaXMgZW1wdHkuIERlZmF1bHRzIHRvIDYwMDAwKG9uZSBtaW51dGUpLiAqL1xuICBkZWxldGVRdWV1ZURlbGF5PzogbnVtYmVyXG4gIC8qKiBUaGUgYmFzZSBrZXkgdGhhdCBpZGVudGlmaWVzIHRoaXMgcXVldWUgaW4gdGhlIHJlc3QgbWFuYWdlciAqL1xuICBpZGVudGlmaWVyOiBzdHJpbmdcbn1cbiJdLCJuYW1lcyI6WyJkZWxheSIsIlF1ZXVlIiwicmVzdCIsIm9wdGlvbnMiLCJyZW1haW5pbmciLCJtYXgiLCJpbnRlcnZhbCIsIndhaXRpbmciLCJwZW5kaW5nIiwicHJvY2Vzc2luZyIsInByb2Nlc3NpbmdQZW5kaW5nIiwiZmlyc3RSZXF1ZXN0IiwiZnJvemVuQXQiLCJkZWxldGVRdWV1ZURlbGF5IiwidXJsIiwiaWRlbnRpZmllciIsInRpbWVvdXRJZCIsImlzUmVxdWVzdEFsbG93ZWQiLCJ3YWl0VW50aWxSZXF1ZXN0QXZhaWxhYmxlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJwdXNoIiwicHJvY2Vzc1dhaXRpbmciLCJsZW5ndGgiLCJsb2dnZXIiLCJkZWJ1ZyIsInF1ZXVlVHlwZSIsInNoaWZ0IiwicHJvY2Vzc1BlbmRpbmciLCJub3ciLCJEYXRlIiwiZnV0dXJlIiwicmVxdWVzdCIsImJhc2ljVVJMIiwic2ltcGxpZnlVcmwiLCJyb3V0ZSIsIm1ldGhvZCIsInVybFJlc2V0SW4iLCJjaGVja1JhdGVMaW1pdHMiLCJidWNrZXRSZXNldEluIiwiYnVja2V0SWQiLCJzZXRUaW1lb3V0IiwidW5kZWZpbmVkIiwiaW52YWxpZEJ1Y2tldCIsInNlbmRSZXF1ZXN0IiwiY2F0Y2giLCJjbGVhbnVwIiwiaGFuZGxlQ29tcGxldGVkUmVxdWVzdCIsImhlYWRlcnMiLCJtYWtlUmVxdWVzdCIsImlzUXVldWVDbGVhcmFibGUiLCJjbGVhclRpbWVvdXQiLCJkZWxldGVRdWV1ZVRpbWVvdXQiLCJxdWV1ZXMiLCJkZWxldGUiLCJzaXplIiwidmFsdWVzIiwibWFwIiwi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
190
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9xdWV1ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAnbm9kZTp0aW1lcnMnO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tICdAZGlzY29yZGVuby91dGlscyc7XG5pbXBvcnQgdHlwZSB7IFJlc3RNYW5hZ2VyLCBTZW5kUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IGNsYXNzIFF1ZXVlIHtcbiAgLyoqIFRoZSByZXN0IG1hbmFnZXIgKi9cbiAgcmVzdDogUmVzdE1hbmFnZXI7XG4gIC8qKiBBbW91bnQgb2YgcmVxdWVzdHMgdGhhdCBoYXZlIGFyZSByZW1haW5pbmcuIERlZmF1bHRzIHRvIDEuICovXG4gIHJlbWFpbmluZzogbnVtYmVyID0gMTtcbiAgLyoqIE1heCByZXF1ZXN0cyBmb3IgdGhpcyB0aGlzLiBEZWZhdWx0cyB0byAxLiAqL1xuICBtYXg6IG51bWJlciA9IDE7XG4gIC8qKiBUaGUgdGltZSB0aGF0IGRpc2NvcmQgYWxsb3dzIHRvIG1ha2UgdGhlIG1heCBudW1iZXIgb2YgcmVxdWVzdHMuIERlZmF1bHRzIHRvIDAgKi9cbiAgaW50ZXJ2YWw6IG51bWJlciA9IDA7XG4gIC8qKiB0aW1lciB0byByZXNldCB0byAwICovXG4gIHRpbWVvdXRJZDogTm9kZUpTLlRpbWVvdXQgfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgcmVxdWVzdHMgdGhhdCBhcmUgY3VycmVudGx5IHBlbmRpbmcuICovXG4gIHdhaXRpbmc6IEFycmF5PCh2YWx1ZTogdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+KSA9PiB2b2lkPiA9IFtdO1xuICAvKiogVGhlIHJlcXVlc3RzIHRoYXQgYXJlIGN1cnJlbnRseSBwZW5kaW5nLiAqL1xuICBwZW5kaW5nOiBTZW5kUmVxdWVzdE9wdGlvbnNbXSA9IFtdO1xuICAvKiogV2hldGhlciBvciBub3QgdGhlIHdhaXRpbmcgcXVldWUgaXMgYWxyZWFkeSBwcm9jZXNzaW5nLiAqL1xuICBwcm9jZXNzaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGVuZGluZyBxdWV1ZSBpcyBhbHJlYWR5IHByb2Nlc3NpbmcuICovXG4gIHByb2Nlc3NpbmdQZW5kaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBXaGV0aGVyIHRoZSBmaXJzdCByZXF1ZXN0IGlzIHBlbmRpbmcuICovXG4gIGZpcnN0UmVxdWVzdDogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogVGhlIHVybCB0aGF0IGFsbCB0aGUgcmVxdWVzdHMgaW4gdGhpcyBxdWV1ZSBhcmUgc2VudCB0by4gKi9cbiAgdXJsOiBzdHJpbmc7XG4gIC8qKiBXaGVuIHJlcXVlc3RzIHN0YXJ0ZWQgYmVpbmcgbWFkZSB0byBkZXRlcm1pbmUgd2hlbiB0aGUgaW50ZXJ2YWwgd2lsbCByZXNldCBpdC4gKi9cbiAgZnJvemVuQXQ6IG51bWJlciA9IDA7XG4gIC8qKiBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgZGVsZXRpbmcgdGhpcyBxdWV1ZSBpZiBpdCBpcyBlbXB0eS4gRGVmYXVsdHMgdG8gNjAwMDAob25lIG1pbnV0ZSkuICovXG4gIGRlbGV0ZVF1ZXVlRGVsYXk6IG51bWJlciA9IDYwMDAwO1xuICAvKiogVGhlIHRpbWVvdXQgZm9yIHRoZSBkZWxldGlvbiBvZiB0aGlzIHF1ZXVlICovXG4gIGRlbGV0ZVF1ZXVlVGltZW91dD86IE5vZGVKUy5UaW1lb3V0O1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgZm9yIHRoaXMgcmVxdWVzdCwgbWF5IGJlIHRoZSByZXF1ZXN0IGF1dGhvcml6YXRpb24gb3IgZmFsbGJhY2sgdG8gdGhlIGJvdCBhdXRoXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgaXMgdXNlZCB0byBnZXQgdGhlIGlkZW50aWZ5IHRoaXMgcXVldWUgZnJvbSB0aGUgcXVldWUgbWFwcGluZyBvZiB0aGUgcmVzdCBtYW5hZ2VyXG4gICAqL1xuICBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocmVzdDogUmVzdE1hbmFnZXIsIG9wdGlvbnM6IFF1ZXVlT3B0aW9ucykge1xuICAgIHRoaXMucmVzdCA9IHJlc3Q7XG4gICAgdGhpcy51cmwgPSBvcHRpb25zLnVybDtcbiAgICB0aGlzLmlkZW50aWZpZXIgPSBvcHRpb25zLmlkZW50aWZpZXI7XG5cbiAgICBpZiAob3B0aW9ucy5pbnRlcnZhbCkgdGhpcy5pbnRlcnZhbCA9IG9wdGlvbnMuaW50ZXJ2YWw7XG4gICAgaWYgKG9wdGlvbnMubWF4KSB0aGlzLm1heCA9IG9wdGlvbnMubWF4O1xuICAgIGlmIChvcHRpb25zLnJlbWFpbmluZykgdGhpcy5yZW1haW5pbmcgPSBvcHRpb25zLnJlbWFpbmluZztcbiAgICBpZiAob3B0aW9ucy50aW1lb3V0SWQpIHRoaXMudGltZW91dElkID0gb3B0aW9ucy50aW1lb3V0SWQ7XG4gICAgaWYgKG9wdGlvbnMuZGVsZXRlUXVldWVEZWxheSkgdGhpcy5kZWxldGVRdWV1ZURlbGF5ID0gb3B0aW9ucy5kZWxldGVRdWV1ZURlbGF5O1xuICB9XG5cbiAgLyoqIENoZWNrIGlmIHRoZXJlIGlzIGFueSByZW1haW5pbmcgcmVxdWVzdHMgdGhhdCBhcmUgYWxsb3dlZC4gKi9cbiAgaXNSZXF1ZXN0QWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZW1haW5pbmcgPiAwO1xuICB9XG5cbiAgLyoqIFBhdXNlcyB0aGUgZXhlY3V0aW9uIHVudGlsIGEgcmVxdWVzdCBpcyBhbGxvd2VkIHRvIGJlIG1hZGUsIG9yIHVudGlsIHRoZSBnaXZlbiBzaWduYWwgYWJvcnRzLiAqL1xuICBhc3luYyB3YWl0VW50aWxSZXF1ZXN0QXZhaWxhYmxlKHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlKSA9PiB7XG4gICAgICAvLyBJZiB3aGF0ZXZlciBhbW91bnQgb2YgcmVxdWVzdHMgaXMgbGVmdCBpcyBtb3JlIHRoYW4gdGhlIHNhZmV0eSBtYXJnaW4sIGFsbG93IHRoZSByZXF1ZXN0XG4gICAgICBpZiAodGhpcy5pc1JlcXVlc3RBbGxvd2VkKCkpIHtcbiAgICAgICAgLy8gdGhpcy5yZW1haW5pbmcrKztcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3RvcFdhaXRpbmcgPSAoKSA9PiB7XG4gICAgICAgICAgc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gQSBjYWxsZXIgdGhhdCBnaXZlcyB1cCBpcyB0YWtlbiBiYWNrIG91dCBvZiB0aGUgcXVldWUgcmlnaHQgYXdheSwgc28gaXRzIHJlcXVlc3QgYW5kIGJvZHkgYXJlbid0IGtlcHQgYWxpdmUgdW50aWwgdGhlIHF1ZXVlIHJlc3VtZXMuXG4gICAgICAgIGNvbnN0IG9uQWJvcnQgPSAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLndhaXRpbmcuaW5kZXhPZihzdG9wV2FpdGluZyk7XG4gICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy53YWl0aW5nLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgc3RvcFdhaXRpbmcoKTtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLndhaXRpbmcucHVzaChzdG9wV2FpdGluZyk7XG4gICAgICAgIHNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0LCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc1dhaXRpbmcoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBQcm9jZXNzIHRoZSBxdWV1ZSBvZiByZXF1ZXN0cyB3YWl0aW5nIHRvIGJlIGhhbmRsZWQuICovXG4gIGFzeW5jIHByb2Nlc3NXYWl0aW5nKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIElmIGFscmVhZHkgcHJvY2Vzc2luZywgdGhhdCBsb29wIHdpbGwgaGFuZGxlIGFsbCB3YWl0aW5nIHJlcXVlc3RzLlxuICAgIGlmICh0aGlzLnByb2Nlc3NpbmcpIHJldHVybjtcbiAgICAvLyBNYXJrIGFzIHByb2Nlc3Npbmcgc28gb3RoZXIgbG9vcHMgZG9uJ3Qgc3RhcnRcbiAgICB0aGlzLnByb2Nlc3NpbmcgPSB0cnVlO1xuXG4gICAgd2hpbGUgKHRoaXMud2FpdGluZy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJlc3QubG9nZ2VyLmRlYnVnKGBbUXVldWVdICR7dGhpcy5xdWV1ZVR5cGV9ICR7dGhpcy51cmx9IHByb2Nlc3Mgd2FpdGluZyB3aGlsZSBsb29wIHJhbi5gKTtcbiAgICAgIGlmICh0aGlzLmlzUmVxdWVzdEFsbG93ZWQoKSkge1xuICAgICAgICAvLyBSZXNvbHZlIHRoZSBuZXh0IGl0ZW0gaW4gdGhlIHF1ZXVlXG4gICAgICAgIHRoaXMud2FpdGluZy5zaGlmdCgpPy4oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IGRlbGF5KDEwMDApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1hcmsgYXMgZmFsc2Ugc28gbmV4dCBwZW5kaW5nIHJlcXVlc3QgY2FuIGJlIHRyaWdnZXJlZCBieSBuZXcgbG9vcC5cbiAgICB0aGlzLnByb2Nlc3NpbmcgPSBmYWxzZTtcbiAgICAvLyBUaGUgd2FpdGluZyBsaXN0IGNhbiBlbXB0eSBvdXQgd2l0aG91dCBhbnl0aGluZyBtb3Zpbmcgb24gdG8gdGhlIHBlbmRpbmcgb25lLCB3aGVuIGV2ZXJ5IHJlcXVlc3QgaW4gaXQgd2FzIGNhbmNlbGxlZCwgYW5kIG5vdGhpbmcgd291bGRcbiAgICAvLyBsb29rIGF0IHRoaXMgcXVldWUgYWdhaW4uXG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gIH1cblxuICAvKiogUHJvY2VzcyB0aGUgcXVldWUgb2YgYWxsIHJlcXVlc3RzIHBlbmRpbmcgdG8gYmUgc2VudC4gKi9cbiAgYXN5bmMgcHJvY2Vzc1BlbmRpbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gSWYgYWxyZWFkeSBwcm9jZXNzaW5nLCB0aGF0IGxvb3Agd2lsbCBoYW5kbGUgYWxsIHBlbmRpbmcgcmVxdWVzdHMuXG4gICAgaWYgKHRoaXMucHJvY2Vzc2luZ1BlbmRpbmcgfHwgIXRoaXMucGVuZGluZy5sZW5ndGgpIHJldHVybjtcblxuICAgIC8vIE1hcmsgYXMgcHJvY2Vzc2luZyBzbyBvdGhlciBsb29wcyBkb24ndCBzdGFydFxuICAgIHRoaXMucHJvY2Vzc2luZ1BlbmRpbmcgPSB0cnVlO1xuXG4gICAgd2hpbGUgKHRoaXMucGVuZGluZy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJlc3QubG9nZ2VyLmRlYnVnKGBRdWV1ZSAke3RoaXMucXVldWVUeXBlfSAke3RoaXMudXJsfSBwcm9jZXNzIHBlbmRpbmcgd2hpbGUgbG9vcCByYW4gd2l0aCAke3RoaXMucGVuZGluZy5sZW5ndGh9LmApO1xuXG4gICAgICAvLyBEcm9wIHRoZSByZXF1ZXN0cyB3aG9zZSBjYWxsZXIgZ2F2ZSB1cCwgdGhleSB3ZXJlIHJlamVjdGVkIHRoZSBtb21lbnQgdGhlaXIgc2lnbmFsIGZpcmVkLiBUaGlzIGhhcHBlbnMgYmVmb3JlIGFueXRoaW5nIGlzIHNwZW50IG9uXG4gICAgICAvLyB0aGVtOiBzZW5kaW5nIHRoZW0gd291bGQgdXNlIHVwIGEgcmF0ZSBsaW1pdCBzbG90IGFuZCBkZWxheSB0aGUgcmVxdWVzdHMgdGhhdCBhcmUgc3RpbGwgd2FudGVkLCBhbmQgZmV0Y2ggcmVmdXNlcyB0aGVtIGFueXdheS5cbiAgICAgIGlmICh0aGlzLnBlbmRpbmdbMF0/LnJlcXVlc3RCb2R5T3B0aW9ucz8uc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICAgIHRoaXMucGVuZGluZy5zaGlmdCgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmZpcnN0UmVxdWVzdCAmJiAhdGhpcy5pc1JlcXVlc3RBbGxvd2VkKCkpIHtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgZnV0dXJlID0gdGhpcy5mcm96ZW5BdCArIHRoaXMuaW50ZXJ2YWw7XG4gICAgICAgIGF3YWl0IGRlbGF5KGZ1dHVyZSA+IG5vdyA/IGZ1dHVyZSAtIG5vdyA6IDEwMDApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucGVuZGluZ1swXTtcbiAgICAgIGlmIChyZXF1ZXN0KSB7XG4gICAgICAgIGNvbnN0IGJhc2ljVVJMID0gdGhpcy5yZXN0LnNpbXBsaWZ5VXJsKHJlcXVlc3Qucm91dGUsIHJlcXVlc3QubWV0aG9kKTtcblxuICAgICAgICAvLyBJZiB0aGlzIHVybCBpcyBzdGlsbCByYXRlIGxpbWl0ZWQsIHRyeSBhZ2FpblxuICAgICAgICBjb25zdCB1cmxSZXNldEluID0gdGhpcy5yZXN0LmNoZWNrUmF0ZUxpbWl0cyhiYXNpY1VSTCwgdGhpcy5pZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKHVybFJlc2V0SW4pIGF3YWl0IGRlbGF5KHVybFJlc2V0SW4pO1xuXG4gICAgICAgIC8vIElGIEEgQlVDS0VUIEVYSVNUUywgQ0hFQ0sgVEhFIEJVQ0tFVCdTIFJBVEUgTElNSVRTXG4gICAgICAgIGNvbnN0IGJ1Y2tldFJlc2V0SW4gPSByZXF1ZXN0LmJ1Y2tldElkID8gdGhpcy5yZXN0LmNoZWNrUmF0ZUxpbWl0cyhyZXF1ZXN0LmJ1Y2tldElkLCB0aGlzLmlkZW50aWZpZXIpIDogZmFsc2U7XG4gICAgICAgIGlmIChidWNrZXRSZXNldEluKSBhd2FpdCBkZWxheShidWNrZXRSZXNldEluKTtcblxuICAgICAgICB0aGlzLmZpcnN0UmVxdWVzdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlbWFpbmluZy0tO1xuXG4gICAgICAgIGlmICh0aGlzLnJlbWFpbmluZyA9PT0gMCAmJiB0aGlzLmludGVydmFsICE9PSAwKSB7XG4gICAgICAgICAgdGhpcy50aW1lb3V0SWQgPz89IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW1haW5pbmcgPSB0aGlzLm1heDtcbiAgICAgICAgICAgIHRoaXMudGltZW91dElkID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH0sIHRoaXMuaW50ZXJ2YWwpLnVucmVmKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgZnJvbSBxdWV1ZSwgd2UgYXJlIGV4ZWN1dGluZyBpdC5cbiAgICAgICAgdGhpcy5wZW5kaW5nLnNoaWZ0KCk7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgcmVxdWVzdCBpcyBhYmxlIHRvIGJlIG1hZGUgZ2xvYmFsbHlcbiAgICAgICAgYXdhaXQgdGhpcy5yZXN0LmludmFsaWRCdWNrZXQud2FpdFVudGlsUmVxdWVzdEF2YWlsYWJsZSgpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMucmVzdC5zZW5kUmVxdWVzdChyZXF1ZXN0KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIHRoaXMucmVzdC5sb2dnZXIuZGVidWcoYFF1ZXVlICR7dGhpcy5xdWV1ZVR5cGV9ICR7dGhpcy51cmx9IGVuY291bnRlcmVkIGFuIGVycm9yIHdoZW4gc2VuZGluZyBhIHJlcXVlc3QuYCwgZSk7XG4gICAgICAgICAgcmVxdWVzdC5yZWplY3QoeyBvazogZmFsc2UsIHN0YXR1czogOTk5LCBlcnJvcjogJ1RoZSBxdWV1ZSBlbmNvbnRlcmVkIGFuIHVuZXhwZWN0ZWQgZXJyb3Igc2VuZGluZyBhIHJlcXVlc3QuJywgZXJyb3JPYmplY3Q6IGUgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMucmVzdC5sb2dnZXIuZGVidWcoYFF1ZXVlICR7dGhpcy5xdWV1ZVR5cGV9ICR7dGhpcy51cmx9IHByb2Nlc3MgcGVuZGluZyB3aGlsZSBsb29wIGV4aXRlZCB3aXRoICR7dGhpcy5wZW5kaW5nLmxlbmd0aH0uYCk7XG5cbiAgICAvLyBNYXJrIGFzIGZhbHNlIHNvIG5leHQgcGVuZGluZyByZXF1ZXN0IGNhbiBiZSB0cmlnZ2VyZWQgYnkgbmV3IGxvb3AuXG4gICAgdGhpcy5wcm9jZXNzaW5nUGVuZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuY2xlYW51cCgpO1xuICB9XG5cbiAgaGFuZGxlQ29tcGxldGVkUmVxdWVzdChoZWFkZXJzOiB7IG1heD86IG51bWJlcjsgaW50ZXJ2YWw/OiBudW1iZXI7IHJlbWFpbmluZz86IG51bWJlciB9KTogdm9pZCB7XG4gICAgaWYgKGhlYWRlcnMubWF4ID09PSAwKSB7XG4gICAgICB0aGlzLnJlbWFpbmluZysrO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5mcm96ZW5BdCkgdGhpcy5mcm96ZW5BdCA9IERhdGUubm93KCk7XG4gICAgaWYgKGhlYWRlcnMuaW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkgdGhpcy5pbnRlcnZhbCA9IGhlYWRlcnMuaW50ZXJ2YWw7XG4gICAgaWYgKGhlYWRlcnMucmVtYWluaW5nICE9PSB1bmRlZmluZWQpIHRoaXMucmVtYWluaW5nID0gaGVhZGVycy5yZW1haW5pbmc7XG5cbiAgICBpZiAodGhpcy5yZW1haW5pbmcgPD0gMSkge1xuICAgICAgdGhpcy50aW1lb3V0SWQgPz89IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlbWFpbmluZyA9IHRoaXMubWF4O1xuICAgICAgICB0aGlzLnRpbWVvdXRJZCA9IHVuZGVmaW5lZDtcbiAgICAgIH0sIGhlYWRlcnMuaW50ZXJ2YWwpLnVucmVmKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENoZWNrcyBpZiBhIHJlcXVlc3QgaXMgYXZhaWxhYmxlIGFuZCBhZGRzIGl0IHRvIHRoZSBxdWV1ZS4gQWxzbyB0cmlnZ2VycyBxdWV1ZSBwcm9jZXNzaW5nIGlmIG5vdCBhbHJlYWR5IHByb2Nlc3NpbmcuICovXG4gIGFzeW5jIG1ha2VSZXF1ZXN0KG9wdGlvbnM6IFNlbmRSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNpZ25hbCA9IG9wdGlvbnMucmVxdWVzdEJvZHlPcHRpb25zPy5zaWduYWw7XG5cbiAgICBhd2FpdCB0aGlzLndhaXRVbnRpbFJlcXVlc3RBdmFpbGFibGUoc2lnbmFsKTtcblxuICAgIC8vIFRoZSBjYWxsZXIgZ2F2ZSB1cCB3aGlsZSB0aGlzIHdhcyB3YWl0aW5nIGZvciBhIHNsb3QsIGl0IGhhcyBhbHJlYWR5IGJlZW4gcmVqZWN0ZWQgYW5kIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byBzZW5kLlxuICAgIGlmIChzaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucGVuZGluZy5wdXNoKG9wdGlvbnMpO1xuICAgIHRoaXMucHJvY2Vzc1BlbmRpbmcoKTtcbiAgfVxuXG4gIC8qKiBDbGVhbnMgdXAgdGhlIHF1ZXVlIGJ5IGNoZWNraW5nIGlmIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCBhbmQgcmVtb3ZpbmcgaXQuICovXG4gIGNsZWFudXAoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzUXVldWVDbGVhcmFibGUoKSkge1xuICAgICAgdGhpcy5wcm9jZXNzUGVuZGluZygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVzdC5sb2dnZXIuZGVidWcoYFtRdWV1ZV0gJHt0aGlzLnF1ZXVlVHlwZX0gJHt0aGlzLnVybH0uIERlbGF5aW5nIGRlbGV0ZSBmb3IgJHt0aGlzLmRlbGV0ZVF1ZXVlRGVsYXl9bXNgKTtcblxuICAgIC8vIERlbGV0ZSBpbiBhIG1pbnV0ZSBnaXZpbmcgYSBiaXQgb2YgdGltZSB0byBhbGxvdyBuZXcgcmVxdWVzdHMgdGhhdCBtYXkgcmV1c2UgdGhpcyBxdWV1ZVxuICAgIGNsZWFyVGltZW91dCh0aGlzLmRlbGV0ZVF1ZXVlVGltZW91dCk7XG4gICAgdGhpcy5kZWxldGVRdWV1ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5pc1F1ZXVlQ2xlYXJhYmxlKCkpIHtcbiAgICAgICAgdGhpcy5yZXN0LmxvZ2dlci5kZWJ1ZyhgW1F1ZXVlXSAke3RoaXMucXVldWVUeXBlfSAke3RoaXMudXJsfS4gaXMgbm90IGNsZWFyYWJsZS4gUmVzdGFydGluZyBwcm9jZXNzaW5nIG9mIHF1ZXVlLmApO1xuICAgICAgICB0aGlzLnByb2Nlc3NQZW5kaW5nKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXN0LmxvZ2dlci5kZWJ1ZyhgW1F1ZXVlXSAke3RoaXMucXVldWVUeXBlfSAke3RoaXMudXJsfS4gRGVsZXRpbmdgKTtcblxuICAgICAgaWYgKHRoaXMudGltZW91dElkKSBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SWQpO1xuXG4gICAgICAvLyBObyByZXF1ZXN0cyBoYXZlIGJlZW4gcmVxdWVzdGVkIGZvciB0aGlzIHF1ZXVlIHNvIHdlIG51a2UgdGhpcyBxdWV1ZVxuICAgICAgdGhpcy5yZXN0LnF1ZXVlcy5kZWxldGUoYCR7dGhpcy5pZGVudGlmaWVyfSR7dGhpcy51cmx9YCk7XG4gICAgICB0aGlzLnJlc3QubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgW1F1ZXVlXSAke3RoaXMucXVldWVUeXBlfSAke3RoaXMudXJsfS4gRGVsZXRlZCEgUmVtYWluaW5nOiAoJHt0aGlzLnJlc3QucXVldWVzLnNpemV9KWAsXG4gICAgICAgIFsuLi50aGlzLnJlc3QucXVldWVzLnZhbHVlcygpXS5tYXAoKHF1ZXVlKSA9PiBgJHtxdWV1ZS5xdWV1ZVR5cGV9JHtxdWV1ZS51cmx9YCksXG4gICAgICApO1xuICAgIH0sIHRoaXMuZGVsZXRlUXVldWVEZWxheSkudW5yZWYoKTtcbiAgfVxuXG4gIC8qKiBTaW1wbHkgY2hlY2tzIGlmIHRoZSBxdWV1ZSBpcyBhYmxlIHRvIGJlIGNsZWFyZWQgb3IgaXQgaGFzIHJlcXVlc3RzIHBlbmRpbmcuICovXG4gIGlzUXVldWVDbGVhcmFibGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZmlyc3RSZXF1ZXN0KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMud2FpdGluZy5sZW5ndGggPiAwKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMucGVuZGluZy5sZW5ndGggPiAwKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMucHJvY2Vzc2luZykgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLnByb2Nlc3NpbmdQZW5kaW5nKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldCBxdWV1ZVR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZGVudGlmaWVyLnNsaWNlKDAsIHRoaXMuaWRlbnRpZmllci5pbmRleE9mKCcgJykpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVldWVPcHRpb25zIHtcbiAgLyoqIEhvdyBtYW55IHJlcXVlc3RzIGFyZSByZW1haW5pbmcuIERlZmF1bHRzIHRvIDEgKi9cbiAgcmVtYWluaW5nPzogbnVtYmVyO1xuICAvKiogTWF4IG51bWJlciBvZiByZXF1ZXN0cyBhbGxvd2VkIGluIHRoaXMgdGhpcy4gRGVmYXVsdHMgdG8gMS4gKi9cbiAgbWF4PzogbnVtYmVyO1xuICAvKiogVGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRoYXQgZGlzY29yZCBhbGxvd3MgdG8gbWFrZSB0aGUgbWF4IG51bWJlciBvZiBpbnZhbGlkIHJlcXVlc3RzLiBEZWZhdWx0cyB0byAwICovXG4gIGludGVydmFsPzogbnVtYmVyO1xuICAvKiogdGltZXIgdG8gcmVzZXQgdG8gMCAqL1xuICB0aW1lb3V0SWQ/OiBOb2RlSlMuVGltZW91dDtcbiAgLyoqIFRoZSB1cmwgdGhpcyBxdWV1ZSB3aWxsIGJlIGhhbmRsaW5nLiAqL1xuICB1cmw6IHN0cmluZztcbiAgLyoqIFRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBkZWxldGluZyB0aGlzIHF1ZXVlIGlmIGl0IGlzIGVtcHR5LiBEZWZhdWx0cyB0byA2MDAwMChvbmUgbWludXRlKS4gKi9cbiAgZGVsZXRlUXVldWVEZWxheT86IG51bWJlcjtcbiAgLyoqIFRoZSBiYXNlIGtleSB0aGF0IGlkZW50aWZpZXMgdGhpcyBxdWV1ZSBpbiB0aGUgcmVzdCBtYW5hZ2VyICovXG4gIGlkZW50aWZpZXI6IHN0cmluZztcbn1cbiJdLCJuYW1lcyI6WyJzZXRUaW1lb3V0IiwiZGVsYXkiLCJRdWV1ZSIsInJlc3QiLCJvcHRpb25zIiwicmVtYWluaW5nIiwibWF4IiwiaW50ZXJ2YWwiLCJ3YWl0aW5nIiwicGVuZGluZyIsInByb2Nlc3NpbmciLCJwcm9jZXNzaW5nUGVuZGluZyIsImZpcnN0UmVxdWVzdCIsImZyb3plbkF0IiwiZGVsZXRlUXVldWVEZWxheSIsInVybCIsImlkZW50aWZpZXIiLCJ0aW1lb3V0SWQiLCJpc1JlcXVlc3RBbGxvd2VkIiwid2FpdFVudGlsUmVxdWVzdEF2YWlsYWJsZSIsInNpZ25hbCIsIlByb21pc2UiLCJyZXNvbHZlIiwic3RvcFdhaXRpbmciLCJyZW1vdmVFdmVudExpc3RlbmVyIiwib25BYm9ydCIsImluZGV4IiwiaW5kZXhPZiIsInNwbGljZSIsInB1c2giLCJhZGRFdmVudExpc3RlbmVyIiwib25jZSIsInByb2Nlc3NXYWl0aW5nIiwibGVuZ3RoIiwibG9nZ2VyIiwiZGVidWciLCJxdWV1ZVR5cGUiLCJzaGlmdCIsImNsZWFudXAiLCJwcm9jZXNzUGVuZGluZyIsInJlcXVlc3RCb2R5T3B0aW9ucyIsImFib3J0ZWQiLCJub3ciLCJEYXRlIiwiZnV0dXJlIiwicmVxdWVzdCIsImJhc2ljVVJMIiwic2ltcGxpZnlVcmwiLCJyb3V0ZSIsIm1ldGhvZCIsInVybFJlc2V0SW4iLCJjaGVja1JhdGVMaW1pdHMiLCJidWNrZXRSZXNldEluIiwiYnVja2V0SWQiLCJ1bmRlZmluZWQiLCJ1bnJlZiIsImludmFsaWRCdWNrZXQiLCJzZW5kUmVxdWVzdCIsImNhdGNoIiwiZSIsInJlamVjdCIsIm9rIiwic3RhdHVzIiwiZXJyb3IiLCJlcnJvck9iamVjdCIsImhhbmRsZUNvbXBsZXRlZFJlcXVlc3QiLCJoZWFkZXJzIiwibWFrZVJlcXVlc3QiLCJpc1F1ZXVlQ2xlYXJhYmxlIiwiY2xlYXJUaW1lb3V0IiwiZGVsZXRlUXVldWVUaW1lb3V0IiwicXVldWVzIiwiZGVsZXRlIiwic2l6ZSIsInZhbHVlcyIsIm1hcCIsInF1ZXVlIiwic2xpY2UiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFVBQVUsUUFBUSxjQUFjO0FBQ3pDLFNBQVNDLEtBQUssUUFBUSxvQkFBb0I7QUFHMUMsT0FBTyxNQUFNQztJQXFDWCxZQUFZQyxJQUFpQixFQUFFQyxPQUFxQixDQUFFO1FBbEN0RCwrREFBK0QsUUFDL0RDLFlBQW9CO1FBQ3BCLCtDQUErQyxRQUMvQ0MsTUFBYztRQUNkLG1GQUFtRixRQUNuRkMsV0FBbUI7UUFHbkIsNkNBQTZDLFFBQzdDQyxVQUE0RCxFQUFFO1FBQzlELDZDQUE2QyxRQUM3Q0MsVUFBZ0MsRUFBRTtRQUNsQyw0REFBNEQsUUFDNURDLGFBQXNCO1FBQ3RCLDREQUE0RCxRQUM1REMsb0JBQTZCO1FBQzdCLDBDQUEwQyxRQUMxQ0MsZUFBd0I7UUFHeEIsbUZBQW1GLFFBQ25GQyxXQUFtQjtRQUNuQiwrR0FBK0csUUFDL0dDLG1CQUEyQjtRQVl6QixJQUFJLENBQUNYLElBQUksR0FBR0E7UUFDWixJQUFJLENBQUNZLEdBQUcsR0FBR1gsUUFBUVcsR0FBRztRQUN0QixJQUFJLENBQUNDLFVBQVUsR0FBR1osUUFBUVksVUFBVTtRQUVwQyxJQUFJWixRQUFRRyxRQUFRLEVBQUUsSUFBSSxDQUFDQSxRQUFRLEdBQUdILFFBQVFHLFFBQVE7UUFDdEQsSUFBSUgsUUFBUUUsR0FBRyxFQUFFLElBQUksQ0FBQ0EsR0FBRyxHQUFHRixRQUFRRSxHQUFHO1FBQ3ZDLElBQUlGLFFBQVFDLFNBQVMsRUFBRSxJQUFJLENBQUNBLFNBQVMsR0FBR0QsUUFBUUMsU0FBUztRQUN6RCxJQUFJRCxRQUFRYSxT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
package/dist/routes.d.ts CHANGED
@@ -1,3 +1,9 @@
1
1
  import type { RestRoutes } from './typings/routes.js';
2
- export declare function createRoutes(): RestRoutes;
2
+ /**
3
+ * Creates the available discord API routes
4
+ *
5
+ * @param disableURIEncode Don't encode strings, except where required - Danger: disabling URI encoding may lead to path traversal if unsafe strings are used
6
+ * @returns The available discord API routes
7
+ */
8
+ export declare function createRoutes(disableURIEncode?: boolean): RestRoutes;
3
9
  //# sourceMappingURL=routes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAErD,wBAAgB,YAAY,IAAI,UAAU,CA4sBzC"}
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,gBAAgB,GAAE,OAAe,GAAG,UAAU,CAgwB1E"}