@revxui/intellibid-client-ts 1.0.68 → 1.0.71

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 (105) hide show
  1. package/README.md +2 -2
  2. package/api/advertiserController.service.d.ts +137 -137
  3. package/api/api.d.ts +11 -11
  4. package/api/audienceController.service.d.ts +128 -128
  5. package/api/campaignController.service.d.ts +110 -127
  6. package/api/insightsController.service.d.ts +33 -33
  7. package/api/lookupDataController.service.d.ts +58 -58
  8. package/api.module.d.ts +11 -11
  9. package/configuration.d.ts +48 -48
  10. package/encoder.d.ts +10 -10
  11. package/esm2020/api/advertiserController.service.mjs +327 -327
  12. package/esm2020/api/api.mjs +11 -11
  13. package/esm2020/api/audienceController.service.mjs +326 -326
  14. package/esm2020/api/campaignController.service.mjs +297 -326
  15. package/esm2020/api/insightsController.service.mjs +107 -107
  16. package/esm2020/api/lookupDataController.service.mjs +134 -134
  17. package/esm2020/api.module.mjs +56 -56
  18. package/esm2020/configuration.mjs +58 -58
  19. package/esm2020/encoder.mjs +16 -16
  20. package/esm2020/index.mjs +5 -5
  21. package/esm2020/model/adAccountResponse.mjs +25 -25
  22. package/esm2020/model/advertiserMmpConversionEventResponse.mjs +12 -12
  23. package/esm2020/model/advertiserResponse.mjs +12 -12
  24. package/esm2020/model/advertiserSearchResponse.mjs +12 -12
  25. package/esm2020/model/audienceResponse.mjs +17 -17
  26. package/esm2020/model/blockedEventResponse.mjs +12 -12
  27. package/esm2020/model/businessZoneResponse.mjs +12 -12
  28. package/esm2020/model/campaignChangeLogResponse.mjs +23 -23
  29. package/esm2020/model/campaignInsightRecord.mjs +18 -18
  30. package/esm2020/model/campaignInsightsResponse.mjs +1 -1
  31. package/esm2020/model/campaignRequest.mjs +34 -34
  32. package/esm2020/model/campaignResponse.mjs +26 -26
  33. package/esm2020/model/campaignSearchResponse.mjs +12 -12
  34. package/esm2020/model/childAudience.mjs +38 -38
  35. package/esm2020/model/countryResponse.mjs +12 -12
  36. package/esm2020/model/createBlockedLiveAudienceRequest.mjs +21 -21
  37. package/esm2020/model/createBucketizedCustomAudienceRequest.mjs +37 -37
  38. package/esm2020/model/createBucketizedLiveAudienceRequest.mjs +25 -25
  39. package/esm2020/model/createDsCustomQueryAudienceRequest.mjs +33 -33
  40. package/esm2020/model/goalEventOptionDTO.mjs +13 -13
  41. package/esm2020/model/goalResponse.mjs +12 -12
  42. package/esm2020/model/models.mjs +37 -38
  43. package/esm2020/model/oSResponse.mjs +12 -12
  44. package/esm2020/model/pageAdvertiserResponse.mjs +2 -2
  45. package/esm2020/model/pageCampaignChangeLogResponse.mjs +2 -2
  46. package/esm2020/model/pageCampaignResponse.mjs +2 -2
  47. package/esm2020/model/pageableObject.mjs +1 -1
  48. package/esm2020/model/platformResponse.mjs +12 -12
  49. package/esm2020/model/productSetRequest.mjs +21 -21
  50. package/esm2020/model/productSetResponse.mjs +21 -21
  51. package/esm2020/model/scheduleUpdateRequest.mjs +18 -18
  52. package/esm2020/model/scheduledUpdates.mjs +12 -12
  53. package/esm2020/model/sortObject.mjs +12 -12
  54. package/esm2020/model/supportedGoalEventsResponseDTO.mjs +1 -1
  55. package/esm2020/model/updateAudienceNameRequest.mjs +21 -21
  56. package/esm2020/model/updateDsCustomQuerySqlRequest.mjs +21 -21
  57. package/esm2020/model/validateDsQueryRequest.mjs +12 -12
  58. package/esm2020/revxui-intellibid-client-ts.mjs +4 -4
  59. package/esm2020/variables.mjs +8 -8
  60. package/fesm2015/revxui-intellibid-client-ts.mjs +1661 -1690
  61. package/fesm2015/revxui-intellibid-client-ts.mjs.map +1 -1
  62. package/fesm2020/revxui-intellibid-client-ts.mjs +1788 -1829
  63. package/fesm2020/revxui-intellibid-client-ts.mjs.map +1 -1
  64. package/index.d.ts +5 -5
  65. package/model/adAccountResponse.d.ts +32 -32
  66. package/model/advertiserMmpConversionEventResponse.d.ts +15 -15
  67. package/model/advertiserResponse.d.ts +32 -32
  68. package/model/advertiserSearchResponse.d.ts +16 -16
  69. package/model/audienceResponse.d.ts +46 -45
  70. package/model/blockedEventResponse.d.ts +15 -15
  71. package/model/businessZoneResponse.d.ts +17 -17
  72. package/model/campaignChangeLogResponse.d.ts +34 -34
  73. package/model/campaignInsightRecord.d.ts +56 -56
  74. package/model/campaignInsightsResponse.d.ts +16 -16
  75. package/model/campaignRequest.d.ts +55 -55
  76. package/model/campaignResponse.d.ts +75 -75
  77. package/model/campaignSearchResponse.d.ts +15 -15
  78. package/model/childAudience.d.ts +68 -69
  79. package/model/countryResponse.d.ts +18 -18
  80. package/model/createBlockedLiveAudienceRequest.d.ts +27 -27
  81. package/model/createBucketizedCustomAudienceRequest.d.ts +56 -56
  82. package/model/createBucketizedLiveAudienceRequest.d.ts +40 -40
  83. package/model/createDsCustomQueryAudienceRequest.d.ts +50 -48
  84. package/model/goalEventOptionDTO.d.ts +14 -15
  85. package/model/goalResponse.d.ts +15 -15
  86. package/model/models.d.ts +36 -37
  87. package/model/oSResponse.d.ts +15 -15
  88. package/model/pageAdvertiserResponse.d.ts +27 -27
  89. package/model/pageCampaignChangeLogResponse.d.ts +27 -27
  90. package/model/pageCampaignResponse.d.ts +27 -27
  91. package/model/pageableObject.d.ts +20 -20
  92. package/model/platformResponse.d.ts +15 -15
  93. package/model/productSetRequest.d.ts +27 -27
  94. package/model/productSetResponse.d.ts +27 -27
  95. package/model/scheduleUpdateRequest.d.ts +22 -22
  96. package/model/scheduledUpdates.d.ts +15 -15
  97. package/model/sortObject.d.ts +18 -18
  98. package/model/supportedGoalEventsResponseDTO.d.ts +19 -19
  99. package/model/updateAudienceNameRequest.d.ts +26 -26
  100. package/model/updateDsCustomQuerySqlRequest.d.ts +26 -26
  101. package/model/validateDsQueryRequest.d.ts +14 -14
  102. package/package.json +1 -1
  103. package/variables.d.ts +8 -8
  104. package/esm2020/model/goalRequest.mjs +0 -13
  105. package/model/goalRequest.d.ts +0 -17
