ng2-rest 13.2.9 → 16.0.11

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 (118) hide show
  1. package/README.md +135 -135
  2. package/assets/shared/shared_folder_info.txt +1 -1
  3. package/browser/README.md +24 -24
  4. package/{client/esm2020 → browser/esm2022}/lib/cookie.mjs +3 -3
  5. package/browser/esm2022/lib/helpers.mjs +25 -0
  6. package/{websql/esm2020 → browser/esm2022}/lib/models.mjs +9 -9
  7. package/browser/esm2022/lib/other/simple-resource.mjs +119 -0
  8. package/browser/esm2022/lib/request-cache.mjs +102 -0
  9. package/browser/esm2022/lib/resource.service.mjs +221 -0
  10. package/browser/esm2022/lib/rest-headers.mjs +129 -0
  11. package/browser/esm2022/lib/rest-request.mjs +323 -0
  12. package/browser/esm2022/lib/rest.class.mjs +120 -0
  13. package/browser/{fesm2020 → fesm2022}/ng2-rest.mjs +73 -73
  14. package/browser/{fesm2020 → fesm2022}/ng2-rest.mjs.map +1 -1
  15. package/browser/lib/rest-headers.d.ts +1 -1
  16. package/browser/package.json +6 -12
  17. package/client/README.md +24 -24
  18. package/{browser/esm2020 → client/esm2022}/lib/cookie.mjs +3 -3
  19. package/client/esm2022/lib/helpers.mjs +25 -0
  20. package/client/esm2022/lib/models.mjs +160 -0
  21. package/client/esm2022/lib/other/simple-resource.mjs +119 -0
  22. package/client/esm2022/lib/request-cache.mjs +102 -0
  23. package/client/esm2022/lib/resource.service.mjs +221 -0
  24. package/client/esm2022/lib/rest-headers.mjs +129 -0
  25. package/client/esm2022/lib/rest-request.mjs +323 -0
  26. package/client/esm2022/lib/rest.class.mjs +120 -0
  27. package/client/{fesm2020 → fesm2022}/ng2-rest.mjs +73 -73
  28. package/client/{fesm2020 → fesm2022}/ng2-rest.mjs.map +1 -1
  29. package/client/lib/rest-headers.d.ts +1 -1
  30. package/client/package.json +84 -82
  31. package/index.js.map +1 -1
  32. package/lib/content-type.js.map +1 -1
  33. package/lib/cookie.js.map +1 -1
  34. package/lib/helpers.js +1 -2
  35. package/lib/helpers.js.map +1 -1
  36. package/lib/index.js.map +1 -1
  37. package/lib/mapping.js.map +1 -1
  38. package/lib/models.js.map +1 -1
  39. package/lib/other/simple-resource.js +1 -2
  40. package/lib/other/simple-resource.js.map +1 -1
  41. package/lib/params.js.map +1 -1
  42. package/lib/request-cache.js +1 -2
  43. package/lib/request-cache.js.map +1 -1
  44. package/lib/resource.service.js +1 -2
  45. package/lib/resource.service.js.map +1 -1
  46. package/lib/rest-headers.d.ts +1 -1
  47. package/lib/rest-headers.js.map +1 -1
  48. package/lib/rest-request.js +1 -2
  49. package/lib/rest-request.js.map +1 -1
  50. package/lib/rest.class.js.map +1 -1
  51. package/package.json +4 -4
  52. package/package.json_devDependencies.json +217 -217
  53. package/package.json_tnp.json5 +53 -53
  54. package/tmp-environment.json +89 -87
  55. package/websql/README.md +24 -24
  56. package/websql/{esm2020 → esm2022}/lib/cookie.mjs +3 -3
  57. package/websql/esm2022/lib/helpers.mjs +25 -0
  58. package/websql/esm2022/lib/models.mjs +160 -0
  59. package/websql/esm2022/lib/other/simple-resource.mjs +119 -0
  60. package/websql/esm2022/lib/request-cache.mjs +102 -0
  61. package/websql/esm2022/lib/resource.service.mjs +221 -0
  62. package/websql/esm2022/lib/rest-headers.mjs +129 -0
  63. package/websql/esm2022/lib/rest-request.mjs +323 -0
  64. package/websql/esm2022/lib/rest.class.mjs +120 -0
  65. package/websql/{fesm2020 → fesm2022}/ng2-rest.mjs +73 -73
  66. package/websql/{fesm2020 → fesm2022}/ng2-rest.mjs.map +1 -1
  67. package/websql/lib/rest-headers.d.ts +1 -1
  68. package/websql/package.json +6 -12
  69. package/browser/esm2020/lib/helpers.mjs +0 -24
  70. package/browser/esm2020/lib/models.mjs +0 -160
  71. package/browser/esm2020/lib/other/simple-resource.mjs +0 -118
  72. package/browser/esm2020/lib/request-cache.mjs +0 -101
  73. package/browser/esm2020/lib/resource.service.mjs +0 -220
  74. package/browser/esm2020/lib/rest-headers.mjs +0 -129
  75. package/browser/esm2020/lib/rest-request.mjs +0 -322
  76. package/browser/esm2020/lib/rest.class.mjs +0 -120
  77. package/browser/fesm2015/ng2-rest.mjs +0 -1739
  78. package/browser/fesm2015/ng2-rest.mjs.map +0 -1
  79. package/client/esm2020/lib/helpers.mjs +0 -24
  80. package/client/esm2020/lib/models.mjs +0 -160
  81. package/client/esm2020/lib/other/simple-resource.mjs +0 -118
  82. package/client/esm2020/lib/request-cache.mjs +0 -101
  83. package/client/esm2020/lib/resource.service.mjs +0 -220
  84. package/client/esm2020/lib/rest-headers.mjs +0 -129
  85. package/client/esm2020/lib/rest-request.mjs +0 -322
  86. package/client/esm2020/lib/rest.class.mjs +0 -120
  87. package/client/fesm2015/ng2-rest.mjs +0 -1739
  88. package/client/fesm2015/ng2-rest.mjs.map +0 -1
  89. package/websql/esm2020/lib/helpers.mjs +0 -24
  90. package/websql/esm2020/lib/other/simple-resource.mjs +0 -118
  91. package/websql/esm2020/lib/request-cache.mjs +0 -101
  92. package/websql/esm2020/lib/resource.service.mjs +0 -220
  93. package/websql/esm2020/lib/rest-headers.mjs +0 -129
  94. package/websql/esm2020/lib/rest-request.mjs +0 -322
  95. package/websql/esm2020/lib/rest.class.mjs +0 -120
  96. package/websql/fesm2015/ng2-rest.mjs +0 -1739
  97. package/websql/fesm2015/ng2-rest.mjs.map +0 -1
  98. /package/browser/{esm2020 → esm2022}/lib/content-type.mjs +0 -0
  99. /package/browser/{esm2020 → esm2022}/lib/index.mjs +0 -0
  100. /package/browser/{esm2020 → esm2022}/lib/mapping.mjs +0 -0
  101. /package/browser/{esm2020 → esm2022}/lib/params.mjs +0 -0
  102. /package/browser/{esm2020 → esm2022}/ng2-rest.mjs +0 -0
  103. /package/browser/{esm2020 → esm2022}/public-api.mjs +0 -0
  104. /package/browser/{ng2-rest.d.ts → index.d.ts} +0 -0
  105. /package/client/{esm2020 → esm2022}/lib/content-type.mjs +0 -0
  106. /package/client/{esm2020 → esm2022}/lib/index.mjs +0 -0
  107. /package/client/{esm2020 → esm2022}/lib/mapping.mjs +0 -0
  108. /package/client/{esm2020 → esm2022}/lib/params.mjs +0 -0
  109. /package/client/{esm2020 → esm2022}/ng2-rest.mjs +0 -0
  110. /package/client/{esm2020 → esm2022}/public-api.mjs +0 -0
  111. /package/client/{ng2-rest.d.ts → index.d.ts} +0 -0
  112. /package/websql/{esm2020 → esm2022}/lib/content-type.mjs +0 -0
  113. /package/websql/{esm2020 → esm2022}/lib/index.mjs +0 -0
  114. /package/websql/{esm2020 → esm2022}/lib/mapping.mjs +0 -0
  115. /package/websql/{esm2020 → esm2022}/lib/params.mjs +0 -0
  116. /package/websql/{esm2020 → esm2022}/ng2-rest.mjs +0 -0
  117. /package/websql/{esm2020 → esm2022}/public-api.mjs +0 -0
  118. /package/websql/{ng2-rest.d.ts → index.d.ts} +0 -0
