@eggjs/koa 2.14.2 → 2.15.1

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.
@@ -0,0 +1,104 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import util from 'node:util';
4
+ import type { IncomingMessage, ServerResponse } from 'node:http';
5
+ import Cookies from 'cookies';
6
+ import type Application from './application';
7
+ import type Request from './request';
8
+ import type Response from './response';
9
+ import type { CustomError, AnyProto } from './types';
10
+ export default class Context {
11
+ #private;
12
+ app: Application;
13
+ req: IncomingMessage;
14
+ res: ServerResponse;
15
+ request: Request & AnyProto;
16
+ response: Response & AnyProto;
17
+ state: Record<string, any>;
18
+ originalUrl: string;
19
+ respond?: boolean;
20
+ constructor(app: Application, req: IncomingMessage, res: ServerResponse);
21
+ /**
22
+ * util.inspect() implementation, which
23
+ * just returns the JSON output.
24
+ */
25
+ inspect(): {
26
+ request: any;
27
+ response: any;
28
+ app: any;
29
+ originalUrl: string;
30
+ req: string;
31
+ res: string;
32
+ socket: string;
33
+ };
34
+ /**
35
+ * Custom inspection implementation for newer Node.js versions.
36
+ */
37
+ [util.inspect.custom](): {
38
+ request: any;
39
+ response: any;
40
+ app: any;
41
+ originalUrl: string;
42
+ req: string;
43
+ res: string;
44
+ socket: string;
45
+ };
46
+ /**
47
+ * Return JSON representation.
48
+ *
49
+ * Here we explicitly invoke .toJSON() on each
50
+ * object, as iteration will otherwise fail due
51
+ * to the getters and cause utilities such as
52
+ * clone() to fail.
53
+ */
54
+ toJSON(): {
55
+ request: any;
56
+ response: any;
57
+ app: any;
58
+ originalUrl: string;
59
+ req: string;
60
+ res: string;
61
+ socket: string;
62
+ };
63
+ /**
64
+ * Similar to .throw(), adds assertion.
65
+ *
66
+ * this.assert(this.user, 401, 'Please login!');
67
+ *
68
+ * See: https://github.com/jshttp/http-assert
69
+ *
70
+ * @param {Mixed} test
71
+ * @param {Number} status
72
+ * @param {String} message
73
+ * @public
74
+ */
75
+ assert(...args: any[]): any;
76
+ /**
77
+ * Throw an error with `status` (default 500) and
78
+ * `msg`. Note that these are user-level
79
+ * errors, and the message may be exposed to the client.
80
+ *
81
+ * this.throw(403)
82
+ * this.throw(400, 'name required')
83
+ * this.throw('something exploded')
84
+ * this.throw(new Error('invalid'))
85
+ * this.throw(400, new Error('invalid'))
86
+ *
87
+ * See: https://github.com/jshttp/http-errors
88
+ *
89
+ * Note: `status` should only be passed as the first parameter.
90
+ *
91
+ * @param {String|Number|Error} err, msg or status
92
+ * @param {String|Number|Error} [err, msg or status]
93
+ * @param {Object} [props]
94
+ */
95
+ throw(...args: any[]): void;
96
+ /**
97
+ * Default error handling.
98
+ * @private
99
+ */
100
+ onerror(err: CustomError): void;
101
+ get cookies(): Cookies;
102
+ set cookies(cookies: Cookies);
103
+ }
104
+ export type ContextDelegation = Context & Pick<Request, 'acceptsLanguages' | 'acceptsEncodings' | 'acceptsCharsets' | 'accepts' | 'get' | 'is' | 'querystring' | 'idempotent' | 'socket' | 'search' | 'method' | 'query' | 'path' | 'url' | 'accept' | 'origin' | 'href' | 'subdomains' | 'protocol' | 'host' | 'hostname' | 'URL' | 'header' | 'headers' | 'secure' | 'stale' | 'fresh' | 'ips' | 'ip'> & Pick<Response, 'attachment' | 'redirect' | 'remove' | 'vary' | 'has' | 'set' | 'append' | 'flushHeaders' | 'status' | 'message' | 'body' | 'length' | 'type' | 'lastModified' | 'etag' | 'headerSent' | 'writable'> & AnyProto;
package/lib/context.js CHANGED
@@ -1,251 +1,221 @@
1
-
2
- 'use strict';
3
-
4
- /**
5
- * Module dependencies.
6
- */
7
-
8
- const util = require('util');
9
- const createError = require('http-errors');
10
- const httpAssert = require('http-assert');
11
- const delegate = require('delegates');
12
- const statuses = require('statuses');
13
- const Cookies = require('cookies');
14
-
15
- const COOKIES = Symbol('context#cookies');
16
-
17
- /**
18
- * Context prototype.
19
- */
20
-
21
- const proto = module.exports = {
22
-
23
- /**
24
- * util.inspect() implementation, which
25
- * just returns the JSON output.
26
- *
27
- * @return {Object}
28
- * @api public
29
- */
30
-
31
- inspect() {
32
- if (this === proto) return this;
33
- return this.toJSON();
34
- },
35
-
36
- /**
37
- * Return JSON representation.
38
- *
39
- * Here we explicitly invoke .toJSON() on each
40
- * object, as iteration will otherwise fail due
41
- * to the getters and cause utilities such as
42
- * clone() to fail.
43
- *
44
- * @return {Object}
45
- * @api public
46
- */
47
-
48
- toJSON() {
49
- return {
50
- request: this.request.toJSON(),
51
- response: this.response.toJSON(),
52
- app: this.app.toJSON(),
53
- originalUrl: this.originalUrl,
54
- req: '<original node req>',
55
- res: '<original node res>',
56
- socket: '<original node socket>'
57
- };
58
- },
59
-
60
- /**
61
- * Similar to .throw(), adds assertion.
62
- *
63
- * this.assert(this.user, 401, 'Please login!');
64
- *
65
- * See: https://github.com/jshttp/http-assert
66
- *
67
- * @param {Mixed} test
68
- * @param {Number} status
69
- * @param {String} message
70
- * @api public
71
- */
72
-
73
- assert: httpAssert,
74
-
75
- /**
76
- * Throw an error with `status` (default 500) and
77
- * `msg`. Note that these are user-level
78
- * errors, and the message may be exposed to the client.
79
- *
80
- * this.throw(403)
81
- * this.throw(400, 'name required')
82
- * this.throw('something exploded')
83
- * this.throw(new Error('invalid'))
84
- * this.throw(400, new Error('invalid'))
85
- *
86
- * See: https://github.com/jshttp/http-errors
87
- *
88
- * Note: `status` should only be passed as the first parameter.
89
- *
90
- * @param {String|Number|Error} err, msg or status
91
- * @param {String|Number|Error} [err, msg or status]
92
- * @param {Object} [props]
93
- * @api public
94
- */
95
-
96
- throw(...args) {
97
- throw createError(...args);
98
- },
99
-
100
- /**
101
- * Default error handling.
102
- *
103
- * @param {Error} err
104
- * @api private
105
- */
106
-
107
- onerror(err) {
108
- // don't do anything if there is no error.
109
- // this allows you to pass `this.onerror`
110
- // to node-style callbacks.
111
- if (null == err) return;
112
-
113
- // When dealing with cross-globals a normal `instanceof` check doesn't work properly.
114
- // See https://github.com/koajs/koa/issues/1466
115
- // We can probably remove it once jest fixes https://github.com/facebook/jest/issues/2549.
116
- const isNativeError =
117
- Object.prototype.toString.call(err) === '[object Error]' ||
118
- err instanceof Error;
119
- if (!isNativeError) err = new Error(util.format('non-error thrown: %j', err));
120
-
121
- let headerSent = false;
122
- if (this.headerSent || !this.writable) {
123
- headerSent = err.headerSent = true;
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_util_1 = __importDefault(require("node:util"));
7
+ const http_errors_1 = __importDefault(require("http-errors"));
8
+ const http_assert_1 = __importDefault(require("http-assert"));
9
+ const delegates_1 = __importDefault(require("delegates"));
10
+ const statuses_1 = __importDefault(require("statuses"));
11
+ const cookies_1 = __importDefault(require("cookies"));
12
+ class Context {
13
+ app;
14
+ req;
15
+ res;
16
+ request;
17
+ response;
18
+ state;
19
+ originalUrl;
20
+ respond;
21
+ constructor(app, req, res) {
22
+ this.app = app;
23
+ this.req = req;
24
+ this.res = res;
25
+ this.state = {};
26
+ this.request = new app.RequestClass(app, this, req, res);
27
+ this.response = new app.ResponseClass(app, this, req, res);
28
+ this.request.response = this.response;
29
+ this.response.request = this.request;
30
+ this.originalUrl = req.url;
124
31
  }
125
-
126
- // delegate
127
- this.app.emit('error', err, this);
128
-
129
- // nothing we can do here other
130
- // than delegate to the app-level
131
- // handler and log.
132
- if (headerSent) {
133
- return;
32
+ /**
33
+ * util.inspect() implementation, which
34
+ * just returns the JSON output.
35
+ */
36
+ inspect() {
37
+ return this.toJSON();
134
38
  }
135
-
136
- const { res } = this;
137
-
138
- // first unset all headers
139
- /* istanbul ignore else */
140
- if (typeof res.getHeaderNames === 'function') {
141
- res.getHeaderNames().forEach(name => res.removeHeader(name));
142
- } else {
143
- res._headers = {}; // Node < 7.7
39
+ /**
40
+ * Custom inspection implementation for newer Node.js versions.
41
+ */
42
+ [node_util_1.default.inspect.custom]() {
43
+ return this.inspect();
144
44
  }
145
-
146
- // then set those specified
147
- this.set(err.headers);
148
-
149
- // force text/plain
150
- this.type = 'text';
151
-
152
- let statusCode = err.status || err.statusCode;
153
-
154
- // ENOENT support
155
- if ('ENOENT' === err.code) statusCode = 404;
156
-
157
- // default to 500
158
- if ('number' !== typeof statusCode || !statuses[statusCode]) statusCode = 500;
159
-
160
- // respond
161
- const code = statuses[statusCode];
162
- const msg = err.expose ? err.message : code;
163
- this.status = err.status = statusCode;
164
- this.length = Buffer.byteLength(msg);
165
- res.end(msg);
166
- },
167
-
168
- get cookies() {
169
- if (!this[COOKIES]) {
170
- this[COOKIES] = new Cookies(this.req, this.res, {
171
- keys: this.app.keys,
172
- secure: this.request.secure
173
- });
45
+ /**
46
+ * Return JSON representation.
47
+ *
48
+ * Here we explicitly invoke .toJSON() on each
49
+ * object, as iteration will otherwise fail due
50
+ * to the getters and cause utilities such as
51
+ * clone() to fail.
52
+ */
53
+ toJSON() {
54
+ return {
55
+ request: this.request.toJSON(),
56
+ response: this.response.toJSON(),
57
+ app: this.app.toJSON(),
58
+ originalUrl: this.originalUrl,
59
+ req: '<original node req>',
60
+ res: '<original node res>',
61
+ socket: '<original node socket>',
62
+ };
63
+ }
64
+ /**
65
+ * Similar to .throw(), adds assertion.
66
+ *
67
+ * this.assert(this.user, 401, 'Please login!');
68
+ *
69
+ * See: https://github.com/jshttp/http-assert
70
+ *
71
+ * @param {Mixed} test
72
+ * @param {Number} status
73
+ * @param {String} message
74
+ * @public
75
+ */
76
+ assert(...args) {
77
+ return (0, http_assert_1.default)(...args);
78
+ }
79
+ /**
80
+ * Throw an error with `status` (default 500) and
81
+ * `msg`. Note that these are user-level
82
+ * errors, and the message may be exposed to the client.
83
+ *
84
+ * this.throw(403)
85
+ * this.throw(400, 'name required')
86
+ * this.throw('something exploded')
87
+ * this.throw(new Error('invalid'))
88
+ * this.throw(400, new Error('invalid'))
89
+ *
90
+ * See: https://github.com/jshttp/http-errors
91
+ *
92
+ * Note: `status` should only be passed as the first parameter.
93
+ *
94
+ * @param {String|Number|Error} err, msg or status
95
+ * @param {String|Number|Error} [err, msg or status]
96
+ * @param {Object} [props]
97
+ */
98
+ throw(...args) {
99
+ throw (0, http_errors_1.default)(...args);
100
+ }
101
+ /**
102
+ * Default error handling.
103
+ * @private
104
+ */
105
+ onerror(err) {
106
+ // don't do anything if there is no error.
107
+ // this allows you to pass `this.onerror`
108
+ // to node-style callbacks.
109
+ if (err === null || err === undefined)
110
+ return;
111
+ // When dealing with cross-globals a normal `instanceof` check doesn't work properly.
112
+ // See https://github.com/koajs/koa/issues/1466
113
+ // We can probably remove it once jest fixes https://github.com/facebook/jest/issues/2549.
114
+ const isNativeError = err instanceof Error ||
115
+ Object.prototype.toString.call(err) === '[object Error]';
116
+ if (!isNativeError)
117
+ err = new Error(node_util_1.default.format('non-error thrown: %j', err));
118
+ let headerSent = false;
119
+ if (this.response.headerSent || !this.response.writable) {
120
+ headerSent = err.headerSent = true;
121
+ }
122
+ // delegate
123
+ this.app.emit('error', err, this);
124
+ // nothing we can do here other
125
+ // than delegate to the app-level
126
+ // handler and log.
127
+ if (headerSent) {
128
+ return;
129
+ }
130
+ const { res } = this;
131
+ // first unset all headers
132
+ res.getHeaderNames().forEach(name => res.removeHeader(name));
133
+ // then set those specified
134
+ if (err.headers)
135
+ this.response.set(err.headers);
136
+ // force text/plain
137
+ this.response.type = 'text';
138
+ let statusCode = err.status || err.statusCode;
139
+ // ENOENT support
140
+ if (err.code === 'ENOENT')
141
+ statusCode = 404;
142
+ // default to 500
143
+ if (typeof statusCode !== 'number' || !statuses_1.default[statusCode])
144
+ statusCode = 500;
145
+ // respond
146
+ const code = statuses_1.default[statusCode];
147
+ const msg = err.expose ? err.message : code;
148
+ this.response.status = err.status = statusCode;
149
+ this.response.length = Buffer.byteLength(msg);
150
+ res.end(msg);
151
+ }
152
+ #cookies;
153
+ get cookies() {
154
+ if (!this.#cookies) {
155
+ this.#cookies = new cookies_1.default(this.req, this.res, {
156
+ keys: this.app.keys,
157
+ secure: this.request.secure,
158
+ });
159
+ }
160
+ return this.#cookies;
161
+ }
162
+ set cookies(cookies) {
163
+ this.#cookies = cookies;
174
164
  }
175
- return this[COOKIES];
176
- },
177
-
178
- set cookies(_cookies) {
179
- this[COOKIES] = _cookies;
180
- }
181
- };
182
-
183
- /**
184
- * Custom inspection implementation for newer Node.js versions.
185
- *
186
- * @return {Object}
187
- * @api public
188
- */
189
-
190
- /* istanbul ignore else */
191
- if (util.inspect.custom) {
192
- module.exports[util.inspect.custom] = module.exports.inspect;
193
165
  }
194
-
166
+ exports.default = Context;
195
167
  /**
196
- * Response delegation.
168
+ * Request delegation.
197
169
  */
198
-
199
- delegate(proto, 'response')
200
- .method('attachment')
201
- .method('redirect')
202
- .method('remove')
203
- .method('vary')
204
- .method('has')
205
- .method('set')
206
- .method('append')
207
- .method('flushHeaders')
208
- .access('status')
209
- .access('message')
210
- .access('body')
211
- .access('length')
212
- .access('type')
213
- .access('lastModified')
214
- .access('etag')
215
- .getter('headerSent')
216
- .getter('writable');
217
-
170
+ (0, delegates_1.default)(Context.prototype, 'request')
171
+ .method('acceptsLanguages')
172
+ .method('acceptsEncodings')
173
+ .method('acceptsCharsets')
174
+ .method('accepts')
175
+ .method('get')
176
+ .method('is')
177
+ .access('querystring')
178
+ .access('idempotent')
179
+ .access('socket')
180
+ .access('search')
181
+ .access('method')
182
+ .access('query')
183
+ .access('path')
184
+ .access('url')
185
+ .access('accept')
186
+ .getter('origin')
187
+ .getter('href')
188
+ .getter('subdomains')
189
+ .getter('protocol')
190
+ .getter('host')
191
+ .getter('hostname')
192
+ .getter('URL')
193
+ .getter('header')
194
+ .getter('headers')
195
+ .getter('secure')
196
+ .getter('stale')
197
+ .getter('fresh')
198
+ .getter('ips')
199
+ .getter('ip');
218
200
  /**
219
- * Request delegation.
201
+ * Response delegation.
220
202
  */
221
-
222
- delegate(proto, 'request')
223
- .method('acceptsLanguages')
224
- .method('acceptsEncodings')
225
- .method('acceptsCharsets')
226
- .method('accepts')
227
- .method('get')
228
- .method('is')
229
- .access('querystring')
230
- .access('idempotent')
231
- .access('socket')
232
- .access('search')
233
- .access('method')
234
- .access('query')
235
- .access('path')
236
- .access('url')
237
- .access('accept')
238
- .getter('origin')
239
- .getter('href')
240
- .getter('subdomains')
241
- .getter('protocol')
242
- .getter('host')
243
- .getter('hostname')
244
- .getter('URL')
245
- .getter('header')
246
- .getter('headers')
247
- .getter('secure')
248
- .getter('stale')
249
- .getter('fresh')
250
- .getter('ips')
251
- .getter('ip');
203
+ (0, delegates_1.default)(Context.prototype, 'response')
204
+ .method('attachment')
205
+ .method('redirect')
206
+ .method('remove')
207
+ .method('vary')
208
+ .method('has')
209
+ .method('set')
210
+ .method('append')
211
+ .method('flushHeaders')
212
+ .access('status')
213
+ .access('message')
214
+ .access('body')
215
+ .access('length')
216
+ .access('type')
217
+ .access('lastModified')
218
+ .access('etag')
219
+ .getter('headerSent')
220
+ .getter('writable');
221
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsMERBQTZCO0FBRTdCLDhEQUFzQztBQUN0Qyw4REFBcUM7QUFDckMsMERBQWlDO0FBQ2pDLHdEQUFnQztBQUNoQyxzREFBOEI7QUFNOUIsTUFBcUIsT0FBTztJQUMxQixHQUFHLENBQWM7SUFDakIsR0FBRyxDQUFrQjtJQUNyQixHQUFHLENBQWlCO0lBQ3BCLE9BQU8sQ0FBcUI7SUFDNUIsUUFBUSxDQUFzQjtJQUM5QixLQUFLLENBQXNCO0lBQzNCLFdBQVcsQ0FBUztJQUNwQixPQUFPLENBQVc7SUFFbEIsWUFBWSxHQUFnQixFQUFFLEdBQW9CLEVBQUUsR0FBbUI7UUFDckUsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLElBQVcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLEdBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNILENBQUMsbUJBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBRUgsTUFBTTtRQUNKLE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDOUIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ2hDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRTtZQUN0QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsR0FBRyxFQUFFLHFCQUFxQjtZQUMxQixHQUFHLEVBQUUscUJBQXFCO1lBQzFCLE1BQU0sRUFBRSx3QkFBd0I7U0FDakMsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUVILE1BQU0sQ0FBQyxHQUFHLElBQVc7UUFDbkIsT0FBTyxJQUFBLHFCQUFVLEVBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWtCRztJQUVILEtBQUssQ0FBQyxHQUFHLElBQVc7UUFDbEIsTUFBTSxJQUFBLHFCQUFXLEVBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsT0FBTyxDQUFDLEdBQWdCO1FBQ3RCLDBDQUEwQztRQUMxQyx5Q0FBeUM7UUFDekMsMkJBQTJCO1FBQzNCLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUztZQUFFLE9BQU87UUFFOUMscUZBQXFGO1FBQ3JGLCtDQUErQztRQUMvQywwRkFBMEY7UUFDMUYsTUFBTSxhQUFhLEdBQUcsR0FBRyxZQUFZLEtBQUs7WUFDeEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLGdCQUFnQixDQUFDO1FBQzNELElBQUksQ0FBQyxhQUFhO1lBQUUsR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLG1CQUFJLENBQUMsTUFBTSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFOUUsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRTtZQUN2RCxVQUFVLEdBQUksR0FBVyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7U0FDN0M7UUFFRCxXQUFXO1FBQ1gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVsQywrQkFBK0I7UUFDL0IsaUNBQWlDO1FBQ2pDLG1CQUFtQjtRQUNuQixJQUFJLFVBQVUsRUFBRTtZQUNkLE9BQU87U0FDUjtRQUVELE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFFckIsMEJBQTBCO1FBQzFCLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFN0QsMkJBQTJCO1FBQzNCLElBQUksR0FBRyxDQUFDLE9BQU87WUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFaEQsbUJBQW1CO1FBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztRQUU1QixJQUFJLFVBQVUsR0FBRyxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUM7UUFFOUMsaUJBQWlCO1FBQ2pCLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRO1lBQUUsVUFBVSxHQUFHLEdBQUcsQ0FBQztRQUU1QyxpQkFBaUI7UUFDakIsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLElBQUksQ0FBQyxrQkFBUSxDQUFDLFVBQVUsQ0FBQztZQUFFLFVBQVUsR0FBRyxHQUFHLENBQUM7UUFFOUUsVUFBVTtRQUNWLE1BQU0sSUFBSSxHQUFHLGtCQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEMsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzVDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDO1FBQy9DLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNmLENBQUM7SUFFRCxRQUFRLENBQVU7SUFDbEIsSUFBSSxPQUFPO1FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGlCQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUM5QyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJO2dCQUNuQixNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNO2FBQzVCLENBQUMsQ0FBQztTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxPQUFnQjtRQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztJQUMxQixDQUFDO0NBQ0Y7QUE1S0QsMEJBNEtDO0FBRUQ7O0dBRUc7QUFFSCxJQUFBLG1CQUFRLEVBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUM7S0FDbkMsTUFBTSxDQUFDLGtCQUFrQixDQUFDO0tBQzFCLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQztLQUMxQixNQUFNLENBQUMsaUJBQWlCLENBQUM7S0FDekIsTUFBTSxDQUFDLFNBQVMsQ0FBQztLQUNqQixNQUFNLENBQUMsS0FBSyxDQUFDO0tBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQztLQUNaLE1BQU0sQ0FBQyxhQUFhLENBQUM7S0FDckIsTUFBTSxDQUFDLFlBQVksQ0FBQztLQUNwQixNQUFNLENBQUMsUUFBUSxDQUFDO0tBQ2hCLE1BQU0sQ0FBQyxRQUFRLENBQUM7S0FDaEIsTUFBTSxDQUFDLFFBQVEsQ0FBQztLQUNoQixNQUFNLENBQUMsT0FBTyxDQUFDO0tBQ2YsTUFBTSxDQUFDLE1BQU0sQ0FBQztLQUNkLE1BQU0sQ0FBQyxLQUFLLENBQUM7S0FDYixNQUFNLENBQUMsUUFBUSxDQUFDO0tBQ2hCLE1BQU0sQ0FBQyxRQUFRLENBQUM7S0FDaEIsTUFBTSxDQUFDLE1BQU0sQ0FBQztLQUNkLE1BQU0sQ0FBQyxZQUFZLENBQUM7S0FDcEIsTUFBTSxDQUFDLFVBQVUsQ0FBQztLQUNsQixNQUFNLENBQUMsTUFBTSxDQUFDO0tBQ2QsTUFBTSxDQUFDLFVBQVUsQ0FBQztLQUNsQixNQUFNLENBQUMsS0FBSyxDQUFDO0tBQ2IsTUFBTSxDQUFDLFFBQVEsQ0FBQztLQUNoQixNQUFNLENBQUMsU0FBUyxDQUFDO0tBQ2pCLE1BQU0sQ0FBQyxRQUFRLENBQUM7S0FDaEIsTUFBTSxDQUFDLE9BQU8sQ0FBQztLQUNmLE1BQU0sQ0FBQyxPQUFPLENBQUM7S0FDZixNQUFNLENBQUMsS0FBSyxDQUFDO0tBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBRWhCOztHQUVHO0FBRUgsSUFBQSxtQkFBUSxFQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDO0tBQ3BDLE1BQU0sQ0FBQyxZQUFZLENBQUM7S0FDcEIsTUFBTSxDQUFDLFVBQVUsQ0FBQztLQUNsQixNQUFNLENBQUMsUUFBUSxDQUFDO0tBQ2hCLE1BQU0sQ0FBQyxNQUFNLENBQUM7S0FDZCxNQUFNLENBQUMsS0FBSyxDQUFDO0tBQ2IsTUFBTSxDQUFDLEtBQUssQ0FBQztLQUNiLE1BQU0sQ0FBQyxRQUFRLENBQUM7S0FDaEIsTUFBTSxDQUFDLGNBQWMsQ0FBQztLQUN0QixNQUFNLENBQUMsUUFBUSxDQUFDO0tBQ2hCLE1BQU0sQ0FBQyxTQUFTLENBQUM7S0FDakIsTUFBTSxDQUFDLE1BQU0sQ0FBQztLQUNkLE1BQU0sQ0FBQyxRQUFRLENBQUM7S0FDaEIsTUFBTSxDQUFDLE1BQU0sQ0FBQztLQUNkLE1BQU0sQ0FBQyxjQUFjLENBQUM7S0FDdEIsTUFBTSxDQUFDLE1BQU0sQ0FBQztLQUNkLE1BQU0sQ0FBQyxZQUFZLENBQUM7S0FDcEIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDIn0=