bx-rest 1.1.0 → 1.3.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.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,40 @@
7
7
  История до версии 1.0.0 здесь не восстанавливалась — смотрите `git log` для
8
8
  более ранних изменений.
9
9
 
10
+ ## [1.3.0] - 2026-10-28
11
+
12
+ ### Added
13
+
14
+ - `BXRestSettings.headers` — статичные HTTP-заголовки, которые прикладываются
15
+ к каждому запросу (например, `{ 'X-Bitrix-App': 'smart-process-pro' }`).
16
+ - `.withHeaders()` у Navvy-запросов — заголовки только для одного запроса,
17
+ поверх `BXRestSettings.headers`. Действуют и на batch-запросы `.resAll()`.
18
+ `BXRestRequest.post()`/`.get()` и `BXRest.batch()` принимают те же заголовки
19
+ последним необязательным аргументом.
20
+ - `Content-Type` библиотека по-прежнему выставляет сама — заголовками он не
21
+ перебивается.
22
+
23
+ ## [1.2.0] - 2026-10-28
24
+
25
+ ### Fixed
26
+
27
+ - `.res()` терял код и описание ошибки Bitrix, если портал отвечал со
28
+ статусом не 2xx — а так Bitrix отдаёт большинство ошибок (`expired_token`
29
+ — 401, `QUERY_LIMIT_EXCEEDED` — 503, `Not found` у `crm.*.get` — 400).
30
+ Вместо `Error("AxiosError: Request failed with status code 400")` теперь
31
+ приходит `BXRestApiError` с `error` и `error_description` — с
32
+ `throwOnApiError` и без него. Поддерживается и формат ошибок REST v3
33
+ (`{ error: { code, message } }`). Сетевые ошибки и ответы не от Bitrix
34
+ (например, HTML-страница прокси) по-прежнему приходят обычным `Error`.
35
+
36
+ ### Added
37
+
38
+ - У `BXRestApiError` появились поля `status` (HTTP-статус; `undefined`, если
39
+ ошибка пришла в теле ответа 2xx), `method` (REST-метод) и `cause` (исходная
40
+ ошибка axios с полным телом ответа в `cause.response.data`). Конструктор
41
+ принимает их третьим необязательным аргументом — существующие вызовы
42
+ `new BXRestApiError(error, error_description)` работают как раньше.
43
+
10
44
  ## [1.1.0] - 2026-10-09
11
45
 
12
46
  ### Fixed
package/README.en.md CHANGED
@@ -18,6 +18,7 @@ Also known as: Bitrix24 REST client, BX24 REST SDK, Bitrix24 API client, Bitrix
18
18
  - [Result modes](#result-modes)
19
19
  - [Authentication and OAuth2](#authentication-and-oauth2)
20
20
  - [`withCredentials`](#withcredentials)
21
+ - [HTTP headers](#http-headers)
21
22
  - [Error handling](#error-handling)
22
23
  - [Usage in Angular](#usage-in-angular)
23
24
  - [SessionKeyServices](#sessionkeyservices)
@@ -154,18 +155,57 @@ BXRestSettings.update({
154
155
  })
155
156
  ```
156
157
 
158
+ ## HTTP headers
159
+
160
+ Put static headers that every request needs into `BXRestSettings.headers`:
161
+
162
+ ```typescript
163
+ BXRestSettings.update({
164
+ headers: {
165
+ 'X-Bitrix-App': 'smart-process-pro'
166
+ }
167
+ })
168
+ ```
169
+
170
+ They are attached to every request the library makes, including the `.resAll()` batch requests, and, like the other settings, are read at subscribe time. `update()` merges settings only at the top level, so `headers` is replaced as a whole — to add a header to the ones already set, pass the full set.
171
+
172
+ For a single request, use `.withHeaders()`. Its headers are applied on top of `BXRestSettings.headers`; when a name matches (case-insensitively), the `.withHeaders()` value wins. It applies to `.res()`, `.resAll()`, `.resVanilla()` and `.mapForVanilla()`:
173
+
174
+ ```typescript
175
+ const deals = await firstValueFrom(
176
+ bxRest.crm.deal.list({ select: ['ID', 'TITLE'], filter: {}, start: 0 })
177
+ .withHeaders({ 'X-Request-Source': 'report' })
178
+ .resAll()
179
+ )
180
+ ```
181
+
182
+ The library always sets `Content-Type` itself (`application/json`, or `application/x-www-form-urlencoded` for `auth.key: 'sessid'`): the server parses the request body based on it, so headers can't override it.
183
+
184
+ For cross-origin requests, the server — the portal or your proxy — must allow a non-standard header in `Access-Control-Allow-Headers` of its CORS preflight (`OPTIONS`) response, or the browser will block the request. The header doesn't add an extra request: the library's JSON requests already go through a preflight because of `Content-Type: application/json`.
185
+
157
186
  ## Error handling
158
187
 
159
- `bx-rest` surfaces two different kinds of failure, and `.res()` only reacts to one of them.
188
+ `.res()` can fail in three ways — which one depends on how the portal answered.
160
189
 
161
- | Failure | When it happens | How it surfaces on `.res()` |
162
- | --- | --- | --- |
163
- | Transport / configuration errors — network failure, missing auth, missing base URL | Before or during the HTTP call | The returned `Observable` errors. Handle it with RxJS `catchError` or the `error` callback of `subscribe()`. |
164
- | Bitrix API errors — `{ error, error_description }`, e.g. `INSUFFICIENT_SCOPE`, `expired_token` | HTTP 200 response whose body is not a success payload | By default, `.res()` resolves normally with `undefined` — **it does not throw**. Pass `{ throwOnApiError: true }` to make it throw a `BXRestApiError` instead. |
190
+ | Failure | How it surfaces on `.res()` |
191
+ | --- | --- |
192
+ | Bitrix API error with a non-2xx HTTP status — this is how Bitrix sends most errors: `expired_token` (401), `ERROR_METHOD_NOT_FOUND` (404), `QUERY_LIMIT_EXCEEDED` (503), `Not found` from `crm.*.get` (400) | The returned `Observable` errors with a `BXRestApiError`, with or without `throwOnApiError`. |
193
+ | Bitrix API error in the body of a 2xx response | By default, `.res()` resolves normally with `undefined` — **it does not throw**. Pass `{ throwOnApiError: true }` to make it throw a `BXRestApiError` instead. |
194
+ | Transport / configuration errors — network failure, missing auth, missing base URL, a response that is not from Bitrix (e.g. a proxy's HTML error page) | The returned `Observable` errors with a plain `Error`. |
195
+
196
+ `BXRestApiError` fields:
197
+
198
+ | Field | Value |
199
+ | --- | --- |
200
+ | `error` | Bitrix error code, e.g. `expired_token`. Can be an empty string: `crm.*.get` answers a missing ID with an empty code and `Not found` in the description. |
201
+ | `error_description` | Bitrix error description; also used as `message`. |
202
+ | `status` | HTTP status, e.g. `401`; `undefined` when the error came in the body of a 2xx response. |
203
+ | `method` | REST method, e.g. `crm.deal.get`. |
204
+ | `cause` | The original axios error when the status was non-2xx; the full response body is in `cause.response.data` (for REST v3 — including `validation`). |
165
205
 
166
- Because a Bitrix-level error resolves as `undefined` rather than as an `Observable` error by default, don't rely on plain `.res()` alone to tell "no records" apart from "the call failed". You have two options.
206
+ For REST v3 methods, `error` holds the error `code` and `error_description` its `message`.
167
207
 
168
- **Option 1 — opt in to throwing with `.res({ throwOnApiError: true })`.** The `Observable` errors with a `BXRestApiError`, exposing `error` and `error_description`, so it can be handled alongside transport errors in a single `catchError`/`error` callback:
208
+ **Recommended — `.res({ throwOnApiError: true })`.** Every Bitrix error then arrives as a `BXRestApiError` whatever the HTTP status, and can be handled alongside transport errors in a single `catchError`/`error` callback:
169
209
 
170
210
  ```typescript
171
211
  import { BXRestNavvy, BXRestApiError } from 'bx-rest'
@@ -180,7 +220,10 @@ bxRest.crm.deal.list({
180
220
  next: deals => console.log(deals),
181
221
  error: err => {
182
222
  if (err instanceof BXRestApiError) {
183
- console.error('Bitrix API error:', err.error, err.error_description)
223
+ console.error('Bitrix API error:', err.status, err.error, err.error_description)
224
+ if (err.error === 'expired_token') {
225
+ // refresh the token and retry the request
226
+ }
184
227
  } else {
185
228
  console.error('Request failed:', err.message)
186
229
  }
@@ -188,7 +231,9 @@ bxRest.crm.deal.list({
188
231
  })
189
232
  ```
190
233
 
191
- **Option 2 — keep the default and check the raw response.** Call `.resVanilla()` instead and check the response with the exported `isBXRestAnswerSuccess()` type guard:
234
+ Without `throwOnApiError`, plain `.res()` can't tell "no records" apart from "an error in a 2xx response" — both resolve as `undefined`.
235
+
236
+ **Alternative — check the raw response.** `.resVanilla()` returns the raw Bitrix body for 2xx responses; check it with the exported `isBXRestAnswerSuccess()` type guard. Note that `.resVanilla()`, `.mapForVanilla()` and `.resAll()` don't convert errors: on a Bitrix error with a non-2xx status they fail with the original axios error, with the response body in `err.response.data`.
192
237
 
193
238
  ```typescript
194
239
  import { firstValueFrom } from 'rxjs'
@@ -211,19 +256,6 @@ if (!answer || !isBXRestAnswerSuccess(answer)) {
211
256
  }
212
257
  ```
213
258
 
214
- Regardless of `throwOnApiError`, transport-level failures always propagate as `Observable` errors and can be caught the usual RxJS way:
215
-
216
- ```typescript
217
- bxRest.crm.deal.list({
218
- select: ['ID', 'TITLE'],
219
- filter: {},
220
- start: 0
221
- }).res().subscribe({
222
- next: deals => console.log(deals),
223
- error: err => console.error('Request failed:', err.message)
224
- })
225
- ```
226
-
227
259
  ## Usage in Angular
228
260
 
229
261
  Register the public clients and `Navvy` when you want to inject them into Angular services or components:
package/README.md CHANGED
@@ -18,6 +18,7 @@
18
18
  - [Режимы результата](#режимы-результата)
19
19
  - [Аутентификация и OAuth2](#аутентификация-и-oauth2)
20
20
  - [`withCredentials`](#withcredentials)
21
+ - [HTTP-заголовки](#http-заголовки)
21
22
  - [Обработка ошибок](#обработка-ошибок)
22
23
  - [Использование в Angular](#использование-в-angular)
23
24
  - [SessionKeyServices](#sessionkeyservices)
@@ -164,18 +165,57 @@ BXRestSettings.update({
164
165
  })
165
166
  ```
166
167
 
168
+ ## HTTP-заголовки
169
+
170
+ Статичные заголовки, которые нужны в каждом запросе, задайте в `BXRestSettings.headers`:
171
+
172
+ ```typescript
173
+ BXRestSettings.update({
174
+ headers: {
175
+ 'X-Bitrix-App': 'smart-process-pro'
176
+ }
177
+ })
178
+ ```
179
+
180
+ Они прикладываются ко всем запросам библиотеки, включая batch-запросы `.resAll()`, и, как и остальные настройки, читаются в момент подписки. `update()` сливает настройки только на верхнем уровне, поэтому `headers` заменяется целиком — чтобы добавить заголовок к уже заданным, передайте весь набор.
181
+
182
+ Для одного запроса используйте `.withHeaders()`. Его заголовки добавляются поверх `BXRestSettings.headers`, при совпадении имени (без учёта регистра) побеждает значение из `.withHeaders()`. Действует на `.res()`, `.resAll()`, `.resVanilla()` и `.mapForVanilla()`:
183
+
184
+ ```typescript
185
+ const deals = await firstValueFrom(
186
+ bxRest.crm.deal.list({ select: ['ID', 'TITLE'], filter: {}, start: 0 })
187
+ .withHeaders({ 'X-Request-Source': 'report' })
188
+ .resAll()
189
+ )
190
+ ```
191
+
192
+ `Content-Type` библиотека всегда выставляет сама (`application/json`, а для `auth.key: 'sessid'` — `application/x-www-form-urlencoded`): от него зависит, как сервер разберёт тело запроса, поэтому заголовками он не перебивается.
193
+
194
+ Для запросов на другой домен сервер — портал или ваш прокси — должен разрешить нестандартный заголовок в `Access-Control-Allow-Headers` ответа на CORS preflight (`OPTIONS`), иначе браузер заблокирует запрос. Лишнего запроса заголовок не добавляет: JSON-запросы библиотеки и так проходят через preflight из-за `Content-Type: application/json`.
195
+
167
196
  ## Обработка ошибок
168
197
 
169
- `bx-rest` показывает два разных вида сбоев, и `.res()` реагирует только на один из них.
198
+ `.res()` может завершиться неудачей тремя способами — какой именно, зависит от того, как ответил портал.
170
199
 
171
- | Сбой | Когда происходит | Как проявляется в `.res()` |
172
- | --- | --- | --- |
173
- | Ошибки транспорта / конфигурации — сбой сети, отсутствие авторизации, отсутствие базового URL | До или во время HTTP-вызова | Возвращённый `Observable` завершается ошибкой. Обрабатывайте её через RxJS `catchError` или колбэк `error` у `subscribe()`. |
174
- | Ошибки API Bitrix — `{ error, error_description }`, например `INSUFFICIENT_SCOPE`, `expired_token` | HTTP-ответ 200, тело которого не является успешным payload'ом | По умолчанию `.res()` резолвится обычным образом со значением `undefined` — **исключение не выбрасывается**. Передайте `{ throwOnApiError: true }`, чтобы вместо этого выбрасывалось `BXRestApiError`. |
200
+ | Сбой | Как проявляется в `.res()` |
201
+ | --- | --- |
202
+ | Ошибка API Bitrix с HTTP-статусом не 2xx — так Bitrix отдаёт большинство ошибок: `expired_token` (401), `ERROR_METHOD_NOT_FOUND` (404), `QUERY_LIMIT_EXCEEDED` (503), `Not found` у `crm.*.get` (400) | Возвращённый `Observable` завершается ошибкой `BXRestApiError` — с `throwOnApiError` и без него. |
203
+ | Ошибка API Bitrix в теле ответа со статусом 2xx | По умолчанию `.res()` резолвится обычным образом со значением `undefined` — **исключение не выбрасывается**. Передайте `{ throwOnApiError: true }`, чтобы вместо этого выбрасывалось `BXRestApiError`. |
204
+ | Ошибки транспорта / конфигурации — сбой сети, отсутствие авторизации, отсутствие базового URL, ответ не от Bitrix (например, HTML-страница ошибки прокси) | Возвращённый `Observable` завершается обычной ошибкой `Error`. |
205
+
206
+ Поля `BXRestApiError`:
207
+
208
+ | Поле | Значение |
209
+ | --- | --- |
210
+ | `error` | Код ошибки Bitrix, например `expired_token`. Может быть пустой строкой: на несуществующий ID `crm.*.get` отвечает пустым кодом и `Not found` в описании. |
211
+ | `error_description` | Описание ошибки Bitrix; оно же используется как `message`. |
212
+ | `status` | HTTP-статус, например `401`; `undefined`, если ошибка пришла в теле ответа со статусом 2xx. |
213
+ | `method` | REST-метод, например `crm.deal.get`. |
214
+ | `cause` | Исходная ошибка axios, если статус был не 2xx; полное тело ответа — в `cause.response.data` (для REST v3 — в том числе `validation`). |
175
215
 
176
- Поскольку ошибка уровня Bitrix по умолчанию резолвится как `undefined`, а не как ошибка `Observable`, не полагайтесь только на голый `.res()`, чтобы отличить «нет записей» от «запрос не удался». Есть два варианта.
216
+ Для методов REST v3 в `error` попадает `code` ошибки, а в `error_description` — её `message`.
177
217
 
178
- **Вариант 1 — включить выброс исключения через `.res({ throwOnApiError: true })`.** `Observable` завершается ошибкой `BXRestApiError`, предоставляющей `error` и `error_description`, поэтому её можно обработать вместе с транспортными ошибками в одном колбэке `catchError`/`error`:
218
+ **Рекомендуемый вариант — `.res({ throwOnApiError: true })`.** Тогда любая ошибка Bitrix приходит как `BXRestApiError` независимо от HTTP-статуса, и её можно обработать вместе с транспортными ошибками в одном колбэке `catchError`/`error`:
179
219
 
180
220
  ```typescript
181
221
  import { BXRestNavvy, BXRestApiError } from 'bx-rest'
@@ -190,7 +230,10 @@ bxRest.crm.deal.list({
190
230
  next: deals => console.log(deals),
191
231
  error: err => {
192
232
  if (err instanceof BXRestApiError) {
193
- console.error('Bitrix API error:', err.error, err.error_description)
233
+ console.error('Bitrix API error:', err.status, err.error, err.error_description)
234
+ if (err.error === 'expired_token') {
235
+ // обновить токен и повторить запрос
236
+ }
194
237
  } else {
195
238
  console.error('Request failed:', err.message)
196
239
  }
@@ -198,7 +241,9 @@ bxRest.crm.deal.list({
198
241
  })
199
242
  ```
200
243
 
201
- **Вариант 2 — оставить поведение по умолчанию и проверять сырой ответ.** Вызовите `.resVanilla()` и проверьте ответ с помощью экспортируемого type guard `isBXRestAnswerSuccess()`:
244
+ Без `throwOnApiError` по голому `.res()` нельзя отличить «нет записей» от «ошибки в ответе 2xx» — оба случая резолвятся как `undefined`.
245
+
246
+ **Альтернатива — проверять сырой ответ.** `.resVanilla()` возвращает сырое тело ответа Bitrix для ответов 2xx; проверяйте его экспортируемым type guard `isBXRestAnswerSuccess()`. Учтите, что `.resVanilla()`, `.mapForVanilla()` и `.resAll()` ошибки не преобразуют: на ошибку Bitrix со статусом не 2xx они завершаются исходной ошибкой axios, тело ответа — в `err.response.data`.
202
247
 
203
248
  ```typescript
204
249
  import { firstValueFrom } from 'rxjs'
@@ -221,19 +266,6 @@ if (!answer || !isBXRestAnswerSuccess(answer)) {
221
266
  }
222
267
  ```
223
268
 
224
- Независимо от `throwOnApiError`, ошибки транспортного уровня всегда всплывают как ошибки `Observable` и могут быть перехвачены обычным способом RxJS:
225
-
226
- ```typescript
227
- bxRest.crm.deal.list({
228
- select: ['ID', 'TITLE'],
229
- filter: {},
230
- start: 0
231
- }).res().subscribe({
232
- next: deals => console.log(deals),
233
- error: err => console.error('Request failed:', err.message)
234
- })
235
- ```
236
-
237
269
  ## Использование в Angular
238
270
 
239
271
  Зарегистрируйте публичные клиенты и `Navvy`, когда нужно внедрять их в сервисы или компоненты Angular:
@@ -1,17 +1,73 @@
1
+ import axios from 'axios';
1
2
  /**
2
- * Thrown by `.res()` when called with `{ throwOnApiError: true }` and the
3
- * Bitrix REST call resolves as a Bitrix-level API error, e.g.
4
- * `INSUFFICIENT_SCOPE` or `expired_token`.
3
+ * A Bitrix-level API error, e.g. `INSUFFICIENT_SCOPE` or `expired_token`.
5
4
  *
6
- * By default `.res()` resolves such responses as `undefined` instead of
7
- * throwing — see the "Error handling" section of the README.
5
+ * `.res()` fails with it whenever the portal answers with a Bitrix error and
6
+ * a non-2xx HTTP status — which is how Bitrix sends most of its errors. When
7
+ * the error comes in the body of a 2xx response, `.res()` resolves as
8
+ * `undefined` by default and fails with it only with
9
+ * `{ throwOnApiError: true }` — see the "Error handling" section of the README.
8
10
  */
9
11
  export class BXRestApiError extends Error {
10
- constructor(error, error_description) {
11
- super(error_description || error || 'Bitrix API error');
12
+ constructor(error, error_description, details) {
13
+ super(error_description || error || 'Bitrix API error', details?.cause !== undefined ? { cause: details.cause } : undefined);
12
14
  this.error = error;
13
15
  this.error_description = error_description;
14
16
  this.name = 'BXRestApiError';
17
+ this.status = details?.status;
18
+ this.method = details?.method;
15
19
  }
16
20
  }
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYngtcmVzdC9zcmMvZnVuY3Rpb25zL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFPLGNBQWUsU0FBUSxLQUFLO0lBQ3ZDLFlBQ1MsS0FBeUIsRUFDekIsaUJBQXFDO1FBRTVDLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxLQUFLLElBQUksa0JBQWtCLENBQUMsQ0FBQTtRQUhoRCxVQUFLLEdBQUwsS0FBSyxDQUFvQjtRQUN6QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW9CO1FBRzVDLElBQUksQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUE7SUFDOUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaHJvd24gYnkgYC5yZXMoKWAgd2hlbiBjYWxsZWQgd2l0aCBgeyB0aHJvd09uQXBpRXJyb3I6IHRydWUgfWAgYW5kIHRoZVxuICogQml0cml4IFJFU1QgY2FsbCByZXNvbHZlcyBhcyBhIEJpdHJpeC1sZXZlbCBBUEkgZXJyb3IsIGUuZy5cbiAqIGBJTlNVRkZJQ0lFTlRfU0NPUEVgIG9yIGBleHBpcmVkX3Rva2VuYC5cbiAqXG4gKiBCeSBkZWZhdWx0IGAucmVzKClgIHJlc29sdmVzIHN1Y2ggcmVzcG9uc2VzIGFzIGB1bmRlZmluZWRgIGluc3RlYWQgb2ZcbiAqIHRocm93aW5nIOKAlCBzZWUgdGhlIFwiRXJyb3IgaGFuZGxpbmdcIiBzZWN0aW9uIG9mIHRoZSBSRUFETUUuXG4gKi9cbmV4cG9ydCBjbGFzcyBCWFJlc3RBcGlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGVycm9yOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIGVycm9yX2Rlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgc3VwZXIoZXJyb3JfZGVzY3JpcHRpb24gfHwgZXJyb3IgfHwgJ0JpdHJpeCBBUEkgZXJyb3InKVxuICAgIHRoaXMubmFtZSA9ICdCWFJlc3RBcGlFcnJvcidcbiAgfVxufVxuIl19
21
+ /**
22
+ * Recognises a Bitrix error body: REST v2 `{ error, error_description }` and
23
+ * REST v3 `{ error: { code, message } }`. Returns `undefined` for anything
24
+ * else — a success payload, an HTML page from a proxy, an empty body.
25
+ *
26
+ * An empty `error` still counts: Bitrix answers e.g. `crm.deal.get` for a
27
+ * missing ID with `{ error: '', error_description: 'Not found' }`.
28
+ */
29
+ export function parseBXRestErrorBody(body) {
30
+ if (!body || typeof body !== 'object' || !('error' in body)) {
31
+ return undefined;
32
+ }
33
+ const { error, error_description } = body;
34
+ if (typeof error === 'string') {
35
+ return {
36
+ error,
37
+ error_description: typeof error_description === 'string' ? error_description : undefined
38
+ };
39
+ }
40
+ if (error && typeof error === 'object' && 'code' in error) {
41
+ const { code, message } = error;
42
+ return {
43
+ error: String(code),
44
+ error_description: typeof message === 'string' ? message : undefined
45
+ };
46
+ }
47
+ return undefined;
48
+ }
49
+ /**
50
+ * Turns an HTTP failure into a `BXRestApiError` when the portal answered with
51
+ * a Bitrix error body. Bitrix sends most errors with a non-2xx status
52
+ * (401 `expired_token`, 404 `ERROR_METHOD_NOT_FOUND`, 503
53
+ * `QUERY_LIMIT_EXCEEDED`, 400 "Not found" from `crm.*.get`, ...), and axios
54
+ * rejects on those.
55
+ *
56
+ * Returns `undefined` for network errors and for responses that are not a
57
+ * Bitrix error body, so the caller can keep its own handling for them.
58
+ */
59
+ export function bxRestApiErrorFromHttp(err, method) {
60
+ if (!axios.isAxiosError(err) || !err.response) {
61
+ return undefined;
62
+ }
63
+ const parsed = parseBXRestErrorBody(err.response.data);
64
+ if (!parsed) {
65
+ return undefined;
66
+ }
67
+ return new BXRestApiError(parsed.error, parsed.error_description, {
68
+ status: err.response.status,
69
+ method,
70
+ cause: err
71
+ });
72
+ }
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYngtcmVzdC9zcmMvZnVuY3Rpb25zL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUE7QUFpQnpCOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxPQUFPLGNBQWUsU0FBUSxLQUFLO0lBSXZDLFlBQ1MsS0FBeUIsRUFDekIsaUJBQXFDLEVBQzVDLE9BQStCO1FBRS9CLEtBQUssQ0FDSCxpQkFBaUIsSUFBSSxLQUFLLElBQUksa0JBQWtCLEVBQ2hELE9BQU8sRUFBRSxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FDcEUsQ0FBQTtRQVBNLFVBQUssR0FBTCxLQUFLLENBQW9CO1FBQ3pCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBb0I7UUFPNUMsSUFBSSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQTtRQUM1QixJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sRUFBRSxNQUFNLENBQUE7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLEVBQUUsTUFBTSxDQUFBO0lBQy9CLENBQUM7Q0FDRjtBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsSUFBYTtJQUVoRCxJQUFJLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDNUQsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUNELE1BQU0sRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxJQUF1RCxDQUFBO0lBRTVGLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsT0FBTztZQUNMLEtBQUs7WUFDTCxpQkFBaUIsRUFBRSxPQUFPLGlCQUFpQixLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLFNBQVM7U0FDekYsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksTUFBTSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQzFELE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsS0FBNkMsQ0FBQTtRQUN2RSxPQUFPO1lBQ0wsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDbkIsaUJBQWlCLEVBQUUsT0FBTyxPQUFPLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVM7U0FDckUsQ0FBQTtJQUNILENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLEdBQVksRUFBRSxNQUFjO0lBQ2pFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlDLE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3RELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFDRCxPQUFPLElBQUksY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixFQUFFO1FBQ2hFLE1BQU0sRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU07UUFDM0IsTUFBTTtRQUNOLEtBQUssRUFBRSxHQUFHO0tBQ1gsQ0FBQyxDQUFBO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBheGlvcyBmcm9tICdheGlvcydcblxuZXhwb3J0IGludGVyZmFjZSBCWFJlc3RBcGlFcnJvckRldGFpbHMge1xuICAvKipcbiAgICogSFRUUCBzdGF0dXMgb2YgdGhlIHBvcnRhbCByZXNwb25zZS4gYHVuZGVmaW5lZGAgd2hlbiB0aGUgZXJyb3IgY2FtZSBpblxuICAgKiB0aGUgYm9keSBvZiBhIHN1Y2Nlc3NmdWwgKDJ4eCkgcmVzcG9uc2UuXG4gICAqL1xuICBzdGF0dXM/OiBudW1iZXJcbiAgLyoqIFJFU1QgbWV0aG9kIHRoYXQgZmFpbGVkLCBlLmcuIGBjcm0uZGVhbC5nZXRgLiAqL1xuICBtZXRob2Q/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFRoZSBvcmlnaW5hbCBlcnJvciwgZS5nLiB0aGUgYEF4aW9zRXJyb3JgIOKAlCBpdHMgYHJlc3BvbnNlLmRhdGFgIGhvbGRzXG4gICAqIHRoZSBmdWxsIHJlc3BvbnNlIGJvZHkgKGluY2x1ZGluZyBSRVNUIHYzIGB2YWxpZGF0aW9uYCkuXG4gICAqL1xuICBjYXVzZT86IHVua25vd25cbn1cblxuLyoqXG4gKiBBIEJpdHJpeC1sZXZlbCBBUEkgZXJyb3IsIGUuZy4gYElOU1VGRklDSUVOVF9TQ09QRWAgb3IgYGV4cGlyZWRfdG9rZW5gLlxuICpcbiAqIGAucmVzKClgIGZhaWxzIHdpdGggaXQgd2hlbmV2ZXIgdGhlIHBvcnRhbCBhbnN3ZXJzIHdpdGggYSBCaXRyaXggZXJyb3IgYW5kXG4gKiBhIG5vbi0yeHggSFRUUCBzdGF0dXMg4oCUIHdoaWNoIGlzIGhvdyBCaXRyaXggc2VuZHMgbW9zdCBvZiBpdHMgZXJyb3JzLiBXaGVuXG4gKiB0aGUgZXJyb3IgY29tZXMgaW4gdGhlIGJvZHkgb2YgYSAyeHggcmVzcG9uc2UsIGAucmVzKClgIHJlc29sdmVzIGFzXG4gKiBgdW5kZWZpbmVkYCBieSBkZWZhdWx0IGFuZCBmYWlscyB3aXRoIGl0IG9ubHkgd2l0aFxuICogYHsgdGhyb3dPbkFwaUVycm9yOiB0cnVlIH1gIOKAlCBzZWUgdGhlIFwiRXJyb3IgaGFuZGxpbmdcIiBzZWN0aW9uIG9mIHRoZSBSRUFETUUuXG4gKi9cbmV4cG9ydCBjbGFzcyBCWFJlc3RBcGlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIgfCB1bmRlZmluZWRcbiAgcmVhZG9ubHkgbWV0aG9kOiBzdHJpbmcgfCB1bmRlZmluZWRcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZXJyb3I6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgZXJyb3JfZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBkZXRhaWxzPzogQlhSZXN0QXBpRXJyb3JEZXRhaWxzXG4gICkge1xuICAgIHN1cGVyKFxuICAgICAgZXJyb3JfZGVzY3JpcHRpb24gfHwgZXJyb3IgfHwgJ0JpdHJpeCBBUEkgZXJyb3InLFxuICAgICAgZGV0YWlscz8uY2F1c2UgIT09IHVuZGVmaW5lZCA/IHsgY2F1c2U6IGRldGFpbHMuY2F1c2UgfSA6IHVuZGVmaW5lZFxuICAgIClcbiAgICB0aGlzLm5hbWUgPSAnQlhSZXN0QXBpRXJyb3InXG4gICAgdGhpcy5zdGF0dXMgPSBkZXRhaWxzPy5zdGF0dXNcbiAgICB0aGlzLm1ldGhvZCA9IGRldGFpbHM/Lm1ldGhvZFxuICB9XG59XG5cbi8qKlxuICogUmVjb2duaXNlcyBhIEJpdHJpeCBlcnJvciBib2R5OiBSRVNUIHYyIGB7IGVycm9yLCBlcnJvcl9kZXNjcmlwdGlvbiB9YCBhbmRcbiAqIFJFU1QgdjMgYHsgZXJyb3I6IHsgY29kZSwgbWVzc2FnZSB9IH1gLiBSZXR1cm5zIGB1bmRlZmluZWRgIGZvciBhbnl0aGluZ1xuICogZWxzZSDigJQgYSBzdWNjZXNzIHBheWxvYWQsIGFuIEhUTUwgcGFnZSBmcm9tIGEgcHJveHksIGFuIGVtcHR5IGJvZHkuXG4gKlxuICogQW4gZW1wdHkgYGVycm9yYCBzdGlsbCBjb3VudHM6IEJpdHJpeCBhbnN3ZXJzIGUuZy4gYGNybS5kZWFsLmdldGAgZm9yIGFcbiAqIG1pc3NpbmcgSUQgd2l0aCBgeyBlcnJvcjogJycsIGVycm9yX2Rlc2NyaXB0aW9uOiAnTm90IGZvdW5kJyB9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQlhSZXN0RXJyb3JCb2R5KGJvZHk6IHVua25vd24pXG4gIDogeyBlcnJvcjogc3RyaW5nLCBlcnJvcl9kZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkIH0gfCB1bmRlZmluZWQge1xuICBpZiAoIWJvZHkgfHwgdHlwZW9mIGJvZHkgIT09ICdvYmplY3QnIHx8ICEoJ2Vycm9yJyBpbiBib2R5KSkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuICBjb25zdCB7IGVycm9yLCBlcnJvcl9kZXNjcmlwdGlvbiB9ID0gYm9keSBhcyB7IGVycm9yOiB1bmtub3duLCBlcnJvcl9kZXNjcmlwdGlvbj86IHVua25vd24gfVxuXG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yLFxuICAgICAgZXJyb3JfZGVzY3JpcHRpb246IHR5cGVvZiBlcnJvcl9kZXNjcmlwdGlvbiA9PT0gJ3N0cmluZycgPyBlcnJvcl9kZXNjcmlwdGlvbiA6IHVuZGVmaW5lZFxuICAgIH1cbiAgfVxuXG4gIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmICdjb2RlJyBpbiBlcnJvcikge1xuICAgIGNvbnN0IHsgY29kZSwgbWVzc2FnZSB9ID0gZXJyb3IgYXMgeyBjb2RlOiB1bmtub3duLCBtZXNzYWdlPzogdW5rbm93biB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yOiBTdHJpbmcoY29kZSksXG4gICAgICBlcnJvcl9kZXNjcmlwdGlvbjogdHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnID8gbWVzc2FnZSA6IHVuZGVmaW5lZFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBUdXJucyBhbiBIVFRQIGZhaWx1cmUgaW50byBhIGBCWFJlc3RBcGlFcnJvcmAgd2hlbiB0aGUgcG9ydGFsIGFuc3dlcmVkIHdpdGhcbiAqIGEgQml0cml4IGVycm9yIGJvZHkuIEJpdHJpeCBzZW5kcyBtb3N0IGVycm9ycyB3aXRoIGEgbm9uLTJ4eCBzdGF0dXNcbiAqICg0MDEgYGV4cGlyZWRfdG9rZW5gLCA0MDQgYEVSUk9SX01FVEhPRF9OT1RfRk9VTkRgLCA1MDNcbiAqIGBRVUVSWV9MSU1JVF9FWENFRURFRGAsIDQwMCBcIk5vdCBmb3VuZFwiIGZyb20gYGNybS4qLmdldGAsIC4uLiksIGFuZCBheGlvc1xuICogcmVqZWN0cyBvbiB0aG9zZS5cbiAqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIGZvciBuZXR3b3JrIGVycm9ycyBhbmQgZm9yIHJlc3BvbnNlcyB0aGF0IGFyZSBub3QgYVxuICogQml0cml4IGVycm9yIGJvZHksIHNvIHRoZSBjYWxsZXIgY2FuIGtlZXAgaXRzIG93biBoYW5kbGluZyBmb3IgdGhlbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ4UmVzdEFwaUVycm9yRnJvbUh0dHAoZXJyOiB1bmtub3duLCBtZXRob2Q6IHN0cmluZyk6IEJYUmVzdEFwaUVycm9yIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFheGlvcy5pc0F4aW9zRXJyb3IoZXJyKSB8fCAhZXJyLnJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlQlhSZXN0RXJyb3JCb2R5KGVyci5yZXNwb25zZS5kYXRhKVxuICBpZiAoIXBhcnNlZCkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuICByZXR1cm4gbmV3IEJYUmVzdEFwaUVycm9yKHBhcnNlZC5lcnJvciwgcGFyc2VkLmVycm9yX2Rlc2NyaXB0aW9uLCB7XG4gICAgc3RhdHVzOiBlcnIucmVzcG9uc2Uuc3RhdHVzLFxuICAgIG1ldGhvZCxcbiAgICBjYXVzZTogZXJyXG4gIH0pXG59XG4iXX0=
@@ -32,8 +32,8 @@ export class BXRest {
32
32
  profile() {
33
33
  return this.http.post(['profile']);
34
34
  }
35
- batch(param) {
36
- return this.http.post(['batch'], param);
35
+ batch(param, headers) {
36
+ return this.http.post(['batch'], param, false, headers);
37
37
  }
38
38
  }
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2J4LXJlc3Qvc3JjL3Jlc3QvYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDNUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUM1QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDMUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ2hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ3hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFHeEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDOUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBRTVDLE1BQU0sT0FBTyxNQUFNO0lBQW5CO1FBQ21CLFNBQUksR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFBO1FBQzVCLFNBQUksR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFBO1FBQ3ZCLFVBQUssR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFBO1FBQ3pCLFNBQUksR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFBO1FBQ3ZCLFVBQUssR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFBO1FBQ3pCLFNBQUksR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFBO1FBQ3ZCLFlBQU8sR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFBO1FBQzdCLFFBQUcsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFBO1FBQ3JCLGdCQUFXLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFBO1FBQ3BDLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFBO1FBQzNCLGVBQVUsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUE7UUFDbkMsUUFBRyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUE7UUFDckIsa0JBQWEsR0FBRyxJQUFJLG1CQUFtQixFQUFFLENBQUE7UUFDekMsU0FBSSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUE7SUFTekMsQ0FBQztJQVBRLE9BQU87UUFDWixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7SUFDeEQsQ0FBQztJQUVNLEtBQUssQ0FBSSxLQUF3QjtRQUN0QyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFrQixDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQzFELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJYUmVzdFVzZXIgfSBmcm9tICcuLi9yZXF1ZXN0L3VzZXInXHJcbmltcG9ydCB7IEJYUmVzdExpc3RzIH0gZnJvbSAnLi4vcmVxdWVzdC9saXN0cydcclxuaW1wb3J0IHsgQlhSZXN0VGFzayB9IGZyb20gJy4uL3JlcXVlc3QvdGFzaydcclxuaW1wb3J0IHsgQlhSZXN0VGFza3MgfSBmcm9tICcuLi9yZXF1ZXN0L3Rhc2tzJ1xyXG5pbXBvcnQgeyBCWFJlc3REaXNrIH0gZnJvbSAnLi4vcmVxdWVzdC9kaXNrJ1xyXG5pbXBvcnQgeyBCWFJlc3RCaXpQcm9jIH0gZnJvbSAnLi4vcmVxdWVzdC9iaXpwcm9jJ1xyXG5pbXBvcnQgeyBCWFJlc3RMb2cgfSBmcm9tICcuLi9yZXF1ZXN0L2xvZydcclxuaW1wb3J0IHsgQlhSZXN0U29uZXRHcm91cCB9IGZyb20gJy4uL3JlcXVlc3Qvc29uZXRfZ3JvdXAnXHJcbmltcG9ydCB7IEJYUmVzdFNlcnZlciB9IGZyb20gJy4uL3JlcXVlc3Qvc2VydmVyJ1xyXG5pbXBvcnQgeyBCWFJlc3REZXBhcnRtZW50IH0gZnJvbSAnLi4vcmVxdWVzdC9kZXBhcnRtZW50J1xyXG5pbXBvcnQgeyBCWFJlc3RBcHAgfSBmcm9tICcuLi9yZXF1ZXN0L2FwcCdcclxuaW1wb3J0IHsgSHR0cEJYU2VydmljZXMgfSBmcm9tICcuLi9zZXJ2aWNlcy9odHRwL0h0dHBCWCdcclxuaW1wb3J0IHsgaUJYUmVzdFByb2ZpbGVIdHRwIH0gZnJvbSAnLi4vdHlwaWZpY2F0aW9uL3Jlc3QvcHJvZmlsZSdcclxuaW1wb3J0IHsgaUJYUmVzdEJhdGNoLCBpQlhSZXN0UGFyYW1CYXRjaCB9IGZyb20gJy4uL3R5cGlmaWNhdGlvbi9yZXN0L2JhdGNoJ1xyXG5pbXBvcnQgeyBCWFJlc3RTb2NpYWxOZXRXb3JrIH0gZnJvbSAnLi4vcmVxdWVzdC9zb2NpYWxuZXR3b3JrJ1xyXG5pbXBvcnQgeyBCWFJlc3RQdWxsIH0gZnJvbSAnLi4vcmVxdWVzdC9wdWxsJ1xyXG5cclxuZXhwb3J0IGNsYXNzIEJYUmVzdCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBodHRwID0gbmV3IEh0dHBCWFNlcnZpY2VzKClcclxuICBwdWJsaWMgcmVhZG9ubHkgdXNlciA9IG5ldyBCWFJlc3RVc2VyKClcclxuICBwdWJsaWMgcmVhZG9ubHkgbGlzdHMgPSBuZXcgQlhSZXN0TGlzdHMoKVxyXG4gIHB1YmxpYyByZWFkb25seSB0YXNrID0gbmV3IEJYUmVzdFRhc2soKVxyXG4gIHB1YmxpYyByZWFkb25seSB0YXNrcyA9IG5ldyBCWFJlc3RUYXNrcygpXHJcbiAgcHVibGljIHJlYWRvbmx5IGRpc2sgPSBuZXcgQlhSZXN0RGlzaygpXHJcbiAgcHVibGljIHJlYWRvbmx5IGJpelByb2MgPSBuZXcgQlhSZXN0Qml6UHJvYygpXHJcbiAgcHVibGljIHJlYWRvbmx5IGxvZyA9IG5ldyBCWFJlc3RMb2coKVxyXG4gIHB1YmxpYyByZWFkb25seSBzb25ldF9ncm91cCA9IG5ldyBCWFJlc3RTb25ldEdyb3VwKClcclxuICBwdWJsaWMgcmVhZG9ubHkgc2VydmVyID0gbmV3IEJYUmVzdFNlcnZlcigpXHJcbiAgcHVibGljIHJlYWRvbmx5IGRlcGFydG1lbnQgPSBuZXcgQlhSZXN0RGVwYXJ0bWVudCgpXHJcbiAgcHVibGljIHJlYWRvbmx5IGFwcCA9IG5ldyBCWFJlc3RBcHAoKVxyXG4gIHB1YmxpYyByZWFkb25seSBzb2NpYWxOZXRXb3JrID0gbmV3IEJYUmVzdFNvY2lhbE5ldFdvcmsoKVxyXG4gIHB1YmxpYyByZWFkb25seSBwdWxsID0gbmV3IEJYUmVzdFB1bGwoKVxyXG5cclxuICBwdWJsaWMgcHJvZmlsZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxpQlhSZXN0UHJvZmlsZUh0dHA+KFsncHJvZmlsZSddKVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGJhdGNoPFQ+KHBhcmFtOiBpQlhSZXN0UGFyYW1CYXRjaCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PGlCWFJlc3RCYXRjaDxUPj4oWydiYXRjaCddLCBwYXJhbSlcclxuICB9XHJcbn0iXX0=
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2J4LXJlc3Qvc3JjL3Jlc3QvYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDNUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUM1QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDMUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ2hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ3hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFHeEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDOUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBRTVDLE1BQU0sT0FBTyxNQUFNO0lBQW5CO1FBQ21CLFNBQUksR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFBO1FBQzVCLFNBQUksR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFBO1FBQ3ZCLFVBQUssR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFBO1FBQ3pCLFNBQUksR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFBO1FBQ3ZCLFVBQUssR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFBO1FBQ3pCLFNBQUksR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFBO1FBQ3ZCLFlBQU8sR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFBO1FBQzdCLFFBQUcsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFBO1FBQ3JCLGdCQUFXLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFBO1FBQ3BDLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFBO1FBQzNCLGVBQVUsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUE7UUFDbkMsUUFBRyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUE7UUFDckIsa0JBQWEsR0FBRyxJQUFJLG1CQUFtQixFQUFFLENBQUE7UUFDekMsU0FBSSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUE7SUFTekMsQ0FBQztJQVBRLE9BQU87UUFDWixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7SUFDeEQsQ0FBQztJQUVNLEtBQUssQ0FBSSxLQUF3QixFQUFFLE9BQWdDO1FBQ3hFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQWtCLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUMxRSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCWFJlc3RVc2VyIH0gZnJvbSAnLi4vcmVxdWVzdC91c2VyJ1xuaW1wb3J0IHsgQlhSZXN0TGlzdHMgfSBmcm9tICcuLi9yZXF1ZXN0L2xpc3RzJ1xuaW1wb3J0IHsgQlhSZXN0VGFzayB9IGZyb20gJy4uL3JlcXVlc3QvdGFzaydcbmltcG9ydCB7IEJYUmVzdFRhc2tzIH0gZnJvbSAnLi4vcmVxdWVzdC90YXNrcydcbmltcG9ydCB7IEJYUmVzdERpc2sgfSBmcm9tICcuLi9yZXF1ZXN0L2Rpc2snXG5pbXBvcnQgeyBCWFJlc3RCaXpQcm9jIH0gZnJvbSAnLi4vcmVxdWVzdC9iaXpwcm9jJ1xuaW1wb3J0IHsgQlhSZXN0TG9nIH0gZnJvbSAnLi4vcmVxdWVzdC9sb2cnXG5pbXBvcnQgeyBCWFJlc3RTb25ldEdyb3VwIH0gZnJvbSAnLi4vcmVxdWVzdC9zb25ldF9ncm91cCdcbmltcG9ydCB7IEJYUmVzdFNlcnZlciB9IGZyb20gJy4uL3JlcXVlc3Qvc2VydmVyJ1xuaW1wb3J0IHsgQlhSZXN0RGVwYXJ0bWVudCB9IGZyb20gJy4uL3JlcXVlc3QvZGVwYXJ0bWVudCdcbmltcG9ydCB7IEJYUmVzdEFwcCB9IGZyb20gJy4uL3JlcXVlc3QvYXBwJ1xuaW1wb3J0IHsgSHR0cEJYU2VydmljZXMgfSBmcm9tICcuLi9zZXJ2aWNlcy9odHRwL0h0dHBCWCdcbmltcG9ydCB7IGlCWFJlc3RQcm9maWxlSHR0cCB9IGZyb20gJy4uL3R5cGlmaWNhdGlvbi9yZXN0L3Byb2ZpbGUnXG5pbXBvcnQgeyBpQlhSZXN0QmF0Y2gsIGlCWFJlc3RQYXJhbUJhdGNoIH0gZnJvbSAnLi4vdHlwaWZpY2F0aW9uL3Jlc3QvYmF0Y2gnXG5pbXBvcnQgeyBCWFJlc3RTb2NpYWxOZXRXb3JrIH0gZnJvbSAnLi4vcmVxdWVzdC9zb2NpYWxuZXR3b3JrJ1xuaW1wb3J0IHsgQlhSZXN0UHVsbCB9IGZyb20gJy4uL3JlcXVlc3QvcHVsbCdcblxuZXhwb3J0IGNsYXNzIEJYUmVzdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaHR0cCA9IG5ldyBIdHRwQlhTZXJ2aWNlcygpXG4gIHB1YmxpYyByZWFkb25seSB1c2VyID0gbmV3IEJYUmVzdFVzZXIoKVxuICBwdWJsaWMgcmVhZG9ubHkgbGlzdHMgPSBuZXcgQlhSZXN0TGlzdHMoKVxuICBwdWJsaWMgcmVhZG9ubHkgdGFzayA9IG5ldyBCWFJlc3RUYXNrKClcbiAgcHVibGljIHJlYWRvbmx5IHRhc2tzID0gbmV3IEJYUmVzdFRhc2tzKClcbiAgcHVibGljIHJlYWRvbmx5IGRpc2sgPSBuZXcgQlhSZXN0RGlzaygpXG4gIHB1YmxpYyByZWFkb25seSBiaXpQcm9jID0gbmV3IEJYUmVzdEJpelByb2MoKVxuICBwdWJsaWMgcmVhZG9ubHkgbG9nID0gbmV3IEJYUmVzdExvZygpXG4gIHB1YmxpYyByZWFkb25seSBzb25ldF9ncm91cCA9IG5ldyBCWFJlc3RTb25ldEdyb3VwKClcbiAgcHVibGljIHJlYWRvbmx5IHNlcnZlciA9IG5ldyBCWFJlc3RTZXJ2ZXIoKVxuICBwdWJsaWMgcmVhZG9ubHkgZGVwYXJ0bWVudCA9IG5ldyBCWFJlc3REZXBhcnRtZW50KClcbiAgcHVibGljIHJlYWRvbmx5IGFwcCA9IG5ldyBCWFJlc3RBcHAoKVxuICBwdWJsaWMgcmVhZG9ubHkgc29jaWFsTmV0V29yayA9IG5ldyBCWFJlc3RTb2NpYWxOZXRXb3JrKClcbiAgcHVibGljIHJlYWRvbmx5IHB1bGwgPSBuZXcgQlhSZXN0UHVsbCgpXG5cbiAgcHVibGljIHByb2ZpbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PGlCWFJlc3RQcm9maWxlSHR0cD4oWydwcm9maWxlJ10pXG4gIH1cblxuICBwdWJsaWMgYmF0Y2g8VD4ocGFyYW06IGlCWFJlc3RQYXJhbUJhdGNoLCBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxpQlhSZXN0QmF0Y2g8VD4+KFsnYmF0Y2gnXSwgcGFyYW0sIGZhbHNlLCBoZWFkZXJzKVxuICB9XG59Il19
@@ -53,21 +53,26 @@ export class HttpBXServices extends HttpServices {
53
53
  *
54
54
  * @param name
55
55
  * @param params
56
+ * @param restApi
57
+ * @param headers заголовки только для этого запроса, поверх `BXRestSettings.headers`
56
58
  */
57
- post(name, params = {}, restApi = false) {
59
+ post(name, params = {}, restApi = false, headers) {
58
60
  const method = this.getNameMethod(name);
59
- return this.httpPost(restApi ? `api/${method}` : method, params);
61
+ return this.httpPost(restApi ? `api/${method}` : method, params, undefined, headers);
60
62
  }
61
63
  /**
62
64
  * Второстепенный метод для запросов. По возможности лучше не использовать
63
65
  *
64
66
  * @param name
65
67
  * @param params
68
+ * @param headers заголовки только для этого запроса, поверх `BXRestSettings.headers`
66
69
  */
67
- get(name, params = {}) {
68
- return this.httpGet(this.getNameMethod(name), params);
70
+ get(name, params = {}, headers) {
71
+ return this.httpGet(this.getNameMethod(name), params, undefined, headers);
69
72
  }
70
- httpPost(url, params = {}) {
73
+ // settings — только для совместимости сигнатуры с HttpServices: здесь тело
74
+ // уходит JSON-ом/urlencoded, и пересчёт дат из iHttpParamSettings не нужен.
75
+ httpPost(url, params = {}, settings, headers) {
71
76
  // defer() откладывает всё содержимое (в том числе чтение BXRestSettings
72
77
  // через this.session.*) до реальной подписки — иначе даже с "живым"
73
78
  // геттером в SessionKeyServices настройки читались бы в момент вызова
@@ -95,19 +100,17 @@ export class HttpBXServices extends HttpServices {
95
100
  // Преобразуем параметры в формат x-www-form-urlencoded
96
101
  const bodyString = this.serializeBitrixParams(paramsClone);
97
102
  return from(this.axiosInstance.post(fullUrl, bodyString, {
98
- headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
103
+ headers: this.buildHeaders(headers, { 'Content-Type': 'application/x-www-form-urlencoded' }),
99
104
  }).then((response) => response.data));
100
105
  }
101
106
  return from(this.axiosInstance.post(fullUrl, paramsClone, {
102
107
  withCredentials: this.session.getWithCredentials(),
103
- headers: {
104
- 'Content-Type': 'application/json',
105
- }
108
+ headers: this.buildHeaders(headers, { 'Content-Type': 'application/json' }),
106
109
  }).then((response) => response.data));
107
110
  }));
108
111
  });
109
112
  }
110
- httpGet(url, params = {}) {
113
+ httpGet(url, params = {}, settings, headers) {
111
114
  // Та же причина, что и у httpPost выше: откладываем чтение BXRestSettings
112
115
  // до подписки, чтобы `get()` вёл себя так же "лениво", как и `post()`
113
116
  // (симметрия, которой не было до этого — GET резолвил настройки в момент
@@ -129,10 +132,21 @@ export class HttpBXServices extends HttpServices {
129
132
  const fullUrl = prepareBaseAddress(baseUrl) + url;
130
133
  const queryString = new URLSearchParams(paramsClone).toString();
131
134
  const finalUrl = `${fullUrl}?${queryString}`;
132
- return from(this.axiosInstance.get(finalUrl).then((response) => response.data));
135
+ return from(this.axiosInstance.get(finalUrl, {
136
+ headers: this.buildHeaders(headers),
137
+ }).then((response) => response.data));
133
138
  }));
134
139
  });
135
140
  }
141
+ /**
142
+ * Заголовки запроса: `BXRestSettings.headers`, поверх них — заголовки
143
+ * конкретного запроса, поверх всего — `required`. В `required` идёт
144
+ * `Content-Type`: от него зависит, как сервер разберёт тело, поэтому
145
+ * пользовательские заголовки его не перебивают.
146
+ */
147
+ buildHeaders(headers, required = {}) {
148
+ return { ...this.session.getHeaders(), ...headers, ...required };
149
+ }
136
150
  serializeBitrixParams(params) {
137
151
  return stringifyBitrixParams(params);
138
152
  }
@@ -140,4 +154,4 @@ export class HttpBXServices extends HttpServices {
140
154
  return arr.join('.');
141
155
  }
142
156
  }
143
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSHR0cEJYLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYngtcmVzdC9zcmMvc2VydmljZXMvaHR0cC9IdHRwQlgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFVBQVUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUNwRSxPQUFPLEtBQUssTUFBTSxZQUFZLENBQUE7QUFDOUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUtyQyxPQUFPLE9BQU8sTUFBTSxpQkFBaUIsQ0FBQTtBQUNyQyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUMxRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDMUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQzVDLE9BQU8sRUFBRSxxQkFBcUIsSUFBSSxxQkFBcUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFBO0FBRXRHLE1BQU0sT0FBTyxjQUFlLFNBQVEsWUFBWTtJQUU5Qzs7OztPQUlHO0lBQ0gsTUFBTSxDQUFPLEtBQXlEO1FBRXBFLElBQUksWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQVMsSUFBSSxDQUFDLFlBQVksQ0FBSSxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQ3RFLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQSxDQUFDLG1CQUFtQjtRQUNuQyxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUEsQ0FBQywyQ0FBMkM7UUFDN0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQy9ELFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLENB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QTtJQUNKLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxNQUFlO1FBQ25DLE9BQU8scUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDdEMsQ0FBQztJQUVELGFBQWEsQ0FBQyxHQUFhO1FBQ3pCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUN0QixDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yLCBmb3JrSm9pbiwgZnJvbSwgZGVmZXIgfSBmcm9tICdyeGpzJ1xyXG5pbXBvcnQgY2xvbmUgZnJvbSAnanVzdC1jbG9uZSdcclxuaW1wb3J0IHsgSHR0cFNlcnZpY2VzIH0gZnJvbSAnLi9odHRwJ1xyXG5pbXBvcnQge1xyXG4gIGlCYXRjaFJlcXVlc3RBbnN3ZXIsIGlCYXRjaFJlcXVlc3RQYXJhbSwgaUJhdGNoUmVxdWVzdFBhcmFtQXJyLCBpQmF0Y2hSZXF1ZXN0UGFyYW1IdHRwLCBrZXlCYXRjaCxcclxufSBmcm9tICcuLi8uLi90eXBpZmljYXRpb24vcmVzdC9iYXRjaC9iYXRjaFJlcXVlc3RQYXJhbSdcclxuaW1wb3J0IHsgaUJYUmVzdEFuc3dlciB9IGZyb20gJy4uLy4uL3R5cGlmaWNhdGlvbi9yZXN0L2Jhc2UvYW5zd2VyJ1xyXG5pbXBvcnQgZmxhdHRlbiBmcm9tICdqdXN0LWZsYXR0ZW4taXQnXHJcbmltcG9ydCB7IGluc3RhbmNlT2ZpQlhSZXN0QW5zd2VyU3VjY2VzcyB9IGZyb20gJy4uLy4uL2Z1bmN0aW9ucy9tYXBSZXN1bHQnXHJcbmltcG9ydCB7IHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xyXG5pbXBvcnQgeyBwcmVwYXJlQmFzZUFkZHJlc3MgfSBmcm9tICcuLi9iYXNlJ1xyXG5pbXBvcnQgeyBzZXJpYWxpemVCaXRyaXhQYXJhbXMgYXMgc3RyaW5naWZ5Qml0cml4UGFyYW1zIH0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zL3NlcmlhbGl6ZUJpdHJpeFBhcmFtcydcclxuXHJcbmV4cG9ydCBjbGFzcyBIdHRwQlhTZXJ2aWNlcyBleHRlbmRzIEh0dHBTZXJ2aWNlcyB7XHJcblxyXG4gIC8qKlxyXG4gICAqINCd0LUg0YHRh9C40YLQsNC50YLQtSDRjdGC0L7RgiDQvNC10YLQvtC0INC+0LHRgNCw0LfRhtC+0Lwv0YTQuNC90LDQu9GM0L3Ri9C8IEFQSS5cclxuICAgKiBUT0RPOiDQo9C00LDQu9C40YLRjCDQtNCw0L3QvdGL0Lkg0LzQtdGC0L7QtCDQv9C+0YHQu9C1INGA0LXQsNC70LjQt9Cw0YbQuNC4INC10LPQviDQsiDRgNCw0LfQtNC10LvQtSBOYXZ2eVxyXG4gICAqIEBwYXJhbSBwYXJhbVxyXG4gICAqL1xyXG4gIGJyYW5jaDxULCBBPihwYXJhbTogaUJhdGNoUmVxdWVzdFBhcmFtQXJyPFQ+IHwgaUJhdGNoUmVxdWVzdFBhcmFtPFQ+W10pXHJcbiAgICA6IE9ic2VydmFibGU8aUJhdGNoUmVxdWVzdEFuc3dlcjxBPltdIHwgdW5kZWZpbmVkPiB7XHJcbiAgICBsZXQgcHJlcGFyZVBhcmFtID0gT2JqZWN0LmVudHJpZXM8c3RyaW5nPih0aGlzLnByZXBhcmVCYXRjaDxUPihwYXJhbSkpXHJcbiAgICBjb25zdCBzaXplID0gNTAgLy8g0LHQvtC70YzRiNC1INC90LUg0L7RgtC00LDRgdGCXHJcbiAgICBsZXQgc3ViYXJyYXkgPSBbXSAvL9C80LDRgdGB0LjQsiDQsiDQutC+0YLQvtGA0YvQuSDQsdGD0LTQtdGCINCy0YvQstC10LTQtdC9INGA0LXQt9GD0LvRjNGC0LDRgi5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5jZWlsKHByZXBhcmVQYXJhbS5sZW5ndGggLyBzaXplKTsgaSsrKSB7XHJcbiAgICAgIHN1YmFycmF5W2ldID0gcHJlcGFyZVBhcmFtLnNsaWNlKChpICogc2l6ZSksIChpICogc2l6ZSkgKyBzaXplKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmb3JrSm9pbihcclxuICAgICAgc3ViYXJyYXkubWFwKGkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBQb3N0KCdiYXRjaC5qc29uJywge1xyXG4gICAgICAgICAgaGFsdDogMCxcclxuICAgICAgICAgIGNtZDogT2JqZWN0LmFzc2lnbih7fSwgLi4uaS5tYXAoeCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7W3hbMF1dOiB4WzFdfVxyXG4gICAgICAgICAgfSkpXHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgICkgYXMgT2JzZXJ2YWJsZTxpQmF0Y2hSZXF1ZXN0QW5zd2VyPEE+W10+XHJcbiAgfVxyXG5cclxuICBwcmVwYXJlQmF0Y2g8VD4ocGFyYW06IGlCYXRjaFJlcXVlc3RQYXJhbUFycjxUPiB8IGlCYXRjaFJlcXVlc3RQYXJhbTxUPltdKTogaUJhdGNoUmVxdWVzdFBhcmFtSHR0cCB7XHJcbiAgICBsZXQgcmVzOiBpQmF0Y2hSZXF1ZXN0UGFyYW1IdHRwID0gT2JqZWN0LmtleXMocGFyYW0pLnJlZHVjZShcclxuICAgICAgKG9iaiwga2V5KSA9PiB7XHJcbiAgICAgICAgb2JqW2tleV0gPSAnJ1xyXG4gICAgICAgIHJldHVybiBvYmpcclxuICAgICAgfSxcclxuICAgICAge30gYXMgaUJhdGNoUmVxdWVzdFBhcmFtSHR0cFxyXG4gICAgKVxyXG4gICAgZm9yIChsZXQga2V5IGluIHBhcmFtKSB7XHJcbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyB8fCB0eXBlb2Yga2V5ID09PSAnbnVtYmVyJyAmJiBwYXJhbVtrZXldLnBhcmFtKSB7XHJcbiAgICAgICAgcmVzW2tleV0gPSBwYXJhbVtrZXldLm5hbWUgKyAnPycgKyBzdHJpbmdpZnlCaXRyaXhQYXJhbXMocGFyYW1ba2V5XS5wYXJhbSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc1xyXG4gIH1cclxuXHJcbiAgbWFwQnJhbmNoUmVzdWx0PFQ+KHJlczogaUJhdGNoUmVxdWVzdEFuc3dlcjxUPltdKSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihbXSwgLi4ucmVzLm1hcChpID0+XHJcbiAgICAgIChpbnN0YW5jZU9maUJYUmVzdEFuc3dlclN1Y2Nlc3MoaSkgJiYgaW5zdGFuY2VPZmlCWFJlc3RBbnN3ZXJTdWNjZXNzKGkucmVzdWx0KSkgPyBpLnJlc3VsdC5yZXN1bHQgOiB1bmRlZmluZWQpXHJcbiAgICApIGFzIFJlY29yZDxrZXlCYXRjaCwgVD5cclxuICB9XHJcblxyXG4gIG1hcEJyYW5jaFJlc3VsdFdpdGhvdXRLZXk8VD4ocmVzOiBpQmF0Y2hSZXF1ZXN0QW5zd2VyPFQ+W10pOiBUW10ge1xyXG4gICAgcmV0dXJuIGZsYXR0ZW48VD4oT2JqZWN0LmFzc2lnbihbXSwgLi4ucmVzLm1hcChpID0+XHJcbiAgICAgIChpbnN0YW5jZU9maUJYUmVzdEFuc3dlclN1Y2Nlc3MoaSkgJiYgaW5zdGFuY2VPZmlCWFJlc3RBbnN3ZXJTdWNjZXNzKGkucmVzdWx0KSlcclxuICAgICAgICA/IGkucmVzdWx0LnJlc3VsdFxyXG4gICAgICAgIDogdW5kZWZpbmVkKSlcclxuICAgIClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqINCe0YHQvdC+0LLQvdC+0Lkg0LzQtdGC0L7QtCDQtNC70Y8g0LfQsNC/0YDQvtGB0L7QslxyXG4gICAqXHJcbiAgICogQHBhcmFtIG5hbWVcclxuICAgKiBAcGFyYW0gcGFyYW1zXHJcbiAgICovXHJcbiAgcG9zdDxUPihuYW1lOiBzdHJpbmdbXSwgcGFyYW1zOiBhbnkgPSB7fSwgcmVzdEFwaSA9IGZhbHNlKSB7XHJcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLmdldE5hbWVNZXRob2QobmFtZSlcclxuICAgIHJldHVybiB0aGlzLmh0dHBQb3N0PGlCWFJlc3RBbnN3ZXI8VD4+KHJlc3RBcGkgPyBgYXBpLyR7bWV0aG9kfWAgOiBtZXRob2QsIHBhcmFtcylcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqINCS0YLQvtGA0L7RgdGC0LXQv9C10L3QvdGL0Lkg0LzQtdGC0L7QtCDQtNC70Y8g0LfQsNC/0YDQvtGB0L7Qsi4g0J/QviDQstC+0LfQvNC+0LbQvdC+0YHRgtC4INC70YPRh9GI0LUg0L3QtSDQuNGB0L/QvtC70YzQt9C+0LLQsNGC0YxcclxuICAgKlxyXG4gICAqIEBwYXJhbSBuYW1lXHJcbiAgICogQHBhcmFtIHBhcmFtc1xyXG4gICAqL1xyXG4gIGdldDxUPihuYW1lOiBzdHJpbmdbXSwgcGFyYW1zOiBhbnkgPSB7fSkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cEdldDxpQlhSZXN0QW5zd2VyPFQ+Pih0aGlzLmdldE5hbWVNZXRob2QobmFtZSksIHBhcmFtcylcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIGh0dHBQb3N0PFQ+KHVybDogc3RyaW5nLCBwYXJhbXM6IGFueSA9IHt9KTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPiB7XHJcbiAgICAvLyBkZWZlcigpINC+0YLQutC70LDQtNGL0LLQsNC10YIg0LLRgdGRINGB0L7QtNC10YDQttC40LzQvtC1ICjQsiDRgtC+0Lwg0YfQuNGB0LvQtSDRh9GC0LXQvdC40LUgQlhSZXN0U2V0dGluZ3NcclxuICAgIC8vINGH0LXRgNC10LcgdGhpcy5zZXNzaW9uLiopINC00L4g0YDQtdCw0LvRjNC90L7QuSDQv9C+0LTQv9C40YHQutC4IOKAlCDQuNC90LDRh9C1INC00LDQttC1INGBIFwi0LbQuNCy0YvQvFwiXHJcbiAgICAvLyDQs9C10YLRgtC10YDQvtC8INCyIFNlc3Npb25LZXlTZXJ2aWNlcyDQvdCw0YHRgtGA0L7QudC60Lgg0YfQuNGC0LDQu9C40YHRjCDQsdGLINCyINC80L7QvNC10L3RgiDQstGL0LfQvtCy0LBcclxuICAgIC8vIC5yZXMoKSwg0LAg0L3QtSDQsiDQvNC+0LzQtdC90YIgc3Vic2NyaWJlKCkvZmlyc3RWYWx1ZUZyb20oKSwg0YfRgtC+INC4INC+0LHQtdGJ0LDQvdC+XHJcbiAgICAvLyDQsiBSRUFETUUg0LrQsNC6INC/0L7QstC10LTQtdC90LjQtSBcItC70LXQvdC40LLQvtCz0L5cIiBSRVNULdCy0YvQt9C+0LLQsC5cclxuICAgIHJldHVybiBkZWZlcigoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHBhcmFtc0Nsb25lID0gY2xvbmUocGFyYW1zKVxyXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLnNlc3Npb24uZ2V0S2V5QXV0aCgpXHJcbiAgICAgIGNvbnN0IGF1dGggPSB0aGlzLnNlc3Npb24uZ2V0QXV0aFBhcmFtcygpXHJcbiAgICAgIGNvbnN0IGNoZWNrSXNPbiA9IHRoaXMuc2Vzc2lvbi5nZXRDaGVja0F1dGhQYXJhbXNJc09uKClcclxuXHJcbiAgICAgIGlmIChjaGVja0lzT24pIHtcclxuICAgICAgICBpZiAoIWF1dGgpIHtcclxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IHRoaXMuc2Vzc2lvbi5nZXRBdXRoRXJyb3IoJ3Bvc3QnKSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChrZXkgIT09ICdPQXV0aDInKSB7XHJcbiAgICAgICAgICBwYXJhbXNDbG9uZVtrZXldID0gYXV0aFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXRCYXNlVXJsKCkucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKGJhc2VVcmwpID0+IHtcclxuICAgICAgICAgIGlmICghYmFzZVVybCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiB0aGlzLnNlc3Npb24uZ2V0QmFzZVVybEVycm9yKCdwb3N0JykpXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgZnVsbFVybCA9IHByZXBhcmVCYXNlQWRkcmVzcyhiYXNlVXJsKSArIHVybFxyXG5cclxuICAgICAgICAgIGlmIChrZXkgPT09ICdzZXNzaWQnKSB7XHJcbiAgICAgICAgICAgIC8vINCf0YDQtdC+0LHRgNCw0LfRg9C10Lwg0L/QsNGA0LDQvNC10YLRgNGLINCyINGE0L7RgNC80LDRgiB4LXd3dy1mb3JtLXVybGVuY29kZWRcclxuICAgICAgICAgICAgY29uc3QgYm9keVN0cmluZyA9IHRoaXMuc2VyaWFsaXplQml0cml4UGFyYW1zKHBhcmFtc0Nsb25lKVxyXG4gICAgICAgICAgICByZXR1cm4gZnJvbShcclxuICAgICAgICAgICAgICB0aGlzLmF4aW9zSW5zdGFuY2UucG9zdDxUPihmdWxsVXJsLCBib2R5U3RyaW5nLCB7XHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7J0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnfSxcclxuICAgICAgICAgICAgICB9KS50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuZGF0YSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJldHVybiBmcm9tKFxyXG4gICAgICAgICAgICB0aGlzLmF4aW9zSW5zdGFuY2UucG9zdDxUPihmdWxsVXJsLCBwYXJhbXNDbG9uZSxcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuc2Vzc2lvbi5nZXRXaXRoQ3JlZGVudGlhbHMoKSxcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICkudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmRhdGEpXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIGh0dHBHZXQ8VD4odXJsOiBzdHJpbmcsIHBhcmFtczogYW55ID0ge30pOiBPYnNlcnZhYmxlPFQgfCB1bmRlZmluZWQ+IHtcclxuICAgIC8vINCi0LAg0LbQtSDQv9GA0LjRh9C40L3QsCwg0YfRgtC+INC4INGDIGh0dHBQb3N0INCy0YvRiNC1OiDQvtGC0LrQu9Cw0LTRi9Cy0LDQtdC8INGH0YLQtdC90LjQtSBCWFJlc3RTZXR0aW5nc1xyXG4gICAgLy8g0LTQviDQv9C+0LTQv9C40YHQutC4LCDRh9GC0L7QsdGLIGBnZXQoKWAg0LLRkdC7INGB0LXQsdGPINGC0LDQuiDQttC1IFwi0LvQtdC90LjQstC+XCIsINC60LDQuiDQuCBgcG9zdCgpYFxyXG4gICAgLy8gKNGB0LjQvNC80LXRgtGA0LjRjywg0LrQvtGC0L7RgNC+0Lkg0L3QtSDQsdGL0LvQviDQtNC+INGN0YLQvtCz0L4g4oCUIEdFVCDRgNC10LfQvtC70LLQuNC7INC90LDRgdGC0YDQvtC50LrQuCDQsiDQvNC+0LzQtdC90YJcclxuICAgIC8vINCy0YvQt9C+0LLQsCwg0LAg0L3QtSDQsiDQvNC+0LzQtdC90YIgc3Vic2NyaWJlKCkpLlxyXG4gICAgcmV0dXJuIGRlZmVyKCgpID0+IHtcclxuICAgICAgY29uc3QgcGFyYW1zQ2xvbmUgPSBjbG9uZShwYXJhbXMpXHJcbiAgICAgIGNvbnN0IGF1dGggPSB0aGlzLnNlc3Npb24uZ2V0QXV0aFBhcmFtcygpXHJcbiAgICAgIGNvbnN0IGNoZWNrSXNPbiA9IHRoaXMuc2Vzc2lvbi5nZXRDaGVja0F1dGhQYXJhbXNJc09uKClcclxuXHJcbiAgICAgIGlmIChjaGVja0lzT24pIHtcclxuICAgICAgICBpZiAoIWF1dGgpIHtcclxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IHRoaXMuc2Vzc2lvbi5nZXRBdXRoRXJyb3IoJ2dldCcpKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcGFyYW1zQ2xvbmVbdGhpcy5zZXNzaW9uLmdldEtleUF1dGgoKV0gPSBhdXRoXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLnNlc3Npb24uZ2V0QmFzZVVybCgpLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKChiYXNlVXJsKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWJhc2VVcmwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gdGhpcy5zZXNzaW9uLmdldEJhc2VVcmxFcnJvcignZ2V0JykpXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgZnVsbFVybCA9IHByZXBhcmVCYXNlQWRkcmVzcyhiYXNlVXJsKSArIHVybFxyXG4gICAgICAgICAgY29uc3QgcXVlcnlTdHJpbmcgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHBhcmFtc0Nsb25lKS50b1N0cmluZygpXHJcbiAgICAgICAgICBjb25zdCBmaW5hbFVybCA9IGAke2Z1bGxVcmx9PyR7cXVlcnlTdHJpbmd9YFxyXG5cclxuICAgICAgICAgIHJldHVybiBmcm9tKFxyXG4gICAgICAgICAgICB0aGlzLmF4aW9zSW5zdGFuY2UuZ2V0PFQ+KGZpbmFsVXJsKS50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuZGF0YSlcclxuICAgICAgICAgIClcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgc2VyaWFsaXplQml0cml4UGFyYW1zKHBhcmFtczogdW5rbm93bik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gc3RyaW5naWZ5Qml0cml4UGFyYW1zKHBhcmFtcylcclxuICB9XHJcblxyXG4gIGdldE5hbWVNZXRob2QoYXJyOiBzdHJpbmdbXSkge1xyXG4gICAgcmV0dXJuIGFyci5qb2luKCcuJylcclxuICB9XHJcblxyXG59XHJcblxyXG4iXX0=
157
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSHR0cEJYLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYngtcmVzdC9zcmMvc2VydmljZXMvaHR0cC9IdHRwQlgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFVBQVUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUNwRSxPQUFPLEtBQUssTUFBTSxZQUFZLENBQUE7QUFDOUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUtyQyxPQUFPLE9BQU8sTUFBTSxpQkFBaUIsQ0FBQTtBQUNyQyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUMxRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDMUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQzVDLE9BQU8sRUFBRSxxQkFBcUIsSUFBSSxxQkFBcUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFBO0FBR3RHLE1BQU0sT0FBTyxjQUFlLFNBQVEsWUFBWTtJQUU5Qzs7OztPQUlHO0lBQ0gsTUFBTSxDQUFPLEtBQXlEO1FBRXBFLElBQUksWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQVMsSUFBSSxDQUFDLFlBQVksQ0FBSSxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQ3RFLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQSxDQUFDLG1CQUFtQjtRQUNuQyxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUEsQ0FBQywyQ0FBMkM7UUFDN0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQy9ELFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLENB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LEdBQUcsT0FBTyxJQUFJLFdBQVcsRUFBRSxDQUFBO2dCQUU1QyxPQUFPLElBQUksQ0FDVCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBSSxRQUFRLEVBQUU7b0JBQ2xDLE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztpQkFDcEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUNyQyxDQUFBO1lBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQTtRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssWUFBWSxDQUFDLE9BQWdDLEVBQUUsV0FBbUMsRUFBRTtRQUMxRixPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLEdBQUcsUUFBUSxFQUFFLENBQUE7SUFDbEUsQ0FBQztJQUVELHFCQUFxQixDQUFDLE1BQWU7UUFDbkMsT0FBTyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUN0QyxDQUFDO0lBRUQsYUFBYSxDQUFDLEdBQWE7UUFDekIsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3RCLENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIHRocm93RXJyb3IsIGZvcmtKb2luLCBmcm9tLCBkZWZlciB9IGZyb20gJ3J4anMnXHJcbmltcG9ydCBjbG9uZSBmcm9tICdqdXN0LWNsb25lJ1xyXG5pbXBvcnQgeyBIdHRwU2VydmljZXMgfSBmcm9tICcuL2h0dHAnXHJcbmltcG9ydCB7XHJcbiAgaUJhdGNoUmVxdWVzdEFuc3dlciwgaUJhdGNoUmVxdWVzdFBhcmFtLCBpQmF0Y2hSZXF1ZXN0UGFyYW1BcnIsIGlCYXRjaFJlcXVlc3RQYXJhbUh0dHAsIGtleUJhdGNoLFxyXG59IGZyb20gJy4uLy4uL3R5cGlmaWNhdGlvbi9yZXN0L2JhdGNoL2JhdGNoUmVxdWVzdFBhcmFtJ1xyXG5pbXBvcnQgeyBpQlhSZXN0QW5zd2VyIH0gZnJvbSAnLi4vLi4vdHlwaWZpY2F0aW9uL3Jlc3QvYmFzZS9hbnN3ZXInXHJcbmltcG9ydCBmbGF0dGVuIGZyb20gJ2p1c3QtZmxhdHRlbi1pdCdcclxuaW1wb3J0IHsgaW5zdGFuY2VPZmlCWFJlc3RBbnN3ZXJTdWNjZXNzIH0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zL21hcFJlc3VsdCdcclxuaW1wb3J0IHsgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXHJcbmltcG9ydCB7IHByZXBhcmVCYXNlQWRkcmVzcyB9IGZyb20gJy4uL2Jhc2UnXHJcbmltcG9ydCB7IHNlcmlhbGl6ZUJpdHJpeFBhcmFtcyBhcyBzdHJpbmdpZnlCaXRyaXhQYXJhbXMgfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMvc2VyaWFsaXplQml0cml4UGFyYW1zJ1xyXG5pbXBvcnQgeyBpSHR0cFBhcmFtU2V0dGluZ3MgfSBmcm9tICcuLi8uLi90eXBpZmljYXRpb24vcmVzdC9zZXR0aW5ncydcclxuXHJcbmV4cG9ydCBjbGFzcyBIdHRwQlhTZXJ2aWNlcyBleHRlbmRzIEh0dHBTZXJ2aWNlcyB7XHJcblxyXG4gIC8qKlxyXG4gICAqINCd0LUg0YHRh9C40YLQsNC50YLQtSDRjdGC0L7RgiDQvNC10YLQvtC0INC+0LHRgNCw0LfRhtC+0Lwv0YTQuNC90LDQu9GM0L3Ri9C8IEFQSS5cclxuICAgKiBUT0RPOiDQo9C00LDQu9C40YLRjCDQtNCw0L3QvdGL0Lkg0LzQtdGC0L7QtCDQv9C+0YHQu9C1INGA0LXQsNC70LjQt9Cw0YbQuNC4INC10LPQviDQsiDRgNCw0LfQtNC10LvQtSBOYXZ2eVxyXG4gICAqIEBwYXJhbSBwYXJhbVxyXG4gICAqL1xyXG4gIGJyYW5jaDxULCBBPihwYXJhbTogaUJhdGNoUmVxdWVzdFBhcmFtQXJyPFQ+IHwgaUJhdGNoUmVxdWVzdFBhcmFtPFQ+W10pXHJcbiAgICA6IE9ic2VydmFibGU8aUJhdGNoUmVxdWVzdEFuc3dlcjxBPltdIHwgdW5kZWZpbmVkPiB7XHJcbiAgICBsZXQgcHJlcGFyZVBhcmFtID0gT2JqZWN0LmVudHJpZXM8c3RyaW5nPih0aGlzLnByZXBhcmVCYXRjaDxUPihwYXJhbSkpXHJcbiAgICBjb25zdCBzaXplID0gNTAgLy8g0LHQvtC70YzRiNC1INC90LUg0L7RgtC00LDRgdGCXHJcbiAgICBsZXQgc3ViYXJyYXkgPSBbXSAvL9C80LDRgdGB0LjQsiDQsiDQutC+0YLQvtGA0YvQuSDQsdGD0LTQtdGCINCy0YvQstC10LTQtdC9INGA0LXQt9GD0LvRjNGC0LDRgi5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5jZWlsKHByZXBhcmVQYXJhbS5sZW5ndGggLyBzaXplKTsgaSsrKSB7XHJcbiAgICAgIHN1YmFycmF5W2ldID0gcHJlcGFyZVBhcmFtLnNsaWNlKChpICogc2l6ZSksIChpICogc2l6ZSkgKyBzaXplKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmb3JrSm9pbihcclxuICAgICAgc3ViYXJyYXkubWFwKGkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBQb3N0KCdiYXRjaC5qc29uJywge1xyXG4gICAgICAgICAgaGFsdDogMCxcclxuICAgICAgICAgIGNtZDogT2JqZWN0LmFzc2lnbih7fSwgLi4uaS5tYXAoeCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7W3hbMF1dOiB4WzFdfVxyXG4gICAgICAgICAgfSkpXHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgICkgYXMgT2JzZXJ2YWJsZTxpQmF0Y2hSZXF1ZXN0QW5zd2VyPEE+W10+XHJcbiAgfVxyXG5cclxuICBwcmVwYXJlQmF0Y2g8VD4ocGFyYW06IGlCYXRjaFJlcXVlc3RQYXJhbUFycjxUPiB8IGlCYXRjaFJlcXVlc3RQYXJhbTxUPltdKTogaUJhdGNoUmVxdWVzdFBhcmFtSHR0cCB7XHJcbiAgICBsZXQgcmVzOiBpQmF0Y2hSZXF1ZXN0UGFyYW1IdHRwID0gT2JqZWN0LmtleXMocGFyYW0pLnJlZHVjZShcclxuICAgICAgKG9iaiwga2V5KSA9PiB7XHJcbiAgICAgICAgb2JqW2tleV0gPSAnJ1xyXG4gICAgICAgIHJldHVybiBvYmpcclxuICAgICAgfSxcclxuICAgICAge30gYXMgaUJhdGNoUmVxdWVzdFBhcmFtSHR0cFxyXG4gICAgKVxyXG4gICAgZm9yIChsZXQga2V5IGluIHBhcmFtKSB7XHJcbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyB8fCB0eXBlb2Yga2V5ID09PSAnbnVtYmVyJyAmJiBwYXJhbVtrZXldLnBhcmFtKSB7XHJcbiAgICAgICAgcmVzW2tleV0gPSBwYXJhbVtrZXldLm5hbWUgKyAnPycgKyBzdHJpbmdpZnlCaXRyaXhQYXJhbXMocGFyYW1ba2V5XS5wYXJhbSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc1xyXG4gIH1cclxuXHJcbiAgbWFwQnJhbmNoUmVzdWx0PFQ+KHJlczogaUJhdGNoUmVxdWVzdEFuc3dlcjxUPltdKSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihbXSwgLi4ucmVzLm1hcChpID0+XHJcbiAgICAgIChpbnN0YW5jZU9maUJYUmVzdEFuc3dlclN1Y2Nlc3MoaSkgJiYgaW5zdGFuY2VPZmlCWFJlc3RBbnN3ZXJTdWNjZXNzKGkucmVzdWx0KSkgPyBpLnJlc3VsdC5yZXN1bHQgOiB1bmRlZmluZWQpXHJcbiAgICApIGFzIFJlY29yZDxrZXlCYXRjaCwgVD5cclxuICB9XHJcblxyXG4gIG1hcEJyYW5jaFJlc3VsdFdpdGhvdXRLZXk8VD4ocmVzOiBpQmF0Y2hSZXF1ZXN0QW5zd2VyPFQ+W10pOiBUW10ge1xyXG4gICAgcmV0dXJuIGZsYXR0ZW48VD4oT2JqZWN0LmFzc2lnbihbXSwgLi4ucmVzLm1hcChpID0+XHJcbiAgICAgIChpbnN0YW5jZU9maUJYUmVzdEFuc3dlclN1Y2Nlc3MoaSkgJiYgaW5zdGFuY2VPZmlCWFJlc3RBbnN3ZXJTdWNjZXNzKGkucmVzdWx0KSlcclxuICAgICAgICA/IGkucmVzdWx0LnJlc3VsdFxyXG4gICAgICAgIDogdW5kZWZpbmVkKSlcclxuICAgIClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqINCe0YHQvdC+0LLQvdC+0Lkg0LzQtdGC0L7QtCDQtNC70Y8g0LfQsNC/0YDQvtGB0L7QslxyXG4gICAqXHJcbiAgICogQHBhcmFtIG5hbWVcclxuICAgKiBAcGFyYW0gcGFyYW1zXHJcbiAgICogQHBhcmFtIHJlc3RBcGlcclxuICAgKiBAcGFyYW0gaGVhZGVycyDQt9Cw0LPQvtC70L7QstC60Lgg0YLQvtC70YzQutC+INC00LvRjyDRjdGC0L7Qs9C+INC30LDQv9GA0L7RgdCwLCDQv9C+0LLQtdGA0YUgYEJYUmVzdFNldHRpbmdzLmhlYWRlcnNgXHJcbiAgICovXHJcbiAgcG9zdDxUPihuYW1lOiBzdHJpbmdbXSwgcGFyYW1zOiBhbnkgPSB7fSwgcmVzdEFwaSA9IGZhbHNlLCBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xyXG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5nZXROYW1lTWV0aG9kKG5hbWUpXHJcbiAgICByZXR1cm4gdGhpcy5odHRwUG9zdDxpQlhSZXN0QW5zd2VyPFQ+PihyZXN0QXBpID8gYGFwaS8ke21ldGhvZH1gIDogbWV0aG9kLCBwYXJhbXMsIHVuZGVmaW5lZCwgaGVhZGVycylcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqINCS0YLQvtGA0L7RgdGC0LXQv9C10L3QvdGL0Lkg0LzQtdGC0L7QtCDQtNC70Y8g0LfQsNC/0YDQvtGB0L7Qsi4g0J/QviDQstC+0LfQvNC+0LbQvdC+0YHRgtC4INC70YPRh9GI0LUg0L3QtSDQuNGB0L/QvtC70YzQt9C+0LLQsNGC0YxcclxuICAgKlxyXG4gICAqIEBwYXJhbSBuYW1lXHJcbiAgICogQHBhcmFtIHBhcmFtc1xyXG4gICAqIEBwYXJhbSBoZWFkZXJzINC30LDQs9C+0LvQvtCy0LrQuCDRgtC+0LvRjNC60L4g0LTQu9GPINGN0YLQvtCz0L4g0LfQsNC/0YDQvtGB0LAsINC/0L7QstC10YDRhSBgQlhSZXN0U2V0dGluZ3MuaGVhZGVyc2BcclxuICAgKi9cclxuICBnZXQ8VD4obmFtZTogc3RyaW5nW10sIHBhcmFtczogYW55ID0ge30sIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwR2V0PGlCWFJlc3RBbnN3ZXI8VD4+KHRoaXMuZ2V0TmFtZU1ldGhvZChuYW1lKSwgcGFyYW1zLCB1bmRlZmluZWQsIGhlYWRlcnMpXHJcbiAgfVxyXG5cclxuICAvLyBzZXR0aW5ncyDigJQg0YLQvtC70YzQutC+INC00LvRjyDRgdC+0LLQvNC10YHRgtC40LzQvtGB0YLQuCDRgdC40LPQvdCw0YLRg9GA0Ysg0YEgSHR0cFNlcnZpY2VzOiDQt9C00LXRgdGMINGC0LXQu9C+XHJcbiAgLy8g0YPRhdC+0LTQuNGCIEpTT04t0L7QvC91cmxlbmNvZGVkLCDQuCDQv9C10YDQtdGB0YfRkdGCINC00LDRgiDQuNC3IGlIdHRwUGFyYW1TZXR0aW5ncyDQvdC1INC90YPQttC10L0uXHJcbiAgb3ZlcnJpZGUgaHR0cFBvc3Q8VD4oXHJcbiAgICB1cmw6IHN0cmluZyxcclxuICAgIHBhcmFtczogYW55ID0ge30sXHJcbiAgICBzZXR0aW5ncz86IGlIdHRwUGFyYW1TZXR0aW5ncyxcclxuICAgIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XHJcbiAgKTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPiB7XHJcbiAgICAvLyBkZWZlcigpINC+0YLQutC70LDQtNGL0LLQsNC10YIg0LLRgdGRINGB0L7QtNC10YDQttC40LzQvtC1ICjQsiDRgtC+0Lwg0YfQuNGB0LvQtSDRh9GC0LXQvdC40LUgQlhSZXN0U2V0dGluZ3NcclxuICAgIC8vINGH0LXRgNC10LcgdGhpcy5zZXNzaW9uLiopINC00L4g0YDQtdCw0LvRjNC90L7QuSDQv9C+0LTQv9C40YHQutC4IOKAlCDQuNC90LDRh9C1INC00LDQttC1INGBIFwi0LbQuNCy0YvQvFwiXHJcbiAgICAvLyDQs9C10YLRgtC10YDQvtC8INCyIFNlc3Npb25LZXlTZXJ2aWNlcyDQvdCw0YHRgtGA0L7QudC60Lgg0YfQuNGC0LDQu9C40YHRjCDQsdGLINCyINC80L7QvNC10L3RgiDQstGL0LfQvtCy0LBcclxuICAgIC8vIC5yZXMoKSwg0LAg0L3QtSDQsiDQvNC+0LzQtdC90YIgc3Vic2NyaWJlKCkvZmlyc3RWYWx1ZUZyb20oKSwg0YfRgtC+INC4INC+0LHQtdGJ0LDQvdC+XHJcbiAgICAvLyDQsiBSRUFETUUg0LrQsNC6INC/0L7QstC10LTQtdC90LjQtSBcItC70LXQvdC40LLQvtCz0L5cIiBSRVNULdCy0YvQt9C+0LLQsC5cclxuICAgIHJldHVybiBkZWZlcigoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHBhcmFtc0Nsb25lID0gY2xvbmUocGFyYW1zKVxyXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLnNlc3Npb24uZ2V0S2V5QXV0aCgpXHJcbiAgICAgIGNvbnN0IGF1dGggPSB0aGlzLnNlc3Npb24uZ2V0QXV0aFBhcmFtcygpXHJcbiAgICAgIGNvbnN0IGNoZWNrSXNPbiA9IHRoaXMuc2Vzc2lvbi5nZXRDaGVja0F1dGhQYXJhbXNJc09uKClcclxuXHJcbiAgICAgIGlmIChjaGVja0lzT24pIHtcclxuICAgICAgICBpZiAoIWF1dGgpIHtcclxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IHRoaXMuc2Vzc2lvbi5nZXRBdXRoRXJyb3IoJ3Bvc3QnKSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChrZXkgIT09ICdPQXV0aDInKSB7XHJcbiAgICAgICAgICBwYXJhbXNDbG9uZVtrZXldID0gYXV0aFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXRCYXNlVXJsKCkucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKGJhc2VVcmwpID0+IHtcclxuICAgICAgICAgIGlmICghYmFzZVVybCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiB0aGlzLnNlc3Npb24uZ2V0QmFzZVVybEVycm9yKCdwb3N0JykpXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgZnVsbFVybCA9IHByZXBhcmVCYXNlQWRkcmVzcyhiYXNlVXJsKSArIHVybFxyXG5cclxuICAgICAgICAgIGlmIChrZXkgPT09ICdzZXNzaWQnKSB7XHJcbiAgICAgICAgICAgIC8vINCf0YDQtdC+0LHRgNCw0LfRg9C10Lwg0L/QsNGA0LDQvNC10YLRgNGLINCyINGE0L7RgNC80LDRgiB4LXd3dy1mb3JtLXVybGVuY29kZWRcclxuICAgICAgICAgICAgY29uc3QgYm9keVN0cmluZyA9IHRoaXMuc2VyaWFsaXplQml0cml4UGFyYW1zKHBhcmFtc0Nsb25lKVxyXG4gICAgICAgICAgICByZXR1cm4gZnJvbShcclxuICAgICAgICAgICAgICB0aGlzLmF4aW9zSW5zdGFuY2UucG9zdDxUPihmdWxsVXJsLCBib2R5U3RyaW5nLCB7XHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmJ1aWxkSGVhZGVycyhoZWFkZXJzLCB7J0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnfSksXHJcbiAgICAgICAgICAgICAgfSkudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmRhdGEpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICByZXR1cm4gZnJvbShcclxuICAgICAgICAgICAgdGhpcy5heGlvc0luc3RhbmNlLnBvc3Q8VD4oZnVsbFVybCwgcGFyYW1zQ2xvbmUsXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLnNlc3Npb24uZ2V0V2l0aENyZWRlbnRpYWxzKCksXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmJ1aWxkSGVhZGVycyhoZWFkZXJzLCB7J0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ30pLFxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKS50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuZGF0YSlcclxuICAgICAgICAgIClcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgaHR0cEdldDxUPihcclxuICAgIHVybDogc3RyaW5nLFxyXG4gICAgcGFyYW1zOiBhbnkgPSB7fSxcclxuICAgIHNldHRpbmdzPzogaUh0dHBQYXJhbVNldHRpbmdzLFxyXG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cclxuICApOiBPYnNlcnZhYmxlPFQgfCB1bmRlZmluZWQ+IHtcclxuICAgIC8vINCi0LAg0LbQtSDQv9GA0LjRh9C40L3QsCwg0YfRgtC+INC4INGDIGh0dHBQb3N0INCy0YvRiNC1OiDQvtGC0LrQu9Cw0LTRi9Cy0LDQtdC8INGH0YLQtdC90LjQtSBCWFJlc3RTZXR0aW5nc1xyXG4gICAgLy8g0LTQviDQv9C+0LTQv9C40YHQutC4LCDRh9GC0L7QsdGLIGBnZXQoKWAg0LLRkdC7INGB0LXQsdGPINGC0LDQuiDQttC1IFwi0LvQtdC90LjQstC+XCIsINC60LDQuiDQuCBgcG9zdCgpYFxyXG4gICAgLy8gKNGB0LjQvNC80LXRgtGA0LjRjywg0LrQvtGC0L7RgNC+0Lkg0L3QtSDQsdGL0LvQviDQtNC+INGN0YLQvtCz0L4g4oCUIEdFVCDRgNC10LfQvtC70LLQuNC7INC90LDRgdGC0YDQvtC50LrQuCDQsiDQvNC+0LzQtdC90YJcclxuICAgIC8vINCy0YvQt9C+0LLQsCwg0LAg0L3QtSDQsiDQvNC+0LzQtdC90YIgc3Vic2NyaWJlKCkpLlxyXG4gICAgcmV0dXJuIGRlZmVyKCgpID0+IHtcclxuICAgICAgY29uc3QgcGFyYW1zQ2xvbmUgPSBjbG9uZShwYXJhbXMpXHJcbiAgICAgIGNvbnN0IGF1dGggPSB0aGlzLnNlc3Npb24uZ2V0QXV0aFBhcmFtcygpXHJcbiAgICAgIGNvbnN0IGNoZWNrSXNPbiA9IHRoaXMuc2Vzc2lvbi5nZXRDaGVja0F1dGhQYXJhbXNJc09uKClcclxuXHJcbiAgICAgIGlmIChjaGVja0lzT24pIHtcclxuICAgICAgICBpZiAoIWF1dGgpIHtcclxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IHRoaXMuc2Vzc2lvbi5nZXRBdXRoRXJyb3IoJ2dldCcpKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcGFyYW1zQ2xvbmVbdGhpcy5zZXNzaW9uLmdldEtleUF1dGgoKV0gPSBhdXRoXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLnNlc3Npb24uZ2V0QmFzZVVybCgpLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKChiYXNlVXJsKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWJhc2VVcmwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gdGhpcy5zZXNzaW9uLmdldEJhc2VVcmxFcnJvcignZ2V0JykpXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgZnVsbFVybCA9IHByZXBhcmVCYXNlQWRkcmVzcyhiYXNlVXJsKSArIHVybFxyXG4gICAgICAgICAgY29uc3QgcXVlcnlTdHJpbmcgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHBhcmFtc0Nsb25lKS50b1N0cmluZygpXHJcbiAgICAgICAgICBjb25zdCBmaW5hbFVybCA9IGAke2Z1bGxVcmx9PyR7cXVlcnlTdHJpbmd9YFxyXG5cclxuICAgICAgICAgIHJldHVybiBmcm9tKFxyXG4gICAgICAgICAgICB0aGlzLmF4aW9zSW5zdGFuY2UuZ2V0PFQ+KGZpbmFsVXJsLCB7XHJcbiAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5idWlsZEhlYWRlcnMoaGVhZGVycyksXHJcbiAgICAgICAgICAgIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5kYXRhKVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDQl9Cw0LPQvtC70L7QstC60Lgg0LfQsNC/0YDQvtGB0LA6IGBCWFJlc3RTZXR0aW5ncy5oZWFkZXJzYCwg0L/QvtCy0LXRgNGFINC90LjRhSDigJQg0LfQsNCz0L7Qu9C+0LLQutC4XHJcbiAgICog0LrQvtC90LrRgNC10YLQvdC+0LPQviDQt9Cw0L/RgNC+0YHQsCwg0L/QvtCy0LXRgNGFINCy0YHQtdCz0L4g4oCUIGByZXF1aXJlZGAuINCSIGByZXF1aXJlZGAg0LjQtNGR0YJcclxuICAgKiBgQ29udGVudC1UeXBlYDog0L7RgiDQvdC10LPQviDQt9Cw0LLQuNGB0LjRgiwg0LrQsNC6INGB0LXRgNCy0LXRgCDRgNCw0LfQsdC10YDRkdGCINGC0LXQu9C+LCDQv9C+0Y3RgtC+0LzRg1xyXG4gICAqINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjNGB0LrQuNC1INC30LDQs9C+0LvQvtCy0LrQuCDQtdCz0L4g0L3QtSDQv9C10YDQtdCx0LjQstCw0Y7Rgi5cclxuICAgKi9cclxuICBwcml2YXRlIGJ1aWxkSGVhZGVycyhoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgcmVxdWlyZWQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fSkge1xyXG4gICAgcmV0dXJuIHsgLi4udGhpcy5zZXNzaW9uLmdldEhlYWRlcnMoKSwgLi4uaGVhZGVycywgLi4ucmVxdWlyZWQgfVxyXG4gIH1cclxuXHJcbiAgc2VyaWFsaXplQml0cml4UGFyYW1zKHBhcmFtczogdW5rbm93bik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gc3RyaW5naWZ5Qml0cml4UGFyYW1zKHBhcmFtcylcclxuICB9XHJcblxyXG4gIGdldE5hbWVNZXRob2QoYXJyOiBzdHJpbmdbXSkge1xyXG4gICAgcmV0dXJuIGFyci5qb2luKCcuJylcclxuICB9XHJcblxyXG59XHJcblxyXG4iXX0=