parse-server 5.3.0-alpha.2 → 5.3.0-alpha.20

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 (34) hide show
  1. package/README.md +50 -44
  2. package/lib/Adapters/Auth/gcenter.js +104 -30
  3. package/lib/Adapters/Cache/LRUCache.js +2 -2
  4. package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +29 -20
  5. package/lib/Auth.js +11 -1
  6. package/lib/Controllers/DatabaseController.js +4 -3
  7. package/lib/Controllers/LiveQueryController.js +9 -1
  8. package/lib/Controllers/SchemaController.js +13 -6
  9. package/lib/Controllers/index.js +3 -2
  10. package/lib/Deprecator/Deprecations.js +4 -1
  11. package/lib/GraphQL/ParseGraphQLSchema.js +39 -58
  12. package/lib/GraphQL/ParseGraphQLServer.js +37 -26
  13. package/lib/GraphQL/helpers/objectsQueries.js +5 -11
  14. package/lib/GraphQL/loaders/defaultGraphQLTypes.js +14 -11
  15. package/lib/GraphQL/loaders/defaultRelaySchema.js +2 -2
  16. package/lib/GraphQL/loaders/filesMutations.js +9 -22
  17. package/lib/GraphQL/loaders/schemaDirectives.js +51 -42
  18. package/lib/GraphQL/loaders/schemaTypes.js +14 -14
  19. package/lib/GraphQL/parseGraphQLUtils.js +5 -3
  20. package/lib/GraphQL/transformers/mutation.js +2 -2
  21. package/lib/GraphQL/transformers/query.js +3 -3
  22. package/lib/LiveQuery/ParseCloudCodePublisher.js +11 -1
  23. package/lib/LiveQuery/ParseLiveQueryServer.js +78 -17
  24. package/lib/LiveQuery/ParseWebSocketServer.js +8 -2
  25. package/lib/LiveQuery/SessionTokenCache.js +2 -2
  26. package/lib/Options/Definitions.js +55 -38
  27. package/lib/Options/docs.js +19 -2
  28. package/lib/Options/index.js +1 -1
  29. package/lib/RestWrite.js +33 -3
  30. package/lib/Routers/FilesRouter.js +23 -14
  31. package/lib/SchemaMigrations/Migrations.js +1 -1
  32. package/lib/cloud-code/Parse.Cloud.js +36 -16
  33. package/lib/triggers.js +7 -18
  34. package/package.json +34 -34
