@clickup/rest-client 2.10.293 → 2.10.296
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/.eslintrc.base.js +20 -2
- package/README.md +3 -1
- package/SECURITY.md +39 -0
- package/dist/.eslintcache +1 -0
- package/dist/RestClient.js +1 -1
- package/dist/RestClient.js.map +1 -1
- package/dist/RestOptions.d.ts +5 -7
- package/dist/RestOptions.d.ts.map +1 -1
- package/dist/RestOptions.js +2 -2
- package/dist/RestOptions.js.map +1 -1
- package/dist/RestRequest.d.ts.map +1 -1
- package/dist/RestRequest.js +7 -13
- package/dist/RestRequest.js.map +1 -1
- package/dist/RestResponse.d.ts +4 -1
- package/dist/RestResponse.d.ts.map +1 -1
- package/dist/RestResponse.js +2 -1
- package/dist/RestResponse.js.map +1 -1
- package/dist/RestStream.js.map +1 -1
- package/dist/errors/RestRateLimitError.d.ts.map +1 -1
- package/dist/errors/RestRateLimitError.js.map +1 -1
- package/dist/errors/RestRetriableError.d.ts.map +1 -1
- package/dist/errors/RestRetriableError.js.map +1 -1
- package/dist/errors/RestTokenInvalidError.d.ts.map +1 -1
- package/dist/errors/RestTokenInvalidError.js.map +1 -1
- package/dist/helpers/depaginate.d.ts +1 -1
- package/dist/helpers/depaginate.d.ts.map +1 -1
- package/dist/helpers/depaginate.js.map +1 -1
- package/dist/internal/RestFetchReader.d.ts +9 -2
- package/dist/internal/RestFetchReader.d.ts.map +1 -1
- package/dist/internal/RestFetchReader.js +14 -3
- package/dist/internal/RestFetchReader.js.map +1 -1
- package/dist/internal/RestRangeUploader.js.map +1 -1
- package/dist/internal/calcRetryDelay.js.map +1 -1
- package/dist/internal/inferResBodyEncoding.js.map +1 -1
- package/dist/internal/inspectPossibleJSON.js.map +1 -1
- package/dist/internal/substituteParams.js.map +1 -1
- package/dist/internal/throwIfErrorResponse.js.map +1 -1
- package/dist/middlewares/paceRequests.js.map +1 -1
- package/dist/pacers/PacerQPS.js.map +1 -1
- package/docs/README.md +3 -1
- package/docs/classes/PacerComposite.md +7 -3
- package/docs/classes/PacerQPS.md +7 -3
- package/docs/classes/RestClient.md +32 -28
- package/docs/classes/RestContentSizeOverLimitError.md +5 -1
- package/docs/classes/RestError.md +5 -1
- package/docs/classes/RestRateLimitError.md +6 -2
- package/docs/classes/RestRequest.md +22 -18
- package/docs/classes/RestResponse.md +25 -10
- package/docs/classes/RestResponseError.md +5 -1
- package/docs/classes/RestRetriableError.md +6 -2
- package/docs/classes/RestStream.md +12 -8
- package/docs/classes/RestTimeoutError.md +5 -1
- package/docs/classes/RestTokenInvalidError.md +6 -2
- package/docs/interfaces/Middleware.md +4 -4
- package/docs/interfaces/Pacer.md +2 -2
- package/docs/interfaces/PacerQPSBackend.md +2 -2
- package/docs/interfaces/RestLogEvent.md +1 -1
- package/docs/interfaces/RestOptions.md +59 -23
- package/docs/interfaces/TokenGetter.md +3 -3
- package/docs/modules.md +4 -4
- package/jest.config.js +3 -0
- package/package.json +40 -8
- package/src/RestClient.ts +490 -0
- package/src/RestOptions.ts +186 -0
- package/src/RestRequest.ts +441 -0
- package/src/RestResponse.ts +49 -0
- package/src/RestStream.ts +89 -0
- package/src/errors/RestContentSizeOverLimitError.ts +3 -0
- package/src/errors/RestError.ts +6 -0
- package/src/errors/RestRateLimitError.ts +12 -0
- package/src/errors/RestResponseError.ts +46 -0
- package/src/errors/RestRetriableError.ts +12 -0
- package/src/errors/RestTimeoutError.ts +3 -0
- package/src/errors/RestTokenInvalidError.ts +11 -0
- package/src/helpers/depaginate.ts +37 -0
- package/src/index.ts +50 -0
- package/src/internal/RestFetchReader.ts +188 -0
- package/src/internal/RestRangeUploader.ts +61 -0
- package/src/internal/calcRetryDelay.ts +59 -0
- package/src/internal/inferResBodyEncoding.ts +33 -0
- package/src/internal/inspectPossibleJSON.ts +71 -0
- package/src/internal/prependNewlineIfMultiline.ts +3 -0
- package/src/internal/substituteParams.ts +25 -0
- package/src/internal/throwIfErrorResponse.ts +89 -0
- package/src/internal/toFloatMs.ts +3 -0
- package/src/middlewares/paceRequests.ts +42 -0
- package/src/pacers/Pacer.ts +22 -0
- package/src/pacers/PacerComposite.ts +29 -0
- package/src/pacers/PacerQPS.ts +147 -0
- package/tsconfig.json +5 -13
- package/typedoc.json +6 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { inspect } from "util";
|
|
2
|
+
import sortBy from "lodash/sortBy";
|
|
3
|
+
import truncate from "lodash/truncate";
|
|
4
|
+
|
|
5
|
+
export default function inspectPossibleJSON(
|
|
6
|
+
headers: { get(name: string): string | null },
|
|
7
|
+
text: string | Buffer | NodeJS.ReadableStream,
|
|
8
|
+
maxOutputLen: number,
|
|
9
|
+
): string {
|
|
10
|
+
const MAX_LEN_TO_TRY_PARSE = 1024 * 1024;
|
|
11
|
+
|
|
12
|
+
if (typeof text === "string" && text.length > MAX_LEN_TO_TRY_PARSE) {
|
|
13
|
+
// Don't even try to JSON-parse if the text is too long.
|
|
14
|
+
return ellipsis(text, maxOutputLen);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (text instanceof Buffer) {
|
|
18
|
+
return `<Buffer: ${text.length} bytes>`;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (!text || typeof text === "string") {
|
|
22
|
+
if (!(headers.get("content-type") || "").match(/json/)) {
|
|
23
|
+
return ellipsis(text, maxOutputLen);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
try {
|
|
27
|
+
const json = JSON.parse(text);
|
|
28
|
+
|
|
29
|
+
if (json && typeof json === "object" && !(json instanceof Array)) {
|
|
30
|
+
// Move error/errors fields on top for better logging. This is a poor
|
|
31
|
+
// man's approach: of course not all APIs return error/errors fields at
|
|
32
|
+
// all, but it's hard to reorder at any other layer of abstraction.
|
|
33
|
+
reorderObjectProps(json, (k) =>
|
|
34
|
+
k === "error" || k === "errors" ? "" : k,
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return ellipsis(
|
|
39
|
+
inspect(json, { depth: 20, compact: true }),
|
|
40
|
+
maxOutputLen,
|
|
41
|
+
);
|
|
42
|
+
} catch (e: any) {
|
|
43
|
+
return ellipsis(text, maxOutputLen);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return "<Stream>";
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* In-place-reorders keys in a given object. The important part is to do it
|
|
52
|
+
* in-place to e.g. be able to alter some @Memoized values.
|
|
53
|
+
*/
|
|
54
|
+
function reorderObjectProps(
|
|
55
|
+
obj: Record<string, any>,
|
|
56
|
+
ranker: (k: string, v: any) => string | number,
|
|
57
|
+
) {
|
|
58
|
+
const entries = Object.entries(obj);
|
|
59
|
+
for (const k in obj) {
|
|
60
|
+
delete obj[k];
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
Object.assign(
|
|
64
|
+
obj,
|
|
65
|
+
Object.fromEntries(sortBy(entries, ([k, v]) => ranker(k, v))),
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function ellipsis(text: any, length: number) {
|
|
70
|
+
return truncate("" + text, { length }).trimEnd();
|
|
71
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Allows to use URLs like /some/:abc/other and pass { abc: "xyz" } as one of
|
|
3
|
+
* body parameters. Such body parameters will be excluded from the body before
|
|
4
|
+
* sending the request (so they're "moved" into the URL).
|
|
5
|
+
*/
|
|
6
|
+
export default function substituteParams<TBody>(
|
|
7
|
+
url: string,
|
|
8
|
+
body: TBody,
|
|
9
|
+
): [string, TBody] {
|
|
10
|
+
if (!body || typeof body !== "object") {
|
|
11
|
+
return [url, body];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
url = url.replace(/:([a-z0-9_]+)/gi, (match, param) => {
|
|
15
|
+
const value = (body as any)[param];
|
|
16
|
+
if (typeof value === "string" || typeof value === "number") {
|
|
17
|
+
body = { ...body };
|
|
18
|
+
delete (body as any)[param];
|
|
19
|
+
return encodeURIComponent(value);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return match;
|
|
23
|
+
});
|
|
24
|
+
return [url, body];
|
|
25
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import RestRateLimitError from "../errors/RestRateLimitError";
|
|
2
|
+
import RestResponseError from "../errors/RestResponseError";
|
|
3
|
+
import RestRetriableError from "../errors/RestRetriableError";
|
|
4
|
+
import RestTokenInvalidError from "../errors/RestTokenInvalidError";
|
|
5
|
+
import type RestOptions from "../RestOptions";
|
|
6
|
+
import type RestResponse from "../RestResponse";
|
|
7
|
+
|
|
8
|
+
const STATUS_TOO_MANY_REQUESTS = 429;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* The general idea is that we turn all logical errors into exceptions and then
|
|
12
|
+
* deal with exceptions only. I.e. throwing an exception becomes an internal API
|
|
13
|
+
* convention for errors. This is because fetch() throws its own exceptions, and
|
|
14
|
+
* also there may be some exceptions during validation of the response, or
|
|
15
|
+
* inside a middleware etc.
|
|
16
|
+
*/
|
|
17
|
+
export default function throwIfErrorResponse(
|
|
18
|
+
options: RestOptions,
|
|
19
|
+
res: RestResponse,
|
|
20
|
+
) {
|
|
21
|
+
const isSuccessResponse = options.isSuccessResponse(res);
|
|
22
|
+
if (isSuccessResponse === "SUCCESS") {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const rateLimitDelayMs = options.isRateLimitError(res);
|
|
27
|
+
switch (rateLimitDelayMs) {
|
|
28
|
+
case "RATE_LIMIT":
|
|
29
|
+
throw new RestRateLimitError(
|
|
30
|
+
`isRateLimitError() returned ${rateLimitDelayMs}`,
|
|
31
|
+
0,
|
|
32
|
+
res,
|
|
33
|
+
);
|
|
34
|
+
case "BEST_EFFORT":
|
|
35
|
+
if (res.status === STATUS_TOO_MANY_REQUESTS) {
|
|
36
|
+
const retryAfterHeader = res.headers.get("Retry-After") || "0";
|
|
37
|
+
throw new RestRateLimitError(
|
|
38
|
+
`Rate limited by HTTP status ${STATUS_TOO_MANY_REQUESTS}`,
|
|
39
|
+
parseInt(retryAfterHeader) || 0,
|
|
40
|
+
res,
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
break;
|
|
45
|
+
case "SOMETHING_ELSE":
|
|
46
|
+
break;
|
|
47
|
+
default:
|
|
48
|
+
throw new RestRateLimitError(
|
|
49
|
+
`isRateLimitError() returned retry delay ${rateLimitDelayMs} ms`,
|
|
50
|
+
rateLimitDelayMs,
|
|
51
|
+
res,
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const isTokenInvalidError = options.isTokenInvalidError(res);
|
|
56
|
+
if (isTokenInvalidError) {
|
|
57
|
+
throw new RestTokenInvalidError("Invalid app token", res);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const retryDelayMs = options.isRetriableError(res, null);
|
|
61
|
+
switch (retryDelayMs) {
|
|
62
|
+
case "RETRY":
|
|
63
|
+
throw new RestRetriableError(
|
|
64
|
+
`isRetriableError() returned ${retryDelayMs}`,
|
|
65
|
+
0,
|
|
66
|
+
res,
|
|
67
|
+
);
|
|
68
|
+
case "BEST_EFFORT":
|
|
69
|
+
case "NEVER_RETRY":
|
|
70
|
+
break;
|
|
71
|
+
default:
|
|
72
|
+
throw new RestRetriableError(
|
|
73
|
+
`"isRetriableError() returned retry delay ${retryDelayMs} ms`,
|
|
74
|
+
retryDelayMs,
|
|
75
|
+
res,
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (isSuccessResponse === "THROW") {
|
|
80
|
+
throw new RestResponseError(
|
|
81
|
+
`isSuccessResponse() returned ${isSuccessResponse}`,
|
|
82
|
+
res,
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (res.status >= 300) {
|
|
87
|
+
throw new RestResponseError("", res);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type Pacer from "../pacers/Pacer";
|
|
2
|
+
import type { Middleware } from "../RestOptions";
|
|
3
|
+
import type RestRequest from "../RestRequest";
|
|
4
|
+
|
|
5
|
+
const MIN_LOG_DELAY_MS = 10;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Rest Client middleware that adds some delay between requests using one of
|
|
9
|
+
* Pacer implementations.
|
|
10
|
+
*/
|
|
11
|
+
export default function paceRequests(
|
|
12
|
+
pacer: Pacer | ((req: RestRequest) => Promise<Pacer | null>) | null,
|
|
13
|
+
): Middleware {
|
|
14
|
+
return async (req, next) => {
|
|
15
|
+
if (typeof pacer === "function") {
|
|
16
|
+
pacer = await pacer(req);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (pacer) {
|
|
20
|
+
const { delayMs, reason } = await pacer.touch();
|
|
21
|
+
if (delayMs > 0) {
|
|
22
|
+
await req.options.heartbeater.delay(delayMs);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (delayMs > MIN_LOG_DELAY_MS) {
|
|
26
|
+
req.options.logger({
|
|
27
|
+
attempt: 0,
|
|
28
|
+
req,
|
|
29
|
+
res: "backoff_delay",
|
|
30
|
+
exception: null,
|
|
31
|
+
timestamp: Date.now(),
|
|
32
|
+
elapsed: delayMs,
|
|
33
|
+
isFinalAttempt: true,
|
|
34
|
+
privateDataInResponse: false,
|
|
35
|
+
comment: reason,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return next(req);
|
|
41
|
+
};
|
|
42
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A result of some Pacer work.
|
|
3
|
+
*/
|
|
4
|
+
export interface PacerDelay {
|
|
5
|
+
delayMs: number;
|
|
6
|
+
reason: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Pacer is a class which allows to pace requests on some resource identified by
|
|
11
|
+
* the instance of this class.
|
|
12
|
+
*/
|
|
13
|
+
export default interface Pacer {
|
|
14
|
+
/** Human readable name of the pacer, used when composing multiple pacers. */
|
|
15
|
+
readonly name: string;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Signals that we're about to send a request. Returns the delay we need to
|
|
19
|
+
* wait for before actually sending.
|
|
20
|
+
*/
|
|
21
|
+
touch(): Promise<PacerDelay>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import maxBy from "lodash/maxBy";
|
|
2
|
+
import type Pacer from "./Pacer";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A Pacer which runs all sub-pacers and chooses the largest delay.
|
|
6
|
+
*/
|
|
7
|
+
export default class PacerComposite implements Pacer {
|
|
8
|
+
readonly name = "";
|
|
9
|
+
|
|
10
|
+
constructor(private _pacers: Pacer[]) {}
|
|
11
|
+
|
|
12
|
+
async touch() {
|
|
13
|
+
const delays = await Promise["all"](
|
|
14
|
+
this._pacers.map(async (pacer) => ({
|
|
15
|
+
pacer,
|
|
16
|
+
delay: await pacer.touch(),
|
|
17
|
+
})),
|
|
18
|
+
);
|
|
19
|
+
const pair = maxBy(delays, ({ delay }) => delay.delayMs);
|
|
20
|
+
return pair
|
|
21
|
+
? {
|
|
22
|
+
...pair.delay,
|
|
23
|
+
reason: pair.pacer.name
|
|
24
|
+
? `${pair.pacer.constructor.name} ${pair.pacer.name}\n${pair.delay.reason}`
|
|
25
|
+
: pair.delay.reason,
|
|
26
|
+
}
|
|
27
|
+
: { delayMs: 0, reason: "no pacers" };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import random from "lodash/random";
|
|
2
|
+
import type { PacerDelay } from "./Pacer";
|
|
3
|
+
import type Pacer from "./Pacer";
|
|
4
|
+
|
|
5
|
+
/** Start decreasing the delay (and thus speeding up requests) only when we have
|
|
6
|
+
* less requests in the moving window than allowed by the desired QPS multiplied
|
|
7
|
+
* by this factor. I.e. we don't speed up immediately when we're slow; we wait
|
|
8
|
+
* until we're SLIGHTLY below the limits. */
|
|
9
|
+
const DEFAULT_DECREASE_THRESHOLD = 0.75;
|
|
10
|
+
|
|
11
|
+
/** Default moving window length. */
|
|
12
|
+
const DEFAULT_WINDOW_SEC = 30;
|
|
13
|
+
|
|
14
|
+
/** Below how many samples do we stop relying on samples to recalculate the
|
|
15
|
+
* current fleet's average delay and instead keep using the previously
|
|
16
|
+
* calculated (and saved) value for the delay. E.g. it doesn't make much sense
|
|
17
|
+
* to rely on an average of 3-4 samples to calculate the average delay, it makes
|
|
18
|
+
* sense to wait for more samples to come. */
|
|
19
|
+
const MIN_COUNT_FOR_CENTRAL_TENDENCY = 10;
|
|
20
|
+
|
|
21
|
+
/** The value here is multiplied by the fleet average to get the delay
|
|
22
|
+
* increment/decrement step. It basically determines, in how many increments
|
|
23
|
+
* would a "cold started" worker reach the current fleet's average delay. Or, in
|
|
24
|
+
* how many steps would it reach delay=0 situation from the current fleet's
|
|
25
|
+
* average if needed. */
|
|
26
|
+
const DELAY_AVG_TO_STEP_FACTOR = 0.02;
|
|
27
|
+
|
|
28
|
+
/** Delay increments are jittered by +/- this proportion. */
|
|
29
|
+
const DELAY_STEP_JITTER = 0.1;
|
|
30
|
+
|
|
31
|
+
export interface PacerQPSBackend {
|
|
32
|
+
/** Resource key which this backend is operating on. */
|
|
33
|
+
readonly key: string;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Maintains the array of numbers somewhere in memory (time-value pairs),
|
|
37
|
+
* inserts a new time-value pair to the end of this list, and removes all the
|
|
38
|
+
* entries which are earlier than `minTime`. Returns the size of the resulting
|
|
39
|
+
* array and some central tendency statistics about its values.
|
|
40
|
+
*/
|
|
41
|
+
push(props: {
|
|
42
|
+
time: number;
|
|
43
|
+
minTime: number;
|
|
44
|
+
value: number;
|
|
45
|
+
minCountForCentralTendency: number;
|
|
46
|
+
}): Promise<{ count: number; sum: number; avg: number; median: number }>;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface PacerQPSOptions {
|
|
50
|
+
/** The maximum QPS allowed within the rolling window. */
|
|
51
|
+
qps: number;
|
|
52
|
+
/** The length of the rolling windows in milliseconds. */
|
|
53
|
+
windowSec?: number;
|
|
54
|
+
/** Decrease the delay if the number of requests in the window has dropped
|
|
55
|
+
* below `decreaseThreshold` portion of the limit. */
|
|
56
|
+
decreaseThreshold?: number;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Implements a very simple heuristic:
|
|
61
|
+
* - increase the delay if we're above the QPS within the rolling window;
|
|
62
|
+
* - decrease the delay if we're below the desired QPS.
|
|
63
|
+
*
|
|
64
|
+
* Each worker keeps (and grows/shrinks) its delay individually; this way, we
|
|
65
|
+
* don't need to elect, who's the "source of truth" for the delay.
|
|
66
|
+
*
|
|
67
|
+
* Backend is a concrete (and minimal) implementation of the storage logic for
|
|
68
|
+
* the pacing algorithm.
|
|
69
|
+
*/
|
|
70
|
+
export default class PacerQPS implements Pacer {
|
|
71
|
+
private _isFirstTouch = true;
|
|
72
|
+
private _delay = 0;
|
|
73
|
+
|
|
74
|
+
constructor(
|
|
75
|
+
private _options: PacerQPSOptions,
|
|
76
|
+
private _backend: PacerQPSBackend,
|
|
77
|
+
) {}
|
|
78
|
+
|
|
79
|
+
get name() {
|
|
80
|
+
return this._backend.key;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async touch(): Promise<PacerDelay> {
|
|
84
|
+
const windowSec = this._options.windowSec ?? DEFAULT_WINDOW_SEC;
|
|
85
|
+
const limit = Math.round(windowSec * this._options.qps);
|
|
86
|
+
const decreaseThreshold =
|
|
87
|
+
this._options.decreaseThreshold ?? DEFAULT_DECREASE_THRESHOLD;
|
|
88
|
+
|
|
89
|
+
const time = Date.now();
|
|
90
|
+
const delayPushed = this._delay;
|
|
91
|
+
const { count, sum, avg, median } = await this._backend.push({
|
|
92
|
+
time,
|
|
93
|
+
minTime: time - windowSec * 1000,
|
|
94
|
+
value: this._delay,
|
|
95
|
+
minCountForCentralTendency: MIN_COUNT_FOR_CENTRAL_TENDENCY,
|
|
96
|
+
});
|
|
97
|
+
const sumDivCount = count ? sum / count : 0;
|
|
98
|
+
|
|
99
|
+
// "Cold start": start with the fleet average delay.
|
|
100
|
+
if (this._isFirstTouch && this._delay === 0) {
|
|
101
|
+
this._delay = Math.round(avg);
|
|
102
|
+
this._isFirstTouch = false;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// If we imagine there is only 1 worker in the fleet, what would be its
|
|
106
|
+
// delay increment/decrement step. We use this number in a fallback
|
|
107
|
+
// situation, when we don't know much about the entire fleet average delay
|
|
108
|
+
// yet, or when this delay is too small to count on.
|
|
109
|
+
const singleWorkerDelayStepMs = Math.round(
|
|
110
|
+
((windowSec * 1000) / limit) * DELAY_AVG_TO_STEP_FACTOR,
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
// Considering that there are multiple workers running, and that the current
|
|
114
|
+
// average fleet's delay is representative, what would be a delay increment
|
|
115
|
+
// to reach from delay=0 to that fleet's average delay.
|
|
116
|
+
const multiWorkerDelayStepMs = Math.round(
|
|
117
|
+
avg *
|
|
118
|
+
DELAY_AVG_TO_STEP_FACTOR *
|
|
119
|
+
random(1 - DELAY_STEP_JITTER, 1 + DELAY_STEP_JITTER, true),
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
// If average fleet delay is not representative yet, we fallback to a
|
|
123
|
+
// single-worker delay increment.
|
|
124
|
+
const delayStepMs = multiWorkerDelayStepMs || singleWorkerDelayStepMs || 1;
|
|
125
|
+
|
|
126
|
+
if (count > limit) {
|
|
127
|
+
// Increase the delay if the limit is reached. There is no "max delay":
|
|
128
|
+
// imagine we have 10 QPS limit and 10000 users; it's obvious that in this
|
|
129
|
+
// case, the delay between requests per a single user will be gigantic.
|
|
130
|
+
this._delay += delayStepMs;
|
|
131
|
+
} else if (count < limit * decreaseThreshold) {
|
|
132
|
+
// Decrease the delay if we're significantly under the limit.
|
|
133
|
+
this._delay = Math.max(0, this._delay - delayStepMs);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return {
|
|
137
|
+
delayMs: this._delay,
|
|
138
|
+
reason: [
|
|
139
|
+
`count=${count} per ${windowSec}s (limit=${limit})`,
|
|
140
|
+
`delay=${this._delay} step=${delayStepMs} delayPushed=${delayPushed}`,
|
|
141
|
+
`median=${Math.round(median)}`,
|
|
142
|
+
`sum/count=${Math.round(sumDivCount)}`,
|
|
143
|
+
`avg=${Math.round(avg)}`,
|
|
144
|
+
].join("\n"),
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
}
|
package/tsconfig.json
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"include": [
|
|
3
|
-
"src/**/*"
|
|
4
|
-
],
|
|
2
|
+
"include": ["src/**/*"],
|
|
5
3
|
"compilerOptions": {
|
|
6
4
|
"allowJs": true,
|
|
7
5
|
"declaration": true,
|
|
@@ -11,11 +9,8 @@
|
|
|
11
9
|
"esModuleInterop": true,
|
|
12
10
|
"experimentalDecorators": true,
|
|
13
11
|
"incremental": true,
|
|
14
|
-
"lib": [
|
|
15
|
-
|
|
16
|
-
],
|
|
17
|
-
"module": "commonjs",
|
|
18
|
-
"moduleResolution": "node",
|
|
12
|
+
"lib": ["ES2019"],
|
|
13
|
+
"module": "Node16",
|
|
19
14
|
"noEmitOnError": true,
|
|
20
15
|
"noErrorTruncation": true,
|
|
21
16
|
"noImplicitOverride": true,
|
|
@@ -29,11 +24,8 @@
|
|
|
29
24
|
"skipLibCheck": true,
|
|
30
25
|
"sourceMap": true,
|
|
31
26
|
"strict": true,
|
|
32
|
-
"target": "
|
|
27
|
+
"target": "ES2019",
|
|
33
28
|
"tsBuildInfoFile": "dist/tsconfig.tsbuildinfo",
|
|
34
|
-
"types": [
|
|
35
|
-
"node",
|
|
36
|
-
"jest"
|
|
37
|
-
],
|
|
29
|
+
"types": ["node", "jest"]
|
|
38
30
|
}
|
|
39
31
|
}
|
package/typedoc.json
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"entryPoints": ["src"],
|
|
3
|
-
"exclude": [
|
|
3
|
+
"exclude": [
|
|
4
|
+
"**/internal/**",
|
|
5
|
+
"**/__tests__/**",
|
|
6
|
+
"**/node_modules/**",
|
|
7
|
+
"**/node-fetch/**"
|
|
8
|
+
],
|
|
4
9
|
"entryPointStrategy": "expand",
|
|
5
10
|
"mergeModulesMergeMode": "project",
|
|
6
11
|
"sort": ["source-order"],
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"program":{"fileNames":["../node_modules/typescript/lib/lib.es5.d.ts","../node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/typescript/lib/lib.es2017.date.d.ts","../node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/typescript/lib/lib.esnext.intl.d.ts","../node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../node_modules/@types/lodash/common/common.d.ts","../node_modules/@types/lodash/common/array.d.ts","../node_modules/@types/lodash/common/collection.d.ts","../node_modules/@types/lodash/common/date.d.ts","../node_modules/@types/lodash/common/function.d.ts","../node_modules/@types/lodash/common/lang.d.ts","../node_modules/@types/lodash/common/math.d.ts","../node_modules/@types/lodash/common/number.d.ts","../node_modules/@types/lodash/common/object.d.ts","../node_modules/@types/lodash/common/seq.d.ts","../node_modules/@types/lodash/common/string.d.ts","../node_modules/@types/lodash/common/util.d.ts","../node_modules/@types/lodash/index.d.ts","../node_modules/@types/lodash/isundefined.d.ts","../node_modules/@types/lodash/omitby.d.ts","../node_modules/@types/node/assert.d.ts","../node_modules/@types/node/assert/strict.d.ts","../node_modules/undici-types/header.d.ts","../node_modules/undici-types/readable.d.ts","../node_modules/undici-types/file.d.ts","../node_modules/undici-types/fetch.d.ts","../node_modules/undici-types/formdata.d.ts","../node_modules/undici-types/connector.d.ts","../node_modules/undici-types/client.d.ts","../node_modules/undici-types/errors.d.ts","../node_modules/undici-types/dispatcher.d.ts","../node_modules/undici-types/global-dispatcher.d.ts","../node_modules/undici-types/global-origin.d.ts","../node_modules/undici-types/pool-stats.d.ts","../node_modules/undici-types/pool.d.ts","../node_modules/undici-types/handlers.d.ts","../node_modules/undici-types/balanced-pool.d.ts","../node_modules/undici-types/agent.d.ts","../node_modules/undici-types/mock-interceptor.d.ts","../node_modules/undici-types/mock-agent.d.ts","../node_modules/undici-types/mock-client.d.ts","../node_modules/undici-types/mock-pool.d.ts","../node_modules/undici-types/mock-errors.d.ts","../node_modules/undici-types/proxy-agent.d.ts","../node_modules/undici-types/api.d.ts","../node_modules/undici-types/cookies.d.ts","../node_modules/undici-types/patch.d.ts","../node_modules/undici-types/filereader.d.ts","../node_modules/undici-types/diagnostics-channel.d.ts","../node_modules/undici-types/websocket.d.ts","../node_modules/undici-types/content-type.d.ts","../node_modules/undici-types/cache.d.ts","../node_modules/undici-types/interceptors.d.ts","../node_modules/undici-types/index.d.ts","../node_modules/@types/node/globals.d.ts","../node_modules/@types/node/async_hooks.d.ts","../node_modules/@types/node/buffer.d.ts","../node_modules/@types/node/child_process.d.ts","../node_modules/@types/node/cluster.d.ts","../node_modules/@types/node/console.d.ts","../node_modules/@types/node/constants.d.ts","../node_modules/@types/node/crypto.d.ts","../node_modules/@types/node/dgram.d.ts","../node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/@types/node/dns.d.ts","../node_modules/@types/node/dns/promises.d.ts","../node_modules/@types/node/domain.d.ts","../node_modules/@types/node/dom-events.d.ts","../node_modules/@types/node/events.d.ts","../node_modules/@types/node/fs.d.ts","../node_modules/@types/node/fs/promises.d.ts","../node_modules/@types/node/http.d.ts","../node_modules/@types/node/http2.d.ts","../node_modules/@types/node/https.d.ts","../node_modules/@types/node/inspector.d.ts","../node_modules/@types/node/module.d.ts","../node_modules/@types/node/net.d.ts","../node_modules/@types/node/os.d.ts","../node_modules/@types/node/path.d.ts","../node_modules/@types/node/perf_hooks.d.ts","../node_modules/@types/node/process.d.ts","../node_modules/@types/node/punycode.d.ts","../node_modules/@types/node/querystring.d.ts","../node_modules/@types/node/readline.d.ts","../node_modules/@types/node/readline/promises.d.ts","../node_modules/@types/node/repl.d.ts","../node_modules/@types/node/stream.d.ts","../node_modules/@types/node/stream/promises.d.ts","../node_modules/@types/node/stream/consumers.d.ts","../node_modules/@types/node/stream/web.d.ts","../node_modules/@types/node/string_decoder.d.ts","../node_modules/@types/node/test.d.ts","../node_modules/@types/node/timers.d.ts","../node_modules/@types/node/timers/promises.d.ts","../node_modules/@types/node/tls.d.ts","../node_modules/@types/node/trace_events.d.ts","../node_modules/@types/node/tty.d.ts","../node_modules/@types/node/url.d.ts","../node_modules/@types/node/util.d.ts","../node_modules/@types/node/v8.d.ts","../node_modules/@types/node/vm.d.ts","../node_modules/@types/node/wasi.d.ts","../node_modules/@types/node/worker_threads.d.ts","../node_modules/@types/node/zlib.d.ts","../node_modules/@types/node/globals.global.d.ts","../node_modules/@types/node/index.d.ts","../node_modules/form-data/index.d.ts","../node_modules/@types/node-fetch/externals.d.ts","../node_modules/@types/node-fetch/index.d.ts","../node_modules/oauth-1.0a/oauth-1.0a.d.ts","../node_modules/fast-typescript-memoize/dist/memoize.d.ts","../node_modules/fast-typescript-memoize/dist/memoize0.d.ts","../node_modules/fast-typescript-memoize/dist/memoize2.d.ts","../node_modules/fast-typescript-memoize/dist/memoizeexpireunused.d.ts","../node_modules/fast-typescript-memoize/dist/index.d.ts","../node_modules/ipaddr.js/lib/ipaddr.js.d.ts","../node_modules/@types/lodash/random.d.ts","../node_modules/@types/lodash/sortby.d.ts","../node_modules/@types/lodash/truncate.d.ts","../src/internal/inspectpossiblejson.ts","../src/internal/prependnewlineifmultiline.ts","../src/errors/resterror.ts","../src/errors/restresponseerror.ts","../src/errors/restcontentsizeoverlimiterror.ts","../src/errors/resttimeouterror.ts","../src/errors/restratelimiterror.ts","../src/errors/restretriableerror.ts","../node_modules/delay/index.d.ts","../src/restoptions.ts","../src/internal/calcretrydelay.ts","../node_modules/event-target-shim/index.d.ts","../node_modules/abort-controller/dist/abort-controller.d.ts","../src/internal/inferresbodyencoding.ts","../src/internal/restfetchreader.ts","../src/internal/throwiferrorresponse.ts","../src/internal/tofloatms.ts","../src/reststream.ts","../src/restrequest.ts","../src/restresponse.ts","../src/errors/resttokeninvaliderror.ts","../src/internal/restrangeuploader.ts","../src/internal/substituteparams.ts","../src/restclient.ts","../src/helpers/depaginate.ts","../src/pacers/pacer.ts","../src/middlewares/pacerequests.ts","../node_modules/@types/lodash/maxby.d.ts","../src/pacers/pacercomposite.ts","../src/pacers/pacerqps.ts","../src/index.ts","../src/__tests__/restclient.test.ts","../node_modules/@types/lodash/range.d.ts","../src/__tests__/helpers.ts","../src/__tests__/restfetchreader.test.ts","../src/__tests__/restrequest.test.ts","../src/__tests__/reststream.test.ts","../node_modules/superstruct/lib/error.d.ts","../node_modules/superstruct/lib/utils.d.ts","../node_modules/superstruct/lib/struct.d.ts","../node_modules/superstruct/lib/structs/coercions.d.ts","../node_modules/superstruct/lib/structs/refinements.d.ts","../node_modules/superstruct/lib/structs/types.d.ts","../node_modules/superstruct/lib/structs/utilities.d.ts","../node_modules/superstruct/lib/index.d.ts","../src/__tests__/example.ts","../node_modules/@jest/expect-utils/build/index.d.ts","../node_modules/chalk/index.d.ts","../node_modules/@sinclair/typebox/typebox.d.ts","../node_modules/@jest/schemas/build/index.d.ts","../node_modules/pretty-format/build/index.d.ts","../node_modules/jest-diff/build/index.d.ts","../node_modules/jest-matcher-utils/build/index.d.ts","../node_modules/expect/build/index.d.ts","../node_modules/@types/jest/index.d.ts"],"fileInfos":[{"version":"2ac9cdcfb8f8875c18d14ec5796a8b029c426f73ad6dc3ffb580c228b58d1c44","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","dc48272d7c333ccf58034c0026162576b7d50ea0e69c3b9292f803fc20720fd5","9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4",{"version":"f296963760430fb65b4e5d91f0ed770a91c6e77455bacf8fa23a1501654ede0e","affectsGlobalScope":true},{"version":"09226e53d1cfda217317074a97724da3e71e2c545e18774484b61562afc53cd2","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"8b41361862022eb72fcc8a7f34680ac842aca802cf4bc1f915e8c620c9ce4331","affectsGlobalScope":true},{"version":"f7bd636ae3a4623c503359ada74510c4005df5b36de7f23e1db8a5c543fd176b","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"0c20f4d2358eb679e4ae8a4432bdd96c857a2960fd6800b21ec4008ec59d60ea","affectsGlobalScope":true},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true},{"version":"82d0d8e269b9eeac02c3bd1c9e884e85d483fcb2cd168bccd6bc54df663da031","affectsGlobalScope":true},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true},{"version":"b8deab98702588840be73d67f02412a2d45a417a3c097b2e96f7f3a42ac483d1","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"376d554d042fb409cb55b5cbaf0b2b4b7e669619493c5d18d5fa8bd67273f82a","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"c4138a3dd7cd6cf1f363ca0f905554e8d81b45844feea17786cdf1626cb8ea06","affectsGlobalScope":true},{"version":"6ff3e2452b055d8f0ec026511c6582b55d935675af67cdb67dd1dc671e8065df","affectsGlobalScope":true},{"version":"03de17b810f426a2f47396b0b99b53a82c1b60e9cba7a7edda47f9bb077882f4","affectsGlobalScope":true},{"version":"8184c6ddf48f0c98429326b428478ecc6143c27f79b79e85740f17e6feb090f1","affectsGlobalScope":true},{"version":"261c4d2cf86ac5a89ad3fb3fafed74cbb6f2f7c1d139b0540933df567d64a6ca","affectsGlobalScope":true},{"version":"6af1425e9973f4924fca986636ac19a0cf9909a7e0d9d3009c349e6244e957b6","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"15a630d6817718a2ddd7088c4f83e4673fde19fa992d2eae2cf51132a302a5d3","affectsGlobalScope":true},{"version":"b7e9f95a7387e3f66be0ed6db43600c49cec33a3900437ce2fd350d9b7cb16f2","affectsGlobalScope":true},{"version":"01e0ee7e1f661acedb08b51f8a9b7d7f959e9cdb6441360f06522cc3aea1bf2e","affectsGlobalScope":true},{"version":"ac17a97f816d53d9dd79b0d235e1c0ed54a8cc6a0677e9a3d61efb480b2a3e4e","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"ec0104fee478075cb5171e5f4e3f23add8e02d845ae0165bfa3f1099241fa2aa","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"9cc66b0513ad41cb5f5372cca86ef83a0d37d1c1017580b7dace3ea5661836df","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"307c8b7ebbd7f23a92b73a4c6c0a697beca05b06b036c23a34553e5fe65e4fdc","affectsGlobalScope":true},{"version":"f35a831e4f0fe3b3697f4a0fe0e3caa7624c92b78afbecaf142c0f93abfaf379","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},"32ab25b7b28b24a138d879ca371b18c8fdfdd564ad5107e1333c5aa5d5fea494","458111fc89d11d2151277c822dfdc1a28fa5b6b2493cf942e37d4cd0a6ee5f22","da2b6356b84a40111aaecb18304ea4e4fcb43d70efb1c13ca7d7a906445ee0d3","187119ff4f9553676a884e296089e131e8cc01691c546273b1d0089c3533ce42","febf0b2de54781102b00f61653b21377390a048fbf5262718c91860d11ff34a6","6f294731b495c65ecf46a5694f0082954b961cf05463bea823f8014098eaffa0","0aaef8cded245bf5036a7a40b65622dd6c4da71f7a35343112edbe112b348a1e","00baffbe8a2f2e4875367479489b5d43b5fc1429ecb4a4cc98cfc3009095f52a","dcd91d3b697cb650b95db5471189b99815af5db2a1cd28760f91e0b12ede8ed5","3c92b6dfd43cc1c2485d9eba5ff0b74a19bb8725b692773ef1d66dac48cda4bd","b03afe4bec768ae333582915146f48b161e567a81b5ebc31c4d78af089770ac9","df996e25faa505f85aeb294d15ebe61b399cf1d1e49959cdfaf2cc0815c203f9","b82fc740467e59abe3d6170417e461527d2a95610f55915fc59557c4b7be55ba","e721209755f152edfd69e10bfdf5462d0a00b90991e2d5c5a9ab9c54fe4ee9fb","19d6c0afaefd2e51db3cc2ec611b33a43bd6d21545e854eb0913243e8d958991","09df3b4f1c937f02e7fee2836d4c4d7a63e66db70fd4d4e97126f4542cc21d9d","7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","7180c03fd3cb6e22f911ce9ba0f8a7008b1a6ddbe88ccf16a9c8140ef9ac1686","25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","54cb85a47d760da1c13c00add10d26b5118280d44d58e6908d8e89abbd9d7725","3e4825171442666d31c845aeb47fcd34b62e14041bb353ae2b874285d78482aa","adda9e3915c6bf15e360356a41d950881a51dbe44f9a6088155836b040820663","b4855526ac5a822d6e0005e4b62ee49c599bf89897e4109135283d660e60291c","e9775e97ac4877aebf963a0289c81abe76d1ec9a2a7778dbe637e5151f25c5f3","471e1da5a78350bc55ef8cef24eb3aca6174143c281b8b214ca2beda51f5e04a","cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","db3435f3525cd785bf21ec6769bf8da7e8a776be1a99e2e7efb5f244a2ef5fee","c3b170c45fc031db31f782e612adf7314b167e60439d304b49e704010e7bafe5","40383ebef22b943d503c6ce2cb2e060282936b952a01bea5f9f493d5fb487cc7","80ad053918e96087d9da8d092ff9f90520c9fc199c8bfd9340266dd8f38f364e","3a84b7cb891141824bd00ef8a50b6a44596aded4075da937f180c90e362fe5f6","13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","33203609eba548914dc83ddf6cadbc0bcb6e8ef89f6d648ca0908ae887f9fcc5","0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","9f0a92164925aa37d4a5d9dd3e0134cff8177208dba55fd2310cd74beea40ee2","8bfdb79bf1a9d435ec48d9372dc93291161f152c0865b81fc0b2694aedb4578d","2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","d32275be3546f252e3ad33976caf8c5e842c09cb87d468cb40d5f4cf092d1acc","d70119390aece1794bf4988f10ea750d13455f5286977d35027d43dd2e9841cf",{"version":"4d719cfab49ae4045d15cb6bed0f38ad3d7d6eb7f277d2603502a0f862ca3182","affectsGlobalScope":true},"cce1f5f86974c1e916ec4a8cab6eec9aa8e31e8148845bf07fbaa8e1d97b1a2c",{"version":"5a856afb15f9dc9983faa391dde989826995a33983c1cccb173e9606688e9709","affectsGlobalScope":true},"546ab07e19116d935ad982e76a223275b53bff7771dab94f433b7ab04652936e","7b43160a49cf2c6082da0465876c4a0b164e160b81187caeb0a6ca7a281e85ba",{"version":"aefb5a4a209f756b580eb53ea771cca8aad411603926f307a5e5b8ec6b16dcf6","affectsGlobalScope":true},"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb","f5a8b7ec4b798c88679194a8ebc25dcb6f5368e6e5811fcda9fe12b0d445b8db","b86e1a45b29437f3a99bad4147cb9fe2357617e8008c0484568e5bb5138d6e13","b5b719a47968cd61a6f83f437236bb6fe22a39223b6620da81ef89f5d7a78fb7","42c431e7965b641106b5e25ab3283aa4865ca7bb9909610a2abfa6226e4348be","0b7e732af0a9599be28c091d6bd1cb22c856ec0d415d4749c087c3881ca07a56","b7fe70be794e13d1b7940e318b8770cd1fb3eced7707805318a2e3aaac2c3e9e",{"version":"2c71199d1fc83bf17636ad5bf63a945633406b7b94887612bba4ef027c662b3e","affectsGlobalScope":true},{"version":"8d6138a264ddc6f94f16e99d4e117a2d6eb31b217891cf091b6437a2f114d561","affectsGlobalScope":true},"3b4c85eea12187de9929a76792b98406e8778ce575caca8c574f06da82622c54","f788131a39c81e0c9b9e463645dd7132b5bc1beb609b0e31e5c1ceaea378b4df","0c236069ce7bded4f6774946e928e4b3601894d294054af47a553f7abcafe2c1","21894466693f64957b9bd4c80fa3ec7fdfd4efa9d1861e070aca23f10220c9b2","396a8939b5e177542bdf9b5262b4eee85d29851b2d57681fa9d7eae30e225830","21773f5ac69ddf5a05636ba1f50b5239f4f2d27e4420db147fc2f76a5ae598ac",{"version":"6ec93c745c5e3e25e278fa35451bf18ef857f733de7e57c15e7920ac463baa2a","affectsGlobalScope":true},"91f8b5abcdff8f9ecb9656b9852878718416fb7700b2c4fad8331e5b97c080bb","30c2ec6abf6aaa60eb4f32fb1235531506b7961c6d1bdc7430711aec8fd85295","0f05c06ff6196958d76b865ae17245b52d8fe01773626ac3c43214a2458ea7b7",{"version":"f49fb15c4aa06b65b0dce4db4584bfd8a9f74644baef1511b404dc95be34af00","affectsGlobalScope":true},{"version":"d48009cbe8a30a504031cc82e1286f78fed33b7a42abf7602c23b5547b382563","affectsGlobalScope":true},"7aaeb5e62f90e1b2be0fc4844df78cdb1be15c22b427bc6c39d57308785b8f10","3ba30205a029ebc0c91d7b1ab4da73f6277d730ca1fc6692d5a9144c6772c76b","d8dba11dc34d50cb4202de5effa9a1b296d7a2f4a029eec871f894bddfb6430d","8b71dd18e7e63b6f991b511a201fad7c3bf8d1e0dd98acb5e3d844f335a73634","01d8e1419c84affad359cc240b2b551fb9812b450b4d3d456b64cda8102d4f60","458b216959c231df388a5de9dcbcafd4b4ca563bc3784d706d0455467d7d4942","269929a24b2816343a178008ac9ae9248304d92a8ba8e233055e0ed6dbe6ef71","93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","f8c87b19eae111f8720b0345ab301af8d81add39621b63614dfc2d15fd6f140a","831c22d257717bf2cbb03afe9c4bcffc5ccb8a2074344d4238bf16d3a857bb12",{"version":"24ba151e213906027e2b1f5223d33575a3612b0234a0e2b56119520bbe0e594b","affectsGlobalScope":true},{"version":"cbf046714f3a3ba2544957e1973ac94aa819fa8aa668846fa8de47eb1c41b0b2","affectsGlobalScope":true},"aa34c3aa493d1c699601027c441b9664547c3024f9dbab1639df7701d63d18fa","eae74e3d50820f37c72c0679fed959cd1e63c98f6a146a55b8c4361582fa6a52","7c651f8dce91a927ab62925e73f190763574c46098f2b11fb8ddc1b147a6709a","7440ab60f4cb031812940cc38166b8bb6fbf2540cfe599f87c41c08011f0c1df",{"version":"aed89e3c18f4c659ee8153a76560dffda23e2d801e1e60d7a67abd84bc555f8d","affectsGlobalScope":true},{"version":"0ed13c80faeb2b7160bffb4926ff299c468e67a37a645b3ae0917ba0db633c1b","affectsGlobalScope":true},"e393915d3dc385e69c0e2390739c87b2d296a610662eb0b1cb85224e55992250","2f940651c2f30e6b29f8743fae3f40b7b1c03615184f837132b56ea75edad08b","5749c327c3f789f658072f8340786966c8b05ea124a56c1d8d60e04649495a4d",{"version":"c9d62b2a51b2ff166314d8be84f6881a7fcbccd37612442cf1c70d27d5352f50","affectsGlobalScope":true},"e7dbf5716d76846c7522e910896c5747b6df1abd538fee8f5291bdc843461795",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"b510d0a18e3db42ac9765d26711083ec1e8b4e21caaca6dc4d25ae6e8623f447","736097ddbb2903bef918bb3b5811ef1c9c5656f2a73bd39b22a91b9cc2525e50","4340936f4e937c452ae783514e7c7bbb7fc06d0c97993ff4865370d0962bb9cf","53d603adbca276d8cd4e5eed5e1e7a91f975962fc41dfcfc515a6b2318025a1c","a7755c2d99539fb62de0630fb339af59614846f4551daccf6cb26586a114e8ba","e1494cd01a096ea81cefcca6ea414cf8fd5adb0256a191f144415f42fa680168","9a447781b2903cea6a609350a58e619a321f821d180764774b58e52175951ba9","0b6980dcb7fae3ceb27025fdcc468c1cbd09d4fd03a08981c7e88564b73f2957","970e6b0a03594d110daef991ad14af8ab05d06b5024bb6163b5bcb738dcc056d","a8215f0406480bad09063082600971c2e9300fabccf23e0a442a5c0994a47df8","662a75272462317059315f3028452dc8044f752ad0b6b61c084a7ae3eeb0f775","9b0e0e8756131143065a76f2e5bbf2a15b1f53e6e40f5aa464c7b1b60dda5ea7","5b164f09f2872a321760a406908ad71e06b7c07f58c9eb7f096f888e99c2bb70","166c1b5eb2abf5af8b31a6862dc9d2d9378ab4f685a8bf5f8720321c7af47e31",{"version":"edc0c953087585eb170a378368f574b424a2c0d4aee2b7dc45e7aea60c5b9e3a","signature":"bee15aab92ae1b487cf6b238296eb94ec752cbeeaf145247445700e66830614d"},{"version":"81f8382e31552d2c02a9041a50c4c27d8dd74d780af163e070b4e9aea002996d","signature":"00684d2074a1750d94e06203b47eb9242a14de64b1034723ef1ce6193b5cfab0"},{"version":"e42f05aaaf819782b88bdcc035c6567e438fa0eda3721cd068dfc8c7867d6001","signature":"79f0607791603b8ff7aeab74b28a0d92efff2113a765ebae6b7a8c8bb147de9c"},{"version":"9a70998f91605cc8097956a986350a9382be6dd7103b13bf42a58c902d12804d","signature":"b8e1ba10a549ec229c24f9acf2e8d3b9fa21ec1367288a95699c8e86141eed36"},{"version":"d1a31931f5325e4677df99351b003b6b17379e4c58d48dbdd7d7744f03b0206b","signature":"793a60ea3c354db31343e97558518da2ec7fc4a13b8221c7b89af721d187c99d"},{"version":"21b549392e3ebd4d3ce8916dd8178f8bee552d29272d879501a1752aab78d52f","signature":"13b1bc24a7eb0be356ab8438c027d3de71070a3e4711e89a085a4e2df298f3f4"},{"version":"c3a9b5b6556215e36c565e8200efc3f1c604dd1daa2aac1e0cb2e2c5e2fe1c89","signature":"443b6359f9afd62ecc3e8b6da61ccab7f03fdee964290579c46799035b790be2"},{"version":"9760b35340158970b28cd5e67b3bed70dd7307689e070a321d07d3582a3528fe","signature":"38575deb7de6ef9aa917a9ffce464abe8f016fda7ac1f12c2fd732d1d75d3c32"},"4c7fb1f4c57f3cd9d571c5e4cae33503530273a45579fa0babaf36b64a776eaa",{"version":"90270873b13869d5e15f1c7cbe0d3619a2b5c97787e8e587523ac0eb05bb1078","signature":"9b9c6e831967fcf20141cca4c47b2ab8e3cdfa79dc9655fed3cf0d250a10fa76"},{"version":"263e8e4ab09d51a95d3ef5e7405dcdf12e7194f930047d8a87249415ac9d9e23","signature":"4afc49f6b96526e9a227f368e6f6c5d8516e1070b41a0eccdfc4b88d1c4f238b"},"2859adaa4f2db3d4f0fc37ad86f056045341496b58fba0dbc16a222f9d5d55b1","655ed305e8f4cb95d3f578040301a4e4d6ace112b1bd8824cd32bda66c3677d1",{"version":"94bd79f9054898dbf637909c2b962f7e8c0de64bef5eb63e6a60e7371337efa2","signature":"eec924bb93ad6aa985bd1a2364d9ced39b1eb9d2bdebf4f63b32f6c5559a9db5"},{"version":"8ce5b3ed250fe03d4768027947c611a41166c138e742c131f9ee47922a425ee5","signature":"a75d179de15facbb156db196984e78e3b861cd554b3bfbe2caa58922af5b9818"},{"version":"5db9b435c31ef2e5d9621f7eadc828b01fd77c3f1db3fc3764b75c5fb21535a0","signature":"7a958bacfc7d732c5175a95ac83de8b830c294d217049785cab5b31c7f3e3c7d"},{"version":"e856168dacb8bb30602e16996a48b6715f5a4c0d471444819edb9c10a497c880","signature":"06f7bfcecf395dbd0299581527d8059f7349ff766d6bba077ef703568d6ec3f6"},{"version":"f8a77f51c9978da183c87ba65096dee1fb918b4115461fcda112c80ac56540b4","signature":"5af96be6143a1b262b6c607e0d9734635389ecb42a25db4139fd974898c35502"},{"version":"36be501b123f2bf8475960b96ce315c5cffebc116119df168b8546e8308db3a4","signature":"bbd9637a5db5992b898b1f416b9c9fd2f8bcfc5a539aac4ada4748dc644cd627"},{"version":"e142af24c9aefb9ec78b7fbae6b587c66fe4b2b8439f00a1d5fc7b3451553af9","signature":"b78e5688f1522616808cac00f67337e347760668e3dc9a83c92712256a0b93f5"},{"version":"942551e18cfe4fcf55bf513a93786e000893982f05ea3c950f556e798470383b","signature":"ae89fa501adcaf84a0d60005fb02f80fb42999753aee7cfa3b73873fc064b2a4"},{"version":"02de79a347c8a2961f753f25b90337b6577a44c8591f3355ac37de8dcb36c264","signature":"6ddfcb36a707c859f0433e2743bc0d6a1e2ee9170ca73a10c4998da134bf2fae"},{"version":"5fb66008714991b3d5cd57e5e0488290b2ddaae3bb4d6b32edce391bf30b3ffc","signature":"259491890e69f9387030cec57bdf0443671665d9b5534469f314a2c70755650c"},{"version":"43227bb01adad4145d725f8302a9c9968428b367389fdd83b875dd9783ef9254","signature":"fa36ac5bc0ad67c9022b4f9deefacf53d58d56039ec188ef4793320ade8804b1"},{"version":"1fd6446477ee3f8605090be9917fa7e0ea6b0eccfc492551829f0c98f6bd3036","signature":"ba3bfeac7dda681d9121e9795f03338753f0f7c05f1d6073a3e07fb907df2a1f"},{"version":"0e205aa301ac78c895857e5bc3cd5629aefe8cbfe6e67f2d308873a3073f45e9","signature":"6c157708e807bd4340d35f0166b5674a388287e42298d52fc04e1f93aca88b87"},{"version":"23fb173b9b1a2c3724a084bf31a80a0b8f381bb6f8b77a314f182aeaefb1c784","signature":"ca5c9ab387db8a7c7610a3cdf1c97cd8f783314bdf41da5a1a0bcfcd0592964e"},"f3dabfe0bf31eea68ec8eb79c7fab7c0c3381174a2f4dd8d06c32e1c5848713f",{"version":"4721bf410b3e877e413c062d7c12debd3fd47078bcb70f2e14d4ef3c045be32f","signature":"e9c66caa80feedaf023f7a8c4664d8cbfe2e8c0d9823dd7f82e17f1794840893"},{"version":"6054013573b292eaae77e1bbace7a4feb79e97f7180cd5ef939dbbfe7f1fb1f6","signature":"f9bb6b2fbe173253c51dbdf9d3c5b30a8fa5f8ec48bdb7d44ff59587061431b0"},{"version":"910ac657cd62b3555534faa394f010eb149222242d054523aae386e0db52b8fd","signature":"fa7640bdc7b3245f8795a5e013e82baeba4647c79b0041b3abd6a4565687639c"},{"version":"88cd2257c63efd31066812365b63e4983b661db1f3b97ee9bd1a44f6de80b8a1","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"9b58c2cbd15e7c2c5ccd13f983fa2ef06c8c32724787b1f5bf1642129a0ac3c2",{"version":"78fe2e6ab16170bed2f8850c6aedff9dfee854023da008c29cfa3a1ee90174fa","signature":"a093e577e8d9969edb042d0b4220780456328c253ddccd4a553530c24ee93471"},{"version":"05ef283944c005fa93ab4a9e03f6bbb0c33db4723993889ef10b503df320309a","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"67c2039f21402fdc8d14fcb32162f9c255b3028d8cfca0785cdafaf3ad2ea23d","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"14f9e6f1b4d238c2e81dba9beb6595d3b74ace7ee0e9d8151b8bf684b35ca6e8","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"60608809747e51f16c3ad8384609743e9d1745de1ed8e9054174574ea79b952b","8855e0d556c6249f67b3cb9426c5ca1796929a48c2ce01fd050f95f1b69adbc5","aed0c3074556d1eb02516da20784fbb4fa125376c8e258c6c845cf0fddbd2918","c6eff85f66b05eba0a5af516cfa2e7ce0c6d2a2cc71bc4c543915c823cea9ce8","434272013d17121b677ec280c2309b16442cd47060af926d1deba5a00fa26856","5eca2dfcfa34ac7477c33d5ef1e153ec64c3eb08785c20e8557626a5e4c8f452","0c7192e40da80243d167d93fd23c11d2efba22dc27fda3602d99889ed02ade86","0706139fea91b191554d605cc00192d295832707c54782c14b2e770f84786576",{"version":"80a83b97d29fcbfae6a8e48596ff412c698579b9b4c044ebbe84013ae163b1ad","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"cdcc132f207d097d7d3aa75615ab9a2e71d6a478162dde8b67f88ea19f3e54de","0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","c085e9aa62d1ae1375794c1fb927a445fa105fed891a7e24edbb1c3300f7384a","f315e1e65a1f80992f0509e84e4ae2df15ecd9ef73df975f7c98813b71e4c8da","5b9586e9b0b6322e5bfbd2c29bd3b8e21ab9d871f82346cb71020e3d84bae73e","3e70a7e67c2cb16f8cd49097360c0309fe9d1e3210ff9222e9dac1f8df9d4fb6","ab68d2a3e3e8767c3fba8f80de099a1cfc18c0de79e42cb02ae66e22dfe14a66","d96cc6598148bf1a98fb2e8dcf01c63a4b3558bdaec6ef35e087fd0562eb40ec",{"version":"9afcfd847523b81d526c73130a247fbb65aa1eba2a1d4195cfacd677a9e4de08","affectsGlobalScope":true}],"root":[[159,166],168,169,[172,185],[187,190],[192,195],204],"options":{"declaration":true,"declarationMap":true,"esModuleInterop":true,"experimentalDecorators":true,"module":1,"noEmitOnError":true,"noErrorTruncation":true,"noImplicitOverride":true,"noImplicitReturns":true,"noPropertyAccessFromIndexSignature":true,"outDir":"./","removeComments":false,"rootDir":"../src","skipLibCheck":true,"sourceMap":true,"strict":true,"target":6,"tsBuildInfoFile":"./tsconfig.tsbuildinfo"},"fileIdsList":[[138],[138,207],[138,209,212],[45,47,48,49,50,51,52,53,54,55,56,57,138],[45,46,48,49,50,51,52,53,54,55,56,57,138],[46,47,48,49,50,51,52,53,54,55,56,57,138],[45,46,47,49,50,51,52,53,54,55,56,57,138],[45,46,47,48,50,51,52,53,54,55,56,57,138],[45,46,47,48,49,51,52,53,54,55,56,57,138],[45,46,47,48,49,50,52,53,54,55,56,57,138],[45,46,47,48,49,50,51,53,54,55,56,57,138],[45,46,47,48,49,50,51,52,54,55,56,57,138],[45,46,47,48,49,50,51,52,53,55,56,57,138],[45,46,47,48,49,50,51,52,53,54,56,57,138],[45,46,47,48,49,50,51,52,53,54,55,57,138],[45,46,47,48,49,50,51,52,53,54,55,56,138],[57,138],[111,137,138,145,146,147],[60,138],[95,138],[96,101,129,138],[97,108,109,116,126,137,138],[97,98,108,116,138],[99,138],[100,101,109,117,138],[101,126,134,138],[102,104,108,116,138],[103,138],[104,105,138],[108,138],[106,108,138],[95,108,138],[108,109,110,126,137,138],[108,109,110,123,126,129,138],[93,138,142],[104,108,111,116,126,137,138],[108,109,111,112,116,126,134,137,138],[111,113,126,134,137,138],[60,61,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144],[108,114,138],[115,137,138,142],[104,108,116,126,138],[117,138],[118,138],[95,119,138],[120,136,138,142],[121,138],[122,138],[108,123,124,138],[123,125,138,140],[96,108,126,127,128,129,138],[96,126,128,138],[126,127,138],[129,138],[130,138],[95,126,138],[108,132,133,138],[132,133,138],[101,116,126,134,138],[135,138],[116,136,138],[96,111,122,137,138],[101,138],[126,138,139],[115,138,140],[138,141],[96,101,108,110,119,126,137,138,140,142],[126,138,143],[138,170],[138,205,211],[138,150,151,152,153],[111,126,138,145],[138,209],[138,206,210],[138,208],[138,196,198,199,200,201,202],[138,196,197],[138,198],[138,197,198],[138,196,198],[70,74,137,138],[70,126,137,138],[65,138],[67,70,134,137,138],[116,134,138],[138,145],[65,138,145],[67,70,116,137,138],[62,63,66,69,96,108,126,137,138],[62,68,138],[66,70,96,129,137,138,145],[96,138,145],[86,96,138,145],[64,65,138,145],[70,138],[64,65,66,67,68,69,70,71,72,74,75,76,77,78,79,80,81,82,83,84,85,87,88,89,90,91,92,138],[70,77,78,138],[68,70,78,79,138],[69,138],[62,65,70,138],[70,74,78,79,138],[74,138],[68,70,73,137,138],[62,67,68,70,74,77,138],[96,126,138],[65,70,86,96,138,142,145],[138,189,203],[111,126,138,148,167,173,189,191],[138,181,189],[138,167,191,192],[138,148,169,174,178,189],[126,138,192],[138,162],[138,162,178],[138,159,160,161,178],[138,148,161,162,163,164,165,166,168,176,177,178,179,182,183,184,185,187,188],[138,163,165,166,168,178,179],[138,148],[138,157,158],[138,148,154,171,172],[138,182],[138,162,165,166,168,178,179],[138,168,177,184],[138,184,186],[138,156,184],[58,59,101,138,148,149,168,177,178,179,180,181],[111,113,138,154,167,177,178],[104,138,148,154,155,156,159,161,163,164,168,169,173,174,175,176,178],[138,148,154,177],[138,154,178],[111,126,173,189],[162],[162,178],[161,178],[148,161,162,163,164,165,166,168,176,177,178,179,182,183,184,185,187,188],[168,178],[148],[182],[168,177,184],[184],[168,177,178],[111,113,177,178],[148,168,176,178],[148,177],[178]],"referencedMap":[[205,1],[208,2],[207,1],[213,3],[46,4],[47,5],[45,6],[48,7],[49,8],[50,9],[51,10],[52,11],[53,12],[54,13],[55,14],[56,15],[57,16],[58,17],[186,17],[59,17],[156,17],[191,17],[157,17],[158,17],[147,1],[148,18],[60,19],[61,19],[95,20],[96,21],[97,22],[98,23],[99,24],[100,25],[101,26],[102,27],[103,28],[104,29],[105,29],[107,30],[106,31],[108,32],[109,33],[110,34],[94,35],[144,1],[111,36],[112,37],[113,38],[145,39],[114,40],[115,41],[116,42],[117,43],[118,44],[119,45],[120,46],[121,47],[122,48],[123,49],[124,49],[125,50],[126,51],[128,52],[127,53],[129,54],[130,55],[131,56],[132,57],[133,58],[134,59],[135,60],[136,61],[137,62],[138,63],[139,64],[140,65],[141,66],[142,67],[143,68],[171,69],[206,1],[167,1],[170,1],[212,70],[154,71],[150,1],[151,1],[152,1],[153,1],[146,72],[155,1],[210,73],[211,74],[149,1],[209,75],[196,1],[203,76],[198,77],[199,78],[200,78],[201,79],[202,79],[197,80],[43,1],[44,1],[9,1],[8,1],[2,1],[10,1],[11,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[3,1],[4,1],[18,1],[22,1],[19,1],[20,1],[21,1],[23,1],[24,1],[25,1],[5,1],[26,1],[27,1],[28,1],[29,1],[6,1],[33,1],[30,1],[31,1],[32,1],[34,1],[7,1],[35,1],[40,1],[41,1],[36,1],[37,1],[38,1],[39,1],[1,1],[42,1],[77,81],[84,82],[76,81],[91,83],[68,84],[67,85],[90,86],[85,87],[88,88],[70,89],[69,90],[65,91],[64,92],[87,93],[66,94],[71,95],[72,1],[75,95],[62,1],[93,96],[92,95],[79,97],[80,98],[82,99],[78,100],[81,101],[86,86],[73,102],[74,103],[83,104],[63,105],[89,106],[204,107],[192,108],[190,109],[193,110],[194,111],[195,112],[163,113],[161,1],[165,114],[162,115],[166,114],[164,113],[179,114],[183,1],[189,116],[169,117],[172,118],[159,119],[160,1],[173,120],[180,121],[181,1],[174,122],[175,1],[185,123],[184,1],[187,124],[188,125],[182,126],[168,127],[177,128],[178,129],[176,130]],"exportedModulesMap":[[205,1],[208,2],[207,1],[213,3],[46,4],[47,5],[45,6],[48,7],[49,8],[50,9],[51,10],[52,11],[53,12],[54,13],[55,14],[56,15],[57,16],[58,17],[186,17],[59,17],[156,17],[191,17],[157,17],[158,17],[147,1],[148,18],[60,19],[61,19],[95,20],[96,21],[97,22],[98,23],[99,24],[100,25],[101,26],[102,27],[103,28],[104,29],[105,29],[107,30],[106,31],[108,32],[109,33],[110,34],[94,35],[144,1],[111,36],[112,37],[113,38],[145,39],[114,40],[115,41],[116,42],[117,43],[118,44],[119,45],[120,46],[121,47],[122,48],[123,49],[124,49],[125,50],[126,51],[128,52],[127,53],[129,54],[130,55],[131,56],[132,57],[133,58],[134,59],[135,60],[136,61],[137,62],[138,63],[139,64],[140,65],[141,66],[142,67],[143,68],[171,69],[206,1],[167,1],[170,1],[212,70],[154,71],[150,1],[151,1],[152,1],[153,1],[146,72],[155,1],[210,73],[211,74],[149,1],[209,75],[196,1],[203,76],[198,77],[199,78],[200,78],[201,79],[202,79],[197,80],[43,1],[44,1],[9,1],[8,1],[2,1],[10,1],[11,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[3,1],[4,1],[18,1],[22,1],[19,1],[20,1],[21,1],[23,1],[24,1],[25,1],[5,1],[26,1],[27,1],[28,1],[29,1],[6,1],[33,1],[30,1],[31,1],[32,1],[34,1],[7,1],[35,1],[40,1],[41,1],[36,1],[37,1],[38,1],[39,1],[1,1],[42,1],[77,81],[84,82],[76,81],[91,83],[68,84],[67,85],[90,86],[85,87],[88,88],[70,89],[69,90],[65,91],[64,92],[87,93],[66,94],[71,95],[72,1],[75,95],[62,1],[93,96],[92,95],[79,97],[80,98],[82,99],[78,100],[81,101],[86,86],[73,102],[74,103],[83,104],[63,105],[89,106],[192,131],[163,132],[165,133],[162,134],[166,133],[164,132],[179,133],[189,135],[169,136],[172,137],[173,137],[180,138],[174,136],[185,139],[187,140],[188,140],[182,141],[168,142],[177,143],[178,144],[176,145]],"semanticDiagnosticsPerFile":[205,208,207,213,46,47,45,48,49,50,51,52,53,54,55,56,57,58,186,59,156,191,157,158,147,148,60,61,95,96,97,98,99,100,101,102,103,104,105,107,106,108,109,110,94,144,111,112,113,145,114,115,116,117,118,119,120,121,122,123,124,125,126,128,127,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,171,206,167,170,212,154,150,151,152,153,146,155,210,211,149,209,196,203,198,199,200,201,202,197,43,44,9,8,2,10,11,12,13,14,15,16,17,3,4,18,22,19,20,21,23,24,25,5,26,27,28,29,6,33,30,31,32,34,7,35,40,41,36,37,38,39,1,42,77,84,76,91,68,67,90,85,88,70,69,65,64,87,66,71,72,75,62,93,92,79,80,82,78,81,86,73,74,83,63,89,204,192,190,193,194,195,163,161,165,162,166,164,179,183,189,169,172,159,160,173,180,181,174,175,185,184,187,188,182,168,177,178,176]},"version":"5.2.2"}
|