@@ -1,322 +0,0 @@
1
- import { firstValueFrom, Observable } from 'rxjs';
2
- import { Subject } from 'rxjs';
3
- import { _ } from 'tnp-core/browser';
4
- import { Models } from './models';
5
- import { RestHeaders } from './rest-headers';
6
- import { Helpers } from 'tnp-core/browser';
7
- import { Level } from 'ng2-logger/browser';
8
- import axios from 'axios';
9
- import { Resource } from './resource.service';
10
- import { Log } from 'ng2-logger/browser';
11
- import { RequestCache } from './request-cache';
12
- const log = Log.create('[ng2-rest] rest-request', Level.__NOTHING);
13
- const jobIDkey = 'jobID';
14
- const customObs = 'customObs';
15
- const cancelFn = 'cancelFn';
16
- const isCanceled = 'isCanceled';
17
- export class RestRequest {
18
- constructor() {
19
- this.subjectInuUse = {};
20
- this.meta = {};
21
- this.replaySubjects = {};
22
- }
23
- handlerResult(options, sourceRequest) {
24
- if (_.isUndefined(options)) {
25
- options = {};
26
- }
27
- const { res, jobid, isArray, method } = options;
28
- if (typeof res !== 'object') {
29
- throw new Error('No resposnse for request. ');
30
- }
31
- if (Helpers.isBrowser) {
32
- res.headers = RestHeaders.from(res.headers);
33
- }
34
- if (res.error) {
35
- this.subjectInuUse[jobid].error(new Models.HttpResponseError(res.error, res.data, res.headers, res.code, jobid));
36
- return;
37
- }
38
- const entity = this.meta[jobid].entity;
39
- const circular = this.meta[jobid].circular;
40
- const success = Resource['_listenSuccess'];
41
- const reqResp = new Models.HttpResponse(sourceRequest, res.data, res.headers, res.code, entity, circular, jobid, isArray);
42
- success.next(reqResp);
43
- this.subjectInuUse[jobid].next(reqResp);
44
- this.meta[jobid] = void 0;
45
- this.subjectInuUse[jobid].complete();
46
- }
47
- checkCache(sourceRequest, jobid) {
48
- const existedInCache = RequestCache.findBy(sourceRequest);
49
- if (existedInCache) {
50
- const success = Resource['_listenSuccess'];
51
- success.next(existedInCache.response);
52
- this.subjectInuUse[jobid].next(existedInCache);
53
- this.subjectInuUse[jobid].complete();
54
- return true;
55
- }
56
- return false;
57
- }
58
- async req(url, method, headers, body, jobid, isArray = false, mockHttp) {
59
- if (this.checkCache({
60
- url,
61
- body,
62
- isArray,
63
- method
64
- }, jobid)) {
65
- return;
66
- }
67
- const CancelToken = axios.CancelToken;
68
- const source = CancelToken.source();
69
- this.subjectInuUse[jobid][cancelFn] = source.cancel;
70
- var response;
71
- if (mockHttp) {
72
- if (typeof mockHttp === 'object') {
73
- response = {
74
- data: mockHttp.data,
75
- status: mockHttp.code,
76
- headers: mockHttp.headers,
77
- statusText: mockHttp.error,
78
- config: {}
79
- };
80
- }
81
- else if (typeof mockHttp === 'function') {
82
- const r = mockHttp(url, method, headers, body);
83
- response = {
84
- data: r.data,
85
- status: r.code,
86
- headers: r.headers,
87
- statusText: r.error,
88
- config: {}
89
- };
90
- }
91
- }
92
- const headersJson = headers.toJSON();
93
- const responseType = headersJson.responsetypeaxios ? headersJson.responsetypeaxios : 'text';
94
- try {
95
- if (!response) {
96
- response = await axios({
97
- url,
98
- method,
99
- data: body,
100
- responseType,
101
- headers: headersJson,
102
- cancelToken: source.token,
103
- });
104
- }
105
- if (this.subjectInuUse[jobid][isCanceled]) {
106
- return;
107
- }
108
- this.handlerResult({
109
- res: {
110
- code: response.status,
111
- data: response.data,
112
- isArray,
113
- jobid,
114
- headers: RestHeaders.from(response.headers)
115
- },
116
- method,
117
- jobid,
118
- isArray
119
- }, {
120
- url,
121
- body,
122
- method,
123
- isArray,
124
- });
125
- }
126
- catch (catchedError) {
127
- if (this.subjectInuUse[jobid][isCanceled]) {
128
- return;
129
- }
130
- if (typeof catchedError === 'object' && catchedError.response && catchedError.response.data) {
131
- const err = catchedError.response.data;
132
- const msg = catchedError.response.data.message || '';
133
- let stack = (err.stack || '').split('\n');
134
- const errObs = Resource['_listenErrors'];
135
- errObs.next({
136
- msg,
137
- stack,
138
- data: catchedError.response.data
139
- });
140
- }
141
- const error = (catchedError && catchedError.response) ? `[${catchedError.response.statusText}]: ` : '';
142
- this.handlerResult({
143
- res: {
144
- code: (catchedError && catchedError.response) ? catchedError.response.status : void 0,
145
- error: `${error}${catchedError.message}`,
146
- data: (catchedError && catchedError.response) ? JSON.stringify(catchedError.response.data) : void 0,
147
- isArray,
148
- jobid,
149
- headers: RestHeaders.from(catchedError && catchedError.response && catchedError.response.headers)
150
- },
151
- method,
152
- jobid,
153
- isArray
154
- }, {
155
- url,
156
- body,
157
- isArray,
158
- method
159
- });
160
- }
161
- }
162
- getReplay(method, meta, onlyGetLastReplayForMethod) {
163
- let replay;
164
- if (_.isUndefined(this.replaySubjects[meta.endpoint])) {
165
- this.replaySubjects[meta.endpoint] = {};
166
- }
167
- if (_.isUndefined(this.replaySubjects[meta.endpoint][meta.path])) {
168
- this.replaySubjects[meta.endpoint][meta.path] = {};
169
- }
170
- if (_.isUndefined(this.replaySubjects[meta.endpoint][meta.path][method])) {
171
- this.replaySubjects[meta.endpoint][meta.path][method] = {};
172
- }
173
- const objectIDToCreateOrLast = (Object.keys(this.replaySubjects[meta.endpoint][meta.path][method]).length) +
174
- (onlyGetLastReplayForMethod ? 0 : 1);
175
- if (onlyGetLastReplayForMethod && (objectIDToCreateOrLast === 0)) {
176
- return replay;
177
- }
178
- if (_.isUndefined(this.replaySubjects[meta.endpoint][meta.path][method][objectIDToCreateOrLast])) {
179
- this.replaySubjects[meta.endpoint][meta.path][method][objectIDToCreateOrLast] = {
180
- subject: new Subject(),
181
- data: void 0,
182
- };
183
- }
184
- replay = this.replaySubjects[meta.endpoint][meta.path][method][objectIDToCreateOrLast];
185
- if (!_.isNumber(replay.id)) {
186
- if (RestRequest.jobId === Number.MAX_SAFE_INTEGER) {
187
- RestRequest.jobId = 0;
188
- }
189
- const jobid = RestRequest.jobId++;
190
- replay.id = jobid;
191
- const subject = replay.subject;
192
- subject[jobIDkey] = jobid; // modify internal rxjs subject obj
193
- this.meta[jobid] = meta;
194
- this.subjectInuUse[jobid] = subject;
195
- this.subjectInuUse[jobid][customObs] = new Observable((observer) => {
196
- observer.add(() => {
197
- if (!this.subjectInuUse[jobid][isCanceled]) {
198
- this.subjectInuUse[jobid][isCanceled] = true;
199
- if (typeof this.subjectInuUse[jobid][cancelFn] === 'function') {
200
- this.subjectInuUse[jobid][cancelFn]('[ng2-rest] on purpose canceled http request');
201
- }
202
- }
203
- else {
204
- }
205
- });
206
- const sub = subject.subscribe({
207
- next: a => observer.next(a),
208
- error: a => observer.error(a),
209
- complete: () => {
210
- sub.unsubscribe();
211
- observer.complete();
212
- },
213
- });
214
- });
215
- }
216
- return replay;
217
- }
218
- generalReq(method, url, body, headers, meta, isArray, mockHttp) {
219
- const replay = this.getReplay(method, meta, false);
220
- replay.data = { url, body, headers, isArray };
221
- ((pthis, purl, pmethod, pheaders, pbody, pid, pisArray, pmockHttp) => {
222
- setTimeout(() => pthis.req(purl, pmethod, pheaders, pbody, pid, pisArray, pmockHttp));
223
- })(this, url, method, headers, body, replay.id, isArray, mockHttp);
224
- const resp = firstValueFrom(replay.subject[customObs]);
225
- resp.observable = replay.subject[customObs];
226
- resp.cache = RequestCache.findBy({
227
- body,
228
- isArray,
229
- method,
230
- url
231
- });
232
- return resp;
233
- }
234
- get(url, body, headers, meta, isArray, mockHttp) {
235
- return this.generalReq('get', url, body, headers, meta, isArray, mockHttp);
236
- }
237
- head(url, body, headers, meta, isArray, mockHttp) {
238
- return this.generalReq('head', url, body, headers, meta, isArray, mockHttp);
239
- }
240
- delete(url, body, headers, meta, isArray, mockHttp) {
241
- return this.generalReq('delete', url, body, headers, meta, isArray, mockHttp);
242
- }
243
- post(url, body, headers, meta, isArray, mockHttp) {
244
- return this.generalReq('post', url, body, headers, meta, isArray, mockHttp);
245
- }
246
- put(url, body, headers, meta, isArray, mockHttp) {
247
- return this.generalReq('put', url, body, headers, meta, isArray, mockHttp);
248
- }
249
- patch(url, body, headers, meta, isArray, mockHttp) {
250
- return this.generalReq('patch', url, body, headers, meta, isArray, mockHttp);
251
- }
252
- jsonp(url, body, headers, meta, isArray, mockHttp) {
253
- const replay = this.getReplay('jsonp', meta, false);
254
- const jobid = replay.id;
255
- const method = 'jsonp';
256
- setTimeout(() => {
257
- if (url.endsWith('/'))
258
- url = url.slice(0, url.length - 1);
259
- let num = Math.round(10000 * Math.random());
260
- let callbackMethodName = "cb_" + num;
261
- window[callbackMethodName] = (data) => {
262
- if (this.checkCache({
263
- url,
264
- body,
265
- isArray,
266
- method
267
- }, jobid)) {
268
- return;
269
- }
270
- this.handlerResult({
271
- res: {
272
- data, isArray
273
- },
274
- method,
275
- jobid,
276
- isArray
277
- }, {
278
- url,
279
- body,
280
- isArray,
281
- method,
282
- });
283
- };
284
- let sc = document.createElement('script');
285
- sc.src = `${url}?callback=${callbackMethodName}`;
286
- document.body.appendChild(sc);
287
- document.body.removeChild(sc);
288
- });
289
- const resp = firstValueFrom(replay.subject[customObs]);
290
- resp.observable = replay.subject[customObs];
291
- console.log('assiging custom observable');
292
- resp.cache = RequestCache.findBy({
293
- body,
294
- isArray,
295
- method,
296
- url
297
- });
298
- return resp;
299
- }
300
- replay(method, meta) {
301
- const replay = this.getReplay(method, meta, true);
302
- if (!replay || !replay.data) {
303
- console.warn(`Canno replay first ${method} request from ${meta.endpoint}/${meta.path}`);
304
- return;
305
- }
306
- ;
307
- if (replay && replay.subject && Array.isArray(replay.subject.observers) &&
308
- replay.subject.observers.length === 0) {
309
- console.warn(`No observators for ${method} request from ${meta.endpoint}/${meta.path}`);
310
- return;
311
- }
312
- const url = replay.data.url;
313
- const headers = replay.data.headers;
314
- const body = replay.data.body;
315
- const isArray = replay.data.isArray;
316
- setTimeout(() => this.req(url, method, headers, body, replay.id, isArray));
317
- }
318
- }
319
- RestRequest.jobId = 0;
320
- ;
321
- ({}); // @--end-of-file-for-module=ng2-rest lib/rest-request.ts
322
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdC1yZXF1ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdG1wLWxpYnMtZm9yLWJ1bmRsZS9uZzItcmVzdC9wcm9qZWN0cy9uZzItcmVzdC9zcmMvbGliL3Jlc3QtcmVxdWVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRS9CLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVyQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzNDLE9BQU8sS0FBd0IsTUFBTSxPQUFPLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxHQUFHLEVBQVUsTUFBTSxvQkFBb0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsRUFDNUMsS0FBSyxDQUFDLFNBQVMsQ0FDbEIsQ0FBQTtBQUVELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQztBQUN6QixNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUM7QUFDOUIsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDO0FBQzVCLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQztBQUtoQyxNQUFNLE9BQU8sV0FBVztJQUF4QjtRQUlVLGtCQUFhLEdBQW1DLEVBQUUsQ0FBQztRQUNu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USxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3hGLE9BQU87U0FDUjtRQUFBLENBQUM7UUFDRixJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7WUFDckUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN2QyxPQUFPLENBQUMsSUFBSSxDQUFDLHNCQUFzQixNQUFNLGlCQUFpQixJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3hGLE9BQU87U0FDUjtRQUNELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQzVCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzlCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3BDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUE7SUFDNUUsQ0FBQzs7QUExYmMsaUJBQUssR0FBRyxDQUFDLENBQUM7QUE4YjFCLENBQUM7QUFBQSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMseURBQXlEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20sIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgXyB9IGZyb20gJ3RucC1jb3JlL2Jyb3dzZXInO1xuXG5pbXBvcnQgeyBNb2RlbHMgfSBmcm9tICcuL21vZGVscyc7XG5pbXBvcnQgeyBSZXN0SGVhZGVycyB9IGZyb20gJy4vcmVzdC1oZWFkZXJzJztcblxuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gJ3RucC1jb3JlL2Jyb3dzZXInO1xuaW1wb3J0IHsgTGV2ZWwgfSBmcm9tICduZzItbG9nZ2VyL2Jyb3dzZXInO1xuaW1wb3J0IGF4aW9zLCB7IEF4aW9zUmVzcG9uc2UgfSBmcm9tICdheGlvcyc7XG5pbXBvcnQgeyBSZXNvdXJjZSB9IGZyb20gJy4vcmVzb3VyY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBMb2csIExvZ2dlciB9IGZyb20gJ25nMi1sb2dnZXIvYnJvd3Nlcic7XG5cbmltcG9ydCB7IFJlcXVlc3RDYWNoZSB9IGZyb20gJy4vcmVxdWVzdC1jYWNoZSc7XG5jb25zdCBsb2cgPSBMb2cuY3JlYXRlKCdbbmcyLXJlc3RdIHJlc3QtcmVxdWVzdCdcbiAgLCBMZXZlbC5fX05PVEhJTkdcbilcblxuY29uc3Qgam9iSURrZXkgPSAnam9iSUQnO1xuY29uc3QgY3VzdG9tT2JzID0gJ2N1c3RvbU9icyc7XG5jb25zdCBjYW5jZWxGbiA9ICdjYW5jZWxGbic7XG5jb25zdCBpc0NhbmNlbGVkID0gJ2lzQ2FuY2VsZWQnO1xuXG5cblxuXG5leHBvcnQgY2xhc3MgUmVzdFJlcXVlc3Qge1xuXG4gIHB1YmxpYyBzdGF0aWMgem9uZTtcbiAgcHJpdmF0ZSBzdGF0aWMgam9iSWQgPSAwO1xuICBwcml2YXRlIHN1YmplY3RJbnVVc2U6IHsgW2lkOiBudW1iZXJdOiBTdWJqZWN0PGFueT4gfSA9IHt9O1xuICBwcml2YXRlIG1ldGE6IHsgW2lkOiBudW1iZXJdOiBNb2RlbHMuTWV0YVJlcXVlc3QgfSA9IHt9O1xuXG5cbiAgcHJpdmF0ZSBoYW5kbGVyUmVzdWx0KG9wdGlvbnM6IE1vZGVscy5IYW5kbGVSZXN1bHRPcHRpb25zLFxuICAgIHNvdXJjZVJlcXVlc3Q6IE1vZGVscy5IYW5kbGVSZXN1bHRTb3VyY2VSZXF1ZXN0T3B0aW9ucykge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKG9wdGlvbnMpKSB7XG4gICAgICBvcHRpb25zID0ge30gYXMgYW55O1xuICAgIH1cblxuICAgIGNvbnN0IHsgcmVzLCBqb2JpZCwgaXNBcnJheSwgbWV0aG9kIH0gPSBvcHRpb25zO1xuXG4gICAgaWYgKHR5cGVvZiByZXMgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJlc3Bvc25zZSBmb3IgcmVxdWVzdC4gJyk7XG4gICAgfVxuXG4gICAgaWYgKEhlbHBlcnMuaXNCcm93c2VyKSB7XG4gICAgICByZXMuaGVhZGVycyA9IFJlc3RIZWFkZXJzLmZyb20ocmVzLmhlYWRlcnMpO1xuICAgIH1cblxuXG4gICAgaWYgKHJlcy5lcnJvcikge1xuICAgICAgdGhpcy5zdWJqZWN0SW51VXNlW2pvYmlkXS5lcnJvcihuZXcgTW9kZWxzLkh0dHBSZXNwb25zZUVycm9yKHJlcy5lcnJvciwgcmVzLmRhdGEsIHJlcy5oZWFkZXJzLCByZXMuY29kZSwgam9iaWQpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZW50aXR5ID0gdGhpcy5tZXRhW2pvYmlkXS5lbnRpdHk7XG4gICAgY29uc3QgY2lyY3VsYXIgPSB0aGlzLm1ldGFbam9iaWRdLmNpcmN1bGFyO1xuXG4gICAgY29uc3Qgc3VjY2VzcyA9IChSZXNvdXJjZVsnX2xpc3RlblN1Y2Nlc3MnXSBhcyBTdWJqZWN0PE1vZGVscy5IdHRwUmVzcG9uc2U8YW55Pj4pXG5cbiAgICBjb25zdCByZXFSZXNwID0gbmV3IE1vZGVscy5IdHRwUmVzcG9uc2Uoc291cmNlUmVxdWVzdCwgcmVzLmRhdGEsIHJlcy5oZWFkZXJzLCByZXMuY29kZSwgZW50aXR5LCBjaXJjdWxhciwgam9iaWQsIGlzQXJyYXkpO1xuICAgIHN1Y2Nlc3MubmV4dChyZXFSZXNwKTtcblxuICAgIHRoaXMuc3ViamVjdEludVVzZVtqb2JpZF0ubmV4dChyZXFSZXNwKTtcbiAgICB0aGlzLm1ldGFbam9iaWRdID0gdm9pZCAwO1xuICAgIHRoaXMuc3ViamVjdEludVVzZVtqb2JpZF0uY29tcGxldGUoKTtcbiAgfVxuICBjaGVja0NhY2hlKHNvdXJjZVJlcXVlc3Q6IE1vZGVscy5IYW5kbGVSZXN1bHRTb3VyY2VSZXF1ZXN0T3B0aW9ucywgam9iaWQ6IG51bWJlcikge1xuICAgIGNvbnN0IGV4aXN0ZWRJbkNhY2hlID0gUmVxdWVzdENhY2hlLmZpbmRCeShzb3VyY2VSZXF1ZXN0KTtcbiAgICBpZiAoZXhpc3RlZEluQ2FjaGUpIHtcblxuICAgICAgY29uc3Qgc3VjY2VzcyA9IChSZXNvdXJjZVsnX2xpc3RlblN1Y2Nlc3MnXSBhcyBTdWJqZWN0PE1vZGVscy5IdHRwUmVzcG9uc2U8YW55Pj4pO1xuICAgICAgc3VjY2Vzcy5uZXh0KGV4aXN0ZWRJbkNhY2hlLnJlc3BvbnNlKTtcbiAgICAgIHRoaXMuc3ViamVjdEludVVzZVtqb2JpZF0ubmV4dChleGlzdGVkSW5DYWNoZSk7XG4gICAgICB0aGlzLnN1YmplY3RJbnVVc2Vbam9iaWRdLmNvbXBsZXRlKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlcShcbiAgICB1cmw6IHN0cmluZyxcbiAgICBtZXRob2Q6IE1vZGVscy5IdHRwTWV0aG9kLFxuICAgIGhlYWRlcnM/OiBSZXN0SGVhZGVycyxcbiAgICBib2R5PzogYW55LFxuICAgIGpvYmlkPzogbnVtYmVyLFxuICAgIGlzQXJyYXkgPSBmYWxzZSxcbiAgICBtb2NrSHR0cD86IE1vZGVscy5Nb2NrSHR0cFxuICApIHtcbiAgICBpZiAodGhpcy5jaGVja0NhY2hlKHtcbiAgICAgIHVybCxcbiAgICAgIGJvZHksXG4gICAgICBpc0FycmF5LFxuICAgICAgbWV0aG9kXG4gICAgfSwgam9iaWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgQ2FuY2VsVG9rZW4gPSBheGlvcy5DYW5jZWxUb2tlbjtcbiAgICBjb25zdCBzb3VyY2UgPSBDYW5jZWxUb2tlbi5zb3VyY2UoKTtcbiAgICB0aGlzLnN1YmplY3RJbnVVc2Vbam9iaWRdW2NhbmNlbEZuXSA9IHNvdXJjZS5jYW5jZWw7XG5cbiAgICB2YXIgcmVzcG9uc2U6IEF4aW9zUmVzcG9uc2U8YW55PjtcbiAgICBpZiAobW9ja0h0dHApIHtcblxuICAgICAgaWYgKHR5cGVvZiBtb2NrSHR0cCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmVzcG9uc2UgPSB7XG4gICAgICAgICAgZGF0YTogbW9ja0h0dHAuZGF0YSxcbiAgICAgICAgICBzdGF0dXM6IG1vY2tIdHRwLmNvZGUsXG4gICAgICAgICAgaGVhZGVyczogbW9ja0h0dHAuaGVhZGVycyBhcyBhbnksXG4gICAgICAgICAgc3RhdHVzVGV4dDogbW9ja0h0dHAuZXJyb3IsXG4gICAgICAgICAgY29uZmlnOiB7fSBhcyBhbnlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbW9ja0h0dHAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc3QgciA9IG1vY2tIdHRwKHVybCwgbWV0aG9kLCBoZWFkZXJzLCBib2R5KTtcbiAgICAgICAgcmVzcG9uc2UgPSB7XG4gICAgICAgICAgZGF0YTogci5kYXRhLFxuICAgICAgICAgIHN0YXR1czogci5jb2RlLFxuICAgICAgICAgIGhlYWRlcnM6IHIuaGVhZGVycyBhcyBhbnksXG4gICAgICAgICAgc3RhdHVzVGV4dDogci5lcnJvcixcbiAgICAgICAgICBjb25maWc6IHt9IGFzIGFueVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG5cbiAgICBjb25zdCBoZWFkZXJzSnNvbiA9IGhlYWRlcnMudG9KU09OKCk7XG4gICAgY29uc3QgcmVzcG9uc2VUeXBlID0gaGVhZGVyc0pzb24ucmVzcG9uc2V0eXBlYXhpb3MgPyBoZWFkZXJzSnNvbi5yZXNwb25zZXR5cGVheGlvcyA6ICd0ZXh0JztcblxuICAgIHRyeSB7XG4gICAgICBpZiAoIXJlc3BvbnNlKSB7XG5cblxuXG5cbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBheGlvcyh7XG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICBkYXRhOiBib2R5LFxuICAgICAgICAgIHJlc3BvbnNlVHlwZSxcbiAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzSnNvbixcbiAgICAgICAgICBjYW5jZWxUb2tlbjogc291cmNlLnRva2VuLFxuXG4gICAgICAgIH0pO1xuXG4gICAgICB9XG5cblxuXG4gICAgICBpZiAodGhpcy5zdWJqZWN0SW51VXNlW2pvYmlkXVtpc0NhbmNlbGVkXSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGFuZGxlclJlc3VsdCh7XG4gICAgICAgIHJlczoge1xuICAgICAgICAgIGNvZGU6IHJlc3BvbnNlLnN0YXR1cyBhcyBhbnksXG4gICAgICAgICAgZGF0YTogcmVzcG9uc2UuZGF0YSxcbiAgICAgICAgICBpc0FycmF5LFxuICAgICAgICAgIGpvYmlkLFxuICAgICAgICAgIGhlYWRlcnM6IFJlc3RIZWFkZXJzLmZyb20ocmVzcG9uc2UuaGVhZGVycyBhcyBhbnkpXG4gICAgICAgIH0sXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgam9iaWQsXG4gICAgICAgIGlzQXJyYXlcbiAgICAgIH0sIHtcbiAgICAgICAgdXJsLFxuICAgICAgICBib2R5LFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIGlzQXJyYXksXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChjYXRjaGVkRXJyb3IpIHtcbiAgICAgIGlmICh0aGlzLnN1YmplY3RJbnVVc2Vbam9iaWRdW2lzQ2FuY2VsZWRdKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuXG4gICAgICBpZiAodHlwZW9mIGNhdGNoZWRFcnJvciA9PT0gJ29iamVjdCcgJiYgY2F0Y2hlZEVycm9yLnJlc3BvbnNlICYmIGNhdGNoZWRFcnJvci5yZXNwb25zZS5kYXRhKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IGNhdGNoZWRFcnJvci5yZXNwb25zZS5kYXRhO1xuICAgICAgICBjb25zdCBtc2c6IHN0cmluZyA9IGNhdGNoZWRFcnJvci5yZXNwb25zZS5kYXRhLm1lc3NhZ2UgfHwgJyc7XG5cblxuXG4gICAgICAgIGxldCBzdGFjazogc3RyaW5nW10gPSAoZXJyLnN0YWNrIHx8ICcnKS5zcGxpdCgnXFxuJyk7XG5cbiAgICAgICAgY29uc3QgZXJyT2JzID0gKFJlc291cmNlWydfbGlzdGVuRXJyb3JzJ10gYXMgU3ViamVjdDxNb2RlbHMuQmFja2VuZEVycm9yPik7XG4gICAgICAgIGVyck9icy5uZXh0KHtcbiAgICAgICAgICBtc2csXG4gICAgICAgICAgc3RhY2ssXG4gICAgICAgICAgZGF0YTogY2F0Y2hlZEVycm9yLnJlc3BvbnNlLmRhdGFcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnJvciA9IChjYXRjaGVkRXJyb3IgJiYgY2F0Y2hlZEVycm9yLnJlc3BvbnNlKSA/IGBbJHtjYXRjaGVkRXJyb3IucmVzcG9uc2Uuc3RhdHVzVGV4dH1dOiBgIDogJyc7XG4gICAgICB0aGlzLmhhbmRsZXJSZXN1bHQoe1xuICAgICAgICByZXM6IHtcbiAgICAgICAgICBjb2RlOiAoY2F0Y2hlZEVycm9yICYmIGNhdGNoZWRFcnJvci5yZXNwb25zZSkgPyBjYXRjaGVkRXJyb3IucmVzcG9uc2Uuc3RhdHVzIGFzIGFueSA6IHZvaWQgMCxcbiAgICAgICAgICBlcnJvcjogYCR7ZXJyb3J9JHtjYXRjaGVkRXJyb3IubWVzc2FnZX1gLFxuICAgICAgICAgIGRhdGE6IChjYXRjaGVkRXJyb3IgJiYgY2F0Y2hlZEVycm9yLnJlc3BvbnNlKSA/IEpTT04uc3RyaW5naWZ5KGNhdGNoZWRFcnJvci5yZXNwb25zZS5kYXRhKSA6IHZvaWQgMCxcbiAgICAgICAgICBpc0FycmF5LFxuICAgICAgICAgIGpvYmlkLFxuICAgICAgICAgIGhlYWRlcnM6IFJlc3RIZWFkZXJzLmZyb20oY2F0Y2hlZEVycm9yICYmIGNhdGNoZWRFcnJvci5yZXNwb25zZSAmJiBjYXRjaGVkRXJyb3IucmVzcG9uc2UuaGVhZGVycylcbiAgICAgICAgfSxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBqb2JpZCxcbiAgICAgICAgaXNBcnJheVxuICAgICAgfSwge1xuICAgICAgICB1cmwsXG4gICAgICAgIGJvZHksXG4gICAgICAgIGlzQXJyYXksXG4gICAgICAgIG1ldGhvZFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZXBsYXkobWV0aG9kOiBNb2RlbHMuSHR0cE1ldGhvZCwgbWV0YTogTW9kZWxzLk1ldGFSZXF1ZXN0LCBvbmx5R2V0TGFzdFJlcGxheUZvck1ldGhvZDogYm9vbGVhbik6IE1vZGVscy5SZXBsYXlEYXRhIHtcbiAgICBsZXQgcmVwbGF5OiBNb2RlbHMuUmVwbGF5RGF0YTtcblxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQodGhpcy5yZXBsYXlTdWJqZWN0c1ttZXRhLmVuZHBvaW50XSkpIHtcblxuICAgICAgdGhpcy5yZXBsYXlTdWJqZWN0c1ttZXRhLmVuZHBvaW50XSA9IHt9O1xuICAgIH1cbiAgICBpZiAoXy5pc1VuZGVmaW5lZCh0aGlzLnJlcGxheVN1YmplY3RzW21ldGEuZW5kcG9pbnRdW21ldGEucGF0aF0pKSB7XG5cbiAgICAgIHRoaXMucmVwbGF5U3ViamVjdHNbbWV0YS5lbmRwb2ludF1bbWV0YS5wYXRoXSA9IHt9O1xuICAgIH1cbiAgICBpZiAoXy5pc1VuZGVmaW5lZCh0aGlzLnJlcGxheVN1YmplY3RzW21ldGEuZW5kcG9pbnRdW21ldGEucGF0aF1bbWV0aG9kXSkpIHtcblxuICAgICAgdGhpcy5yZXBsYXlTdWJqZWN0c1ttZXRhLmVuZHBvaW50XVttZXRhLnBhdGhdW21ldGhvZF0gPSB7fTtcbiAgICB9XG5cblxuICAgIGNvbnN0IG9iamVjdElEVG9DcmVhdGVPckxhc3QgPSAoT2JqZWN0LmtleXModGhpcy5yZXBsYXlTdWJqZWN0c1ttZXRhLmVuZHBvaW50XVttZXRhLnBhdGhdW21ldGhvZF0gYXMgT2JqZWN0KS5sZW5ndGgpICtcbiAgICAgIChvbmx5R2V0TGFzdFJlcGxheUZvck1ldGhvZCA/IDAgOiAxKTtcbiAgICBpZiAob25seUdldExhc3RSZXBsYXlGb3JNZXRob2QgJiYgKG9iamVjdElEVG9DcmVhdGVPckxhc3QgPT09IDApKSB7XG4gICAgICByZXR1cm4gcmVwbGF5O1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHRoaXMucmVwbGF5U3ViamVjdHNbbWV0YS5lbmRwb2ludF1bbWV0YS5wYXRoXVttZXRob2RdW29iamVjdElEVG9DcmVhdGVPckxhc3RdKSkge1xuXG4gICAgICB0aGlzLnJlcGxheVN1YmplY3RzW21ldGEuZW5kcG9pbnRdW21ldGEucGF0aF1bbWV0aG9kXVtvYmplY3RJRFRvQ3JlYXRlT3JMYXN0XSA9IDxNb2RlbHMuUmVwbGF5RGF0YT57XG4gICAgICAgIHN1YmplY3Q6IG5ldyBTdWJqZWN0KCksXG4gICAgICAgIGRhdGE6IHZvaWQgMCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmVwbGF5ID0gdGhpcy5yZXBsYXlTdWJqZWN0c1ttZXRhLmVuZHBvaW50XVttZXRhLnBhdGhdW21ldGhvZF1bb2JqZWN0SURUb0NyZWF0ZU9yTGFzdF07XG5cbiAgICBpZiAoIV8uaXNOdW1iZXIocmVwbGF5LmlkKSkge1xuICAgICAgaWYgKFJlc3RSZXF1ZXN0LmpvYklkID09PSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICBSZXN0UmVxdWVzdC5qb2JJZCA9IDA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGpvYmlkOiBudW1iZXIgPSBSZXN0UmVxdWVzdC5qb2JJZCsrO1xuICAgICAgcmVwbGF5LmlkID0gam9iaWQ7XG4gICAgICBjb25zdCBzdWJqZWN0OiBTdWJqZWN0PGFueT4gPSByZXBsYXkuc3ViamVjdDtcbiAgICAgIHN1YmplY3Rbam9iSURrZXldID0gam9iaWQ7IC8vIG1vZGlmeSBpbnRlcm5hbCByeGpzIHN1YmplY3Qgb2JqXG5cbiAgICAgIHRoaXMubWV0YVtqb2JpZF0gPSBtZXRhO1xuICAgICAgdGhpcy5zdWJqZWN0SW51VXNlW2pvYmlkXSA9IHN1YmplY3Q7XG5cbiAgICAgIHRoaXMuc3ViamVjdEludVVzZVtqb2JpZF1bY3VzdG9tT2JzXSA9IG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcikgPT4ge1xuXG5cblxuICAgICAgICBvYnNlcnZlci5hZGQoKCkgPT4ge1xuXG4gICAgICAgICAgaWYgKCF0aGlzLnN1YmplY3RJbnVVc2Vbam9iaWRdW2lzQ2FuY2VsZWRdKSB7XG4gICAgICAgICAgICB0aGlzLnN1YmplY3RJbnVVc2Vbam9iaWRdW2lzQ2FuY2VsZWRdID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5zdWJqZWN0SW51VXNlW2pvYmlkXVtjYW5jZWxGbl0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgdGhpcy5zdWJqZWN0SW51VXNlW2pvYmlkXVtjYW5jZWxGbl0oJ1tuZzItcmVzdF0gb24gcHVycG9zZSBjYW5jZWxlZCBodHRwIHJlcXVlc3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBzdWIgPSBzdWJqZWN0LnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogYSA9PiBvYnNlcnZlci5uZXh0KGEpLFxuICAgICAgICAgIGVycm9yOiBhID0+IG9ic2VydmVyLmVycm9yKGEpLFxuICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKClcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcGxheTtcbiAgfVxuXG5cblxuXG4gIHByaXZhdGUgZ2VuZXJhbFJlcShcbiAgICBtZXRob2Q6IE1vZGVscy5IdHRwTWV0aG9kLFxuICAgIHVybDogc3RyaW5nLFxuICAgIGJvZHk6IHN0cmluZyxcbiAgICBoZWFkZXJzOiBSZXN0SGVhZGVycyxcbiAgICBtZXRhOiBNb2RlbHMuTWV0YVJlcXVlc3QsXG4gICAgaXNBcnJheTogYm9vbGVhbixcbiAgICBtb2NrSHR0cDogTW9kZWxzLk1vY2tIdHRwKTogTW9kZWxzLlByb21pc2VPYnNlcnZhYmxlTWl4PGFueT4ge1xuXG4gICAgY29uc3QgcmVwbGF5OiBNb2RlbHMuUmVwbGF5RGF0YSA9IHRoaXMuZ2V0UmVwbGF5KG1ldGhvZCwgbWV0YSwgZmFsc2UpO1xuICAgIHJlcGxheS5kYXRhID0geyB1cmwsIGJvZHksIGhlYWRlcnMsIGlzQXJyYXkgfTtcblxuICAgICgocHRoaXMsIHB1cmwsIHBtZXRob2QsIHBoZWFkZXJzLCBwYm9keSwgcGlkLCBwaXNBcnJheSwgcG1vY2tIdHRwKSA9PiB7XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gcHRoaXMucmVxKHB1cmwsIHBtZXRob2QsIHBoZWFkZXJzLCBwYm9keSwgcGlkLCBwaXNBcnJheSwgcG1vY2tIdHRwKSk7XG4gICAgfSkodGhpcywgdXJsLCBtZXRob2QsIGhlYWRlcnMsIGJvZHksIHJlcGxheS5pZCwgaXNBcnJheSwgbW9ja0h0dHApXG5cbiAgICBjb25zdCByZXNwOiBNb2RlbHMuUHJvbWlzZU9ic2VydmFibGVNaXg8YW55PiA9IGZpcnN0VmFsdWVGcm9tKHJlcGxheS5zdWJqZWN0W2N1c3RvbU9ic10pIGFzIGFueTtcbiAgICByZXNwLm9ic2VydmFibGUgPSByZXBsYXkuc3ViamVjdFtjdXN0b21PYnNdO1xuICAgIHJlc3AuY2FjaGUgPSBSZXF1ZXN0Q2FjaGUuZmluZEJ5KHtcbiAgICAgIGJvZHksXG4gICAgICBpc0FycmF5LFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3A7XG4gIH1cblxuICBnZXQoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgYm9keTogc3RyaW5nLFxuICAgIGhlYWRlcnM6IFJlc3RIZWFkZXJzLFxuICAgIG1ldGE6IE1vZGVscy5NZXRhUmVxdWVzdCxcbiAgICBpc0FycmF5OiBib29sZWFuLCBtb2NrSHR0cDogTW9kZWxzLk1vY2tIdHRwXG4gICk6IE1vZGVscy5Qcm9taXNlT2JzZXJ2YWJsZU1peDxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmFsUmVxKCdnZXQnLCB1cmwsIGJvZHksIGhlYWRlcnMsIG1ldGEsIGlzQXJyYXksIG1vY2tIdHRwKTtcbiAgfVxuXG4gIGhlYWQoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgYm9keTogc3RyaW5nLFxuICAgIGhlYWRlcnM6IFJlc3RIZWFkZXJzLFxuICAgIG1ldGE6IE1vZGVscy5NZXRhUmVxdWVzdCxcbiAgICBpc0FycmF5OiBib29sZWFuLCBtb2NrSHR0cDogTW9kZWxzLk1vY2tIdHRwXG4gICk6IE1vZGVscy5Qcm9taXNlT2JzZXJ2YWJsZU1peDxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmFsUmVxKCdoZWFkJywgdXJsLCBib2R5LCBoZWFkZXJzLCBtZXRhLCBpc0FycmF5LCBtb2NrSHR0cCk7XG4gIH1cblxuICBkZWxldGUoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgYm9keTogc3RyaW5nLFxuICAgIGhlYWRlcnM6IFJlc3RIZWFkZXJzLFxuICAgIG1ldGE6IE1vZGVscy5NZXRhUmVxdWVzdCxcbiAgICBpc0FycmF5OiBib29sZWFuLFxuICAgIG1vY2tIdHRwOiBNb2RlbHMuTW9ja0h0dHApOiBNb2RlbHMuUHJvbWlzZU9ic2VydmFibGVNaXg8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhbFJlcSgnZGVsZXRlJywgdXJsLCBib2R5LCBoZWFkZXJzLCBtZXRhLCBpc0FycmF5LCBtb2NrSHR0cCk7XG4gIH1cblxuICBwb3N0KFxuICAgIHVybDogc3RyaW5nLFxuICAgIGJvZHk6IHN0cmluZyxcbiAgICBoZWFkZXJzOiBSZXN0SGVhZGVycyxcbiAgICBtZXRhOiBNb2RlbHMuTWV0YVJlcXVlc3QsXG4gICAgaXNBcnJheTogYm9vbGVhbixcbiAgICBtb2NrSHR0cDogTW9kZWxzLk1vY2tIdHRwXG4gICk6IE1vZGVscy5Qcm9taXNlT2JzZXJ2YWJsZU1peDxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmFsUmVxKCdwb3N0JywgdXJsLCBib2R5LCBoZWFkZXJzLCBtZXRhLCBpc0FycmF5LCBtb2NrSHR0cCk7XG4gIH1cblxuICBwdXQoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgYm9keTogc3RyaW5nLFxuICAgIGhlYWRlcnM6IFJlc3RIZWFkZXJzLFxuICAgIG1ldGE6IE1vZGVscy5NZXRhUmVxdWVzdCxcbiAgICBpc0FycmF5OiBib29sZWFuLFxuICAgIG1vY2tIdHRwOiBNb2RlbHMuTW9ja0h0dHBcbiAgKTogTW9kZWxzLlByb21pc2VPYnNlcnZhYmxlTWl4PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdlbmVyYWxSZXEoJ3B1dCcsIHVybCwgYm9keSwgaGVhZGVycywgbWV0YSwgaXNBcnJheSwgbW9ja0h0dHApO1xuICB9XG5cbiAgcGF0Y2goXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgYm9keTogc3RyaW5nLFxuICAgIGhlYWRlcnM6IFJlc3RIZWFkZXJzLFxuICAgIG1ldGE6IE1vZGVscy5NZXRhUmVxdWVzdCxcbiAgICBpc0FycmF5OiBib29sZWFuLFxuICAgIG1vY2tIdHRwOiBNb2RlbHMuTW9ja0h0dHBcbiAgKTogTW9kZWxzLlByb21pc2VPYnNlcnZhYmxlTWl4PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdlbmVyYWxSZXEoJ3BhdGNoJywgdXJsLCBib2R5LCBoZWFkZXJzLCBtZXRhLCBpc0FycmF5LCBtb2NrSHR0cCk7XG4gIH1cblxuICBqc29ucChcbiAgICB1cmw6IHN0cmluZyxcbiAgICBib2R5OiBzdHJpbmcsXG4gICAgaGVhZGVyczogUmVzdEhlYWRlcnMsXG4gICAgbWV0YTogTW9kZWxzLk1ldGFSZXF1ZXN0LFxuICAgIGlzQXJyYXk6IGJvb2xlYW4sXG4gICAgbW9ja0h0dHA6IE1vZGVscy5Nb2NrSHR0cFxuICApOiBNb2RlbHMuUHJvbWlzZU9ic2VydmFibGVNaXg8YW55PiB7XG5cbiAgICBjb25zdCByZXBsYXk6IE1vZGVscy5SZXBsYXlEYXRhID0gdGhpcy5nZXRSZXBsYXkoJ2pzb25wJywgbWV0YSwgZmFsc2UpO1xuICAgIGNvbnN0IGpvYmlkID0gcmVwbGF5LmlkO1xuICAgIGNvbnN0IG1ldGhvZCA9ICdqc29ucCdcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh1cmwuZW5kc1dpdGgoJy8nKSkgdXJsID0gdXJsLnNsaWNlKDAsIHVybC5sZW5ndGggLSAxKVxuICAgICAgbGV0IG51bSA9IE1hdGgucm91bmQoMTAwMDAgKiBNYXRoLnJhbmRvbSgpKTtcbiAgICAgIGxldCBjYWxsYmFja01ldGhvZE5hbWUgPSBcImNiX1wiICsgbnVtO1xuICAgICAgd2luZG93W2NhbGxiYWNrTWV0aG9kTmFtZV0gPSAoZGF0YSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jaGVja0NhY2hlKHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgYm9keSxcbiAgICAgICAgICBpc0FycmF5LFxuICAgICAgICAgIG1ldGhvZFxuICAgICAgICB9LCBqb2JpZCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYW5kbGVyUmVzdWx0KHtcbiAgICAgICAgICByZXM6IHtcbiAgICAgICAgICAgIGRhdGEsIGlzQXJyYXlcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICBqb2JpZCxcbiAgICAgICAgICBpc0FycmF5XG4gICAgICAgIH0sIHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgYm9keSxcbiAgICAgICAgICBpc0FycmF5LFxuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGxldCBzYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgc2Muc3JjID0gYCR7dXJsfT9jYWxsYmFjaz0ke2NhbGxiYWNrTWV0aG9kTmFtZX1gO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzYyk7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNjKTtcbiAgICB9KVxuXG4gICAgY29uc3QgcmVzcDogTW9kZWxzLlByb21pc2VPYnNlcnZhYmxlTWl4PGFueT4gPSBmaXJzdFZhbHVlRnJvbShyZXBsYXkuc3ViamVjdFtjdXN0b21PYnNdKSBhcyBhbnk7XG4gICAgcmVzcC5vYnNlcnZhYmxlID0gcmVwbGF5LnN1YmplY3RbY3VzdG9tT2JzXTtcbiAgICBjb25zb2xlLmxvZygnYXNzaWdpbmcgY3VzdG9tIG9ic2VydmFibGUnKVxuICAgIHJlc3AuY2FjaGUgPSBSZXF1ZXN0Q2FjaGUuZmluZEJ5KHtcbiAgICAgIGJvZHksXG4gICAgICBpc0FycmF5LFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsXG4gICAgfSlcbiAgICByZXR1cm4gcmVzcDtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGF5U3ViamVjdHMgPSB7fTtcbiAgcHVibGljIHJlcGxheShtZXRob2Q6IE1vZGVscy5IdHRwTWV0aG9kLCBtZXRhOiBNb2RlbHMuTWV0YVJlcXVlc3QpIHtcbiAgICBjb25zdCByZXBsYXk6IE1vZGVscy5SZXBsYXlEYXRhID0gdGhpcy5nZXRSZXBsYXkobWV0aG9kLCBtZXRhLCB0cnVlKTtcbiAgICBpZiAoIXJlcGxheSB8fCAhcmVwbGF5LmRhdGEpIHtcbiAgICAgIGNvbnNvbGUud2FybihgQ2Fubm8gcmVwbGF5IGZpcnN0ICR7bWV0aG9kfSByZXF1ZXN0IGZyb20gJHttZXRhLmVuZHBvaW50fS8ke21ldGEucGF0aH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9O1xuICAgIGlmIChyZXBsYXkgJiYgcmVwbGF5LnN1YmplY3QgJiYgQXJyYXkuaXNBcnJheShyZXBsYXkuc3ViamVjdC5vYnNlcnZlcnMpICYmXG4gICAgICByZXBsYXkuc3ViamVjdC5vYnNlcnZlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLndhcm4oYE5vIG9ic2VydmF0b3JzIGZvciAke21ldGhvZH0gcmVxdWVzdCBmcm9tICR7bWV0YS5lbmRwb2ludH0vJHttZXRhLnBhdGh9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHJlcGxheS5kYXRhLnVybDtcbiAgICBjb25zdCBoZWFkZXJzID0gcmVwbGF5LmRhdGEuaGVhZGVycztcbiAgICBjb25zdCBib2R5ID0gcmVwbGF5LmRhdGEuYm9keTtcbiAgICBjb25zdCBpc0FycmF5ID0gcmVwbGF5LmRhdGEuaXNBcnJheTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucmVxKHVybCwgbWV0aG9kLCBoZWFkZXJzLCBib2R5LCByZXBsYXkuaWQsIGlzQXJyYXkpKVxuICB9XG5cbn1cblxuIDsoe30pOyAvLyBALS1lbmQtb2YtZmlsZS1mb3ItbW9kdWxlPW5nMi1yZXN0IGxpYi9yZXN0LXJlcXVlc3QudHMiXX0=
@@ -1,120 +0,0 @@
1
- import { getRestParams, getParamsUrl } from './params';
2
- import { RestHeaders } from './rest-headers';
3
- import { CONTENT_TYPE } from './content-type';
4
- import { CLASS } from 'typescript-class-helpers/browser';
5
- export class Rest {
6
- constructor(endpoint, request, meta, customContentType) {
7
- this.request = request;
8
- this.meta = meta;
9
- this.customContentType = customContentType;
10
- this._headers = RestHeaders.from(CONTENT_TYPE.APPLICATION_JSON);
11
- this.array = {
12
- get: (params = void 0, doNotSerializeParams) => {
13
- return this.req('get', void 0, params, doNotSerializeParams, true);
14
- },
15
- head: (params = void 0, doNotSerializeParams) => {
16
- return this.req('head', void 0, params, doNotSerializeParams, true);
17
- },
18
- post: (item, params, doNotSerializeParams) => {
19
- return this.req('post', item, params, doNotSerializeParams, true);
20
- },
21
- put: (item, params, doNotSerializeParams) => {
22
- return this.req('put', item, params, doNotSerializeParams, true);
23
- },
24
- patch: (item, params, doNotSerializeParams) => {
25
- return this.req('patch', item, params, doNotSerializeParams, true);
26
- },
27
- delete: (params, doNotSerializeParams) => {
28
- return this.req('delete', void 0, params, doNotSerializeParams, true);
29
- },
30
- jsonp: (params, doNotSerializeParams) => {
31
- return this.req('jsonp', void 0, params, doNotSerializeParams, true);
32
- }
33
- };
34
- this.__meta_endpoint = endpoint;
35
- }
36
- mock(mock) {
37
- if ((typeof mock === 'function') || (typeof mock === 'object')) {
38
- this.mockHttp = mock;
39
- }
40
- else {
41
- throw `[ng2-rest]
42
- .model(...)
43
- .mock( < BAD MOCK DATA > )
44
- ...
45
- `;
46
- }
47
- return this;
48
- }
49
- get endpoint() {
50
- let e = this.__meta_endpoint;
51
- if (this.restQueryParams !== void 0 && this._endpointRest !== void 0
52
- && typeof this._endpointRest === 'string' && this._endpointRest.trim() !== '')
53
- e = this._endpointRest;
54
- return e;
55
- }
56
- set __rest_endpoint(endpoint) {
57
- this._endpointRest = endpoint;
58
- if (endpoint === void 0) {
59
- this.restQueryParams = void 0;
60
- }
61
- else {
62
- this.restQueryParams = getRestParams(endpoint, this.__meta_endpoint);
63
- }
64
- }
65
- creatUrl(params, doNotSerializeParams = false) {
66
- return `${this.endpoint}${getParamsUrl(params, doNotSerializeParams)}`;
67
- }
68
- get headers() {
69
- return this._headers;
70
- }
71
- req(method, requestBody, params, doNotSerializeParams = false, isArray = false) {
72
- const modelUrl = this.creatUrl(params, doNotSerializeParams);
73
- const body = (CLASS.getNameFromObject(requestBody) === 'FormData')
74
- ? requestBody
75
- : (requestBody ? JSON.stringify(requestBody) : void 0);
76
- if (this.customContentType) {
77
- const customHeaderKeys = this.customContentType.keys();
78
- const currentHeaderKeys = this._headers.keys();
79
- currentHeaderKeys
80
- .filter(key => !customHeaderKeys.includes(key))
81
- .forEach(key => {
82
- this.customContentType.set(key, this._headers.get(key));
83
- });
84
- this._headers = this.customContentType;
85
- }
86
- else {
87
- this._headers = RestHeaders.from(CONTENT_TYPE.APPLICATION_JSON);
88
- }
89
- const result = this.request[method.toLowerCase()](modelUrl, body, this.headers, this.meta, isArray, this.mockHttp);
90
- this.mockHttp = void 0;
91
- return result;
92
- }
93
- replay(method) {
94
- this.request.replay(method, this.meta);
95
- }
96
- get(params, doNotSerializeParams = false) {
97
- return this.req('get', void 0, params, doNotSerializeParams);
98
- }
99
- head(params, doNotSerializeParams = false) {
100
- return this.req('head', void 0, params, doNotSerializeParams);
101
- }
102
- post(item, params, doNotSerializeParams = false) {
103
- return this.req('post', item, params, doNotSerializeParams);
104
- }
105
- put(item, params, doNotSerializeParams = false) {
106
- return this.req('put', item, params, doNotSerializeParams);
107
- }
108
- patch(item, params, doNotSerializeParams = false) {
109
- return this.req('patch', item, params, doNotSerializeParams);
110
- }
111
- delete(params, doNotSerializeParams = false) {
112
- return this.req('delete', void 0, params, doNotSerializeParams);
113
- }
114
- jsonp(params, doNotSerializeParams = false) {
115
- return this.req('jsonp', void 0, params, doNotSerializeParams);
116
- }
117
- }
118
- ;
119
- ({}); // @--end-of-file-for-module=ng2-rest lib/rest.class.ts
120
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdC5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RtcC1saWJzLWZvci1idW5kbGUvbmcyLXJlc3QvcHJvamVjdHMvbmcyLXJlc3Qvc3JjL2xpYi9yZXN0LmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXZELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBR3pELE1BQU0sT0FBTyxJQUFJO0lBaURmLFlBQ0UsUUFBZ0IsRUFDUixPQUFvQixFQUNwQixJQUF3QixFQUN4QixpQkFBOEI7UUFGOUIsWUFBTyxHQUFQLE9BQU8sQ0FBYTtRQUNwQixTQUFJLEdBQUosSUFBSSxDQUFvQjtRQUN4QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQWE7UUFSaEMsYUFBUSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFtRW5FLFVBQUssR0FBRztZQUNOLEdBQUcsRUFBRSxDQUFDLFNBQTZCLEtBQUssQ0FBQyxFQUFFLG9CQUE4QixFQUF3RCxFQUFFO2dCQUNqSSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxJQUFJLENBQVEsQ0FBQTtZQUMzRSxDQUFDO1lBQ0QsSUFBSSxFQUFFLENBQUMsU0FBNkIsS0FBSyxDQUFDLEVBQUUsb0JBQThCLEVBQXdELEVBQUU7Z0JBQ2xJLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLG9CQUFvQixFQUFFLElBQUksQ0FBUSxD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QUFFLElBQUksRUFBRSxNQUFNLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsTUFBTSxDQUFDLE1BQTJCLEVBQUUsdUJBQWdDLEtBQUs7UUFDdkUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQTJCLEVBQUUsdUJBQWdDLEtBQUs7UUFDdEUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUNqRSxDQUFDO0NBR0Y7QUFFQSxDQUFDO0FBQUEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLHVEQUF1RCIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHsgTG9nLCBMZXZlbCB9IGZyb20gJ25nMi1sb2dnZXIvYnJvd3Nlcic7XG5cblxuaW1wb3J0IHsgTW9kZWxzIH0gZnJvbSAnLi9tb2RlbHMnO1xuaW1wb3J0IHsgZ2V0UmVzdFBhcmFtcywgZ2V0UGFyYW1zVXJsIH0gZnJvbSAnLi9wYXJhbXMnO1xuaW1wb3J0IHsgUmVzdFJlcXVlc3QgfSBmcm9tICcuL3Jlc3QtcmVxdWVzdCc7XG5pbXBvcnQgeyBSZXN0SGVhZGVycyB9IGZyb20gJy4vcmVzdC1oZWFkZXJzJztcbmltcG9ydCB7IENPTlRFTlRfVFlQRSB9IGZyb20gJy4vY29udGVudC10eXBlJztcbmltcG9ydCB7IENMQVNTIH0gZnJvbSAndHlwZXNjcmlwdC1jbGFzcy1oZWxwZXJzL2Jyb3dzZXInO1xuXG5cbmV4cG9ydCBjbGFzcyBSZXN0PFQsIFRBID0gVFtdPiBpbXBsZW1lbnRzIE1vZGVscy5Gbk1ldGhvZHNIdHRwV2l0aE1vY2s8VCwgVEE+IHtcblxuICBwcml2YXRlIG1vY2tIdHRwOiBNb2RlbHMuTW9ja0h0dHA7XG4gIG1vY2sobW9jazogTW9kZWxzLk1vY2tIdHRwKTogTW9kZWxzLkZuTWV0aG9kc0h0dHA8VCwgVEE+IHtcbiAgICBpZiAoKHR5cGVvZiBtb2NrID09PSAnZnVuY3Rpb24nKSB8fCAodHlwZW9mIG1vY2sgPT09ICdvYmplY3QnKSkge1xuICAgICAgdGhpcy5tb2NrSHR0cCA9IG1vY2s7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGBbbmcyLXJlc3RdXG4gICAgICAubW9kZWwoLi4uKVxuICAgICAgLm1vY2soIDwgQkFEIE1PQ0sgREFUQSA+IClcbiAgICAgIC4uLlxuICAgICAgYFxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG5cblxuXG4gIHByaXZhdGUgX19tZXRhX2VuZHBvaW50OiBzdHJpbmc7XG4gIHByaXZhdGUgX2VuZHBvaW50UmVzdDogc3RyaW5nO1xuICBwcml2YXRlIGdldCBlbmRwb2ludCgpIHtcbiAgICBsZXQgZSA9IHRoaXMuX19tZXRhX2VuZHBvaW50O1xuICAgIGlmICh0aGlzLnJlc3RRdWVyeVBhcmFtcyAhPT0gdm9pZCAwICYmIHRoaXMuX2VuZHBvaW50UmVzdCAhPT0gdm9pZCAwXG4gICAgICAmJiB0eXBlb2YgdGhpcy5fZW5kcG9pbnRSZXN0ID09PSAnc3RyaW5nJyAmJiB0aGlzLl9lbmRwb2ludFJlc3QudHJpbSgpICE9PSAnJykgZSA9IHRoaXMuX2VuZHBvaW50UmVzdDtcbiAgICByZXR1cm4gZTtcbiAgfVxuICBwcml2YXRlIHJlc3RRdWVyeVBhcmFtczogT2JqZWN0O1xuICBwdWJsaWMgc2V0IF9fcmVzdF9lbmRwb2ludChlbmRwb2ludCkge1xuICAgIHRoaXMuX2VuZHBvaW50UmVzdCA9IGVuZHBvaW50O1xuICAgIGlmIChlbmRwb2ludCA9PT0gdm9pZCAwKSB7XG4gICAgICB0aGlzLnJlc3RRdWVyeVBhcmFtcyA9IHZvaWQgMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXN0UXVlcnlQYXJhbXMgPSBnZXRSZXN0UGFyYW1zKGVuZHBvaW50LCB0aGlzLl9fbWV0YV9lbmRwb2ludCk7XG4gICAgfVxuXG4gIH1cblxuICBwcml2YXRlIGNyZWF0VXJsKHBhcmFtczogYW55LCBkb05vdFNlcmlhbGl6ZVBhcmFtczogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuZW5kcG9pbnR9JHtnZXRQYXJhbXNVcmwocGFyYW1zLCBkb05vdFNlcmlhbGl6ZVBhcmFtcyl9YDtcbiAgfVxuXG5cblxuXG4gIHByaXZhdGUgX2hlYWRlcnMgPSBSZXN0SGVhZGVycy5mcm9tKENPTlRFTlRfVFlQRS5BUFBMSUNBVElPTl9KU09OKTtcbiAgZ2V0IGhlYWRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlYWRlcnM7XG4gIH1cbiAgY29uc3RydWN0b3IoXG4gICAgZW5kcG9pbnQ6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlcXVlc3Q6IFJlc3RSZXF1ZXN0LFxuICAgIHByaXZhdGUgbWV0YTogTW9kZWxzLk1ldGFSZXF1ZXN0LFxuICAgIHByaXZhdGUgY3VzdG9tQ29udGVudFR5cGU6IFJlc3RIZWFkZXJzLFxuICApIHtcbiAgICB0aGlzLl9fbWV0YV9lbmRwb2ludCA9IGVuZHBvaW50O1xuXG4gIH1cblxuXG5cblxuICBwcml2YXRlIHJlcShtZXRob2Q6IE1vZGVscy5IdHRwTWV0aG9kLFxuICAgIHJlcXVlc3RCb2R5OiBULFxuICAgIHBhcmFtcz86IE1vZGVscy5VcmxQYXJhbXNbXSxcbiAgICBkb05vdFNlcmlhbGl6ZVBhcmFtczogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGlzQXJyYXk6IGJvb2xlYW4gPSBmYWxzZVxuICApIHtcblxuICAgIGNvbnN0IG1vZGVsVXJsID0gdGhpcy5jcmVhdFVybChwYXJhbXMsIGRvTm90U2VyaWFsaXplUGFyYW1zKTtcbiAgICBjb25zdCBib2R5ID0gKENMQVNTLmdldE5hbWVGcm9tT2JqZWN0KHJlcXVlc3RCb2R5KSA9PT0gJ0Zvcm1EYXRhJylcbiAgICAgID8gcmVxdWVzdEJvZHlcbiAgICAgIDogKHJlcXVlc3RCb2R5ID8gSlNPTi5zdHJpbmdpZnkocmVxdWVzdEJvZHkpIDogdm9pZCAwKTtcblxuXG4gICAgaWYgKHRoaXMuY3VzdG9tQ29udGVudFR5cGUpIHtcbiAgICAgIGNvbnN0IGN1c3RvbUhlYWRlcktleXMgPSB0aGlzLmN1c3RvbUNvbnRlbnRUeXBlLmtleXMoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRIZWFkZXJLZXlzID0gdGhpcy5faGVhZGVycy5rZXlzKCk7XG4gICAgICBjdXJyZW50SGVhZGVyS2V5c1xuICAgICAgICAuZmlsdGVyKGtleSA9PiAhY3VzdG9tSGVhZGVyS2V5cy5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgIHRoaXMuY3VzdG9tQ29udGVudFR5cGUuc2V0KGtleSwgdGhpcy5faGVhZGVycy5nZXQoa2V5KSk7XG4gICAgICAgIH0pO1xuICAgICAgdGhpcy5faGVhZGVycyA9IHRoaXMuY3VzdG9tQ29udGVudFR5cGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2hlYWRlcnMgPSBSZXN0SGVhZGVycy5mcm9tKENPTlRFTlRfVFlQRS5BUFBMSUNBVElPTl9KU09OKTtcbiAgICB9XG5cblxuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZXF1ZXN0W21ldGhvZC50b0xvd2VyQ2FzZSgpXShcbiAgICAgIG1vZGVsVXJsLFxuICAgICAgYm9keSxcbiAgICAgIHRoaXMuaGVhZGVycyxcbiAgICAgIHRoaXMubWV0YSxcbiAgICAgIGlzQXJyYXksXG4gICAgICB0aGlzLm1vY2tIdHRwXG4gICAgKTtcblxuICAgIHRoaXMubW9ja0h0dHAgPSB2b2lkIDA7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG5cblxuXG5cbiAgcmVwbGF5KG1ldGhvZDogTW9kZWxzLkh0dHBNZXRob2QpIHtcbiAgICB0aGlzLnJlcXVlc3QucmVwbGF5KG1ldGhvZCwgdGhpcy5tZXRhKTtcbiAgfVxuXG5cbiAgYXJyYXkgPSB7XG4gICAgZ2V0OiAocGFyYW1zOiBNb2RlbHMuVXJsUGFyYW1zW10gPSB2b2lkIDAsIGRvTm90U2VyaWFsaXplUGFyYW1zPzogYm9vbGVhbik6IE1vZGVscy5Qcm9taXNlT2JzZXJ2YWJsZU1peDxNb2RlbHMuSHR0cFJlc3BvbnNlPFRBPj4gPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucmVxKCdnZXQnLCB2b2lkIDAsIHBhcmFtcywgZG9Ob3RTZXJpYWxpemVQYXJhbXMsIHRydWUpIGFzIGFueVxuICAgIH0sXG4gICAgaGVhZDogKHBhcmFtczogTW9kZWxzLlVybFBhcmFtc1tdID0gdm9pZCAwLCBkb05vdFNlcmlhbGl6ZVBhcmFtcz86IGJvb2xlYW4pOiBNb2RlbHMuUHJvbWlzZU9ic2VydmFibGVNaXg8TW9kZWxzLkh0dHBSZXNwb25zZTxUQT4+ID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnJlcSgnaGVhZCcsIHZvaWQgMCwgcGFyYW1zLCBkb05vdFNlcmlhbGl6ZVBhcmFtcywgdHJ1ZSkgYXMgYW55XG4gICAgfSxcbiAgICBwb3N0OiAoaXRlbTogVEEsIHBhcmFtcz86IE1vZGVscy5VcmxQYXJhbXNbXSwgZG9Ob3RTZXJpYWxpemVQYXJhbXM/OiBib29sZWFuKTogTW9kZWxzLlByb21pc2VPYnNlcnZhYmxlTWl4PE1vZGVscy5IdHRwUmVzcG9uc2U8VEE+PiA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5yZXEoJ3Bvc3QnLCBpdGVtIGFzIGFueSwgcGFyYW1zLCBkb05vdFNlcmlhbGl6ZVBhcmFtcywgdHJ1ZSkgYXMgYW55O1xuICAgIH0sXG4gICAgcHV0OiAoaXRlbTogVEEsIHBhcmFtcz86IE1vZGVscy5VcmxQYXJhbXNbXSwgZG9Ob3RTZXJpYWxpemVQYXJhbXM/OiBib29sZWFuKTogTW9kZWxzLlByb21pc2VPYnNlcnZhYmxlTWl4PE1vZGVscy5IdHRwUmVzcG9uc2U8VEE+PiA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5yZXEoJ3B1dCcsIGl0ZW0gYXMgYW55LCBwYXJhbXMsIGRvTm90U2VyaWFsaXplUGFyYW1zLCB0cnVlKSBhcyBhbnk7XG4gICAgfSxcbiAgICBwYXRjaDogKGl0ZW06IFRBLCBwYXJhbXM/OiBNb2RlbHMuVXJsUGFyYW1zW10sIGRvTm90U2VyaWFsaXplUGFyYW1zPzogYm9vbGVhbik6IE1vZGVscy5Qcm9taXNlT2JzZXJ2YWJsZU1peDxNb2RlbHMuSHR0cFJlc3BvbnNlPFRBPj4gPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucmVxKCdwYXRjaCcsIGl0ZW0gYXMgYW55LCBwYXJhbXMsIGRvTm90U2VyaWFsaXplUGFyYW1zLCB0cnVlKSBhcyBhbnk7XG4gICAgfSxcbiAgICBkZWxldGU6IChwYXJhbXM/OiBNb2RlbHMuVXJsUGFyYW1zW10sIGRvTm90U2VyaWFsaXplUGFyYW1zPzogYm9vbGVhbik6IE1vZGVscy5Qcm9taXNlT2JzZXJ2YWJsZU1peDxNb2RlbHMuSHR0cFJlc3BvbnNlPFRBPj4gPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucmVxKCdkZWxldGUnLCB2b2lkIDAsIHBhcmFtcywgZG9Ob3RTZXJpYWxpemVQYXJhbXMsIHRydWUpIGFzIGFueTtcbiAgICB9LFxuICAgIGpzb25wOiAocGFyYW1zPzogTW9kZWxzLlVybFBhcmFtc1tdLCBkb05vdFNlcmlhbGl6ZVBhcmFtcz86IGJvb2xlYW4pOiBNb2RlbHMuUHJvbWlzZU9ic2VydmFibGVNaXg8TW9kZWxzLkh0dHBSZXNwb25zZTxUQT4+ID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnJlcSgnanNvbnAnLCB2b2lkIDAsIHBhcmFtcywgZG9Ob3RTZXJpYWxpemVQYXJhbXMsIHRydWUpIGFzIGFueTtcbiAgICB9XG4gIH1cblxuICBnZXQocGFyYW1zPzogTW9kZWxzLlVybFBhcmFtc1tdLCBkb05vdFNlcmlhbGl6ZVBhcmFtczogYm9vbGVhbiA9IGZhbHNlKTogTW9kZWxzLlByb21pc2VPYnNlcnZhYmxlTWl4PE1vZGVscy5IdHRwUmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXEoJ2dldCcsIHZvaWQgMCwgcGFyYW1zLCBkb05vdFNlcmlhbGl6ZVBhcmFtcykgYXMgYW55O1xuICB9XG5cbiAgaGVhZChwYXJhbXM/OiBNb2RlbHMuVXJsUGFyYW1zW10sIGRvTm90U2VyaWFsaXplUGFyYW1zOiBib29sZWFuID0gZmFsc2UpOiBNb2RlbHMuUHJvbWlzZU9ic2VydmFibGVNaXg8TW9kZWxzLkh0dHBSZXNwb25zZTxUPj4ge1xuICAgIHJldHVybiB0aGlzLnJlcSgnaGVhZCcsIHZvaWQgMCwgcGFyYW1zLCBkb05vdFNlcmlhbGl6ZVBhcmFtcykgYXMgYW55O1xuICB9XG5cbiAgcG9zdChpdGVtOiBULCBwYXJhbXM/OiBNb2RlbHMuVXJsUGFyYW1zW10sIGRvTm90U2VyaWFsaXplUGFyYW1zOiBib29sZWFuID0gZmFsc2UpOiBNb2RlbHMuUHJvbWlzZU9ic2VydmFibGVNaXg8TW9kZWxzLkh0dHBSZXNwb25zZTxUPj4ge1xuICAgIHJldHVybiB0aGlzLnJlcSgncG9zdCcsIGl0ZW0sIHBhcmFtcywgZG9Ob3RTZXJpYWxpemVQYXJhbXMpO1xuICB9XG5cbiAgcHV0KGl0ZW06IFQsIHBhcmFtcz86IE1vZGVscy5VcmxQYXJhbXNbXSwgZG9Ob3RTZXJpYWxpemVQYXJhbXM6IGJvb2xlYW4gPSBmYWxzZSk6IE1vZGVscy5Qcm9taXNlT2JzZXJ2YWJsZU1peDxNb2RlbHMuSHR0cFJlc3BvbnNlPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxKCdwdXQnLCBpdGVtLCBwYXJhbXMsIGRvTm90U2VyaWFsaXplUGFyYW1zKTtcbiAgfVxuXG4gIHBhdGNoKGl0ZW06IFQsIHBhcmFtcz86IE1vZGVscy5VcmxQYXJhbXNbXSwgZG9Ob3RTZXJpYWxpemVQYXJhbXM6IGJvb2xlYW4gPSBmYWxzZSk6IE1vZGVscy5Qcm9taXNlT2JzZXJ2YWJsZU1peDxNb2RlbHMuSHR0cFJlc3BvbnNlPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxKCdwYXRjaCcsIGl0ZW0sIHBhcmFtcywgZG9Ob3RTZXJpYWxpemVQYXJhbXMpO1xuICB9XG5cbiAgZGVsZXRlKHBhcmFtcz86IE1vZGVscy5VcmxQYXJhbXNbXSwgZG9Ob3RTZXJpYWxpemVQYXJhbXM6IGJvb2xlYW4gPSBmYWxzZSk6IE1vZGVscy5Qcm9taXNlT2JzZXJ2YWJsZU1peDxNb2RlbHMuSHR0cFJlc3BvbnNlPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxKCdkZWxldGUnLCB2b2lkIDAsIHBhcmFtcywgZG9Ob3RTZXJpYWxpemVQYXJhbXMpO1xuICB9XG5cbiAganNvbnAocGFyYW1zPzogTW9kZWxzLlVybFBhcmFtc1tdLCBkb05vdFNlcmlhbGl6ZVBhcmFtczogYm9vbGVhbiA9IGZhbHNlKTogTW9kZWxzLlByb21pc2VPYnNlcnZhYmxlTWl4PE1vZGVscy5IdHRwUmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXEoJ2pzb25wJywgdm9pZCAwLCBwYXJhbXMsIGRvTm90U2VyaWFsaXplUGFyYW1zKTtcbiAgfVxuXG5cbn1cblxuIDsoe30pOyAvLyBALS1lbmQtb2YtZmlsZS1mb3ItbW9kdWxlPW5nMi1yZXN0IGxpYi9yZXN0LmNsYXNzLnRzIl19