package/README.md CHANGED
@@ -7,8 +7,8 @@
7
7
  [![Coverage](https://img.shields.io/codecov/c/github/parse-community/parse-server/alpha.svg)](https://codecov.io/github/parse-community/parse-server?branch=alpha)
8
8
  [![auto-release](https://img.shields.io/badge/%F0%9F%9A%80-auto--release-9e34eb.svg)](https://github.com/parse-community/parse-dashboard/releases)
9
9
 
10
- [![Node Version](https://img.shields.io/badge/nodejs-12,_14,_16-green.svg?logo=node.js&style=flat)](https://nodejs.org)
11
- [![MongoDB Version](https://img.shields.io/badge/mongodb-4.0,_4.2,_4.4,_5.0-green.svg?logo=mongodb&style=flat)](https://www.mongodb.com)
10
+ [![Node Version](https://img.shields.io/badge/nodejs-12,_14,_16,_17,_18-green.svg?logo=node.js&style=flat)](https://nodejs.org)
11
+ [![MongoDB Version](https://img.shields.io/badge/mongodb-4.0,_4.2,_4.4,_5.0,_5.1,_5.2-green.svg?logo=mongodb&style=flat)](https://www.mongodb.com)
12
12
  [![Postgres Version](https://img.shields.io/badge/postgresql-11,_12,_13,_14-green.svg?logo=postgresql&style=flat)](https://www.postgresql.org)
13
13
 
14
14
  [![npm latest version](https://img.shields.io/npm/v/parse-server/latest.svg)](https://www.npmjs.com/package/parse-server)
@@ -20,6 +20,7 @@
20
20
  [![License][license-svg]][license-link]
21
21
  [![Forum](https://img.shields.io/discourse/https/community.parseplatform.org/topics.svg)](https://community.parseplatform.org/c/parse-server)
22
22
  [![Twitter](https://img.shields.io/twitter/follow/ParsePlatform.svg?label=Follow&style=social)](https://twitter.com/intent/follow?screen_name=ParsePlatform)
23
+ [![Chat](https://img.shields.io/badge/Chat-Join!-%23fff?style=social&logo=slack)](https://chat.parseplatform.org)
23
24
 
24
25
  ---
25
26
 
@@ -41,6 +42,8 @@ A big *thank you* 🙏 to our [sponsors](#sponsors) and [backers](#backers) who
41
42
 
42
43
  ---
43
44
 
45
+ - [Flavors & Branches](#flavors--branches)
46
+ - [Long Term Support](#long-term-support)
44
47
  - [Getting Started](#getting-started)
45
48
  - [Running Parse Server](#running-parse-server)
46
49
  - [Compatibility](#compatibility)
@@ -88,13 +91,25 @@ A big *thank you* 🙏 to our [sponsors](#sponsors) and [backers](#backers) who
88
91
  - [Using automatically generated operations](#using-automatically-generated-operations)
89
92
  - [Customizing your GraphQL Schema](#customizing-your-graphql-schema)
90
93
  - [Learning more](#learning-more)
91
- - [Upgrading to 3.0.0](#upgrading-to-300)
92
- - [Want to ride the bleeding edge?](#want-to-ride-the-bleeding-edge)
94
+ - [Upgrading to Parse Server 3.0](#upgrading-to-parse-server-30)
93
95
  - [Contributing](#contributing)
94
96
  - [Contributors](#contributors)
95
97
  - [Sponsors](#sponsors)
96
98
  - [Backers](#backers)
97
99
 
100
+ # Flavors & Branches
101
+
102
+ Parse Server is available in different flavors on different branches:
103
+
104
+ - The main branches are [release][log_release], [beta][log_beta] and [alpha][log_alpha]. See the [changelog overview](CHANGELOG.md) for details.
105
+ - The long-term-support (LTS) branches are named `release-<version>.x.x`, for example `release-4.x.x`. LTS branches do not have pre-release branches.
106
+
107
+ ## Long Term Support
108
+
109
+ Long-Term-Support (LTS) is provided for the previous Parse Server major version. For example, Parse Server 4.x will receive security updates until Parse Server 5.x is superseded by Parse Server 6.x and becomes the new LTS version. While the current major version is published on branch `release`, a LTS version is published on branch `release-#.x.x`, for example `release-4.x.x` for the Parse Server 4.x LTS branch.
110
+
111
+ ⚠️ LTS versions are provided to help you transition as soon as possible to the current major version. While we aim to fix security vulnerabilities in the LTS version, our main focus is on developing the current major version and preparing the next major release. Therefore we may leave certain vulnerabilities up to the community to fix. Search for [pull requests with the specific LTS base branch](https://github.com/parse-community/parse-server/pulls?q=is%3Aopen+is%3Apr+base%3Arelease-4.x.x) to see the current open vulnerabilities for that LTS branch.
112
+
98
113
  # Getting Started
99
114
 
100
115
  The fastest and easiest way to get started is to run MongoDB and Parse Server locally.
@@ -110,27 +125,32 @@ Before you start make sure you have installed:
110
125
  ### Compatibility
111
126
 
112
127
  #### Node.js
128
+
113
129
  Parse Server is continuously tested with the most recent releases of Node.js to ensure compatibility. We follow the [Node.js Long Term Support plan](https://github.com/nodejs/Release) and only test against versions that are officially supported and have not reached their end-of-life date.
114
130
 
115
- | Version | Latest Version | End-of-Life | Compatible |
116
- |------------|----------------|-------------|--------------|
117
- | Node.js 12 | 12.22.7 | April 2022 | ✅ Yes |
118
- | Node.js 14 | 14.18.1 | April 2023 | ✅ Yes |
119
- | Node.js 16 | 16.13.0 | April 2024 | ✅ Yes |
120
- | Node.js 17 | 17.x | June 2022 | Not tested |
131
+ | Version | Latest Version | End-of-Life | Compatible |
132
+ |------------|----------------|-------------|------------|
133
+ | Node.js 12 | 12.22.11 | April 2022 | ✅ Yes |
134
+ | Node.js 14 | 14.19.1 | April 2023 | ✅ Yes |
135
+ | Node.js 16 | 16.14.2 | April 2024 | ✅ Yes |
136
+ | Node.js 17 | 17.9.0 | June 2022 | Yes |
137
+ | Node.js 18 | 18.1.0 | April 2025 | ✅ Yes |
121
138
 
122
139
  #### MongoDB
140
+
123
141
  Parse Server is continuously tested with the most recent releases of MongoDB to ensure compatibility. We follow the [MongoDB support schedule](https://www.mongodb.com/support-policy) and only test against versions that are officially supported and have not reached their end-of-life date.
124
142
 
125
- | Version | Latest Version | End-of-Life | Compatible |
126
- |-------------|----------------|--------------|------------|
127
- | MongoDB 4.0 | 4.0.27 | April 2022 | ✅ Yes |
128
- | MongoDB 4.2 | 4.2.17 | TBD | ✅ Yes |
129
- | MongoDB 4.4 | 4.4.10 | TBD | ✅ Yes |
130
- | MongoDB 5.0 | 5.0.3 | January 2024 | ✅ Yes |
131
- | MongoDB 5.1 | 5.1.0 | January 2024 | ✅ Yes |
143
+ | Version | Latest Version | End-of-Life | Compatible |
144
+ |-------------|----------------|-------------|------------|
145
+ | MongoDB 4.0 | 4.0.28 | April 2022 | ✅ Yes |
146
+ | MongoDB 4.2 | 4.2.19 | TBD | ✅ Yes |
147
+ | MongoDB 4.4 | 4.4.13 | TBD | ✅ Yes |
148
+ | MongoDB 5.0 | 5.0.6 | TBD | ✅ Yes |
149
+ | MongoDB 5.1 | 5.1.1 | TBD | ✅ Yes |
150
+ | MongoDB 5.2 | 5.2.1 | TBD | ✅ Yes |
132
151
 
133
152
  #### PostgreSQL
153
+
134
154
  Parse Server is continuously tested with the most recent releases of PostgreSQL and PostGIS to ensure compatibility, using [PostGIS docker images](https://registry.hub.docker.com/r/postgis/postgis/tags?page=1&ordering=last_updated). We follow the [PostgreSQL support schedule](https://www.postgresql.org/support/versioning) and [PostGIS support schedule](https://www.postgis.net/eol_policy/) and only test against versions that are officially supported and have not reached their end-of-life date. Due to the extensive PostgreSQL support duration of 5 years, Parse Server drops support if a version is older than 3.5 years and a newer version has been available for at least 2.5 years.
135
155
 
136
156
  | Version | PostGIS Version | End-of-Life | Parse Server Support End | Compatible |
@@ -141,6 +161,7 @@ Parse Server is continuously tested with the most recent releases of PostgreSQL
141
161
  | Postgres 14 | 3.2 | November 2026 | April 2025 | ✅ Yes |
142
162
 
143
163
  ### Locally
164
+
144
165
  ```bash
145
166
  $ npm install -g parse-server mongodb-runner
146
167
  $ mongodb-runner start
@@ -233,7 +254,6 @@ $ curl -X GET \
233
254
  }
234
255
  ]
235
256
  }
236
-
237
257
  ```
238
258
 
239
259
  To learn more about using saving and querying objects on Parse Server, check out the [Parse documentation](http://docs.parseplatform.org).
@@ -383,6 +403,7 @@ const server = ParseServer({
383
403
  ```
384
404
 
385
405
  ## Custom Routes
406
+
386
407
  **Caution, this is an experimental feature that may not be appropriate for production.**
387
408
 
388
409
  Custom routes allow to build user flows with webpages, similar to the existing password reset and email verification features. Custom routes are defined with the `pages` option in the Parse Server configuration:
@@ -415,6 +436,7 @@ The above route can be invoked by sending a `GET` request to:
415
436
  The `handler` receives the `request` and returns a `custom_page.html` webpage from the `pages.pagesPath` directory as response. The advantage of building a custom route this way is that it automatically makes use of Parse Server's built-in capabilities, such as [page localization](#pages) and [dynamic placeholders](#dynamic-placeholders).
416
437
 
417
438
  ### Reserved Paths
439
+
418
440
  The following paths are already used by Parse Server's built-in features and are therefore not available for custom routes. Custom routes with an identical combination of `path` and `method` are ignored.
419
441
 
420
442
  | Path | HTTP Method | Feature |
@@ -510,6 +532,7 @@ Identical requests are identified by their request header `X-Parse-Request-Id`.
510
532
  Deduplication is only done for object creation and update (`POST` and `PUT` requests). Deduplication is not done for object finding and deletion (`GET` and `DELETE` requests), as these operations are already idempotent by definition.
511
533
 
512
534
  ### Configuration example <!-- omit in toc -->
535
+
513
536
  ```
514
537
  let api = new ParseServer({
515
538
  idempotencyOptions: {
@@ -518,6 +541,7 @@ let api = new ParseServer({
518
541
  }
519
542
  }
520
543
  ```
544
+
521
545
  ### Parameters <!-- omit in toc -->
522
546
 
523
547
  | Parameter | Optional | Type | Default value | Example values | Environment variable | Description |
@@ -550,6 +574,7 @@ Assuming the script above is named, `parse_idempotency_delete_expired_records.sh
550
574
  ## Localization
551
575
 
552
576
  ### Pages
577
+
553
578
  **Caution, this is an experimental feature that may not be appropriate for production.**
554
579
 
555
580
  Custom pages as well as feature pages (e.g. password reset, email verification) can be localized with the `pages` option in the Parse Server configuration:
@@ -1093,37 +1118,15 @@ You also have a very powerful tool inside your GraphQL Playground. Please look a
1093
1118
 
1094
1119
  Additionally, the [GraphQL Learn Section](https://graphql.org/learn/) is a very good source to learn more about the power of the GraphQL language.
1095
1120
 
1096
- # Upgrading to 3.0.0
1097
-
1098
- Starting 3.0.0, parse-server uses the JS SDK version 2.0.
1099
- In short, parse SDK v2.0 removes the backbone style callbacks as well as the Parse.Promise object in favor of native promises.
1100
- All the Cloud Code interfaces also have been updated to reflect those changes, and all backbone style response objects are removed and replaced by Promise style resolution.
1101
-
1102
- We have written up a [migration guide](3.0.0.md), hoping this will help you transition to the next major release.
1121
+ # Upgrading to Parse Server 3.0
1103
1122
 
1104
- # Want to ride the bleeding edge?
1105
-
1106
- It is recommend to use builds deployed npm for many reasons, but if you want to use
1107
- the latest not-yet-released version of parse-server, you can do so by depending
1108
- directly on this branch:
1109
-
1110
- ```
1111
- npm install parse-community/parse-server.git#master
1112
- ```
1113
-
1114
- ## Experimenting <!-- omit in toc -->
1115
-
1116
- You can also use your own forks, and work in progress branches by specifying them:
1117
-
1118
- ```
1119
- npm install github:myUsername/parse-server#my-awesome-feature
1120
- ```
1123
+ Starting Parse Server 3.0, Parse Server uses the Parse JavaScript SDK 2.0. In short, the Parse JavaScript SDK 2.0 removes the backbone style callbacks as well as the `Parse.Promise` object in favor of native promises. All the Cloud Code interfaces also have been updated to reflect those changes, and all backbone style response objects are removed and replaced by promise style resolution.
1121
1124
 
1122
- And don't forget, if you plan to deploy it remotely, you should run `npm install` with the `--save` option.
1125
+ We have written up a [migration guide](3.0.0.md) to help you transition to the next major release.
1123
1126
 
1124
1127
  # Contributing
1125
1128
 
1126
- We really want Parse to be yours, to see it grow and thrive in the open source community. Please see the [Contributing to Parse Server guide](CONTRIBUTING.md).
1129
+ Please see the [Contributing Guide](CONTRIBUTING.md).
1127
1130
 
1128
1131
  # Contributors
1129
1132
 
@@ -1179,3 +1182,6 @@ As of April 5, 2017, Parse, LLC has transferred this code to the parse-community
1179
1182
  [license-svg]: https://img.shields.io/badge/license-BSD-lightgrey.svg
1180
1183
  [license-link]: LICENSE
1181
1184
  [open-collective-link]: https://opencollective.com/parse-server
1185
+ [log_release]: https://github.com/parse-community/parse-server/blob/release/changelogs/CHANGELOG_release.md
1186
+ [log_beta]: https://github.com/parse-community/parse-server/blob/beta/changelogs/CHANGELOG_beta.md
1187
+ [log_alpha]: https://github.com/parse-community/parse-server/blob/alpha/changelogs/CHANGELOG_alpha.md
@@ -20,21 +20,20 @@ const crypto = require('crypto');
20
20
 
21
21
  const https = require('https');
22
22
 
23
+ const {
24
+ pki
25
+ } = require('node-forge');
26
+
27
+ const ca = {
28
+ cert: null,
29
+ url: null
30
+ };
23
31
  const cache = {}; // (publicKey -> cert) cache
24
32
 
25
33
  function verifyPublicKeyUrl(publicKeyUrl) {
26
34
  try {
27
- const parsedUrl = new URL(publicKeyUrl);
28
-
29
- if (parsedUrl.protocol !== 'https:') {
30
- return false;
31
- }
32
-
33
- const hostnameParts = parsedUrl.hostname.split('.');
34
- const length = hostnameParts.length;
35
- const domainParts = hostnameParts.slice(length - 2, length);
36
- const domain = domainParts.join('.');
37
- return domain === 'apple.com';
35
+ const regex = /^https:\/\/(?:[-_A-Za-z0-9]+\.){0,}apple\.com\/.*\.cer$/;
36
+ return regex.test(publicKeyUrl);
38
37
  } catch (error) {
39
38
  return false;
40
39
  }
@@ -48,7 +47,7 @@ function convertX509CertToPEM(X509Cert) {
48
47
  return pemPreFix + certBody + pemPostFix;
49
48
  }
50
49
 
51
- function getAppleCertificate(publicKeyUrl) {
50
+ async function getAppleCertificate(publicKeyUrl) {
52
51
  if (!verifyPublicKeyUrl(publicKeyUrl)) {
53
52
  throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `Apple Game Center - invalid publicKeyUrl: ${publicKeyUrl}`);
54
53
  }
@@ -57,28 +56,66 @@ function getAppleCertificate(publicKeyUrl) {
57
56
  return cache[publicKeyUrl];
58
57
  }
59
58
 
59
+ const url = new URL(publicKeyUrl);
60
+ const headOptions = {
61
+ hostname: url.hostname,
62
+ path: url.pathname,
63
+ method: 'HEAD'
64
+ };
65
+ const cert_headers = await new Promise((resolve, reject) => https.get(headOptions, res => resolve(res.headers)).on('error', reject));
66
+ const validContentTypes = ['application/x-x509-ca-cert', 'application/pkix-cert'];
67
+
68
+ if (!validContentTypes.includes(cert_headers['content-type']) || cert_headers['content-length'] == null || cert_headers['content-length'] > 10000) {
69
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `Apple Game Center - invalid publicKeyUrl: ${publicKeyUrl}`);
70
+ }
71
+
72
+ const {
73
+ certificate,
74
+ headers
75
+ } = await getCertificate(publicKeyUrl);
76
+
77
+ if (headers['cache-control']) {
78
+ const expire = headers['cache-control'].match(/max-age=([0-9]+)/);
79
+
80
+ if (expire) {
81
+ cache[publicKeyUrl] = certificate; // we'll expire the cache entry later, as per max-age
82
+
83
+ setTimeout(() => {
84
+ delete cache[publicKeyUrl];
85
+ }, parseInt(expire[1], 10) * 1000);
86
+ }
87
+ }
88
+
89
+ return verifyPublicKeyIssuer(certificate, publicKeyUrl);
90
+ }
91
+
92
+ function getCertificate(url, buffer) {
60
93
  return new Promise((resolve, reject) => {
61
- https.get(publicKeyUrl, res => {
62
- let data = '';
94
+ https.get(url, res => {
95
+ const data = [];
63
96
  res.on('data', chunk => {
64
- data += chunk.toString('base64');
97
+ data.push(chunk);
65
98
  });
66
99
  res.on('end', () => {
67
- const cert = convertX509CertToPEM(data);
68
-
69
- if (res.headers['cache-control']) {
70
- var expire = res.headers['cache-control'].match(/max-age=([0-9]+)/);
100
+ if (buffer) {
101
+ resolve({
102
+ certificate: Buffer.concat(data),
103
+ headers: res.headers
104
+ });
105
+ return;
106
+ }
71
107
 
72
- if (expire) {
73
- cache[publicKeyUrl] = cert; // we'll expire the cache entry later, as per max-age
108
+ let cert = '';
74
109
 
75
- setTimeout(() => {
76
- delete cache[publicKeyUrl];
77
- }, parseInt(expire[1], 10) * 1000);
78
- }
110
+ for (const chunk of data) {
111
+ cert += chunk.toString('base64');
79
112
  }
80
113
 
81
- resolve(cert);
114
+ const certificate = convertX509CertToPEM(cert);
115
+ resolve({
116
+ certificate,
117
+ headers: res.headers
118
+ });
82
119
  });
83
120
  }).on('error', reject);
84
121
  });
@@ -103,6 +140,24 @@ function verifySignature(publicKey, authData) {
103
140
  if (!verifier.verify(publicKey, authData.signature, 'base64')) {
104
141
  throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Apple Game Center - invalid signature');
105
142
  }
143
+ }
144
+
145
+ function verifyPublicKeyIssuer(cert, publicKeyUrl) {
146
+ const publicKeyCert = pki.certificateFromPem(cert);
147
+
148
+ if (!ca.cert) {
149
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Apple Game Center auth adapter parameter `rootCertificateURL` is invalid.');
150
+ }
151
+
152
+ try {
153
+ if (!ca.cert.verify(publicKeyCert)) {
154
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `Apple Game Center - invalid publicKeyUrl: ${publicKeyUrl}`);
155
+ }
156
+ } catch (e) {
157
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `Apple Game Center - invalid publicKeyUrl: ${publicKeyUrl}`);
158
+ }
159
+
160
+ return cert;
106
161
  } // Returns a promise that fulfills if this user id is valid.
107
162
 
108
163
 
@@ -117,12 +172,31 @@ async function validateAuthData(authData) {
117
172
  } // Returns a promise that fulfills if this app id is valid.
118
173
 
119
174
 
120
- function validateAppId() {
121
- return Promise.resolve();
175
+ async function validateAppId(appIds, authData, options = {}) {
176
+ if (!options.rootCertificateUrl) {
177
+ options.rootCertificateUrl = 'https://cacerts.digicert.com/DigiCertTrustedG4CodeSigningRSA4096SHA3842021CA1.crt.pem';
178
+ }
179
+
180
+ if (ca.url === options.rootCertificateUrl) {
181
+ return;
182
+ }
183
+
184
+ const {
185
+ certificate,
186
+ headers
187
+ } = await getCertificate(options.rootCertificateUrl, true);
188
+
189
+ if (headers['content-type'] !== 'application/x-pem-file' || headers['content-length'] == null || headers['content-length'] > 10000) {
190
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Apple Game Center auth adapter parameter `rootCertificateURL` is invalid.');
191
+ }
192
+
193
+ ca.cert = pki.certificateFromPem(certificate);
194
+ ca.url = options.rootCertificateUrl;
122
195
  }
123
196
 
124
197
  module.exports = {
125
198
  validateAppId,
126
- validateAuthData
199
+ validateAuthData,
200
+ cache
127
201
  };
128
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2djZW50ZXIuanMiXSwibmFtZXMiOlsiUGFyc2UiLCJyZXF1aXJlIiwiY3J5cHRvIiwiaHR0cHMiLCJjYWNoZSIsInZlcmlmeVB1YmxpY0tleVVybCIsInB1YmxpY0tleVVybCIsInBhcnNlZFVybCIsIlVSTCIsInByb3RvY29sIiwiaG9zdG5hbWVQYXJ0cyIsImhvc3RuYW1lIiwic3BsaXQiLCJsZW5ndGgiLCJkb21haW5QYXJ0cyIsInNsaWNlIiwiZG9tYWluIiwiam9pbiIsImVycm9yIiwiY29udmVydFg1MDlDZXJ0VG9QRU0iLCJYNTA5Q2VydCIsInBlbVByZUZpeCIsInBlbVBvc3RGaXgiLCJiYXNlNjQiLCJjZXJ0Qm9keSIsIm1hdGNoIiwiUmVnRXhwIiwiZ2V0QXBwbGVDZXJ0aWZpY2F0ZSIsIkVycm9yIiwiT0JKRUNUX05PVF9GT1VORCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZ2V0IiwicmVzIiwiZGF0YSIsIm9uIiwiY2h1bmsiLCJ0b1N0cmluZyIsImNlcnQiLCJoZWFkZXJzIiwiZXhwaXJlIiwic2V0VGltZW91dCIsInBhcnNlSW50IiwiY29udmVydFRpbWVzdGFtcFRvQmlnRW5kaWFuIiwidGltZXN0YW1wIiwiYnVmZmVyIiwiQnVmZmVyIiwiYWxsb2MiLCJoaWdoIiwibG93Iiwid3JpdGVVSW50MzJCRSIsInZlcmlmeVNpZ25hdHVyZSIsInB1YmxpY0tleSIsImF1dGhEYXRhIiwidmVyaWZpZXIiLCJjcmVhdGVWZXJpZnkiLCJ1cGRhdGUiLCJwbGF5ZXJJZCIsImJ1bmRsZUlkIiwic2FsdCIsInZlcmlmeSIsInNpZ25hdHVyZSIsInZhbGlkYXRlQXV0aERhdGEiLCJpZCIsInZhbGlkYXRlQXBwSWQiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVB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Q1UsUUFBUSxDQUFDVCxTQUFWLENBQTNDO0FBQ0FVLEVBQUFBLFFBQVEsQ0FBQ0UsTUFBVCxDQUFnQkgsUUFBUSxDQUFDTSxJQUF6QixFQUErQixRQUEvQjs7QUFFQSxNQUFJLENBQUNMLFFBQVEsQ0FBQ00sTUFBVCxDQUFnQlIsU0FBaEIsRUFBMkJDLFFBQVEsQ0FBQ1EsU0FBcEMsRUFBK0MsUUFBL0MsQ0FBTCxFQUErRDtBQUM3RCxVQUFNLElBQUk5RCxLQUFLLENBQUM0QixLQUFWLENBQWdCNUIsS0FBSyxDQUFDNEIsS0FBTixDQUFZQyxnQkFBNUIsRUFBOEMsdUNBQTlDLENBQU47QUFDRDtBQUNGLEMsQ0FFRDs7O0FBQ0EsZUFBZWtDLGdCQUFmLENBQWdDVCxRQUFoQyxFQUEwQztBQUN4QyxNQUFJLENBQUNBLFFBQVEsQ0FBQ1UsRUFBZCxFQUFrQjtBQUNoQixVQUFNLElBQUloRSxLQUFLLENBQUM0QixLQUFWLENBQWdCNUIsS0FBSyxDQUFDNEIsS0FBTixDQUFZQyxnQkFBNUIsRUFBOEMseUNBQTlDLENBQU47QUFDRDs7QUFDRHlCLEVBQUFBLFFBQVEsQ0FBQ0ksUUFBVCxHQUFvQkosUUFBUSxDQUFDVSxFQUE3QjtBQUNBLFFBQU1YLFNBQVMsR0FBRyxNQUFNMUIsbUJBQW1CLENBQUMyQixRQUFRLENBQUNoRCxZQUFWLENBQTNDO0FBQ0EsU0FBTzhDLGVBQWUsQ0FBQ0MsU0FBRCxFQUFZQyxRQUFaLENBQXRCO0FBQ0QsQyxDQUVEOzs7QUFDQSxTQUFTVyxhQUFULEdBQXlCO0FBQ3ZCLFNBQU9uQyxPQUFPLENBQUNDLE9BQVIsRUFBUDtBQUNEOztBQUVEbUMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCO0FBQ2ZGLEVBQUFBLGFBRGU7QUFFZkYsRUFBQUE7QUFGZSxDQUFqQiIsInNvdXJjZXNDb250ZW50IjpbIi8qIEFwcGxlIEdhbWUgQ2VudGVyIEF1dGhcbmh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL2dhbWVraXQvZ2tsb2NhbHBsYXllci8xNTE1NDA3LWdlbmVyYXRlaWRlbnRpdHl2ZXJpZmljYXRpb25zaWduI2Rpc2N1c3Npb25cblxuY29uc3QgYXV0aERhdGEgPSB7XG4gIHB1YmxpY0tleVVybDogJ2h0dHBzOi8vdmFsaWQuYXBwbGUuY29tL3B1YmxpYy90aW1lb3V0LmNlcicsXG4gIHRpbWVzdGFtcDogMTQ2MDk4MTQyMTMwMyxcbiAgc2lnbmF0dXJlOiAnUG9Ed2YzOURDTjQ2NEI0OWpKQ1UwZDlZMEonLFxuICBzYWx0OiAnc2FsdFNUPT0nLFxuICBidW5kbGVJZDogJ2NvbS52YWxpZC5hcHAnXG4gIGlkOiAncGxheWVySWQnLFxufTtcbiovXG5cbmNvbnN0IHsgUGFyc2UgfSA9IHJlcXVpcmUoJ3BhcnNlL25vZGUnKTtcbmNvbnN0IGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuY29uc3QgaHR0cHMgPSByZXF1aXJlKCdodHRwcycpO1xuXG5jb25zdCBjYWNoZSA9IHt9OyAvLyAocHVibGljS2V5IC0+IGNlcnQpIGNhY2hlXG5cbmZ1bmN0aW9uIHZlcmlmeVB1YmxpY0tleVVybChwdWJsaWNLZXlVcmwpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHB1YmxpY0tleVVybCk7XG4gICAgaWYgKHBhcnNlZFVybC5wcm90b2NvbCAhPT0gJ2h0dHBzOicpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaG9zdG5hbWVQYXJ0cyA9IHBhcnNlZFVybC5ob3N0bmFtZS5zcGxpdCgnLicpO1xuICAgIGNvbnN0IGxlbmd0aCA9IGhvc3RuYW1lUGFydHMubGVuZ3RoO1xuICAgIGNvbnN0IGRvbWFpblBhcnRzID0gaG9zdG5hbWVQYXJ0cy5zbGljZShsZW5ndGggLSAyLCBsZW5ndGgpO1xuICAgIGNvbnN0IGRvbWFpbiA9IGRvbWFpblBhcnRzLmpvaW4oJy4nKTtcbiAgICByZXR1cm4gZG9tYWluID09PSAnYXBwbGUuY29tJztcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29udmVydFg1MDlDZXJ0VG9QRU0oWDUwOUNlcnQpIHtcbiAgY29uc3QgcGVtUHJlRml4ID0gJy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxcbic7XG4gIGNvbnN0IHBlbVBvc3RGaXggPSAnLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLSc7XG5cbiAgY29uc3QgYmFzZTY0ID0gWDUwOUNlcnQ7XG4gIGNvbnN0IGNlcnRCb2R5ID0gYmFzZTY0Lm1hdGNoKG5ldyBSZWdFeHAoJy57MCw2NH0nLCAnZycpKS5qb2luKCdcXG4nKTtcblxuICByZXR1cm4gcGVtUHJlRml4ICsgY2VydEJvZHkgKyBwZW1Qb3N0Rml4O1xufVxuXG5mdW5jdGlvbiBnZXRBcHBsZUNlcnRpZmljYXRlKHB1YmxpY0tleVVybCkge1xuICBpZiAoIXZlcmlmeVB1YmxpY0tleVVybChwdWJsaWNLZXlVcmwpKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgIGBBcHBsZSBHYW1lIENlbnRlciAtIGludmFsaWQgcHVibGljS2V5VXJsOiAke3B1YmxpY0tleVVybH1gXG4gICAgKTtcbiAgfVxuICBpZiAoY2FjaGVbcHVibGljS2V5VXJsXSkge1xuICAgIHJldHVybiBjYWNoZVtwdWJsaWNLZXlVcmxdO1xuICB9XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgaHR0cHNcbiAgICAgIC5nZXQocHVibGljS2V5VXJsLCByZXMgPT4ge1xuICAgICAgICBsZXQgZGF0YSA9ICcnO1xuICAgICAgICByZXMub24oJ2RhdGEnLCBjaHVuayA9PiB7XG4gICAgICAgICAgZGF0YSArPSBjaHVuay50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXMub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBjZXJ0ID0gY29udmVydFg1MDlDZXJ0VG9QRU0oZGF0YSk7XG4gICAgICAgICAgaWYgKHJlcy5oZWFkZXJzWydjYWNoZS1jb250cm9sJ10pIHtcbiAgICAgICAgICAgIHZhciBleHBpcmUgPSByZXMuaGVhZGVyc1snY2FjaGUtY29udHJvbCddLm1hdGNoKC9tYXgtYWdlPShbMC05XSspLyk7XG4gICAgICAgICAgICBpZiAoZXhwaXJlKSB7XG4gICAgICAgICAgICAgIGNhY2hlW3B1YmxpY0tleVVybF0gPSBjZXJ0O1xuICAgICAgICAgICAgICAvLyB3ZSdsbCBleHBpcmUgdGhlIGNhY2hlIGVudHJ5IGxhdGVyLCBhcyBwZXIgbWF4LWFnZVxuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVbcHVibGljS2V5VXJsXTtcbiAgICAgICAgICAgICAgfSwgcGFyc2VJbnQoZXhwaXJlWzFdLCAxMCkgKiAxMDAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZShjZXJ0KTtcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VGltZXN0YW1wVG9CaWdFbmRpYW4odGltZXN0YW1wKSB7XG4gIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg4KTtcblxuICBjb25zdCBoaWdoID0gfn4odGltZXN0YW1wIC8gMHhmZmZmZmZmZik7XG4gIGNvbnN0IGxvdyA9IHRpbWVzdGFtcCAlICgweGZmZmZmZmZmICsgMHgxKTtcblxuICBidWZmZXIud3JpdGVVSW50MzJCRShwYXJzZUludChoaWdoLCAxMCksIDApO1xuICBidWZmZXIud3JpdGVVSW50MzJCRShwYXJzZUludChsb3csIDEwKSwgNCk7XG5cbiAgcmV0dXJuIGJ1ZmZlcjtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5U2lnbmF0dXJlKHB1YmxpY0tleSwgYXV0aERhdGEpIHtcbiAgY29uc3QgdmVyaWZpZXIgPSBjcnlwdG8uY3JlYXRlVmVyaWZ5KCdzaGEyNTYnKTtcbiAgdmVyaWZpZXIudXBkYXRlKGF1dGhEYXRhLnBsYXllcklkLCAndXRmOCcpO1xuICB2ZXJpZmllci51cGRhdGUoYXV0aERhdGEuYnVuZGxlSWQsICd1dGY4Jyk7XG4gIHZlcmlmaWVyLnVwZGF0ZShjb252ZXJ0VGltZXN0YW1wVG9CaWdFbmRpYW4oYXV0aERhdGEudGltZXN0YW1wKSk7XG4gIHZlcmlmaWVyLnVwZGF0ZShhdXRoRGF0YS5zYWx0LCAnYmFzZTY0Jyk7XG5cbiAgaWYgKCF2ZXJpZmllci52ZXJpZnkocHVibGljS2V5LCBhdXRoRGF0YS5zaWduYXR1cmUsICdiYXNlNjQnKSkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnQXBwbGUgR2FtZSBDZW50ZXIgLSBpbnZhbGlkIHNpZ25hdHVyZScpO1xuICB9XG59XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgaWYgdGhpcyB1c2VyIGlkIGlzIHZhbGlkLlxuYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVBdXRoRGF0YShhdXRoRGF0YSkge1xuICBpZiAoIWF1dGhEYXRhLmlkKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdBcHBsZSBHYW1lIENlbnRlciAtIGF1dGhEYXRhIGlkIG1pc3NpbmcnKTtcbiAgfVxuICBhdXRoRGF0YS5wbGF5ZXJJZCA9IGF1dGhEYXRhLmlkO1xuICBjb25zdCBwdWJsaWNLZXkgPSBhd2FpdCBnZXRBcHBsZUNlcnRpZmljYXRlKGF1dGhEYXRhLnB1YmxpY0tleVVybCk7XG4gIHJldHVybiB2ZXJpZnlTaWduYXR1cmUocHVibGljS2V5LCBhdXRoRGF0YSk7XG59XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgaWYgdGhpcyBhcHAgaWQgaXMgdmFsaWQuXG5mdW5jdGlvbiB2YWxpZGF0ZUFwcElkKCkge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB2YWxpZGF0ZUFwcElkLFxuICB2YWxpZGF0ZUF1dGhEYXRhLFxufTtcbiJdfQ==
202
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2djZW50ZXIuanMiXSwibmFtZXMiOlsiUGFyc2UiLCJyZXF1aXJlIiwiY3J5cHRvIiwiaHR0cHMiLCJwa2kiLCJjYSIsImNlcnQiLCJ1cmwiLCJjYWNoZSIsInZlcmlmeVB1YmxpY0tleVVybCIsInB1YmxpY0tleVVybCIsInJlZ2V4IiwidGVzdCIsImVycm9yIiwiY29udmVydFg1MDlDZXJ0VG9QRU0iLCJYNTA5Q2VydCIsInBlbVByZUZpeCIsInBlbVBvc3RGaXgiLCJiYXNlNjQiLCJjZXJ0Qm9keSIsIm1hdGNoIiwiUmVnRXhwIiwiam9pbiIsImdldEFwcGxlQ2VydGlmaWNhdGUiLCJFcnJvciIsIk9CSkVDVF9OT1RfRk9VTkQiLCJVUkwiLCJoZWFkT3B0aW9ucyIsImhvc3RuYW1lIiwicGF0aCIsInBhdGhuYW1lIiwibWV0aG9kIiwiY2VydF9oZWFkZXJzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJnZXQiLCJyZXMiLCJoZWFkZXJzIiwib24iLCJ2YWxpZENvbnRlbnRUeXBlcyIsImluY2x1ZGVzIiwiY2VydGlmaWNhdGUiLCJnZXRDZXJ0aWZpY2F0ZSIsImV4cGlyZSIsInNldFRpbWVvdXQiLCJwYXJzZUludCIsInZlcmlmeVB1YmxpY0tleUlzc3VlciIsImJ1ZmZlciIsImRhdGEiLCJjaHVuayIsInB1c2giLCJCdWZmZXIiLCJjb25jYXQiLCJ0b1N0cmluZyIsImNvbnZlcnRUaW1lc3RhbXBUb0JpZ0VuZGlhbiIsInRpbWVzdGFtcCIsImFsbG9jIiwiaGlnaCIsImxvdyIsIndyaXRlVUludDMyQkUiLCJ2ZXJpZnlTaWduYXR1cmUiLCJwdWJsaWNLZXkiLCJhdXRoRGF0YSIsInZlcmlmaWVyIiwiY3JlYXRlVmVyaWZ5IiwidXBkYXRlIiwicGxheWVySWQiLCJidW5kbGVJZCIsInNhbHQiLCJ2ZXJpZnkiLCJzaWduYXR1cmUiLCJwdWJsaWNLZXlDZXJ0IiwiY2VydGlmaWNhdGVGcm9tUGVtIiwiZSIsInZhbGlkYXRlQXV0aERhdGEiLCJpZCIsInZhbGlkYXRlQXBwSWQiLCJhcHBJZHMiLCJvcHRpb25zIiwicm9vdENlcnRpZmljYXRlVXJsIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxNQUFNO0FBQUVBLEVBQUFBO0FBQUYsSUFBWUMsT0FBTyxDQUFDLFlBQUQsQ0FBekI7O0FBQ0EsTUFBTUMsTUFBTSxHQUFHRCxPQUFPLENBQUMsUUFBRCxDQUF0Qjs7QUFDQSxNQUFNRSxLQUFLLEdBQUdGLE9BQU8sQ0FBQyxPQUFELENBQXJCOztBQUNBLE1BQU07QUFBRUcsRUFBQUE7QUFBRixJQUFVSCxPQUFPLENBQUMsWUFBRCxDQUF2Qjs7QUFDQSxNQUFNSSxFQUFFLEdBQUc7QUFBRUMsRUFBQUEsSUFBSSxFQUFFLElBQVI7QUFBY0MsRUFBQUEsR0FBRyxFQUFFO0FBQW5CLENBQVg7QUFDQSxNQUFNQyxLQUFLLEdBQUcsRUFBZCxDLENBQWtCOztBQUVsQixTQUFTQyxrQkFBVCxDQUE0QkMsWUFBNUIsRUFBMEM7QUFDeEMsTUFBSTtBQUNGLFVBQU1DLEtBQUssR0FBRyx5REFBZDtBQUNBLFdBQU9BLEtBQUssQ0FBQ0MsSUFBTixDQUFXRixZQUFYLENBQVA7QUFDRCxHQUhELENBR0UsT0FBT0csS0FBUCxFQUFjO0FBQ2QsV0FBTyxLQUFQO0FBQ0Q7QUFDRjs7QUFFRCxTQUFTQyxvQkFBVCxDQUE4QkMsUUFBOUIsRUFBd0M7QUFDdEMsUUFBTUMsU0FBUyxHQUFHLCtCQUFsQjtBQUNBLFFBQU1DLFVBQVUsR0FBRywyQkFBbkI7QUFFQSxRQUFNQyxNQUFNLEdBQUdILFFBQWY7QUFDQSxRQUFNSSxRQUFRLEdBQUdELE1BQU0sQ0FBQ0UsS0FBUCxDQUFhLElBQUlDLE1BQUosQ0FBVyxTQUFYLEVBQXNCLEdBQXRCLENBQWIsRUFBeUNDLElBQXpDLENBQThDLElBQTlDLENBQWpC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QWYsTUFBMkIsTUFBTUssY0FBYyxDQUFDb0MsT0FBTyxDQUFDQyxrQkFBVCxFQUE2QixJQUE3QixDQUFyRDs7QUFDQSxNQUNFMUMsT0FBTyxDQUFDLGNBQUQsQ0FBUCxLQUE0Qix3QkFBNUIsSUFDQUEsT0FBTyxDQUFDLGdCQUFELENBQVAsSUFBNkIsSUFEN0IsSUFFQUEsT0FBTyxDQUFDLGdCQUFELENBQVAsR0FBNEIsS0FIOUIsRUFJRTtBQUNBLFVBQU0sSUFBSXRDLEtBQUssQ0FBQ3dCLEtBQVYsQ0FDSnhCLEtBQUssQ0FBQ3dCLEtBQU4sQ0FBWUMsZ0JBRFIsRUFFSiwyRUFGSSxDQUFOO0FBSUQ7O0FBQ0RwQixFQUFBQSxFQUFFLENBQUNDLElBQUgsR0FBVUYsR0FBRyxDQUFDcUUsa0JBQUosQ0FBdUIvQixXQUF2QixDQUFWO0FBQ0FyQyxFQUFBQSxFQUFFLENBQUNFLEdBQUgsR0FBU3dFLE9BQU8sQ0FBQ0Msa0JBQWpCO0FBQ0Q7O0FBRURDLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjtBQUNmTCxFQUFBQSxhQURlO0FBRWZGLEVBQUFBLGdCQUZlO0FBR2ZuRSxFQUFBQTtBQUhlLENBQWpCIiwic291cmNlc0NvbnRlbnQiOlsiLyogQXBwbGUgR2FtZSBDZW50ZXIgQXV0aFxuaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24vZ2FtZWtpdC9na2xvY2FscGxheWVyLzE1MTU0MDctZ2VuZXJhdGVpZGVudGl0eXZlcmlmaWNhdGlvbnNpZ24jZGlzY3Vzc2lvblxuXG5jb25zdCBhdXRoRGF0YSA9IHtcbiAgcHVibGljS2V5VXJsOiAnaHR0cHM6Ly92YWxpZC5hcHBsZS5jb20vcHVibGljL3RpbWVvdXQuY2VyJyxcbiAgdGltZXN0YW1wOiAxNDYwOTgxNDIxMzAzLFxuICBzaWduYXR1cmU6ICdQb0R3ZjM5RENONDY0QjQ5akpDVTBkOVkwSicsXG4gIHNhbHQ6ICdzYWx0U1Q9PScsXG4gIGJ1bmRsZUlkOiAnY29tLnZhbGlkLmFwcCdcbiAgaWQ6ICdwbGF5ZXJJZCcsXG59O1xuKi9cblxuY29uc3QgeyBQYXJzZSB9ID0gcmVxdWlyZSgncGFyc2Uvbm9kZScpO1xuY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5jb25zdCBodHRwcyA9IHJlcXVpcmUoJ2h0dHBzJyk7XG5jb25zdCB7IHBraSB9ID0gcmVxdWlyZSgnbm9kZS1mb3JnZScpO1xuY29uc3QgY2EgPSB7IGNlcnQ6IG51bGwsIHVybDogbnVsbCB9O1xuY29uc3QgY2FjaGUgPSB7fTsgLy8gKHB1YmxpY0tleSAtPiBjZXJ0KSBjYWNoZVxuXG5mdW5jdGlvbiB2ZXJpZnlQdWJsaWNLZXlVcmwocHVibGljS2V5VXJsKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVnZXggPSAvXmh0dHBzOlxcL1xcLyg/OlstX0EtWmEtejAtOV0rXFwuKXswLH1hcHBsZVxcLmNvbVxcLy4qXFwuY2VyJC87XG4gICAgcmV0dXJuIHJlZ2V4LnRlc3QocHVibGljS2V5VXJsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29udmVydFg1MDlDZXJ0VG9QRU0oWDUwOUNlcnQpIHtcbiAgY29uc3QgcGVtUHJlRml4ID0gJy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxcbic7XG4gIGNvbnN0IHBlbVBvc3RGaXggPSAnLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLSc7XG5cbiAgY29uc3QgYmFzZTY0ID0gWDUwOUNlcnQ7XG4gIGNvbnN0IGNlcnRCb2R5ID0gYmFzZTY0Lm1hdGNoKG5ldyBSZWdFeHAoJy57MCw2NH0nLCAnZycpKS5qb2luKCdcXG4nKTtcblxuICByZXR1cm4gcGVtUHJlRml4ICsgY2VydEJvZHkgKyBwZW1Qb3N0Rml4O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBcHBsZUNlcnRpZmljYXRlKHB1YmxpY0tleVVybCkge1xuICBpZiAoIXZlcmlmeVB1YmxpY0tleVVybChwdWJsaWNLZXlVcmwpKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgIGBBcHBsZSBHYW1lIENlbnRlciAtIGludmFsaWQgcHVibGljS2V5VXJsOiAke3B1YmxpY0tleVVybH1gXG4gICAgKTtcbiAgfVxuICBpZiAoY2FjaGVbcHVibGljS2V5VXJsXSkge1xuICAgIHJldHVybiBjYWNoZVtwdWJsaWNLZXlVcmxdO1xuICB9XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwocHVibGljS2V5VXJsKTtcbiAgY29uc3QgaGVhZE9wdGlvbnMgPSB7XG4gICAgaG9zdG5hbWU6IHVybC5ob3N0bmFtZSxcbiAgICBwYXRoOiB1cmwucGF0aG5hbWUsXG4gICAgbWV0aG9kOiAnSEVBRCcsXG4gIH07XG4gIGNvbnN0IGNlcnRfaGVhZGVycyA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAgaHR0cHMuZ2V0KGhlYWRPcHRpb25zLCByZXMgPT4gcmVzb2x2ZShyZXMuaGVhZGVycykpLm9uKCdlcnJvcicsIHJlamVjdClcbiAgKTtcbiAgY29uc3QgdmFsaWRDb250ZW50VHlwZXMgPSBbJ2FwcGxpY2F0aW9uL3gteDUwOS1jYS1jZXJ0JywgJ2FwcGxpY2F0aW9uL3BraXgtY2VydCddO1xuICBpZiAoXG4gICAgIXZhbGlkQ29udGVudFR5cGVzLmluY2x1ZGVzKGNlcnRfaGVhZGVyc1snY29udGVudC10eXBlJ10pIHx8XG4gICAgY2VydF9oZWFkZXJzWydjb250ZW50LWxlbmd0aCddID09IG51bGwgfHxcbiAgICBjZXJ0X2hlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10gPiAxMDAwMFxuICApIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgYEFwcGxlIEdhbWUgQ2VudGVyIC0gaW52YWxpZCBwdWJsaWNLZXlVcmw6ICR7cHVibGljS2V5VXJsfWBcbiAgICApO1xuICB9XG4gIGNvbnN0IHsgY2VydGlmaWNhdGUsIGhlYWRlcnMgfSA9IGF3YWl0IGdldENlcnRpZmljYXRlKHB1YmxpY0tleVVybCk7XG4gIGlmIChoZWFkZXJzWydjYWNoZS1jb250cm9sJ10pIHtcbiAgICBjb25zdCBleHBpcmUgPSBoZWFkZXJzWydjYWNoZS1jb250cm9sJ10ubWF0Y2goL21heC1hZ2U9KFswLTldKykvKTtcbiAgICBpZiAoZXhwaXJlKSB7XG4gICAgICBjYWNoZVtwdWJsaWNLZXlVcmxdID0gY2VydGlmaWNhdGU7XG4gICAgICAvLyB3ZSdsbCBleHBpcmUgdGhlIGNhY2hlIGVudHJ5IGxhdGVyLCBhcyBwZXIgbWF4LWFnZVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGRlbGV0ZSBjYWNoZVtwdWJsaWNLZXlVcmxdO1xuICAgICAgfSwgcGFyc2VJbnQoZXhwaXJlWzFdLCAxMCkgKiAxMDAwKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZlcmlmeVB1YmxpY0tleUlzc3VlcihjZXJ0aWZpY2F0ZSwgcHVibGljS2V5VXJsKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2VydGlmaWNhdGUodXJsLCBidWZmZXIpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBodHRwc1xuICAgICAgLmdldCh1cmwsIHJlcyA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBbXTtcbiAgICAgICAgcmVzLm9uKCdkYXRhJywgY2h1bmsgPT4ge1xuICAgICAgICAgIGRhdGEucHVzaChjaHVuayk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXMub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICBpZiAoYnVmZmVyKSB7XG4gICAgICAgICAgICByZXNvbHZlKHsgY2VydGlmaWNhdGU6IEJ1ZmZlci5jb25jYXQoZGF0YSksIGhlYWRlcnM6IHJlcy5oZWFkZXJzIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgY2VydCA9ICcnO1xuICAgICAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgZGF0YSkge1xuICAgICAgICAgICAgY2VydCArPSBjaHVuay50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGNlcnRpZmljYXRlID0gY29udmVydFg1MDlDZXJ0VG9QRU0oY2VydCk7XG4gICAgICAgICAgcmVzb2x2ZSh7IGNlcnRpZmljYXRlLCBoZWFkZXJzOiByZXMuaGVhZGVycyB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VGltZXN0YW1wVG9CaWdFbmRpYW4odGltZXN0YW1wKSB7XG4gIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg4KTtcblxuICBjb25zdCBoaWdoID0gfn4odGltZXN0YW1wIC8gMHhmZmZmZmZmZik7XG4gIGNvbnN0IGxvdyA9IHRpbWVzdGFtcCAlICgweGZmZmZmZmZmICsgMHgxKTtcblxuICBidWZmZXIud3JpdGVVSW50MzJCRShwYXJzZUludChoaWdoLCAxMCksIDApO1xuICBidWZmZXIud3JpdGVVSW50MzJCRShwYXJzZUludChsb3csIDEwKSwgNCk7XG5cbiAgcmV0dXJuIGJ1ZmZlcjtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5U2lnbmF0dXJlKHB1YmxpY0tleSwgYXV0aERhdGEpIHtcbiAgY29uc3QgdmVyaWZpZXIgPSBjcnlwdG8uY3JlYXRlVmVyaWZ5KCdzaGEyNTYnKTtcbiAgdmVyaWZpZXIudXBkYXRlKGF1dGhEYXRhLnBsYXllcklkLCAndXRmOCcpO1xuICB2ZXJpZmllci51cGRhdGUoYXV0aERhdGEuYnVuZGxlSWQsICd1dGY4Jyk7XG4gIHZlcmlmaWVyLnVwZGF0ZShjb252ZXJ0VGltZXN0YW1wVG9CaWdFbmRpYW4oYXV0aERhdGEudGltZXN0YW1wKSk7XG4gIHZlcmlmaWVyLnVwZGF0ZShhdXRoRGF0YS5zYWx0LCAnYmFzZTY0Jyk7XG5cbiAgaWYgKCF2ZXJpZmllci52ZXJpZnkocHVibGljS2V5LCBhdXRoRGF0YS5zaWduYXR1cmUsICdiYXNlNjQnKSkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnQXBwbGUgR2FtZSBDZW50ZXIgLSBpbnZhbGlkIHNpZ25hdHVyZScpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZlcmlmeVB1YmxpY0tleUlzc3VlcihjZXJ0LCBwdWJsaWNLZXlVcmwpIHtcbiAgY29uc3QgcHVibGljS2V5Q2VydCA9IHBraS5jZXJ0aWZpY2F0ZUZyb21QZW0oY2VydCk7XG4gIGlmICghY2EuY2VydCkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsXG4gICAgICAnQXBwbGUgR2FtZSBDZW50ZXIgYXV0aCBhZGFwdGVyIHBhcmFtZXRlciBgcm9vdENlcnRpZmljYXRlVVJMYCBpcyBpbnZhbGlkLidcbiAgICApO1xuICB9XG4gIHRyeSB7XG4gICAgaWYgKCFjYS5jZXJ0LnZlcmlmeShwdWJsaWNLZXlDZXJ0KSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgICBgQXBwbGUgR2FtZSBDZW50ZXIgLSBpbnZhbGlkIHB1YmxpY0tleVVybDogJHtwdWJsaWNLZXlVcmx9YFxuICAgICAgKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgYEFwcGxlIEdhbWUgQ2VudGVyIC0gaW52YWxpZCBwdWJsaWNLZXlVcmw6ICR7cHVibGljS2V5VXJsfWBcbiAgICApO1xuICB9XG4gIHJldHVybiBjZXJ0O1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmIHRoaXMgdXNlciBpZCBpcyB2YWxpZC5cbmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlQXV0aERhdGEoYXV0aERhdGEpIHtcbiAgaWYgKCFhdXRoRGF0YS5pZCkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnQXBwbGUgR2FtZSBDZW50ZXIgLSBhdXRoRGF0YSBpZCBtaXNzaW5nJyk7XG4gIH1cbiAgYXV0aERhdGEucGxheWVySWQgPSBhdXRoRGF0YS5pZDtcbiAgY29uc3QgcHVibGljS2V5ID0gYXdhaXQgZ2V0QXBwbGVDZXJ0aWZpY2F0ZShhdXRoRGF0YS5wdWJsaWNLZXlVcmwpO1xuICByZXR1cm4gdmVyaWZ5U2lnbmF0dXJlKHB1YmxpY0tleSwgYXV0aERhdGEpO1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmIHRoaXMgYXBwIGlkIGlzIHZhbGlkLlxuYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVBcHBJZChhcHBJZHMsIGF1dGhEYXRhLCBvcHRpb25zID0ge30pIHtcbiAgaWYgKCFvcHRpb25zLnJvb3RDZXJ0aWZpY2F0ZVVybCkge1xuICAgIG9wdGlvbnMucm9vdENlcnRpZmljYXRlVXJsID1cbiAgICAgICdodHRwczovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcnQucGVtJztcbiAgfVxuICBpZiAoY2EudXJsID09PSBvcHRpb25zLnJvb3RDZXJ0aWZpY2F0ZVVybCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB7IGNlcnRpZmljYXRlLCBoZWFkZXJzIH0gPSBhd2FpdCBnZXRDZXJ0aWZpY2F0ZShvcHRpb25zLnJvb3RDZXJ0aWZpY2F0ZVVybCwgdHJ1ZSk7XG4gIGlmIChcbiAgICBoZWFkZXJzWydjb250ZW50LXR5cGUnXSAhPT0gJ2FwcGxpY2F0aW9uL3gtcGVtLWZpbGUnIHx8XG4gICAgaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA9PSBudWxsIHx8XG4gICAgaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA+IDEwMDAwXG4gICkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsXG4gICAgICAnQXBwbGUgR2FtZSBDZW50ZXIgYXV0aCBhZGFwdGVyIHBhcmFtZXRlciBgcm9vdENlcnRpZmljYXRlVVJMYCBpcyBpbnZhbGlkLidcbiAgICApO1xuICB9XG4gIGNhLmNlcnQgPSBwa2kuY2VydGlmaWNhdGVGcm9tUGVtKGNlcnRpZmljYXRlKTtcbiAgY2EudXJsID0gb3B0aW9ucy5yb290Q2VydGlmaWNhdGVVcmw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB2YWxpZGF0ZUFwcElkLFxuICB2YWxpZGF0ZUF1dGhEYXRhLFxuICBjYWNoZSxcbn07XG4iXX0=
@@ -18,7 +18,7 @@ class LRUCache {
18
18
  }) {
19
19
  this.cache = new _lruCache.default({
20
20
  max: maxSize,
21
- maxAge: ttl
21
+ ttl
22
22
  });
23
23
  }
24
24
 
@@ -43,4 +43,4 @@ class LRUCache {
43
43
  exports.LRUCache = LRUCache;
44
44
  var _default = LRUCache;
45
45
  exports.default = _default;
46
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9DYWNoZS9MUlVDYWNoZS5qcyJdLCJuYW1lcyI6WyJMUlVDYWNoZSIsImNvbnN0cnVjdG9yIiwidHRsIiwiZGVmYXVsdHMiLCJjYWNoZVRUTCIsIm1heFNpemUiLCJjYWNoZU1heFNpemUiLCJjYWNoZSIsIkxSVSIsIm1heCIsIm1heEFnZSIsImdldCIsImtleSIsInB1dCIsInZhbHVlIiwic2V0IiwiZGVsIiwiY2xlYXIiLCJyZXNldCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOzs7O0FBRU8sTUFBTUEsUUFBTixDQUFlO0FBQ3BCQyxFQUFBQSxXQUFXLENBQUM7QUFBRUMsSUFBQUEsR0FBRyxHQUFHQyxrQkFBU0MsUUFBakI7QUFBMkJDLElBQUFBLE9BQU8sR0FBR0Ysa0JBQVNHO0FBQTlDLEdBQUQsRUFBK0Q7QUFDeEUsU0FBS0MsS0FBTCxHQUFhLElBQUlDLGlCQUFKLENBQVE7QUFDbkJDLE1BQUFBLEdBQUcsRUFBRUosT0FEYztBQUVuQkssTUFBQUEsTUFBTSxFQUFFUjtBQUZXLEtBQVIsQ0FBYjtBQUlEOztBQUVEUyxFQUFBQSxHQUFHLENBQUNDLEdBQUQsRUFBTTtBQUNQLFdBQU8sS0FBS0wsS0FBTCxDQUFXSSxHQUFYLENBQWVDLEdBQWYsS0FBdUIsSUFBOUI7QUFDRDs7QUFFREMsRUFBQUEsR0FBRyxDQUFDRCxHQUFELEVBQU1FLEtBQU4sRUFBYVosR0FBRyxHQUFHLEtBQUtBLEdBQXhCLEVBQTZCO0FBQzlCLFNBQUtLLEtBQUwsQ0FBV1EsR0FBWCxDQUFlSCxHQUFmLEVBQW9CRSxLQUFwQixFQUEyQlosR0FBM0I7QUFDRDs7QUFFRGMsRUFBQUEsR0FBRyxDQUFDSixHQUFELEVBQU07QUFDUCxTQUFLTCxLQUFMLENBQVdTLEdBQVgsQ0FBZUosR0FBZjtBQUNEOztBQUVESyxFQUFBQSxLQUFLLEdBQUc7QUFDTixTQUFLVixLQUFMLENBQVdXLEtBQVg7QUFDRDs7QUF0Qm1COzs7ZUF5QlBsQixRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExSVSBmcm9tICdscnUtY2FjaGUnO1xuaW1wb3J0IGRlZmF1bHRzIGZyb20gJy4uLy4uL2RlZmF1bHRzJztcblxuZXhwb3J0IGNsYXNzIExSVUNhY2hlIHtcbiAgY29uc3RydWN0b3IoeyB0dGwgPSBkZWZhdWx0cy5jYWNoZVRUTCwgbWF4U2l6ZSA9IGRlZmF1bHRzLmNhY2hlTWF4U2l6ZSB9KSB7XG4gICAgdGhpcy5jYWNoZSA9IG5ldyBMUlUoe1xuICAgICAgbWF4OiBtYXhTaXplLFxuICAgICAgbWF4QWdlOiB0dGwsXG4gICAgfSk7XG4gIH1cblxuICBnZXQoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KGtleSkgfHwgbnVsbDtcbiAgfVxuXG4gIHB1dChrZXksIHZhbHVlLCB0dGwgPSB0aGlzLnR0bCkge1xuICAgIHRoaXMuY2FjaGUuc2V0KGtleSwgdmFsdWUsIHR0bCk7XG4gIH1cblxuICBkZWwoa2V5KSB7XG4gICAgdGhpcy5jYWNoZS5kZWwoa2V5KTtcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuY2FjaGUucmVzZXQoKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMUlVDYWNoZTtcbiJdfQ==
46
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9DYWNoZS9MUlVDYWNoZS5qcyJdLCJuYW1lcyI6WyJMUlVDYWNoZSIsImNvbnN0cnVjdG9yIiwidHRsIiwiZGVmYXVsdHMiLCJjYWNoZVRUTCIsIm1heFNpemUiLCJjYWNoZU1heFNpemUiLCJjYWNoZSIsIkxSVSIsIm1heCIsImdldCIsImtleSIsInB1dCIsInZhbHVlIiwic2V0IiwiZGVsIiwiY2xlYXIiLCJyZXNldCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOzs7O0FBRU8sTUFBTUEsUUFBTixDQUFlO0FBQ3BCQyxFQUFBQSxXQUFXLENBQUM7QUFBRUMsSUFBQUEsR0FBRyxHQUFHQyxrQkFBU0MsUUFBakI7QUFBMkJDLElBQUFBLE9BQU8sR0FBR0Ysa0JBQVNHO0FBQTlDLEdBQUQsRUFBK0Q7QUFDeEUsU0FBS0MsS0FBTCxHQUFhLElBQUlDLGlCQUFKLENBQVE7QUFDbkJDLE1BQUFBLEdBQUcsRUFBRUosT0FEYztBQUVuQkgsTUFBQUE7QUFGbUIsS0FBUixDQUFiO0FBSUQ7O0FBRURRLEVBQUFBLEdBQUcsQ0FBQ0MsR0FBRCxFQUFNO0FBQ1AsV0FBTyxLQUFLSixLQUFMLENBQVdHLEdBQVgsQ0FBZUMsR0FBZixLQUF1QixJQUE5QjtBQUNEOztBQUVEQyxFQUFBQSxHQUFHLENBQUNELEdBQUQsRUFBTUUsS0FBTixFQUFhWCxHQUFHLEdBQUcsS0FBS0EsR0FBeEIsRUFBNkI7QUFDOUIsU0FBS0ssS0FBTCxDQUFXTyxHQUFYLENBQWVILEdBQWYsRUFBb0JFLEtBQXBCLEVBQTJCWCxHQUEzQjtBQUNEOztBQUVEYSxFQUFBQSxHQUFHLENBQUNKLEdBQUQsRUFBTTtBQUNQLFNBQUtKLEtBQUwsQ0FBV1EsR0FBWCxDQUFlSixHQUFmO0FBQ0Q7O0FBRURLLEVBQUFBLEtBQUssR0FBRztBQUNOLFNBQUtULEtBQUwsQ0FBV1UsS0FBWDtBQUNEOztBQXRCbUI7OztlQXlCUGpCLFEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTFJVIGZyb20gJ2xydS1jYWNoZSc7XG5pbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi4vLi4vZGVmYXVsdHMnO1xuXG5leHBvcnQgY2xhc3MgTFJVQ2FjaGUge1xuICBjb25zdHJ1Y3Rvcih7IHR0bCA9IGRlZmF1bHRzLmNhY2hlVFRMLCBtYXhTaXplID0gZGVmYXVsdHMuY2FjaGVNYXhTaXplIH0pIHtcbiAgICB0aGlzLmNhY2hlID0gbmV3IExSVSh7XG4gICAgICBtYXg6IG1heFNpemUsXG4gICAgICB0dGwsXG4gICAgfSk7XG4gIH1cblxuICBnZXQoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KGtleSkgfHwgbnVsbDtcbiAgfVxuXG4gIHB1dChrZXksIHZhbHVlLCB0dGwgPSB0aGlzLnR0bCkge1xuICAgIHRoaXMuY2FjaGUuc2V0KGtleSwgdmFsdWUsIHR0bCk7XG4gIH1cblxuICBkZWwoa2V5KSB7XG4gICAgdGhpcy5jYWNoZS5kZWwoa2V5KTtcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuY2FjaGUucmVzZXQoKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMUlVDYWNoZTtcbiJdfQ==