@serve.zone/dcrouter 17.7.1 → 17.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/deno.json +1 -1
  2. package/dist_serve/bundle.js +410 -410
  3. package/dist_ts/00_commitinfo_data.js +1 -1
  4. package/dist_ts/classes.dcrouter.d.ts +2 -0
  5. package/dist_ts/classes.dcrouter.js +23 -1
  6. package/dist_ts/config/classes.gateway-client-manager.js +3 -1
  7. package/dist_ts/db/documents/classes.cached.email.d.ts +7 -0
  8. package/dist_ts/db/documents/classes.cached.email.js +52 -2
  9. package/dist_ts/db/documents/classes.webpush-admission.doc.d.ts +19 -0
  10. package/dist_ts/db/documents/classes.webpush-admission.doc.js +124 -0
  11. package/dist_ts/db/documents/classes.webpush-binding.doc.d.ts +65 -0
  12. package/dist_ts/db/documents/classes.webpush-binding.doc.js +205 -0
  13. package/dist_ts/db/documents/classes.webpush-spool.doc.d.ts +44 -0
  14. package/dist_ts/db/documents/classes.webpush-spool.doc.js +277 -0
  15. package/dist_ts/db/documents/index.d.ts +3 -0
  16. package/dist_ts/db/documents/index.js +5 -1
  17. package/dist_ts/email/classes.accepted-email-spool.d.ts +5 -0
  18. package/dist_ts/email/classes.accepted-email-spool.js +28 -3
  19. package/dist_ts/email/classes.workapp-mail-manager.d.ts +5 -1
  20. package/dist_ts/email/classes.workapp-mail-manager.js +87 -12
  21. package/dist_ts/index.d.ts +1 -0
  22. package/dist_ts/index.js +3 -1
  23. package/dist_ts/opsserver/classes.opsserver.d.ts +2 -0
  24. package/dist_ts/opsserver/classes.opsserver.js +5 -1
  25. package/dist_ts/opsserver/handlers/gatewayclient.handler.js +11 -5
  26. package/dist_ts/opsserver/handlers/index.d.ts +2 -0
  27. package/dist_ts/opsserver/handlers/index.js +3 -1
  28. package/dist_ts/opsserver/handlers/webpush-app.handler.d.ts +9 -0
  29. package/dist_ts/opsserver/handlers/webpush-app.handler.js +66 -0
  30. package/dist_ts/opsserver/handlers/webpush-control.handler.d.ts +14 -0
  31. package/dist_ts/opsserver/handlers/webpush-control.handler.js +163 -0
  32. package/dist_ts/plugins.d.ts +5 -2
  33. package/dist_ts/plugins.js +6 -3
  34. package/dist_ts/webpush/classes.webpush-crypto.d.ts +38 -0
  35. package/dist_ts/webpush/classes.webpush-crypto.js +231 -0
  36. package/dist_ts/webpush/classes.webpush-manager.d.ts +153 -0
  37. package/dist_ts/webpush/classes.webpush-manager.js +2374 -0
  38. package/dist_ts/webpush/classes.webpush-transport.d.ts +45 -0
  39. package/dist_ts/webpush/classes.webpush-transport.js +161 -0
  40. package/dist_ts/webpush/helpers.webpush-endpoint.d.ts +21 -0
  41. package/dist_ts/webpush/helpers.webpush-endpoint.js +111 -0
  42. package/dist_ts/webpush/index.d.ts +4 -0
  43. package/dist_ts/webpush/index.js +5 -0
  44. package/dist_ts/webpush/webpush-indexes.d.ts +11 -0
  45. package/dist_ts/webpush/webpush-indexes.js +123 -0
  46. package/dist_ts_interfaces/data/route-management.d.ts +2 -0
  47. package/dist_ts_interfaces/data/route-management.js +1 -1
  48. package/dist_ts_migrations/index.js +221 -11
  49. package/dist_ts_web/00_commitinfo_data.js +1 -1
  50. package/package.json +12 -8
  51. package/readme.md +27 -0
  52. package/third-party-notices.md +37 -0
  53. package/ts/00_commitinfo_data.ts +1 -1
  54. package/ts/classes.dcrouter.ts +29 -0
  55. package/ts/config/classes.gateway-client-manager.ts +2 -0
  56. package/ts/db/documents/classes.cached.email.ts +47 -0
  57. package/ts/db/documents/classes.webpush-admission.doc.ts +48 -0
  58. package/ts/db/documents/classes.webpush-binding.doc.ts +147 -0
  59. package/ts/db/documents/classes.webpush-spool.doc.ts +136 -0
  60. package/ts/db/documents/index.ts +5 -0
  61. package/ts/email/classes.accepted-email-spool.ts +41 -2
  62. package/ts/email/classes.workapp-mail-manager.ts +97 -10
  63. package/ts/index.ts +3 -0
  64. package/ts/opsserver/classes.opsserver.ts +4 -0
  65. package/ts/opsserver/handlers/gatewayclient.handler.ts +10 -3
  66. package/ts/opsserver/handlers/index.ts +2 -0
  67. package/ts/opsserver/handlers/webpush-app.handler.ts +105 -0
  68. package/ts/opsserver/handlers/webpush-control.handler.ts +257 -0
  69. package/ts/plugins.ts +6 -0
  70. package/ts/webpush/classes.webpush-crypto.ts +306 -0
  71. package/ts/webpush/classes.webpush-manager.ts +3173 -0
  72. package/ts/webpush/classes.webpush-transport.ts +241 -0
  73. package/ts/webpush/helpers.webpush-endpoint.ts +150 -0
  74. package/ts/webpush/index.ts +4 -0
  75. package/ts/webpush/webpush-indexes.ts +141 -0
  76. package/ts_web/00_commitinfo_data.ts +1 -1
  77. package/readme.plan.md +0 -22