@@ -1,327 +1,327 @@
1
- /**
2
- * Intellibid API
3
- * API documentation for the Intellibid platform
4
- *
5
- * OpenAPI spec version: 1.0
6
- *
7
- *
8
- * NOTE: This class is auto generated by the swagger code generator program.
9
- * https://github.com/swagger-api/swagger-codegen.git
10
- * Do not edit the class manually.
11
- */ /* tslint:disable:no-unused-variable member-ordering */
12
- import { Inject, Injectable, Optional } from '@angular/core';
13
- import { HttpHeaders, HttpParams } from '@angular/common/http';
14
- import { CustomHttpUrlEncodingCodec } from '../encoder';
15
- import { BASE_PATH } from '../variables';
16
- import { Configuration } from '../configuration';
17
- import * as i0 from "@angular/core";
18
- import * as i1 from "@angular/common/http";
19
- import * as i2 from "../configuration";
20
- export class AudienceControllerService {
21
- constructor(httpClient, basePath, configuration) {
22
- this.httpClient = httpClient;
23
- this.basePath = 'http://dev1-intellibid-svc.revx.io';
24
- this.defaultHeaders = new HttpHeaders();
25
- this.configuration = new Configuration();
26
- if (basePath) {
27
- this.basePath = basePath;
28
- }
29
- if (configuration) {
30
- this.configuration = configuration;
31
- this.basePath = basePath || configuration.basePath || this.basePath;
32
- }
33
- }
34
- /**
35
- * @param consumes string[] mime-types
36
- * @return true: consumes contains 'multipart/form-data', false: otherwise
37
- */
38
- canConsumeForm(consumes) {
39
- const form = 'multipart/form-data';
40
- for (const consume of consumes) {
41
- if (form === consume) {
42
- return true;
43
- }
44
- }
45
- return false;
46
- }
47
- createBlockedLiveAudience(body, observe = 'body', reportProgress = false) {
48
- if (body === null || body === undefined) {
49
- throw new Error('Required parameter body was null or undefined when calling createBlockedLiveAudience.');
50
- }
51
- let headers = this.defaultHeaders;
52
- // to determine the Accept header
53
- let httpHeaderAccepts = [
54
- '*/*'
55
- ];
56
- const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
57
- if (httpHeaderAcceptSelected != undefined) {
58
- headers = headers.set('Accept', httpHeaderAcceptSelected);
59
- }
60
- // to determine the Content-Type header
61
- const consumes = [
62
- 'application/json'
63
- ];
64
- const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
65
- if (httpContentTypeSelected != undefined) {
66
- headers = headers.set('Content-Type', httpContentTypeSelected);
67
- }
68
- return this.httpClient.request('post', `${this.basePath}/api/audiences/live/blocked`, {
69
- body: body,
70
- withCredentials: this.configuration.withCredentials,
71
- headers: headers,
72
- observe: observe,
73
- reportProgress: reportProgress
74
- });
75
- }
76
- createBucketizedCustom(body, observe = 'body', reportProgress = false) {
77
- if (body === null || body === undefined) {
78
- throw new Error('Required parameter body was null or undefined when calling createBucketizedCustom.');
79
- }
80
- let headers = this.defaultHeaders;
81
- // to determine the Accept header
82
- let httpHeaderAccepts = [
83
- '*/*'
84
- ];
85
- const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
86
- if (httpHeaderAcceptSelected != undefined) {
87
- headers = headers.set('Accept', httpHeaderAcceptSelected);
88
- }
89
- // to determine the Content-Type header
90
- const consumes = [
91
- 'application/json'
92
- ];
93
- const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
94
- if (httpContentTypeSelected != undefined) {
95
- headers = headers.set('Content-Type', httpContentTypeSelected);
96
- }
97
- return this.httpClient.request('post', `${this.basePath}/api/audiences/custom/bucketized`, {
98
- body: body,
99
- withCredentials: this.configuration.withCredentials,
100
- headers: headers,
101
- observe: observe,
102
- reportProgress: reportProgress
103
- });
104
- }
105
- createBucketizedLive(body, observe = 'body', reportProgress = false) {
106
- if (body === null || body === undefined) {
107
- throw new Error('Required parameter body was null or undefined when calling createBucketizedLive.');
108
- }
109
- let headers = this.defaultHeaders;
110
- // to determine the Accept header
111
- let httpHeaderAccepts = [
112
- '*/*'
113
- ];
114
- const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
115
- if (httpHeaderAcceptSelected != undefined) {
116
- headers = headers.set('Accept', httpHeaderAcceptSelected);
117
- }
118
- // to determine the Content-Type header
119
- const consumes = [
120
- 'application/json'
121
- ];
122
- const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
123
- if (httpContentTypeSelected != undefined) {
124
- headers = headers.set('Content-Type', httpContentTypeSelected);
125
- }
126
- return this.httpClient.request('post', `${this.basePath}/api/audiences/live/bucketized`, {
127
- body: body,
128
- withCredentials: this.configuration.withCredentials,
129
- headers: headers,
130
- observe: observe,
131
- reportProgress: reportProgress
132
- });
133
- }
134
- createDsCustomQuery(body, observe = 'body', reportProgress = false) {
135
- if (body === null || body === undefined) {
136
- throw new Error('Required parameter body was null or undefined when calling createDsCustomQuery.');
137
- }
138
- let headers = this.defaultHeaders;
139
- // to determine the Accept header
140
- let httpHeaderAccepts = [
141
- '*/*'
142
- ];
143
- const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
144
- if (httpHeaderAcceptSelected != undefined) {
145
- headers = headers.set('Accept', httpHeaderAcceptSelected);
146
- }
147
- // to determine the Content-Type header
148
- const consumes = [
149
- 'application/json'
150
- ];
151
- const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
152
- if (httpContentTypeSelected != undefined) {
153
- headers = headers.set('Content-Type', httpContentTypeSelected);
154
- }
155
- return this.httpClient.request('post', `${this.basePath}/api/audiences/custom/ds-query`, {
156
- body: body,
157
- withCredentials: this.configuration.withCredentials,
158
- headers: headers,
159
- observe: observe,
160
- reportProgress: reportProgress
161
- });
162
- }
163
- getAllAudiences(advertiserId, groupType, sourcePlatform, audienceType, audienceSource, observe = 'body', reportProgress = false) {
164
- if (advertiserId === null || advertiserId === undefined) {
165
- throw new Error('Required parameter advertiserId was null or undefined when calling getAllAudiences.');
166
- }
167
- let queryParameters = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
168
- if (groupType !== undefined && groupType !== null) {
169
- queryParameters = queryParameters.set('groupType', groupType);
170
- }
171
- if (sourcePlatform !== undefined && sourcePlatform !== null) {
172
- queryParameters = queryParameters.set('sourcePlatform', sourcePlatform);
173
- }
174
- if (audienceType !== undefined && audienceType !== null) {
175
- queryParameters = queryParameters.set('audienceType', audienceType);
176
- }
177
- if (audienceSource !== undefined && audienceSource !== null) {
178
- queryParameters = queryParameters.set('audienceSource', audienceSource);
179
- }
180
- let headers = this.defaultHeaders;
181
- // to determine the Accept header
182
- let httpHeaderAccepts = [
183
- '*/*'
184
- ];
185
- const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
186
- if (httpHeaderAcceptSelected != undefined) {
187
- headers = headers.set('Accept', httpHeaderAcceptSelected);
188
- }
189
- // to determine the Content-Type header
190
- const consumes = [];
191
- return this.httpClient.request('get', `${this.basePath}/api/audiences/advertiser/${encodeURIComponent(String(advertiserId))}`, {
192
- params: queryParameters,
193
- withCredentials: this.configuration.withCredentials,
194
- headers: headers,
195
- observe: observe,
196
- reportProgress: reportProgress
197
- });
198
- }
199
- getGroupStatus(groupId, observe = 'body', reportProgress = false) {
200
- if (groupId === null || groupId === undefined) {
201
- throw new Error('Required parameter groupId was null or undefined when calling getGroupStatus.');
202
- }
203
- let headers = this.defaultHeaders;
204
- // to determine the Accept header
205
- let httpHeaderAccepts = [
206
- '*/*'
207
- ];
208
- const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
209
- if (httpHeaderAcceptSelected != undefined) {
210
- headers = headers.set('Accept', httpHeaderAcceptSelected);
211
- }
212
- // to determine the Content-Type header
213
- const consumes = [];
214
- return this.httpClient.request('get', `${this.basePath}/api/audiences/groups/${encodeURIComponent(String(groupId))}`, {
215
- withCredentials: this.configuration.withCredentials,
216
- headers: headers,
217
- observe: observe,
218
- reportProgress: reportProgress
219
- });
220
- }
221
- updateDsCustomQuerySql(body, groupId, observe = 'body', reportProgress = false) {
222
- if (body === null || body === undefined) {
223
- throw new Error('Required parameter body was null or undefined when calling updateDsCustomQuerySql.');
224
- }
225
- if (groupId === null || groupId === undefined) {
226
- throw new Error('Required parameter groupId was null or undefined when calling updateDsCustomQuerySql.');
227
- }
228
- let headers = this.defaultHeaders;
229
- // to determine the Accept header
230
- let httpHeaderAccepts = [
231
- '*/*'
232
- ];
233
- const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
234
- if (httpHeaderAcceptSelected != undefined) {
235
- headers = headers.set('Accept', httpHeaderAcceptSelected);
236
- }
237
- // to determine the Content-Type header
238
- const consumes = [
239
- 'application/json'
240
- ];
241
- const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
242
- if (httpContentTypeSelected != undefined) {
243
- headers = headers.set('Content-Type', httpContentTypeSelected);
244
- }
245
- return this.httpClient.request('post', `${this.basePath}/api/audiences/groups/${encodeURIComponent(String(groupId))}/custom/ds-query/sql`, {
246
- body: body,
247
- withCredentials: this.configuration.withCredentials,
248
- headers: headers,
249
- observe: observe,
250
- reportProgress: reportProgress
251
- });
252
- }
253
- updateName(body, groupId, observe = 'body', reportProgress = false) {
254
- if (body === null || body === undefined) {
255
- throw new Error('Required parameter body was null or undefined when calling updateName.');
256
- }
257
- if (groupId === null || groupId === undefined) {
258
- throw new Error('Required parameter groupId was null or undefined when calling updateName.');
259
- }
260
- let headers = this.defaultHeaders;
261
- // to determine the Accept header
262
- let httpHeaderAccepts = [
263
- '*/*'
264
- ];
265
- const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
266
- if (httpHeaderAcceptSelected != undefined) {
267
- headers = headers.set('Accept', httpHeaderAcceptSelected);
268
- }
269
- // to determine the Content-Type header
270
- const consumes = [
271
- 'application/json'
272
- ];
273
- const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
274
- if (httpContentTypeSelected != undefined) {
275
- headers = headers.set('Content-Type', httpContentTypeSelected);
276
- }
277
- return this.httpClient.request('post', `${this.basePath}/api/audiences/groups/${encodeURIComponent(String(groupId))}/name`, {
278
- body: body,
279
- withCredentials: this.configuration.withCredentials,
280
- headers: headers,
281
- observe: observe,
282
- reportProgress: reportProgress
283
- });
284
- }
285
- validateDsQuery(body, observe = 'body', reportProgress = false) {
286
- if (body === null || body === undefined) {
287
- throw new Error('Required parameter body was null or undefined when calling validateDsQuery.');
288
- }
289
- let headers = this.defaultHeaders;
290
- // to determine the Accept header
291
- let httpHeaderAccepts = [
292
- '*/*'
293
- ];
294
- const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
295
- if (httpHeaderAcceptSelected != undefined) {
296
- headers = headers.set('Accept', httpHeaderAcceptSelected);
297
- }
298
- // to determine the Content-Type header
299
- const consumes = [
300
- 'application/json'
301
- ];
302
- const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
303
- if (httpContentTypeSelected != undefined) {
304
- headers = headers.set('Content-Type', httpContentTypeSelected);
305
- }
306
- return this.httpClient.request('post', `${this.basePath}/api/audiences/validate-ds-query`, {
307
- body: body,
308
- withCredentials: this.configuration.withCredentials,
309
- headers: headers,
310
- observe: observe,
311
- reportProgress: reportProgress
312
- });
313
- }
314
- }
315
- AudienceControllerService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AudienceControllerService, deps: [{ token: i1.HttpClient }, { token: BASE_PATH, optional: true }, { token: i2.Configuration, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
316
- AudienceControllerService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AudienceControllerService });
317
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AudienceControllerService, decorators: [{
318
- type: Injectable
319
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: undefined, decorators: [{
320
- type: Optional
321
- }, {
322
- type: Inject,
323
- args: [BASE_PATH]
324
- }] }, { type: i2.Configuration, decorators: [{
325
- type: Optional
326
- }] }]; } });
1
+ /**
2
+ * Intellibid API
3
+ * API documentation for the Intellibid platform
4
+ *
5
+ * OpenAPI spec version: 1.0
6
+ *
7
+ *
8
+ * NOTE: This class is auto generated by the swagger code generator program.
9
+ * https://github.com/swagger-api/swagger-codegen.git
10
+ * Do not edit the class manually.
11
+ */ /* tslint:disable:no-unused-variable member-ordering */
12
+ import { Inject, Injectable, Optional } from '@angular/core';
13
+ import { HttpHeaders, HttpParams } from '@angular/common/http';
14
+ import { CustomHttpUrlEncodingCodec } from '../encoder';
15
+ import { BASE_PATH } from '../variables';
16
+ import { Configuration } from '../configuration';
17
+ import * as i0 from "@angular/core";
18
+ import * as i1 from "@angular/common/http";
19
+ import * as i2 from "../configuration";
20
+ export class AudienceControllerService {
21
+ constructor(httpClient, basePath, configuration) {
22
+ this.httpClient = httpClient;
23
+ this.basePath = 'http://dev1-intellibid-svc.revx.io';
24
+ this.defaultHeaders = new HttpHeaders();
25
+ this.configuration = new Configuration();
26
+ if (basePath) {
27
+ this.basePath = basePath;
28
+ }
29
+ if (configuration) {
30
+ this.configuration = configuration;
31
+ this.basePath = basePath || configuration.basePath || this.basePath;
32
+ }
33
+ }
34
+ /**
35
+ * @param consumes string[] mime-types
36
+ * @return true: consumes contains 'multipart/form-data', false: otherwise
37
+ */
38
+ canConsumeForm(consumes) {
39
+ const form = 'multipart/form-data';
40
+ for (const consume of consumes) {
41
+ if (form === consume) {
42
+ return true;
43
+ }
44
+ }
45
+ return false;
46
+ }
47
+ createBlockedLiveAudience(body, observe = 'body', reportProgress = false) {
48
+ if (body === null || body === undefined) {
49
+ throw new Error('Required parameter body was null or undefined when calling createBlockedLiveAudience.');
50
+ }
51
+ let headers = this.defaultHeaders;
52
+ // to determine the Accept header
53
+ let httpHeaderAccepts = [
54
+ '*/*'
55
+ ];
56
+ const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
57
+ if (httpHeaderAcceptSelected != undefined) {
58
+ headers = headers.set('Accept', httpHeaderAcceptSelected);
59
+ }
60
+ // to determine the Content-Type header
61
+ const consumes = [
62
+ 'application/json'
63
+ ];
64
+ const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
65
+ if (httpContentTypeSelected != undefined) {
66
+ headers = headers.set('Content-Type', httpContentTypeSelected);
67
+ }
68
+ return this.httpClient.request('post', `${this.basePath}/api/audiences/live/blocked`, {
69
+ body: body,
70
+ withCredentials: this.configuration.withCredentials,
71
+ headers: headers,
72
+ observe: observe,
73
+ reportProgress: reportProgress
74
+ });
75
+ }
76
+ createBucketizedCustom(body, observe = 'body', reportProgress = false) {
77
+ if (body === null || body === undefined) {
78
+ throw new Error('Required parameter body was null or undefined when calling createBucketizedCustom.');
79
+ }
80
+ let headers = this.defaultHeaders;
81
+ // to determine the Accept header
82
+ let httpHeaderAccepts = [
83
+ '*/*'
84
+ ];
85
+ const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
86
+ if (httpHeaderAcceptSelected != undefined) {
87
+ headers = headers.set('Accept', httpHeaderAcceptSelected);
88
+ }
89
+ // to determine the Content-Type header
90
+ const consumes = [
91
+ 'application/json'
92
+ ];
93
+ const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
94
+ if (httpContentTypeSelected != undefined) {
95
+ headers = headers.set('Content-Type', httpContentTypeSelected);
96
+ }
97
+ return this.httpClient.request('post', `${this.basePath}/api/audiences/custom/bucketized`, {
98
+ body: body,
99
+ withCredentials: this.configuration.withCredentials,
100
+ headers: headers,
101
+ observe: observe,
102
+ reportProgress: reportProgress
103
+ });
104
+ }
105
+ createBucketizedLive(body, observe = 'body', reportProgress = false) {
106
+ if (body === null || body === undefined) {
107
+ throw new Error('Required parameter body was null or undefined when calling createBucketizedLive.');
108
+ }
109
+ let headers = this.defaultHeaders;
110
+ // to determine the Accept header
111
+ let httpHeaderAccepts = [
112
+ '*/*'
113
+ ];
114
+ const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
115
+ if (httpHeaderAcceptSelected != undefined) {
116
+ headers = headers.set('Accept', httpHeaderAcceptSelected);
117
+ }
118
+ // to determine the Content-Type header
119
+ const consumes = [
120
+ 'application/json'
121
+ ];
122
+ const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
123
+ if (httpContentTypeSelected != undefined) {
124
+ headers = headers.set('Content-Type', httpContentTypeSelected);
125
+ }
126
+ return this.httpClient.request('post', `${this.basePath}/api/audiences/live/bucketized`, {
127
+ body: body,
128
+ withCredentials: this.configuration.withCredentials,
129
+ headers: headers,
130
+ observe: observe,
131
+ reportProgress: reportProgress
132
+ });
133
+ }
134
+ createDsCustomQuery(body, observe = 'body', reportProgress = false) {
135
+ if (body === null || body === undefined) {
136
+ throw new Error('Required parameter body was null or undefined when calling createDsCustomQuery.');
137
+ }
138
+ let headers = this.defaultHeaders;
139
+ // to determine the Accept header
140
+ let httpHeaderAccepts = [
141
+ '*/*'
142
+ ];
143
+ const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
144
+ if (httpHeaderAcceptSelected != undefined) {
145
+ headers = headers.set('Accept', httpHeaderAcceptSelected);
146
+ }
147
+ // to determine the Content-Type header
148
+ const consumes = [
149
+ 'application/json'
150
+ ];
151
+ const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
152
+ if (httpContentTypeSelected != undefined) {
153
+ headers = headers.set('Content-Type', httpContentTypeSelected);
154
+ }
155
+ return this.httpClient.request('post', `${this.basePath}/api/audiences/custom/ds-query`, {
156
+ body: body,
157
+ withCredentials: this.configuration.withCredentials,
158
+ headers: headers,
159
+ observe: observe,
160
+ reportProgress: reportProgress
161
+ });
162
+ }
163
+ getAllAudiences(advertiserId, groupType, sourcePlatform, audienceType, audienceSource, observe = 'body', reportProgress = false) {
164
+ if (advertiserId === null || advertiserId === undefined) {
165
+ throw new Error('Required parameter advertiserId was null or undefined when calling getAllAudiences.');
166
+ }
167
+ let queryParameters = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
168
+ if (groupType !== undefined && groupType !== null) {
169
+ queryParameters = queryParameters.set('groupType', groupType);
170
+ }
171
+ if (sourcePlatform !== undefined && sourcePlatform !== null) {
172
+ queryParameters = queryParameters.set('sourcePlatform', sourcePlatform);
173
+ }
174
+ if (audienceType !== undefined && audienceType !== null) {
175
+ queryParameters = queryParameters.set('audienceType', audienceType);
176
+ }
177
+ if (audienceSource !== undefined && audienceSource !== null) {
178
+ queryParameters = queryParameters.set('audienceSource', audienceSource);
179
+ }
180
+ let headers = this.defaultHeaders;
181
+ // to determine the Accept header
182
+ let httpHeaderAccepts = [
183
+ '*/*'
184
+ ];
185
+ const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
186
+ if (httpHeaderAcceptSelected != undefined) {
187
+ headers = headers.set('Accept', httpHeaderAcceptSelected);
188
+ }
189
+ // to determine the Content-Type header
190
+ const consumes = [];
191
+ return this.httpClient.request('get', `${this.basePath}/api/audiences/advertiser/${encodeURIComponent(String(advertiserId))}`, {
192
+ params: queryParameters,
193
+ withCredentials: this.configuration.withCredentials,
194
+ headers: headers,
195
+ observe: observe,
196
+ reportProgress: reportProgress
197
+ });
198
+ }
199
+ getGroupStatus(groupId, observe = 'body', reportProgress = false) {
200
+ if (groupId === null || groupId === undefined) {
201
+ throw new Error('Required parameter groupId was null or undefined when calling getGroupStatus.');
202
+ }
203
+ let headers = this.defaultHeaders;
204
+ // to determine the Accept header
205
+ let httpHeaderAccepts = [
206
+ '*/*'
207
+ ];
208
+ const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
209
+ if (httpHeaderAcceptSelected != undefined) {
210
+ headers = headers.set('Accept', httpHeaderAcceptSelected);
211
+ }
212
+ // to determine the Content-Type header
213
+ const consumes = [];
214
+ return this.httpClient.request('get', `${this.basePath}/api/audiences/groups/${encodeURIComponent(String(groupId))}`, {
215
+ withCredentials: this.configuration.withCredentials,
216
+ headers: headers,
217
+ observe: observe,
218
+ reportProgress: reportProgress
219
+ });
220
+ }
221
+ updateDsCustomQuerySql(body, groupId, observe = 'body', reportProgress = false) {
222
+ if (body === null || body === undefined) {
223
+ throw new Error('Required parameter body was null or undefined when calling updateDsCustomQuerySql.');
224
+ }
225
+ if (groupId === null || groupId === undefined) {
226
+ throw new Error('Required parameter groupId was null or undefined when calling updateDsCustomQuerySql.');
227
+ }
228
+ let headers = this.defaultHeaders;
229
+ // to determine the Accept header
230
+ let httpHeaderAccepts = [
231
+ '*/*'
232
+ ];
233
+ const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
234
+ if (httpHeaderAcceptSelected != undefined) {
235
+ headers = headers.set('Accept', httpHeaderAcceptSelected);
236
+ }
237
+ // to determine the Content-Type header
238
+ const consumes = [
239
+ 'application/json'
240
+ ];
241
+ const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
242
+ if (httpContentTypeSelected != undefined) {
243
+ headers = headers.set('Content-Type', httpContentTypeSelected);
244
+ }
245
+ return this.httpClient.request('post', `${this.basePath}/api/audiences/groups/${encodeURIComponent(String(groupId))}/custom/ds-query/sql`, {
246
+ body: body,
247
+ withCredentials: this.configuration.withCredentials,
248
+ headers: headers,
249
+ observe: observe,
250
+ reportProgress: reportProgress
251
+ });
252
+ }
253
+ updateName(body, groupId, observe = 'body', reportProgress = false) {
254
+ if (body === null || body === undefined) {
255
+ throw new Error('Required parameter body was null or undefined when calling updateName.');
256
+ }
257
+ if (groupId === null || groupId === undefined) {
258
+ throw new Error('Required parameter groupId was null or undefined when calling updateName.');
259
+ }
260
+ let headers = this.defaultHeaders;
261
+ // to determine the Accept header
262
+ let httpHeaderAccepts = [
263
+ '*/*'
264
+ ];
265
+ const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
266
+ if (httpHeaderAcceptSelected != undefined) {
267
+ headers = headers.set('Accept', httpHeaderAcceptSelected);
268
+ }
269
+ // to determine the Content-Type header
270
+ const consumes = [
271
+ 'application/json'
272
+ ];
273
+ const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
274
+ if (httpContentTypeSelected != undefined) {
275
+ headers = headers.set('Content-Type', httpContentTypeSelected);
276
+ }
277
+ return this.httpClient.request('post', `${this.basePath}/api/audiences/groups/${encodeURIComponent(String(groupId))}/name`, {
278
+ body: body,
279
+ withCredentials: this.configuration.withCredentials,
280
+ headers: headers,
281
+ observe: observe,
282
+ reportProgress: reportProgress
283
+ });
284
+ }
285
+ validateDsQuery(body, observe = 'body', reportProgress = false) {
286
+ if (body === null || body === undefined) {
287
+ throw new Error('Required parameter body was null or undefined when calling validateDsQuery.');
288
+ }
289
+ let headers = this.defaultHeaders;
290
+ // to determine the Accept header
291
+ let httpHeaderAccepts = [
292
+ '*/*'
293
+ ];
294
+ const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
295
+ if (httpHeaderAcceptSelected != undefined) {
296
+ headers = headers.set('Accept', httpHeaderAcceptSelected);
297
+ }
298
+ // to determine the Content-Type header
299
+ const consumes = [
300
+ 'application/json'
301
+ ];
302
+ const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
303
+ if (httpContentTypeSelected != undefined) {
304
+ headers = headers.set('Content-Type', httpContentTypeSelected);
305
+ }
306
+ return this.httpClient.request('post', `${this.basePath}/api/audiences/validate-ds-query`, {
307
+ body: body,
308
+ withCredentials: this.configuration.withCredentials,
309
+ headers: headers,
310
+ observe: observe,
311
+ reportProgress: reportProgress
312
+ });
313
+ }
314
+ }
315
+ AudienceControllerService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AudienceControllerService, deps: [{ token: i1.HttpClient }, { token: BASE_PATH, optional: true }, { token: i2.Configuration, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
316
+ AudienceControllerService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AudienceControllerService });
317
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AudienceControllerService, decorators: [{
318
+ type: Injectable
319
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: undefined, decorators: [{
320
+ type: Optional
321
+ }, {
322
+ type: Inject,
323
+ args: [BASE_PATH]
324
+ }] }, { type: i2.Configuration, decorators: [{
325
+ type: Optional
326
+ }] }]; } });
327
327
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaWVuY2VDb250cm9sbGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hcGkvYXVkaWVuY2VDb250cm9sbGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRyxDQUFBLHVEQUF1RDtBQUUxRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBMkIsZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBYyxXQUFXLEVBQUUsVUFBVSxFQUNWLE1BQWdDLHNCQUFzQixDQUFDO0FBQ3pGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUE2QixZQUFZLENBQUM7QUFhL0UsT0FBTyxFQUFFLFNBQVMsRUFBc0IsTUFBMEIsY0FBYyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBMEMsa0JBQWtCLENBQUM7Ozs7QUFJckYsTUFBTSxPQUFPLHlCQUF5QjtJQU1sQyxZQUFzQixVQUFzQixFQUFnQyxRQUFnQixFQUFjLGFBQTRCO1FBQWhILGVBQVUsR0FBVixVQUFVLENBQVk7UUFKbEMsYUFBUSxHQUFHLG9DQUFvQyxDQUFDO1FBQ25ELG1CQUFjLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNuQyxrQkFBYSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7UUFHdkMsSUFBSSxRQUFRLEVBQUU7WUFDVixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztTQUM1QjtRQUNELElBQUksYUFBYSxFQUFFO1lBQ2YsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7WUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLElBQUksYUFBYSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ3ZFO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGNBQWMsQ0FBQyxRQUFrQjtRQUNyQyxNQUFNLElBQUksR0FBRyxxQkFBcUIsQ0FBQztRQUNu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Q0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM5RyxJQUFJLHdCQUF3QixJQUFJLFNBQVMsRUFBRTtZQUN2QyxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztTQUM3RDtRQUVELHVDQUF1QztRQUN2QyxNQUFNLFFBQVEsR0FBYTtZQUN2QixrQkFBa0I7U0FDckIsQ0FBQztRQUNGLE1BQU0sdUJBQXVCLEdBQXVCLElBQUksQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekcsSUFBSSx1QkFBdUIsSUFBSSxTQUFTLEVBQUU7WUFDdEMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLHVCQUF1QixDQUFDLENBQUM7U0FDbEU7UUFFRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUE2QixNQUFNLEVBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxrQ0FBa0MsRUFDaEg7WUFDSSxJQUFJLEVBQUUsSUFBSTtZQUNWLGVBQWUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWU7WUFDbkQsT0FBTyxFQUFFLE9BQU87WUFDaEIsT0FBTyxFQUFFLE9BQU87WUFDaEIsY0FBYyxFQUFFLGNBQWM7U0FDakMsQ0FDSixDQUFDO0lBQ04sQ0FBQzs7dUhBemRRLHlCQUF5Qiw0Q0FNK0IsU0FBUzsySEFOakUseUJBQXlCOzRGQUF6Qix5QkFBeUI7a0JBRHJDLFVBQVU7OzBCQU93QyxRQUFROzswQkFBRyxNQUFNOzJCQUFDLFNBQVM7OzBCQUFxQixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJbnRlbGxpYmlkIEFQSVxuICogQVBJIGRvY3VtZW50YXRpb24gZm9yIHRoZSBJbnRlbGxpYmlkIHBsYXRmb3JtXG4gKlxuICogT3BlbkFQSSBzcGVjIHZlcnNpb246IDEuMFxuICogXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc3dhZ2dlciBjb2RlIGdlbmVyYXRvciBwcm9ncmFtLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbi5naXRcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqLy8qIHRzbGludDpkaXNhYmxlOm5vLXVudXNlZC12YXJpYWJsZSBtZW1iZXItb3JkZXJpbmcgKi9cblxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9ICAgICAgICAgICAgICAgICAgICAgIGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMsXG4gICAgICAgICBIdHRwUmVzcG9uc2UsIEh0dHBFdmVudCB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQ3VzdG9tSHR0cFVybEVuY29kaW5nQ29kZWMgfSAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL2VuY29kZXInO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEF1ZGllbmNlUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbC9hdWRpZW5jZVJlc3BvbnNlJztcbmltcG9ydCB7IENyZWF0ZUJsb2NrZWRMaXZlQXVkaWVuY2VSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWwvY3JlYXRlQmxvY2tlZExpdmVBdWRpZW5jZVJlcXVlc3QnO1xuaW1wb3J0IHsgQ3JlYXRlQnVja2V0aXplZEN1c3RvbUF1ZGllbmNlUmVxdWVzdCB9IGZyb20gJy4uL21vZGVsL2NyZWF0ZUJ1Y2tldGl6ZWRDdXN0b21BdWRpZW5jZVJlcXVlc3QnO1xuaW1wb3J0IHsgQ3JlYXRlQnVja2V0aXplZExpdmVBdWRpZW5jZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbC9jcmVhdGVCdWNrZXRpemVkTGl2ZUF1ZGllbmNlUmVxdWVzdCc7XG5pbXBvcnQgeyBDcmVhdGVEc0N1c3RvbVF1ZXJ5QXVkaWVuY2VSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWwvY3JlYXRlRHNDdXN0b21RdWVyeUF1ZGllbmNlUmVxdWVzdCc7XG5pbXBvcnQgeyBVcGRhdGVBdWRpZW5jZU5hbWVSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWwvdXBkYXRlQXVkaWVuY2VOYW1lUmVxdWVzdCc7XG5pbXBvcnQgeyBVcGRhdGVEc0N1c3RvbVF1ZXJ5U3FsUmVxdWVzdCB9IGZyb20gJy4uL21vZGVsL3VwZGF0ZURzQ3VzdG9tUXVlcnlTcWxSZXF1ZXN0JztcbmltcG9ydCB7IFZhbGlkYXRlRHNRdWVyeVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbC92YWxpZGF0ZURzUXVlcnlSZXF1ZXN0JztcblxuaW1wb3J0IHsgQkFTRV9QQVRILCBDT0xMRUNUSU9OX0ZPUk1BVFMgfSAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vY29uZmlndXJhdGlvbic7XG5cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEF1ZGllbmNlQ29udHJvbGxlclNlcnZpY2Uge1xuXG4gICAgcHJvdGVjdGVkIGJhc2VQYXRoID0gJ2h0dHA6Ly9kZXYxLWludGVsbGliaWQtc3ZjLnJldnguaW8nO1xuICAgIHB1YmxpYyBkZWZhdWx0SGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xuICAgIHB1YmxpYyBjb25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKUBJbmplY3QoQkFTRV9QQVRIKSBiYXNlUGF0aDogc3RyaW5nLCBAT3B0aW9uYWwoKSBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uKSB7XG4gICAgICAgIGlmIChiYXNlUGF0aCkge1xuICAgICAgICAgICAgdGhpcy5iYXNlUGF0aCA9IGJhc2VQYXRoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uO1xuICAgICAgICAgICAgdGhpcy5iYXNlUGF0aCA9IGJhc2VQYXRoIHx8IGNvbmZpZ3VyYXRpb24uYmFzZVBhdGggfHwgdGhpcy5iYXNlUGF0aDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBjb25zdW1lcyBzdHJpbmdbXSBtaW1lLXR5cGVzXG4gICAgICogQHJldHVybiB0cnVlOiBjb25zdW1lcyBjb250YWlucyAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScsIGZhbHNlOiBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBwcml2YXRlIGNhbkNvbnN1bWVGb3JtKGNvbnN1bWVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBmb3JtID0gJ211bHRpcGFydC9mb3JtLWRhdGEnO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnN1bWUgb2YgY29uc3VtZXMpIHtcbiAgICAgICAgICAgIGlmIChmb3JtID09PSBjb25zdW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogXG4gICAgICogQHBhcmFtIGJvZHkgXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUJsb2NrZWRMaXZlQXVkaWVuY2UoYm9keTogQ3JlYXRlQmxvY2tlZExpdmVBdWRpZW5jZVJlcXVlc3QsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXVkaWVuY2VSZXNwb25zZT47XG4gICAgcHVibGljIGNyZWF0ZUJsb2NrZWRMaXZlQXVkaWVuY2UoYm9keTogQ3JlYXRlQmxvY2tlZExpdmVBdWRpZW5jZVJlcXVlc3QsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBdWRpZW5jZVJlc3BvbnNlPj47XG4gICAgcHVibGljIGNyZWF0ZUJsb2NrZWRMaXZlQXVkaWVuY2UoYm9keTogQ3JlYXRlQmxvY2tlZExpdmVBdWRpZW5jZVJlcXVlc3QsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXVkaWVuY2VSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBjcmVhdGVCbG9ja2VkTGl2ZUF1ZGllbmNlKGJvZHk6IENyZWF0ZUJsb2NrZWRMaXZlQXVkaWVuY2VSZXF1ZXN0LCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAoYm9keSA9PT0gbnVsbCB8fCBib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGJvZHkgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBjcmVhdGVCbG9ja2VkTGl2ZUF1ZGllbmNlLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJyovKidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgaWYgKGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEF1ZGllbmNlUmVzcG9uc2U+KCdwb3N0JyxgJHt0aGlzLmJhc2VQYXRofS9hcGkvYXVkaWVuY2VzL2xpdmUvYmxvY2tlZGAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYm9keTogYm9keSxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIFxuICAgICAqIEBwYXJhbSBib2R5IFxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVCdWNrZXRpemVkQ3VzdG9tKGJvZHk6IENyZWF0ZUJ1Y2tldGl6ZWRDdXN0b21BdWRpZW5jZVJlcXVlc3QsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXVkaWVuY2VSZXNwb25zZT47XG4gICAgcHVibGljIGNyZWF0ZUJ1Y2tldGl6ZWRDdXN0b20oYm9keTogQ3JlYXRlQnVja2V0aXplZEN1c3RvbUF1ZGllbmNlUmVxdWVzdCwgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEF1ZGllbmNlUmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgY3JlYXRlQnVja2V0aXplZEN1c3RvbShib2R5OiBDcmVhdGVCdWNrZXRpemVkQ3VzdG9tQXVkaWVuY2VSZXF1ZXN0LCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEF1ZGllbmNlUmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgY3JlYXRlQnVja2V0aXplZEN1c3RvbShib2R5OiBDcmVhdGVCdWNrZXRpemVkQ3VzdG9tQXVkaWVuY2VSZXF1ZXN0LCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAoYm9keSA9PT0gbnVsbCB8fCBib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGJvZHkgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBjcmVhdGVCdWNrZXRpemVkQ3VzdG9tLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJyovKidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgaWYgKGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEF1ZGllbmNlUmVzcG9uc2U+KCdwb3N0JyxgJHt0aGlzLmJhc2VQYXRofS9hcGkvYXVkaWVuY2VzL2N1c3RvbS9idWNrZXRpemVkYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5LFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogXG4gICAgICogQHBhcmFtIGJvZHkgXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUJ1Y2tldGl6ZWRMaXZlKGJvZHk6IENyZWF0ZUJ1Y2tldGl6ZWRMaXZlQXVkaWVuY2VSZXF1ZXN0LCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEF1ZGllbmNlUmVzcG9uc2U+O1xuICAgIHB1YmxpYyBjcmVhdGVCdWNrZXRpemVkTGl2ZShib2R5OiBDcmVhdGVCdWNrZXRpemVkTGl2ZUF1ZGllbmNlUmVxdWVzdCwgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEF1ZGllbmNlUmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgY3JlYXRlQnVja2V0aXplZExpdmUoYm9keTogQ3JlYXRlQnVja2V0aXplZExpdmVBdWRpZW5jZVJlcXVlc3QsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXVkaWVuY2VSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBjcmVhdGVCdWNrZXRpemVkTGl2ZShib2R5OiBDcmVhdGVCdWNrZXRpemVkTGl2ZUF1ZGllbmNlUmVxdWVzdCwgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGJvZHkgPT09IG51bGwgfHwgYm9keSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBib2R5IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgY3JlYXRlQnVja2V0aXplZExpdmUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnKi8qJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8QXVkaWVuY2VSZXNwb25zZT4oJ3Bvc3QnLGAke3RoaXMuYmFzZVBhdGh9L2FwaS9hdWRpZW5jZXMvbGl2ZS9idWNrZXRpemVkYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5LFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogXG4gICAgICogQHBhcmFtIGJvZHkgXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZURzQ3VzdG9tUXVlcnkoYm9keTogQ3JlYXRlRHNDdXN0b21RdWVyeUF1ZGllbmNlUmVxdWVzdCwgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxBdWRpZW5jZVJlc3BvbnNlPjtcbiAgICBwdWJsaWMgY3JlYXRlRHNDdXN0b21RdWVyeShib2R5OiBDcmVhdGVEc0N1c3RvbVF1ZXJ5QXVkaWVuY2VSZXF1ZXN0LCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXVkaWVuY2VSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBjcmVhdGVEc0N1c3RvbVF1ZXJ5KGJvZHk6IENyZWF0ZURzQ3VzdG9tUXVlcnlBdWRpZW5jZVJlcXVlc3QsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXVkaWVuY2VSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBjcmVhdGVEc0N1c3RvbVF1ZXJ5KGJvZHk6IENyZWF0ZURzQ3VzdG9tUXVlcnlBdWRpZW5jZVJlcXVlc3QsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSApOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGlmIChib2R5ID09PSBudWxsIHx8IGJvZHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgYm9keSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGNyZWF0ZURzQ3VzdG9tUXVlcnkuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnKi8qJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8QXVkaWVuY2VSZXNwb25zZT4oJ3Bvc3QnLGAke3RoaXMuYmFzZVBhdGh9L2FwaS9hdWRpZW5jZXMvY3VzdG9tL2RzLXF1ZXJ5YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5LFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogXG4gICAgICogQHBhcmFtIGFkdmVydGlzZXJJZCBcbiAgICAgKiBAcGFyYW0gZ3JvdXBUeXBlIFxuICAgICAqIEBwYXJhbSBzb3VyY2VQbGF0Zm9ybSBcbiAgICAgKiBAcGFyYW0gYXVkaWVuY2VUeXBlIFxuICAgICAqIEBwYXJhbSBhdWRpZW5jZVNvdXJjZSBcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QWxsQXVkaWVuY2VzKGFkdmVydGlzZXJJZDogbnVtYmVyLCBncm91cFR5cGU/OiBzdHJpbmcsIHNvdXJjZVBsYXRmb3JtPzogc3RyaW5nLCBhdWRpZW5jZVR5cGU/OiBzdHJpbmcsIGF1ZGllbmNlU291cmNlPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFycmF5PEF1ZGllbmNlUmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgZ2V0QWxsQXVkaWVuY2VzKGFkdmVydGlzZXJJZDogbnVtYmVyLCBncm91cFR5cGU/OiBzdHJpbmcsIHNvdXJjZVBsYXRmb3JtPzogc3RyaW5nLCBhdWRpZW5jZVR5cGU/OiBzdHJpbmcsIGF1ZGllbmNlU291cmNlPzogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXJyYXk8QXVkaWVuY2VSZXNwb25zZT4+PjtcbiAgICBwdWJsaWMgZ2V0QWxsQXVkaWVuY2VzKGFkdmVydGlzZXJJZDogbnVtYmVyLCBncm91cFR5cGU/OiBzdHJpbmcsIHNvdXJjZVBsYXRmb3JtPzogc3RyaW5nLCBhdWRpZW5jZVR5cGU/OiBzdHJpbmcsIGF1ZGllbmNlU291cmNlPzogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFycmF5PEF1ZGllbmNlUmVzcG9uc2U+Pj47XG4gICAgcHVibGljIGdldEFsbEF1ZGllbmNlcyhhZHZlcnRpc2VySWQ6IG51bWJlciwgZ3JvdXBUeXBlPzogc3RyaW5nLCBzb3VyY2VQbGF0Zm9ybT86IHN0cmluZywgYXVkaWVuY2VUeXBlPzogc3RyaW5nLCBhdWRpZW5jZVNvdXJjZT86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGFkdmVydGlzZXJJZCA9PT0gbnVsbCB8fCBhZHZlcnRpc2VySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgYWR2ZXJ0aXNlcklkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0QWxsQXVkaWVuY2VzLicpO1xuICAgICAgICB9XG5cblxuXG5cblxuICAgICAgICBsZXQgcXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IG5ldyBDdXN0b21IdHRwVXJsRW5jb2RpbmdDb2RlYygpfSk7XG4gICAgICAgIGlmIChncm91cFR5cGUgIT09IHVuZGVmaW5lZCAmJiBncm91cFR5cGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVycyA9IHF1ZXJ5UGFyYW1ldGVycy5zZXQoJ2dyb3VwVHlwZScsIDxhbnk+Z3JvdXBUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc291cmNlUGxhdGZvcm0gIT09IHVuZGVmaW5lZCAmJiBzb3VyY2VQbGF0Zm9ybSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLnNldCgnc291cmNlUGxhdGZvcm0nLCA8YW55PnNvdXJjZVBsYXRmb3JtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXVkaWVuY2VUeXBlICE9PSB1bmRlZmluZWQgJiYgYXVkaWVuY2VUeXBlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtZXRlcnMuc2V0KCdhdWRpZW5jZVR5cGUnLCA8YW55PmF1ZGllbmNlVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF1ZGllbmNlU291cmNlICE9PSB1bmRlZmluZWQgJiYgYXVkaWVuY2VTb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVycyA9IHF1ZXJ5UGFyYW1ldGVycy5zZXQoJ2F1ZGllbmNlU291cmNlJywgPGFueT5hdWRpZW5jZVNvdXJjZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnKi8qJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8QXJyYXk8QXVkaWVuY2VSZXNwb25zZT4+KCdnZXQnLGAke3RoaXMuYmFzZVBhdGh9L2FwaS9hdWRpZW5jZXMvYWR2ZXJ0aXNlci8ke2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoYWR2ZXJ0aXNlcklkKSl9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIFxuICAgICAqIEBwYXJhbSBncm91cElkIFxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRHcm91cFN0YXR1cyhncm91cElkOiBudW1iZXIsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXVkaWVuY2VSZXNwb25zZT47XG4gICAgcHVibGljIGdldEdyb3VwU3RhdHVzKGdyb3VwSWQ6IG51bWJlciwgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEF1ZGllbmNlUmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgZ2V0R3JvdXBTdGF0dXMoZ3JvdXBJZDogbnVtYmVyLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEF1ZGllbmNlUmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgZ2V0R3JvdXBTdGF0dXMoZ3JvdXBJZDogbnVtYmVyLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAoZ3JvdXBJZCA9PT0gbnVsbCB8fCBncm91cElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGdyb3VwSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRHcm91cFN0YXR1cy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICcqLyonXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxBdWRpZW5jZVJlc3BvbnNlPignZ2V0JyxgJHt0aGlzLmJhc2VQYXRofS9hcGkvYXVkaWVuY2VzL2dyb3Vwcy8ke2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoZ3JvdXBJZCkpfWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gYm9keSBcbiAgICAgKiBAcGFyYW0gZ3JvdXBJZCBcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlRHNDdXN0b21RdWVyeVNxbChib2R5OiBVcGRhdGVEc0N1c3RvbVF1ZXJ5U3FsUmVxdWVzdCwgZ3JvdXBJZDogbnVtYmVyLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEF1ZGllbmNlUmVzcG9uc2U+O1xuICAgIHB1YmxpYyB1cGRhdGVEc0N1c3RvbVF1ZXJ5U3FsKGJvZHk6IFVwZGF0ZURzQ3VzdG9tUXVlcnlTcWxSZXF1ZXN0LCBncm91cElkOiBudW1iZXIsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBdWRpZW5jZVJlc3BvbnNlPj47XG4gICAgcHVibGljIHVwZGF0ZURzQ3VzdG9tUXVlcnlTcWwoYm9keTogVXBkYXRlRHNDdXN0b21RdWVyeVNxbFJlcXVlc3QsIGdyb3VwSWQ6IG51bWJlciwgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBdWRpZW5jZVJlc3BvbnNlPj47XG4gICAgcHVibGljIHVwZGF0ZURzQ3VzdG9tUXVlcnlTcWwoYm9keTogVXBkYXRlRHNDdXN0b21RdWVyeVNxbFJlcXVlc3QsIGdyb3VwSWQ6IG51bWJlciwgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGJvZHkgPT09IG51bGwgfHwgYm9keSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBib2R5IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBkYXRlRHNDdXN0b21RdWVyeVNxbC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChncm91cElkID09PSBudWxsIHx8IGdyb3VwSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZ3JvdXBJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHVwZGF0ZURzQ3VzdG9tUXVlcnlTcWwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnKi8qJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8QXVkaWVuY2VSZXNwb25zZT4oJ3Bvc3QnLGAke3RoaXMuYmFzZVBhdGh9L2FwaS9hdWRpZW5jZXMvZ3JvdXBzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhncm91cElkKSl9L2N1c3RvbS9kcy1xdWVyeS9zcWxgLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGJvZHk6IGJvZHksXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gYm9keSBcbiAgICAgKiBAcGFyYW0gZ3JvdXBJZCBcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlTmFtZShib2R5OiBVcGRhdGVBdWRpZW5jZU5hbWVSZXF1ZXN0LCBncm91cElkOiBudW1iZXIsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXVkaWVuY2VSZXNwb25zZT47XG4gICAgcHVibGljIHVwZGF0ZU5hbWUoYm9keTogVXBkYXRlQXVkaWVuY2VOYW1lUmVxdWVzdCwgZ3JvdXBJZDogbnVtYmVyLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXVkaWVuY2VSZXNwb25zZT4+O1xuICAgIHB1YmxpYyB1cGRhdGVOYW1lKGJvZHk6IFVwZGF0ZUF1ZGllbmNlTmFtZVJlcXVlc3QsIGdyb3VwSWQ6IG51bWJlciwgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBdWRpZW5jZVJlc3BvbnNlPj47XG4gICAgcHVibGljIHVwZGF0ZU5hbWUoYm9keTogVXBkYXRlQXVkaWVuY2VOYW1lUmVxdWVzdCwgZ3JvdXBJZDogbnVtYmVyLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAoYm9keSA9PT0gbnVsbCB8fCBib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGJvZHkgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyB1cGRhdGVOYW1lLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGdyb3VwSWQgPT09IG51bGwgfHwgZ3JvdXBJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBncm91cElkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBkYXRlTmFtZS4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICcqLyonXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxBdWRpZW5jZVJlc3BvbnNlPigncG9zdCcsYCR7dGhpcy5iYXNlUGF0aH0vYXBpL2F1ZGllbmNlcy9ncm91cHMvJHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGdyb3VwSWQpKX0vbmFtZWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYm9keTogYm9keSxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIFxuICAgICAqIEBwYXJhbSBib2R5IFxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyB2YWxpZGF0ZURzUXVlcnkoYm9keTogVmFsaWRhdGVEc1F1ZXJ5UmVxdWVzdCwgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTx7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfT47XG4gICAgcHVibGljIHZhbGlkYXRlRHNRdWVyeShib2R5OiBWYWxpZGF0ZURzUXVlcnlSZXF1ZXN0LCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0+PjtcbiAgICBwdWJsaWMgdmFsaWRhdGVEc1F1ZXJ5KGJvZHk6IFZhbGlkYXRlRHNRdWVyeVJlcXVlc3QsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0+PjtcbiAgICBwdWJsaWMgdmFsaWRhdGVEc1F1ZXJ5KGJvZHk6IFZhbGlkYXRlRHNRdWVyeVJlcXVlc3QsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSApOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGlmIChib2R5ID09PSBudWxsIHx8IGJvZHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgYm9keSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHZhbGlkYXRlRHNRdWVyeS4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICcqLyonXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDx7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfT4oJ3Bvc3QnLGAke3RoaXMuYmFzZVBhdGh9L2FwaS9hdWRpZW5jZXMvdmFsaWRhdGUtZHMtcXVlcnlgLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGJvZHk6IGJvZHksXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbn1cbiJdfQ==