@@ -0,0 +1,45 @@
1
+ import * as plugins from '../plugins.js';
2
+ import { type TWebPushDnsLookup } from './helpers.webpush-endpoint.js';
3
+ export interface IWebPushTransportRequest {
4
+ subscription: plugins.webpush.PushSubscription;
5
+ payload: string;
6
+ ttlSeconds: number;
7
+ urgency: plugins.webpush.Urgency;
8
+ topic?: string;
9
+ vapid: {
10
+ subject: string;
11
+ publicKey: string;
12
+ privateKey: string;
13
+ };
14
+ }
15
+ export interface IWebPushTransportResponse {
16
+ statusCode: number;
17
+ retryAfter?: string;
18
+ }
19
+ export interface IWebPushTransport {
20
+ send(requestArg: IWebPushTransportRequest): Promise<IWebPushTransportResponse>;
21
+ }
22
+ export type TWebPushTransportErrorCode = 'PUSH_DNS_TIMEOUT' | 'PUSH_REQUEST_TIMEOUT' | 'PUSH_RESPONSE_TOO_LARGE' | 'PUSH_RESPONSE_INVALID' | 'PUSH_NETWORK_ERROR';
23
+ export declare class WebPushTransportError extends Error {
24
+ readonly code: TWebPushTransportErrorCode;
25
+ constructor(code: TWebPushTransportErrorCode, optionsArg?: {
26
+ cause?: unknown;
27
+ });
28
+ }
29
+ export interface IWebPushHttpTransportOptions {
30
+ dnsLookup?: TWebPushDnsLookup;
31
+ dnsTimeoutMs?: number;
32
+ connectTimeoutMs?: number;
33
+ requestTimeoutMs?: number;
34
+ maxResponseBytes?: number;
35
+ }
36
+ export declare class WebPushHttpTransport implements IWebPushTransport {
37
+ private readonly dnsLookup?;
38
+ private readonly dnsTimeoutMs;
39
+ private readonly connectTimeoutMs;
40
+ private readonly requestTimeoutMs;
41
+ private readonly maxResponseBytes;
42
+ constructor(optionsArg?: IWebPushHttpTransportOptions);
43
+ send(requestArg: IWebPushTransportRequest): Promise<IWebPushTransportResponse>;
44
+ private normalizePositiveInteger;
45
+ }
@@ -0,0 +1,161 @@
1
+ import * as plugins from '../plugins.js';
2
+ import { createPinnedWebPushAgent, resolveWebPushEndpoint, WebPushEndpointPolicyError, } from './helpers.webpush-endpoint.js';
3
+ export class WebPushTransportError extends Error {
4
+ code;
5
+ constructor(code, optionsArg = {}) {
6
+ super(code, optionsArg);
7
+ this.code = code;
8
+ this.name = 'WebPushTransportError';
9
+ }
10
+ }
11
+ const normalizeRetryAfter = (valueArg) => {
12
+ if (Array.isArray(valueArg))
13
+ return valueArg[0]?.slice(0, 128);
14
+ return typeof valueArg === 'string' ? valueArg.slice(0, 128) : undefined;
15
+ };
16
+ export class WebPushHttpTransport {
17
+ dnsLookup;
18
+ dnsTimeoutMs;
19
+ connectTimeoutMs;
20
+ requestTimeoutMs;
21
+ maxResponseBytes;
22
+ constructor(optionsArg = {}) {
23
+ this.dnsLookup = optionsArg.dnsLookup;
24
+ this.dnsTimeoutMs = this.normalizePositiveInteger(optionsArg.dnsTimeoutMs, 5_000, 'dnsTimeoutMs');
25
+ this.connectTimeoutMs = this.normalizePositiveInteger(optionsArg.connectTimeoutMs, 10_000, 'connectTimeoutMs');
26
+ this.requestTimeoutMs = this.normalizePositiveInteger(optionsArg.requestTimeoutMs, 15_000, 'requestTimeoutMs');
27
+ this.maxResponseBytes = this.normalizePositiveInteger(optionsArg.maxResponseBytes, 16_384, 'maxResponseBytes');
28
+ }
29
+ async send(requestArg) {
30
+ const sendDeadline = Date.now() + this.requestTimeoutMs;
31
+ let resolved;
32
+ try {
33
+ resolved = await new Promise((resolve, reject) => {
34
+ let settled = false;
35
+ const settle = (errorArg, valueArg) => {
36
+ if (settled)
37
+ return;
38
+ settled = true;
39
+ clearTimeout(timer);
40
+ if (errorArg)
41
+ reject(errorArg);
42
+ else
43
+ resolve(valueArg);
44
+ };
45
+ const timer = setTimeout(() => {
46
+ settle(new WebPushTransportError('PUSH_DNS_TIMEOUT'));
47
+ }, Math.min(this.dnsTimeoutMs, this.requestTimeoutMs));
48
+ resolveWebPushEndpoint(requestArg.subscription.endpoint, this.dnsLookup).then((valueArg) => settle(null, valueArg), (errorArg) => settle(errorArg));
49
+ });
50
+ }
51
+ catch (error) {
52
+ if (error instanceof WebPushEndpointPolicyError)
53
+ throw error;
54
+ if (error instanceof WebPushTransportError)
55
+ throw error;
56
+ throw new WebPushTransportError('PUSH_NETWORK_ERROR', { cause: error });
57
+ }
58
+ const remainingRequestTimeoutMs = sendDeadline - Date.now();
59
+ if (remainingRequestTimeoutMs <= 0) {
60
+ throw new WebPushTransportError('PUSH_REQUEST_TIMEOUT');
61
+ }
62
+ const agent = createPinnedWebPushAgent(resolved);
63
+ try {
64
+ const requestDetails = plugins.webpush.generateRequestDetails(requestArg.subscription, requestArg.payload, {
65
+ TTL: requestArg.ttlSeconds,
66
+ contentEncoding: 'aes128gcm',
67
+ urgency: requestArg.urgency,
68
+ ...(requestArg.topic ? { topic: requestArg.topic } : {}),
69
+ vapidDetails: requestArg.vapid,
70
+ });
71
+ if (requestDetails.method !== 'POST'
72
+ || requestDetails.endpoint !== requestArg.subscription.endpoint
73
+ || !Buffer.isBuffer(requestDetails.body)) {
74
+ throw new WebPushTransportError('PUSH_RESPONSE_INVALID');
75
+ }
76
+ return await new Promise((resolve, reject) => {
77
+ let settled = false;
78
+ let requestTimer;
79
+ const settle = (errorArg, responseArg) => {
80
+ if (settled)
81
+ return;
82
+ settled = true;
83
+ if (requestTimer)
84
+ clearTimeout(requestTimer);
85
+ if (errorArg)
86
+ reject(errorArg);
87
+ else
88
+ resolve(responseArg);
89
+ };
90
+ const pushRequest = plugins.https.request({
91
+ protocol: 'https:',
92
+ hostname: resolved.hostname,
93
+ servername: resolved.hostname,
94
+ port: 443,
95
+ path: `${resolved.url.pathname}${resolved.url.search}`,
96
+ method: 'POST',
97
+ headers: requestDetails.headers,
98
+ agent,
99
+ timeout: Math.min(this.connectTimeoutMs, remainingRequestTimeoutMs),
100
+ maxHeaderSize: 16_384,
101
+ setHost: true,
102
+ }, (pushResponse) => {
103
+ let responseBytes = 0;
104
+ pushResponse.on('data', (chunkArg) => {
105
+ responseBytes += Buffer.byteLength(chunkArg);
106
+ if (responseBytes > this.maxResponseBytes) {
107
+ const error = new WebPushTransportError('PUSH_RESPONSE_TOO_LARGE');
108
+ settle(error);
109
+ pushResponse.destroy(error);
110
+ pushRequest.destroy(error);
111
+ }
112
+ });
113
+ pushResponse.once('end', () => {
114
+ const statusCode = pushResponse.statusCode;
115
+ if (!Number.isSafeInteger(statusCode) || statusCode < 100 || statusCode > 599) {
116
+ settle(new WebPushTransportError('PUSH_RESPONSE_INVALID'));
117
+ return;
118
+ }
119
+ settle(null, {
120
+ statusCode: statusCode,
121
+ retryAfter: normalizeRetryAfter(pushResponse.headers['retry-after']),
122
+ });
123
+ });
124
+ pushResponse.once('error', (errorArg) => {
125
+ settle(errorArg instanceof WebPushTransportError
126
+ ? errorArg
127
+ : new WebPushTransportError('PUSH_NETWORK_ERROR', { cause: errorArg }));
128
+ });
129
+ });
130
+ pushRequest.once('timeout', () => {
131
+ const error = new WebPushTransportError('PUSH_REQUEST_TIMEOUT');
132
+ settle(error);
133
+ pushRequest.destroy(error);
134
+ });
135
+ pushRequest.once('error', (errorArg) => {
136
+ settle(errorArg instanceof WebPushTransportError
137
+ ? errorArg
138
+ : new WebPushTransportError('PUSH_NETWORK_ERROR', { cause: errorArg }));
139
+ });
140
+ requestTimer = setTimeout(() => {
141
+ const error = new WebPushTransportError('PUSH_REQUEST_TIMEOUT');
142
+ settle(error);
143
+ pushRequest.destroy(error);
144
+ }, remainingRequestTimeoutMs);
145
+ requestTimer.unref();
146
+ pushRequest.end(requestDetails.body);
147
+ });
148
+ }
149
+ finally {
150
+ agent.destroy();
151
+ }
152
+ }
153
+ normalizePositiveInteger(valueArg, defaultArg, labelArg) {
154
+ const value = valueArg ?? defaultArg;
155
+ if (!Number.isSafeInteger(value) || value <= 0) {
156
+ throw new Error(`Web Push transport ${labelArg} must be a positive integer`);
157
+ }
158
+ return value;
159
+ }
160
+ }
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy53ZWJwdXNoLXRyYW5zcG9ydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3dlYnB1c2gvY2xhc3Nlcy53ZWJwdXNoLXRyYW5zcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLHNCQUFzQixFQUN0QiwwQkFBMEIsR0FFM0IsTUFBTSwrQkFBK0IsQ0FBQztBQStCdkMsTUFBTSxPQUFPLHFCQUFzQixTQUFRLEtBQUs7SUFFNUI7SUFEbEIsWUFDa0IsSUFBZ0MsRUFDaEQsYUFBa0MsRUFBRTtRQUVwQyxLQUFLLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBSFIsU0FBSSxHQUFKLElBQUksQ0FBNEI7UUFJaEQsSUFBSSxDQUFDLElBQUksR0FBRyx1QkFBdUIsQ0FBQztJQUN0QyxDQUFDO0NBQ0Y7QUFVRCxNQUFNLG1CQUFtQixHQUFHLENBQUMsUUFBdUMsRUFBc0IsRUFBRTtJQUMxRixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQUUsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMvRCxPQUFPLE9BQU8sUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUMzRSxDQUFDLENBQUM7QUFFRixNQUFNLE9BQU8sb0JBQW9CO0lBQ2QsU0FBUyxDQUFxQjtJQUM5QixZQUFZLENBQVM7SUFDckIsZ0JBQWdCLENBQVM7SUFDekIsZ0JBQWdCLENBQVM7SUFDekIsZ0JBQWdCLENBQVM7SUFFMUMsWUFBbUIsYUFBMkMsRUFBRTtRQUM5RCxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUs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
@@ -0,0 +1,21 @@
1
+ import * as plugins from '../plugins.js';
2
+ export type TWebPushEndpointPolicyErrorCode = 'ENDPOINT_URL_INVALID' | 'ENDPOINT_SCHEME_INVALID' | 'ENDPOINT_PORT_INVALID' | 'ENDPOINT_AUTHORITY_INVALID' | 'ENDPOINT_FRAGMENT_INVALID' | 'ENDPOINT_IP_LITERAL_FORBIDDEN' | 'ENDPOINT_DNS_EMPTY' | 'ENDPOINT_DNS_UNSAFE';
3
+ export declare class WebPushEndpointPolicyError extends Error {
4
+ readonly code: TWebPushEndpointPolicyErrorCode;
5
+ constructor(code: TWebPushEndpointPolicyErrorCode);
6
+ }
7
+ export interface IWebPushDnsAddress {
8
+ address: string;
9
+ family: number;
10
+ }
11
+ export type TWebPushDnsLookup = (hostnameArg: string) => Promise<IWebPushDnsAddress[]>;
12
+ export interface IWebPushResolvedEndpoint {
13
+ url: URL;
14
+ hostname: string;
15
+ address: string;
16
+ family: 4 | 6;
17
+ }
18
+ export declare function isGloballyRoutableWebPushAddress(addressArg: string): boolean;
19
+ export declare function parseWebPushEndpoint(endpointArg: string): URL;
20
+ export declare function resolveWebPushEndpoint(endpointArg: string, lookupArg?: TWebPushDnsLookup): Promise<IWebPushResolvedEndpoint>;
21
+ export declare function createPinnedWebPushAgent(resolvedArg: IWebPushResolvedEndpoint): InstanceType<typeof plugins.https.Agent>;
@@ -0,0 +1,111 @@
1
+ import * as plugins from '../plugins.js';
2
+ export class WebPushEndpointPolicyError extends Error {
3
+ code;
4
+ constructor(code) {
5
+ super(code);
6
+ this.code = code;
7
+ this.name = 'WebPushEndpointPolicyError';
8
+ }
9
+ }
10
+ const defaultDnsLookup = async (hostnameArg) => {
11
+ return await plugins.dns.promises.lookup(hostnameArg, {
12
+ all: true,
13
+ verbatim: true,
14
+ });
15
+ };
16
+ export function isGloballyRoutableWebPushAddress(addressArg) {
17
+ const family = plugins.net.isIP(addressArg);
18
+ if (family !== 4 && family !== 6)
19
+ return false;
20
+ try {
21
+ const parsed = plugins.ipaddr.parse(addressArg);
22
+ if (parsed.kind() === 'ipv6'
23
+ && 'isIPv4MappedAddress' in parsed
24
+ && parsed.isIPv4MappedAddress())
25
+ return false;
26
+ return parsed.range() === 'unicast';
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ }
32
+ export function parseWebPushEndpoint(endpointArg) {
33
+ if (typeof endpointArg !== 'string' || endpointArg.length === 0 || endpointArg.length > 4096) {
34
+ throw new WebPushEndpointPolicyError('ENDPOINT_URL_INVALID');
35
+ }
36
+ let endpoint;
37
+ try {
38
+ endpoint = new URL(endpointArg);
39
+ }
40
+ catch {
41
+ throw new WebPushEndpointPolicyError('ENDPOINT_URL_INVALID');
42
+ }
43
+ if (endpoint.protocol !== 'https:') {
44
+ throw new WebPushEndpointPolicyError('ENDPOINT_SCHEME_INVALID');
45
+ }
46
+ if (endpoint.port && endpoint.port !== '443') {
47
+ throw new WebPushEndpointPolicyError('ENDPOINT_PORT_INVALID');
48
+ }
49
+ if (endpoint.username || endpoint.password || !endpoint.hostname) {
50
+ throw new WebPushEndpointPolicyError('ENDPOINT_AUTHORITY_INVALID');
51
+ }
52
+ if (endpoint.hash) {
53
+ throw new WebPushEndpointPolicyError('ENDPOINT_FRAGMENT_INVALID');
54
+ }
55
+ const hostname = endpoint.hostname.startsWith('[') && endpoint.hostname.endsWith(']')
56
+ ? endpoint.hostname.slice(1, -1)
57
+ : endpoint.hostname;
58
+ if (plugins.net.isIP(hostname) !== 0) {
59
+ throw new WebPushEndpointPolicyError('ENDPOINT_IP_LITERAL_FORBIDDEN');
60
+ }
61
+ return endpoint;
62
+ }
63
+ export async function resolveWebPushEndpoint(endpointArg, lookupArg = defaultDnsLookup) {
64
+ const url = parseWebPushEndpoint(endpointArg);
65
+ const hostname = url.hostname.toLowerCase();
66
+ const answers = await lookupArg(hostname);
67
+ if (!Array.isArray(answers) || answers.length === 0) {
68
+ throw new WebPushEndpointPolicyError('ENDPOINT_DNS_EMPTY');
69
+ }
70
+ const normalized = answers.map((answerArg) => ({
71
+ address: String(answerArg.address || '').trim(),
72
+ family: plugins.net.isIP(String(answerArg.address || '').trim()),
73
+ }));
74
+ if (normalized.some((answerArg) => ((answerArg.family !== 4 && answerArg.family !== 6)
75
+ || !isGloballyRoutableWebPushAddress(answerArg.address)))) {
76
+ throw new WebPushEndpointPolicyError('ENDPOINT_DNS_UNSAFE');
77
+ }
78
+ const unique = Array.from(new Map(normalized.map((answerArg) => [`${answerArg.family}:${answerArg.address}`, answerArg])).values());
79
+ const selected = unique[0];
80
+ return {
81
+ url,
82
+ hostname,
83
+ address: selected.address,
84
+ family: selected.family,
85
+ };
86
+ }
87
+ export function createPinnedWebPushAgent(resolvedArg) {
88
+ const lookup = (hostnameArg, optionsArg, callbackArg) => {
89
+ if (hostnameArg.toLowerCase() !== resolvedArg.hostname) {
90
+ const error = new Error('Pinned Web Push agent hostname mismatch');
91
+ error.code = 'EHOSTUNREACH';
92
+ callbackArg(error, '', 0);
93
+ return;
94
+ }
95
+ if (optionsArg.all) {
96
+ callbackArg(null, [{
97
+ address: resolvedArg.address,
98
+ family: resolvedArg.family,
99
+ }]);
100
+ return;
101
+ }
102
+ callbackArg(null, resolvedArg.address, resolvedArg.family);
103
+ };
104
+ return new plugins.https.Agent({
105
+ keepAlive: false,
106
+ maxSockets: 1,
107
+ maxFreeSockets: 0,
108
+ lookup,
109
+ });
110
+ }
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy53ZWJwdXNoLWVuZHBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvd2VicHVzaC9oZWxwZXJzLndlYnB1c2gtZW5kcG9pbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFZekMsTUFBTSxPQUFPLDBCQUEyQixTQUFRLEtBQUs7SUFDaEI7SUFBbkMsWUFBbUMsSUFBcUM7UUFDdEUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRHFCLFNBQUksR0FBSixJQUFJLENBQWlDO1FBRXRFLElBQUksQ0FBQyxJQUFJLEdBQUcsNEJBQTRCLENBQUM7SUFDM0MsQ0FBQztDQUNGO0FBa0JELE1BQU0sZ0JBQWdCLEdBQXNCLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRTtJQUNoRSxPQUFPLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRTtRQUNwRCxHQUFHLEVBQUUsSUFBSTtRQUNULFFBQVEsRUFBRSxJQUFJO0tBQ2YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsTUFBTSxVQUFVLGdDQUFnQyxDQUFDLFVBQWtCO0lBQ2pFLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzVDLElBQUksTUFBTSxLQUFLLENBQUMsSUFBSSxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQy9DLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hELElBQ0UsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLE1BQU07ZUFDckIscUJBQXFCLElBQUksTUFBTTtlQUMvQixNQUFNLENBQUMsbUJBQW1CLEVBQUU7WUFDL0IsT0FBTyxLQUFLLENBQUM7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
@@ -0,0 +1,4 @@
1
+ export * from './classes.webpush-crypto.js';
2
+ export * from './classes.webpush-manager.js';
3
+ export * from './classes.webpush-transport.js';
4
+ export * from './helpers.webpush-endpoint.js';
@@ -0,0 +1,5 @@
1
+ export * from './classes.webpush-crypto.js';
2
+ export * from './classes.webpush-manager.js';
3
+ export * from './classes.webpush-transport.js';
4
+ export * from './helpers.webpush-endpoint.js';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy93ZWJwdXNoL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMsK0JBQStCLENBQUMifQ==
@@ -0,0 +1,11 @@
1
+ export type TWebPushIndexCollection = 'WebPushBindingDoc' | 'WebPushAdmissionDoc' | 'WebPushSpoolDoc';
2
+ export interface IWebPushIndexSpecification {
3
+ collection: TWebPushIndexCollection;
4
+ name: string;
5
+ key: Record<string, 1 | -1>;
6
+ unique?: true;
7
+ expireAfterSeconds?: number;
8
+ partialFilterExpression?: Record<string, unknown>;
9
+ }
10
+ export declare const webPushIndexSpecifications: IWebPushIndexSpecification[];
11
+ export declare function getWebPushIndexSpecifications(collectionArg: TWebPushIndexCollection): IWebPushIndexSpecification[];
@@ -0,0 +1,123 @@
1
+ export const webPushIndexSpecifications = [
2
+ {
3
+ collection: 'WebPushBindingDoc',
4
+ name: 'web_push_binding_id_unique',
5
+ key: { id: 1 },
6
+ unique: true,
7
+ },
8
+ {
9
+ collection: 'WebPushBindingDoc',
10
+ name: 'web_push_binding_owner_unique',
11
+ key: {
12
+ ownerGatewayClientType: 1,
13
+ ownerGatewayClientId: 1,
14
+ ownerAppInstanceId: 1,
15
+ },
16
+ unique: true,
17
+ },
18
+ {
19
+ collection: 'WebPushBindingDoc',
20
+ name: 'web_push_binding_credential_unique',
21
+ key: { 'credential.id': 1 },
22
+ unique: true,
23
+ },
24
+ {
25
+ collection: 'WebPushBindingDoc',
26
+ name: 'web_push_binding_previous_credential_lookup',
27
+ key: { 'previousCredentials.id': 1 },
28
+ },
29
+ {
30
+ collection: 'WebPushBindingDoc',
31
+ name: 'web_push_binding_previous_credential_cleanup',
32
+ key: { 'previousCredentials.validUntil': 1 },
33
+ },
34
+ {
35
+ collection: 'WebPushBindingDoc',
36
+ name: 'web_push_binding_rotation_recovery_cleanup',
37
+ key: { 'credentialRotationRecovery.expiresAt': 1 },
38
+ },
39
+ {
40
+ collection: 'WebPushBindingDoc',
41
+ name: 'web_push_binding_vapid_status_cleanup',
42
+ key: { 'vapidKeys.status': 1 },
43
+ },
44
+ {
45
+ collection: 'WebPushBindingDoc',
46
+ name: 'web_push_binding_vapid_retire_after_cleanup',
47
+ key: { 'vapidKeys.retireAfter': 1 },
48
+ },
49
+ {
50
+ collection: 'WebPushBindingDoc',
51
+ name: 'web_push_binding_disabled_cleanup',
52
+ key: { enabled: 1, lifecycleGeneration: 1 },
53
+ },
54
+ {
55
+ collection: 'WebPushBindingDoc',
56
+ name: 'web_push_binding_deleted_cleanup',
57
+ key: { deletedAt: 1, lifecycleGeneration: 1 },
58
+ },
59
+ {
60
+ collection: 'WebPushAdmissionDoc',
61
+ name: 'web_push_admission_binding_unique',
62
+ key: { bindingId: 1, lifecycleGeneration: 1 },
63
+ unique: true,
64
+ },
65
+ {
66
+ collection: 'WebPushAdmissionDoc',
67
+ name: 'web_push_admission_ttl',
68
+ key: { purgeAt: 1 },
69
+ expireAfterSeconds: 0,
70
+ },
71
+ {
72
+ collection: 'WebPushSpoolDoc',
73
+ name: 'web_push_spool_id_unique',
74
+ key: { id: 1 },
75
+ unique: true,
76
+ },
77
+ {
78
+ collection: 'WebPushSpoolDoc',
79
+ name: 'web_push_spool_idempotency_unique',
80
+ key: {
81
+ bindingId: 1,
82
+ lifecycleGeneration: 1,
83
+ credentialId: 1,
84
+ idempotencyKeyDigest: 1,
85
+ },
86
+ unique: true,
87
+ },
88
+ {
89
+ collection: 'WebPushSpoolDoc',
90
+ name: 'web_push_spool_delivery_scan',
91
+ key: { state: 1, nextAttemptAt: 1, leaseExpiresAt: 1 },
92
+ },
93
+ {
94
+ collection: 'WebPushSpoolDoc',
95
+ name: 'web_push_spool_cancellation_scan',
96
+ key: { bindingId: 1, lifecycleGeneration: 1, subscriptionId: 1, state: 1 },
97
+ },
98
+ {
99
+ collection: 'WebPushSpoolDoc',
100
+ name: 'web_push_spool_cancelled_lease_scan',
101
+ key: { state: 1, cancelRequestedAt: 1, leaseExpiresAt: 1, id: 1 },
102
+ },
103
+ {
104
+ collection: 'WebPushSpoolDoc',
105
+ name: 'web_push_spool_lifecycle_drain_scan',
106
+ key: { bindingId: 1, lifecycleGeneration: 1, state: 1, leaseExpiresAt: 1 },
107
+ },
108
+ {
109
+ collection: 'WebPushSpoolDoc',
110
+ name: 'web_push_spool_vapid_retirement_scan',
111
+ key: { bindingId: 1, lifecycleGeneration: 1, vapidKeyId: 1, state: 1 },
112
+ },
113
+ {
114
+ collection: 'WebPushSpoolDoc',
115
+ name: 'web_push_spool_terminal_ttl',
116
+ key: { purgeAt: 1 },
117
+ expireAfterSeconds: 0,
118
+ },
119
+ ];
120
+ export function getWebPushIndexSpecifications(collectionArg) {
121
+ return webPushIndexSpecifications.filter((specificationArg) => specificationArg.collection === collectionArg);
122
+ }
123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2VicHVzaC1pbmRleGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvd2VicHVzaC93ZWJwdXNoLWluZGV4ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBY0EsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQWlDO0lBQ3RFO1FBQ0UsVUFBVSxFQUFFLG1CQUFtQjtRQUMvQixJQUFJLEVBQUUsNEJBQTRCO1FBQ2xDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDZCxNQUFNLEVBQUUsSUFBSTtLQUNiO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsbUJBQW1CO1FBQy9CLElBQUksRUFBRSwrQkFBK0I7UUFDckMsR0FBRyxFQUFFO1lBQ0gsc0JBQXNCLEVBQUUsQ0FBQztZQUN6QixvQkFBb0IsRUFBRSxDQUFDO1lBQ3ZCLGtCQUFrQixFQUFFLENBQUM7U0FDdEI7UUFDRCxNQUFNLEVBQUUsSUFBSTtLQUNiO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsbUJBQW1CO1FBQy9CLElBQUksRUFBRSxvQ0FBb0M7UUFDMUMsR0FBRyxFQUFFLEVBQUUsZUFBZSxFQUFFLENBQUMsRUFBRTtRQUMzQixNQUFNLEVBQUUsSUFBSTtLQUNiO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsbUJBQW1CO1FBQy9CLElBQUksRUFBRSw2Q0FBNkM7UUFDbkQsR0FBRyxFQUFFLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQyxFQUFFO0tBQ3JDO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsbUJBQW1CO1FBQy9CLElBQUksRUFBRSw4Q0FBOEM7UUFDcEQsR0FBRyxFQUFFLEVBQUUsZ0NBQWdDLEVBQUUsQ0FBQyxFQUFFO0tBQzdDO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsbUJBQW1CO1FBQy9CLElBQUksRUFBRSw0Q0FBNEM7UUFDbEQsR0FBRyxFQUFFLEVBQUUsc0NBQXNDLEVBQUUsQ0FBQyxFQUFFO0tBQ25EO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsbUJBQW1CO1FBQy9CLElBQUks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
@@ -39,6 +39,8 @@ export interface IApiTokenPolicy {
39
39
  manageMail?: boolean;
40
40
  readCertificates?: boolean;
41
41
  requestCertificates?: boolean;
42
+ readWebPush?: boolean;
43
+ manageWebPush?: boolean;
42
44
  };
43
45
  }
44
46
  export interface IGatewayCredentialLifecycle {
@@ -120,4 +120,4 @@ export function canonicalizeSourceRouteId(routeId) {
120
120
  const sourceVariantIndex = routeId.indexOf(':source:');
121
121
  return sourceVariantIndex === -1 ? routeId : routeId.slice(0, sourceVariantIndex);
122
122
  }
123
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtbWFuYWdlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX2ludGVyZmFjZXMvZGF0YS9yb3V0ZS1tYW5hZ2VtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXFCQSwrRUFBK0U7QUFDL0UsOEJBQThCO0FBQzlCLCtFQUErRTtBQUUvRSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsR0FBRztJQUNILGFBQWE7SUFDYixjQUFjO0lBQ2QsYUFBYTtJQUNiLFlBQVk7SUFDWixXQUFXO0lBQ1gsb0JBQW9CO0lBQ3BCLHFCQUFxQjtJQUNyQixlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLGFBQWE7SUFDYixjQUFjO0lBQ2QsbUJBQW1CO0lBQ25CLG9CQUFvQjtJQUNwQixhQUFhO0lBQ2IsZUFBZTtJQUNmLFlBQVk7SUFDWixjQUFjO0lBQ2Qsc0JBQXNCO0lBQ3RCLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsdUJBQXVCO0lBQ3ZCLGNBQWM7SUFDZCxlQUFlO0lBQ2Ysb0JBQW9CO0lBQ3BCLHFCQUFxQjtJQUNyQixjQUFjO0lBQ2QsZUFBZTtJQUNmLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQixvQkFBb0I7SUFDcEIscUJBQXFCO0lBQ3JCLHFCQUFxQjtJQUNyQixzQkFBc0I7SUFDdEIsVUFBVTtJQUNWLFdBQVc7SUFDWCxhQUFhO0lBQ2IsY0FBYztJQUNkLHNCQUFzQjtJQUN0Qix1QkFBdUI7SUFDdkIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtDQUNYLENBQUM7QUErRVgsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUc7SUFDOUIsZ0JBQWdCO0lBQ2hCLFFBQVE7SUFDUixhQUFhO0lBQ2IsZ0JBQWdCO0lBQ2hCLEtBQUs7SUFDTCxTQUFTO0NBQ0QsQ0FBQztBQUlYLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFvQztJQUN4RSxnQkFBZ0IsRUFBRSxnQkFBZ0I7SUFDbEMsTUFBTSxFQUFFLGVBQWU7SUFDdkIsYUFBYSxFQUFFLGFBQWE7SUFDNUIsZ0JBQWdCLEVBQUUsZ0JBQWdCO0lBQ2xDLEdBQUcsRUFBRSxXQUFXO0lBQ2hCLE9BQU8sRUFBRSxVQUFVO0NBQ3BCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBc0M7SUFDNUUsZ0JBQWdCLEVBQUU7UUFDaEIsb0JBQW9CO1FBQ3BCLDBCQUEwQjtRQUMxQiwyQkFBMkI7UUFDM0IsbUJBQW1CO1FBQ25CLHFCQUFxQjtLQUN0QjtJQUNELE1BQU0sRUFBRTtRQUNOLFdBQVc7UUFDWCxZQUFZO1FBQ1osaUJBQWlCO1FBQ2pCLGdCQUFnQjtRQUNoQixRQUFRO1FBQ1IsUUFBUTtRQUNSLE9BQU87UUFDUCxVQUFVO1FBQ1YsY0FBYztLQUNmO0lBQ0QsYUFBYSxFQUFFLEVBQUU7SUFDakIsZ0JBQWdCLEVBQUU7UUFDaEIsWUFBWTtRQUNaLFNBQVM7UUFDVCxXQUFXO1FBQ1gsUUFBUTtRQUNSLFVBQVU7UUFDVixTQUFTO1FBQ1QsZ0JBQWdCO1FBQ2hCLFlBQVk7UUFDWixlQUFlO1FBQ2YsWUFBWTtRQUNaLFlBQVk7UUFDWixlQUFlO1FBQ2YsYUFBYTtRQUNiLFlBQVk7UUFDWixlQUFlO1FBQ2YsY0FBYztRQUNkLGVBQWU7S0FDaEI7SUFDRCxHQUFHLEVBQUU7UUFDSCxZQUFZO1FBQ1osWUFBWTtLQUNiO0lBQ0QsT0FBTyxFQUFFO1FBQ1AsZ0JBQWdCO1FBQ2hCLDBCQUEwQjtLQUMzQjtDQUNGLENBQUM7QUFtREYsK0VBQStFO0FBQy9FLHVCQUF1QjtBQUN2QiwrRUFBK0U7QUFFL0UsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBVSxDQUFDO0FBdUZ6RSxnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLHlCQUF5QixDQUFDLE9BQWU7SUFDdkQsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZELE9BQU8sa0JBQWtCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztBQUNwRixDQUFDIn0=
123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtbWFuYWdlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX2ludGVyZmFjZXMvZGF0YS9yb3V0ZS1tYW5hZ2VtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXFCQSwrRUFBK0U7QUFDL0UsOEJBQThCO0FBQzlCLCtFQUErRTtBQUUvRSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsR0FBRztJQUNILGFBQWE7SUFDYixjQUFjO0lBQ2QsYUFBYTtJQUNiLFlBQVk7SUFDWixXQUFXO0lBQ1gsb0JBQW9CO0lBQ3BCLHFCQUFxQjtJQUNyQixlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLGFBQWE7SUFDYixjQUFjO0lBQ2QsbUJBQW1CO0lBQ25CLG9CQUFvQjtJQUNwQixhQUFhO0lBQ2IsZUFBZTtJQUNmLFlBQVk7SUFDWixjQUFjO0lBQ2Qsc0JBQXNCO0lBQ3RCLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsdUJBQXVCO0lBQ3ZCLGNBQWM7SUFDZCxlQUFlO0lBQ2Ysb0JBQW9CO0lBQ3BCLHFCQUFxQjtJQUNyQixjQUFjO0lBQ2QsZUFBZTtJQUNmLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQixvQkFBb0I7SUFDcEIscUJBQXFCO0lBQ3JCLHFCQUFxQjtJQUNyQixzQkFBc0I7SUFDdEIsVUFBVTtJQUNWLFdBQVc7SUFDWCxhQUFhO0lBQ2IsY0FBYztJQUNkLHNCQUFzQjtJQUN0Qix1QkFBdUI7SUFDdkIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtDQUNYLENBQUM7QUFpRlgsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUc7SUFDOUIsZ0JBQWdCO0lBQ2hCLFFBQVE7SUFDUixhQUFhO0lBQ2IsZ0JBQWdCO0lBQ2hCLEtBQUs7SUFDTCxTQUFTO0NBQ0QsQ0FBQztBQUlYLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFvQztJQUN4RSxnQkFBZ0IsRUFBRSxnQkFBZ0I7SUFDbEMsTUFBTSxFQUFFLGVBQWU7SUFDdkIsYUFBYSxFQUFFLGFBQWE7SUFDNUIsZ0JBQWdCLEVBQUUsZ0JBQWdCO0lBQ2xDLEdBQUcsRUFBRSxXQUFXO0lBQ2hCLE9BQU8sRUFBRSxVQUFVO0NBQ3BCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBc0M7SUFDNUUsZ0JBQWdCLEVBQUU7UUFDaEIsb0JBQW9CO1FBQ3BCLDBCQUEwQjtRQUMxQiwyQkFBMkI7UUFDM0IsbUJBQW1CO1FBQ25CLHFCQUFxQjtLQUN0QjtJQUNELE1BQU0sRUFBRTtRQUNOLFdBQVc7UUFDWCxZQUFZO1FBQ1osaUJBQWlCO1FBQ2pCLGdCQUFnQjtRQUNoQixRQUFRO1FBQ1IsUUFBUTtRQUNSLE9BQU87UUFDUCxVQUFVO1FBQ1YsY0FBYztLQUNmO0lBQ0QsYUFBYSxFQUFFLEVBQUU7SUFDakIsZ0JBQWdCLEVBQUU7UUFDaEIsWUFBWTtRQUNaLFNBQVM7UUFDVCxXQUFXO1FBQ1gsUUFBUTtRQUNSLFVBQVU7UUFDVixTQUFTO1FBQ1QsZ0JBQWdCO1FBQ2hCLFlBQVk7UUFDWixlQUFlO1FBQ2YsWUFBWTtRQUNaLFlBQVk7UUFDWixlQUFlO1FBQ2YsYUFBYTtRQUNiLFlBQVk7UUFDWixlQUFlO1FBQ2YsY0FBYztRQUNkLGVBQWU7S0FDaEI7SUFDRCxHQUFHLEVBQUU7UUFDSCxZQUFZO1FBQ1osWUFBWTtLQUNiO0lBQ0QsT0FBTyxFQUFFO1FBQ1AsZ0JBQWdCO1FBQ2hCLDBCQUEwQjtLQUMzQjtDQUNGLENBQUM7QUFtREYsK0VBQStFO0FBQy9FLHVCQUF1QjtBQUN2QiwrRUFBK0U7QUFFL0UsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBVSxDQUFDO0FBdUZ6RSxnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLHlCQUF5QixDQUFDLE9BQWU7SUFDdkQsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZELE9BQU8sa0JBQWtCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztBQUNwRixDQUFDIn0=