@revxui/api-clients-ts 1.1.469 → 1.1.471

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 (126) hide show
  1. package/README.md +2 -2
  2. package/api/advertiserController.service.d.ts +12 -0
  3. package/api/api.d.ts +1 -3
  4. package/esm2020/api/adminController.service.mjs +2 -2
  5. package/esm2020/api/advertiserController.service.mjs +27 -2
  6. package/esm2020/api/api.mjs +2 -4
  7. package/esm2020/api/appSettingsController.service.mjs +2 -2
  8. package/esm2020/api/appsFlyerController.service.mjs +2 -2
  9. package/esm2020/api/audienceController.service.mjs +2 -2
  10. package/esm2020/api/auditController.service.mjs +2 -2
  11. package/esm2020/api/bidFunnelController.service.mjs +2 -2
  12. package/esm2020/api/bulkStrategyController.service.mjs +2 -2
  13. package/esm2020/api/cSSThemeController_.service.mjs +2 -2
  14. package/esm2020/api/campaignController.service.mjs +2 -2
  15. package/esm2020/api/catalogController.service.mjs +2 -2
  16. package/esm2020/api/clickDestinationController.service.mjs +2 -2
  17. package/esm2020/api/creativeController.service.mjs +2 -2
  18. package/esm2020/api/creativeSetsController.service.mjs +2 -2
  19. package/esm2020/api/creativeTemplateThemesController.service.mjs +2 -2
  20. package/esm2020/api/creativeTemplateVariablesController.service.mjs +2 -2
  21. package/esm2020/api/creativeTemplatesController.service.mjs +2 -2
  22. package/esm2020/api/customerReportingController.service.mjs +2 -2
  23. package/esm2020/api/dashboardController.service.mjs +2 -2
  24. package/esm2020/api/experimentsController.service.mjs +2 -2
  25. package/esm2020/api/notificationsController.service.mjs +2 -2
  26. package/esm2020/api/pixelController.service.mjs +2 -2
  27. package/esm2020/api/reportController.service.mjs +2 -2
  28. package/esm2020/api/reportingController.service.mjs +2 -2
  29. package/esm2020/api/reportingSchedulerController.service.mjs +2 -2
  30. package/esm2020/api/safeguardController.service.mjs +2 -2
  31. package/esm2020/api/sliceXController.service.mjs +2 -2
  32. package/esm2020/api/strategyController.service.mjs +2 -2
  33. package/esm2020/api/strategyTemplateController.service.mjs +2 -2
  34. package/esm2020/api/uILoggerController.service.mjs +2 -2
  35. package/esm2020/api/userPreferenceController.service.mjs +2 -2
  36. package/esm2020/api.module.mjs +1 -4
  37. package/esm2020/model/apiResponseObjectApiListResponseBaseModel.mjs +2 -0
  38. package/esm2020/model/dynamicVideoTemplate.mjs +1 -1
  39. package/esm2020/model/models.mjs +2 -35
  40. package/esm2020/model/safeguardBlockedItemDTO.mjs +2 -5
  41. package/esm2020/model/safeguardDetail.mjs +3 -2
  42. package/esm2020/model/safeguardExclusionDTO.mjs +3 -2
  43. package/esm2020/model/safeguardRequestDTO.mjs +3 -2
  44. package/esm2020/model/safeguardResponseDTO.mjs +3 -2
  45. package/fesm2015/revxui-api-clients-ts.mjs +67 -561
  46. package/fesm2015/revxui-api-clients-ts.mjs.map +1 -1
  47. package/fesm2020/revxui-api-clients-ts.mjs +113 -773
  48. package/fesm2020/revxui-api-clients-ts.mjs.map +1 -1
  49. package/model/{apiResponseObjectDcoVideoSettingsDTO.d.ts → apiResponseObjectApiListResponseBaseModel.d.ts} +3 -3
  50. package/model/dynamicVideoTemplate.d.ts +0 -4
  51. package/model/models.d.ts +1 -34
  52. package/model/safeguardBlockedItemDTO.d.ts +2 -5
  53. package/model/safeguardDetail.d.ts +4 -1
  54. package/model/safeguardExclusionDTO.d.ts +2 -1
  55. package/model/safeguardRequestDTO.d.ts +3 -1
  56. package/model/safeguardResponseDTO.d.ts +3 -1
  57. package/package.json +1 -1
  58. package/api/dCOVideoSettingsController.service.d.ts +0 -190
  59. package/esm2020/api/dCOVideoSettingsController.service.mjs +0 -505
  60. package/esm2020/model/apiResponseObjectDcoVideoActivateResponse.mjs +0 -2
  61. package/esm2020/model/apiResponseObjectDcoVideoAssetUploadResponse.mjs +0 -2
  62. package/esm2020/model/apiResponseObjectDcoVideoDeleteResponse.mjs +0 -2
  63. package/esm2020/model/apiResponseObjectDcoVideoGenerateSampleResponse.mjs +0 -2
  64. package/esm2020/model/apiResponseObjectDcoVideoGeneratedCountResponse.mjs +0 -2
  65. package/esm2020/model/apiResponseObjectDcoVideoSettingsDTO.mjs +0 -2
  66. package/esm2020/model/apiResponseObjectListDcoVideoBrandGuidelineDTO.mjs +0 -2
  67. package/esm2020/model/apiResponseObjectListDcoVideoDimensionDTO.mjs +0 -2
  68. package/esm2020/model/apiResponseObjectListDcoVideoSettingsDTO.mjs +0 -2
  69. package/esm2020/model/apiResponseObjectListDcoVideoTemplateDTO.mjs +0 -2
  70. package/esm2020/model/apiResponseObjectListstring.mjs +0 -13
  71. package/esm2020/model/dcoVideoActivateRequest.mjs +0 -13
  72. package/esm2020/model/dcoVideoActivateResponse.mjs +0 -13
  73. package/esm2020/model/dcoVideoAssetDTO.mjs +0 -19
  74. package/esm2020/model/dcoVideoAssetUploadResponse.mjs +0 -2
  75. package/esm2020/model/dcoVideoBrandGuidelineDTO.mjs +0 -13
  76. package/esm2020/model/dcoVideoCatalogItemDTO.mjs +0 -13
  77. package/esm2020/model/dcoVideoDeleteResponse.mjs +0 -13
  78. package/esm2020/model/dcoVideoDimensionDTO.mjs +0 -13
  79. package/esm2020/model/dcoVideoGenerateSampleRequest.mjs +0 -2
  80. package/esm2020/model/dcoVideoGenerateSampleResponse.mjs +0 -2
  81. package/esm2020/model/dcoVideoGeneratedCountResponse.mjs +0 -13
  82. package/esm2020/model/dcoVideoSettingsCreateRequest.mjs +0 -2
  83. package/esm2020/model/dcoVideoSettingsDTO.mjs +0 -2
  84. package/esm2020/model/dcoVideoSettingsUpdateRequest.mjs +0 -2
  85. package/esm2020/model/dcoVideoTemplateDTO.mjs +0 -2
  86. package/esm2020/model/dcoVideoTemplateRequirementsDTO.mjs +0 -13
  87. package/esm2020/model/dcoVideoUploadedAssetDTO.mjs +0 -13
  88. package/esm2020/model/inputStream.mjs +0 -13
  89. package/esm2020/model/modelFile.mjs +0 -13
  90. package/esm2020/model/resource.mjs +0 -2
  91. package/esm2020/model/uRI.mjs +0 -13
  92. package/esm2020/model/uRL.mjs +0 -2
  93. package/esm2020/model/uRLStreamHandler.mjs +0 -13
  94. package/model/apiResponseObjectDcoVideoActivateResponse.d.ts +0 -17
  95. package/model/apiResponseObjectDcoVideoAssetUploadResponse.d.ts +0 -17
  96. package/model/apiResponseObjectDcoVideoDeleteResponse.d.ts +0 -17
  97. package/model/apiResponseObjectDcoVideoGenerateSampleResponse.d.ts +0 -17
  98. package/model/apiResponseObjectDcoVideoGeneratedCountResponse.d.ts +0 -17
  99. package/model/apiResponseObjectListDcoVideoBrandGuidelineDTO.d.ts +0 -17
  100. package/model/apiResponseObjectListDcoVideoDimensionDTO.d.ts +0 -17
  101. package/model/apiResponseObjectListDcoVideoSettingsDTO.d.ts +0 -17
  102. package/model/apiResponseObjectListDcoVideoTemplateDTO.d.ts +0 -17
  103. package/model/apiResponseObjectListstring.d.ts +0 -16
  104. package/model/dcoVideoActivateRequest.d.ts +0 -15
  105. package/model/dcoVideoActivateResponse.d.ts +0 -18
  106. package/model/dcoVideoAssetDTO.d.ts +0 -31
  107. package/model/dcoVideoAssetUploadResponse.d.ts +0 -17
  108. package/model/dcoVideoBrandGuidelineDTO.d.ts +0 -16
  109. package/model/dcoVideoCatalogItemDTO.d.ts +0 -16
  110. package/model/dcoVideoDeleteResponse.d.ts +0 -17
  111. package/model/dcoVideoDimensionDTO.d.ts +0 -15
  112. package/model/dcoVideoGenerateSampleRequest.d.ts +0 -20
  113. package/model/dcoVideoGenerateSampleResponse.d.ts +0 -29
  114. package/model/dcoVideoGeneratedCountResponse.d.ts +0 -24
  115. package/model/dcoVideoSettingsCreateRequest.d.ts +0 -20
  116. package/model/dcoVideoSettingsDTO.d.ts +0 -31
  117. package/model/dcoVideoSettingsUpdateRequest.d.ts +0 -19
  118. package/model/dcoVideoTemplateDTO.d.ts +0 -25
  119. package/model/dcoVideoTemplateRequirementsDTO.d.ts +0 -17
  120. package/model/dcoVideoUploadedAssetDTO.d.ts +0 -15
  121. package/model/inputStream.d.ts +0 -13
  122. package/model/modelFile.d.ts +0 -32
  123. package/model/resource.d.ts +0 -24
  124. package/model/uRI.d.ts +0 -30
  125. package/model/uRL.d.ts +0 -27
  126. package/model/uRLStreamHandler.d.ts +0 -13
@@ -1,505 +0,0 @@
1
- /**
2
- * Api Documentation
3
- * Api Documentation
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
- */
12
- /* tslint:disable:no-unused-variable member-ordering */
13
- import { Inject, Injectable, Optional } from '@angular/core';
14
- import { HttpHeaders, HttpParams } from '@angular/common/http';
15
- import { CustomHttpUrlEncodingCodec } from '../encoder';
16
- import { BASE_PATH } from '../variables';
17
- import { Configuration } from '../configuration';
18
- import * as i0 from "@angular/core";
19
- import * as i1 from "@angular/common/http";
20
- import * as i2 from "../configuration";
21
- export class DCOVideoSettingsControllerService {
22
- constructor(httpClient, basePath, configuration) {
23
- this.httpClient = httpClient;
24
- this.basePath = 'https://apiv2stage7.atomex.net';
25
- this.defaultHeaders = new HttpHeaders();
26
- this.configuration = new Configuration();
27
- if (basePath) {
28
- this.basePath = basePath;
29
- }
30
- if (configuration) {
31
- this.configuration = configuration;
32
- this.basePath = basePath || configuration.basePath || this.basePath;
33
- }
34
- }
35
- /**
36
- * @param consumes string[] mime-types
37
- * @return true: consumes contains 'multipart/form-data', false: otherwise
38
- */
39
- canConsumeForm(consumes) {
40
- const form = 'multipart/form-data';
41
- for (const consume of consumes) {
42
- if (form === consume) {
43
- return true;
44
- }
45
- }
46
- return false;
47
- }
48
- activateSettingsUsingPOST(request, reqId, token, observe = 'body', reportProgress = false) {
49
- if (request === null || request === undefined) {
50
- throw new Error('Required parameter request was null or undefined when calling activateSettingsUsingPOST.');
51
- }
52
- let headers = this.defaultHeaders;
53
- if (reqId !== undefined && reqId !== null) {
54
- headers = headers.set('reqId', String(reqId));
55
- }
56
- if (token !== undefined && token !== null) {
57
- headers = headers.set('token', String(token));
58
- }
59
- // to determine the Accept header
60
- let httpHeaderAccepts = [
61
- 'application/json'
62
- ];
63
- const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
64
- if (httpHeaderAcceptSelected != undefined) {
65
- headers = headers.set('Accept', httpHeaderAcceptSelected);
66
- }
67
- // to determine the Content-Type header
68
- const consumes = [
69
- 'application/json'
70
- ];
71
- const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
72
- if (httpContentTypeSelected != undefined) {
73
- headers = headers.set('Content-Type', httpContentTypeSelected);
74
- }
75
- return this.httpClient.post(`${this.basePath}/v2/api/dcovideo/settings/activate`, request, {
76
- withCredentials: this.configuration.withCredentials,
77
- headers: headers,
78
- observe: observe,
79
- reportProgress: reportProgress
80
- });
81
- }
82
- createSettingsUsingPOST(request, reqId, token, observe = 'body', reportProgress = false) {
83
- if (request === null || request === undefined) {
84
- throw new Error('Required parameter request was null or undefined when calling createSettingsUsingPOST.');
85
- }
86
- let headers = this.defaultHeaders;
87
- if (reqId !== undefined && reqId !== null) {
88
- headers = headers.set('reqId', String(reqId));
89
- }
90
- if (token !== undefined && token !== null) {
91
- headers = headers.set('token', String(token));
92
- }
93
- // to determine the Accept header
94
- let httpHeaderAccepts = [
95
- 'application/json'
96
- ];
97
- const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
98
- if (httpHeaderAcceptSelected != undefined) {
99
- headers = headers.set('Accept', httpHeaderAcceptSelected);
100
- }
101
- // to determine the Content-Type header
102
- const consumes = [
103
- 'application/json'
104
- ];
105
- const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
106
- if (httpContentTypeSelected != undefined) {
107
- headers = headers.set('Content-Type', httpContentTypeSelected);
108
- }
109
- return this.httpClient.post(`${this.basePath}/v2/api/dcovideo/settings`, request, {
110
- withCredentials: this.configuration.withCredentials,
111
- headers: headers,
112
- observe: observe,
113
- reportProgress: reportProgress
114
- });
115
- }
116
- deleteSettingsUsingPOST(id, reqId, token, observe = 'body', reportProgress = false) {
117
- if (id === null || id === undefined) {
118
- throw new Error('Required parameter id was null or undefined when calling deleteSettingsUsingPOST.');
119
- }
120
- let headers = this.defaultHeaders;
121
- if (reqId !== undefined && reqId !== null) {
122
- headers = headers.set('reqId', String(reqId));
123
- }
124
- if (token !== undefined && token !== null) {
125
- headers = headers.set('token', String(token));
126
- }
127
- // to determine the Accept header
128
- let httpHeaderAccepts = [
129
- 'application/json'
130
- ];
131
- const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
132
- if (httpHeaderAcceptSelected != undefined) {
133
- headers = headers.set('Accept', httpHeaderAcceptSelected);
134
- }
135
- // to determine the Content-Type header
136
- const consumes = [
137
- 'application/json'
138
- ];
139
- return this.httpClient.post(`${this.basePath}/v2/api/dcovideo/settings/${encodeURIComponent(String(id))}/archive`, null, {
140
- withCredentials: this.configuration.withCredentials,
141
- headers: headers,
142
- observe: observe,
143
- reportProgress: reportProgress
144
- });
145
- }
146
- generateSampleUsingPOST(request, reqId, token, observe = 'body', reportProgress = false) {
147
- if (request === null || request === undefined) {
148
- throw new Error('Required parameter request was null or undefined when calling generateSampleUsingPOST.');
149
- }
150
- let headers = this.defaultHeaders;
151
- if (reqId !== undefined && reqId !== null) {
152
- headers = headers.set('reqId', String(reqId));
153
- }
154
- if (token !== undefined && token !== null) {
155
- headers = headers.set('token', String(token));
156
- }
157
- // to determine the Accept header
158
- let httpHeaderAccepts = [
159
- 'application/json'
160
- ];
161
- const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
162
- if (httpHeaderAcceptSelected != undefined) {
163
- headers = headers.set('Accept', httpHeaderAcceptSelected);
164
- }
165
- // to determine the Content-Type header
166
- const consumes = [
167
- 'application/json'
168
- ];
169
- const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
170
- if (httpContentTypeSelected != undefined) {
171
- headers = headers.set('Content-Type', httpContentTypeSelected);
172
- }
173
- return this.httpClient.post(`${this.basePath}/v2/api/dcovideo/settings/generate-sample`, request, {
174
- withCredentials: this.configuration.withCredentials,
175
- headers: headers,
176
- observe: observe,
177
- reportProgress: reportProgress
178
- });
179
- }
180
- getBrandGuidelinesUsingGET(advertiserId, includeInactive, reqId, token, observe = 'body', reportProgress = false) {
181
- if (advertiserId === null || advertiserId === undefined) {
182
- throw new Error('Required parameter advertiserId was null or undefined when calling getBrandGuidelinesUsingGET.');
183
- }
184
- let queryParameters = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
185
- if (includeInactive !== undefined && includeInactive !== null) {
186
- queryParameters = queryParameters.set('includeInactive', includeInactive);
187
- }
188
- let headers = this.defaultHeaders;
189
- if (reqId !== undefined && reqId !== null) {
190
- headers = headers.set('reqId', String(reqId));
191
- }
192
- if (token !== undefined && token !== null) {
193
- headers = headers.set('token', String(token));
194
- }
195
- // to determine the Accept header
196
- let httpHeaderAccepts = [
197
- 'application/json'
198
- ];
199
- const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
200
- if (httpHeaderAcceptSelected != undefined) {
201
- headers = headers.set('Accept', httpHeaderAcceptSelected);
202
- }
203
- // to determine the Content-Type header
204
- const consumes = [];
205
- return this.httpClient.get(`${this.basePath}/v2/api/dcovideo/advertiser/${encodeURIComponent(String(advertiserId))}/brand-guidelines`, {
206
- params: queryParameters,
207
- withCredentials: this.configuration.withCredentials,
208
- headers: headers,
209
- observe: observe,
210
- reportProgress: reportProgress
211
- });
212
- }
213
- getDimensionsUsingGET(advertiserId, includeInactive, reqId, token, observe = 'body', reportProgress = false) {
214
- if (advertiserId === null || advertiserId === undefined) {
215
- throw new Error('Required parameter advertiserId was null or undefined when calling getDimensionsUsingGET.');
216
- }
217
- let queryParameters = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
218
- if (includeInactive !== undefined && includeInactive !== null) {
219
- queryParameters = queryParameters.set('includeInactive', includeInactive);
220
- }
221
- let headers = this.defaultHeaders;
222
- if (reqId !== undefined && reqId !== null) {
223
- headers = headers.set('reqId', String(reqId));
224
- }
225
- if (token !== undefined && token !== null) {
226
- headers = headers.set('token', String(token));
227
- }
228
- // to determine the Accept header
229
- let httpHeaderAccepts = [
230
- 'application/json'
231
- ];
232
- const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
233
- if (httpHeaderAcceptSelected != undefined) {
234
- headers = headers.set('Accept', httpHeaderAcceptSelected);
235
- }
236
- // to determine the Content-Type header
237
- const consumes = [];
238
- return this.httpClient.get(`${this.basePath}/v2/api/dcovideo/advertiser/${encodeURIComponent(String(advertiserId))}/dimensions`, {
239
- params: queryParameters,
240
- withCredentials: this.configuration.withCredentials,
241
- headers: headers,
242
- observe: observe,
243
- reportProgress: reportProgress
244
- });
245
- }
246
- getFeedKeysUsingGET(advertiserId, reqId, token, observe = 'body', reportProgress = false) {
247
- if (advertiserId === null || advertiserId === undefined) {
248
- throw new Error('Required parameter advertiserId was null or undefined when calling getFeedKeysUsingGET.');
249
- }
250
- let headers = this.defaultHeaders;
251
- if (reqId !== undefined && reqId !== null) {
252
- headers = headers.set('reqId', String(reqId));
253
- }
254
- if (token !== undefined && token !== null) {
255
- headers = headers.set('token', String(token));
256
- }
257
- // to determine the Accept header
258
- let httpHeaderAccepts = [
259
- 'application/json'
260
- ];
261
- const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
262
- if (httpHeaderAcceptSelected != undefined) {
263
- headers = headers.set('Accept', httpHeaderAcceptSelected);
264
- }
265
- // to determine the Content-Type header
266
- const consumes = [];
267
- return this.httpClient.get(`${this.basePath}/v2/api/dcovideo/advertiser/${encodeURIComponent(String(advertiserId))}/feed-keys`, {
268
- withCredentials: this.configuration.withCredentials,
269
- headers: headers,
270
- observe: observe,
271
- reportProgress: reportProgress
272
- });
273
- }
274
- getGeneratedVideoCountUsingGET(id, reqId, token, observe = 'body', reportProgress = false) {
275
- if (id === null || id === undefined) {
276
- throw new Error('Required parameter id was null or undefined when calling getGeneratedVideoCountUsingGET.');
277
- }
278
- let headers = this.defaultHeaders;
279
- if (reqId !== undefined && reqId !== null) {
280
- headers = headers.set('reqId', String(reqId));
281
- }
282
- if (token !== undefined && token !== null) {
283
- headers = headers.set('token', String(token));
284
- }
285
- // to determine the Accept header
286
- let httpHeaderAccepts = [
287
- 'application/json'
288
- ];
289
- const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
290
- if (httpHeaderAcceptSelected != undefined) {
291
- headers = headers.set('Accept', httpHeaderAcceptSelected);
292
- }
293
- // to determine the Content-Type header
294
- const consumes = [];
295
- return this.httpClient.get(`${this.basePath}/v2/api/dcovideo/settings/${encodeURIComponent(String(id))}/generated-video-count`, {
296
- withCredentials: this.configuration.withCredentials,
297
- headers: headers,
298
- observe: observe,
299
- reportProgress: reportProgress
300
- });
301
- }
302
- getSettingsUsingGET(advertiserId, includeInactive, reqId, token, observe = 'body', reportProgress = false) {
303
- if (advertiserId === null || advertiserId === undefined) {
304
- throw new Error('Required parameter advertiserId was null or undefined when calling getSettingsUsingGET.');
305
- }
306
- let queryParameters = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
307
- if (includeInactive !== undefined && includeInactive !== null) {
308
- queryParameters = queryParameters.set('includeInactive', includeInactive);
309
- }
310
- let headers = this.defaultHeaders;
311
- if (reqId !== undefined && reqId !== null) {
312
- headers = headers.set('reqId', String(reqId));
313
- }
314
- if (token !== undefined && token !== null) {
315
- headers = headers.set('token', String(token));
316
- }
317
- // to determine the Accept header
318
- let httpHeaderAccepts = [
319
- 'application/json'
320
- ];
321
- const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
322
- if (httpHeaderAcceptSelected != undefined) {
323
- headers = headers.set('Accept', httpHeaderAcceptSelected);
324
- }
325
- // to determine the Content-Type header
326
- const consumes = [];
327
- return this.httpClient.get(`${this.basePath}/v2/api/dcovideo/settings/${encodeURIComponent(String(advertiserId))}`, {
328
- params: queryParameters,
329
- withCredentials: this.configuration.withCredentials,
330
- headers: headers,
331
- observe: observe,
332
- reportProgress: reportProgress
333
- });
334
- }
335
- getTemplatesUsingGET(advertiserId, hasBackgroundImage, hasPromoBanner, hasPromoVideo, reqId, token, observe = 'body', reportProgress = false) {
336
- if (advertiserId === null || advertiserId === undefined) {
337
- throw new Error('Required parameter advertiserId was null or undefined when calling getTemplatesUsingGET.');
338
- }
339
- let queryParameters = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
340
- if (advertiserId !== undefined && advertiserId !== null) {
341
- queryParameters = queryParameters.set('advertiserId', advertiserId);
342
- }
343
- if (hasBackgroundImage !== undefined && hasBackgroundImage !== null) {
344
- queryParameters = queryParameters.set('hasBackgroundImage', hasBackgroundImage);
345
- }
346
- if (hasPromoBanner !== undefined && hasPromoBanner !== null) {
347
- queryParameters = queryParameters.set('hasPromoBanner', hasPromoBanner);
348
- }
349
- if (hasPromoVideo !== undefined && hasPromoVideo !== null) {
350
- queryParameters = queryParameters.set('hasPromoVideo', hasPromoVideo);
351
- }
352
- let headers = this.defaultHeaders;
353
- if (reqId !== undefined && reqId !== null) {
354
- headers = headers.set('reqId', String(reqId));
355
- }
356
- if (token !== undefined && token !== null) {
357
- headers = headers.set('token', String(token));
358
- }
359
- // to determine the Accept header
360
- let httpHeaderAccepts = [
361
- 'application/json'
362
- ];
363
- const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
364
- if (httpHeaderAcceptSelected != undefined) {
365
- headers = headers.set('Accept', httpHeaderAcceptSelected);
366
- }
367
- // to determine the Content-Type header
368
- const consumes = [];
369
- return this.httpClient.get(`${this.basePath}/v2/api/dcovideo/templates`, {
370
- params: queryParameters,
371
- withCredentials: this.configuration.withCredentials,
372
- headers: headers,
373
- observe: observe,
374
- reportProgress: reportProgress
375
- });
376
- }
377
- updateSettingsUsingPOST(id, request, regenerateSample, reqId, token, observe = 'body', reportProgress = false) {
378
- if (id === null || id === undefined) {
379
- throw new Error('Required parameter id was null or undefined when calling updateSettingsUsingPOST.');
380
- }
381
- if (request === null || request === undefined) {
382
- throw new Error('Required parameter request was null or undefined when calling updateSettingsUsingPOST.');
383
- }
384
- let queryParameters = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
385
- if (regenerateSample !== undefined && regenerateSample !== null) {
386
- queryParameters = queryParameters.set('regenerateSample', regenerateSample);
387
- }
388
- let headers = this.defaultHeaders;
389
- if (reqId !== undefined && reqId !== null) {
390
- headers = headers.set('reqId', String(reqId));
391
- }
392
- if (token !== undefined && token !== null) {
393
- headers = headers.set('token', String(token));
394
- }
395
- // to determine the Accept header
396
- let httpHeaderAccepts = [
397
- 'application/json'
398
- ];
399
- const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
400
- if (httpHeaderAcceptSelected != undefined) {
401
- headers = headers.set('Accept', httpHeaderAcceptSelected);
402
- }
403
- // to determine the Content-Type header
404
- const consumes = [
405
- 'application/json'
406
- ];
407
- const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
408
- if (httpContentTypeSelected != undefined) {
409
- headers = headers.set('Content-Type', httpContentTypeSelected);
410
- }
411
- return this.httpClient.post(`${this.basePath}/v2/api/dcovideo/settings/${encodeURIComponent(String(id))}`, request, {
412
- params: queryParameters,
413
- withCredentials: this.configuration.withCredentials,
414
- headers: headers,
415
- observe: observe,
416
- reportProgress: reportProgress
417
- });
418
- }
419
- uploadStagingAssetsUsingPOST(advertiserId, templateId, file_BACKGROUND_IMAGE, file_PROMO_BANNER, file_PROMO_MUSIC, file_PROMO_VIDEO, reqId, token, observe = 'body', reportProgress = false) {
420
- if (advertiserId === null || advertiserId === undefined) {
421
- throw new Error('Required parameter advertiserId was null or undefined when calling uploadStagingAssetsUsingPOST.');
422
- }
423
- if (templateId === null || templateId === undefined) {
424
- throw new Error('Required parameter templateId was null or undefined when calling uploadStagingAssetsUsingPOST.');
425
- }
426
- let headers = this.defaultHeaders;
427
- if (reqId !== undefined && reqId !== null) {
428
- headers = headers.set('reqId', String(reqId));
429
- }
430
- if (token !== undefined && token !== null) {
431
- headers = headers.set('token', String(token));
432
- }
433
- // to determine the Accept header
434
- let httpHeaderAccepts = [
435
- 'application/json'
436
- ];
437
- const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
438
- if (httpHeaderAcceptSelected != undefined) {
439
- headers = headers.set('Accept', httpHeaderAcceptSelected);
440
- }
441
- // to determine the Content-Type header
442
- const consumes = [
443
- 'multipart/form-data'
444
- ];
445
- const canConsumeForm = this.canConsumeForm(consumes);
446
- let formParams;
447
- let useForm = false;
448
- let convertFormParamsToString = false;
449
- // use FormData to transmit files using content-type "multipart/form-data"
450
- // see https://stackoverflow.com/questions/4007969/application-x-www-form-urlencoded-or-multipart-form-data
451
- useForm = canConsumeForm;
452
- // use FormData to transmit files using content-type "multipart/form-data"
453
- // see https://stackoverflow.com/questions/4007969/application-x-www-form-urlencoded-or-multipart-form-data
454
- useForm = canConsumeForm;
455
- // use FormData to transmit files using content-type "multipart/form-data"
456
- // see https://stackoverflow.com/questions/4007969/application-x-www-form-urlencoded-or-multipart-form-data
457
- useForm = canConsumeForm;
458
- // use FormData to transmit files using content-type "multipart/form-data"
459
- // see https://stackoverflow.com/questions/4007969/application-x-www-form-urlencoded-or-multipart-form-data
460
- useForm = canConsumeForm;
461
- if (useForm) {
462
- formParams = new FormData();
463
- }
464
- else {
465
- formParams = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
466
- }
467
- if (advertiserId !== undefined) {
468
- formParams = formParams.append('advertiserId', advertiserId) || formParams;
469
- }
470
- if (file_BACKGROUND_IMAGE !== undefined) {
471
- formParams = formParams.append('file_BACKGROUND_IMAGE', file_BACKGROUND_IMAGE) || formParams;
472
- }
473
- if (file_PROMO_BANNER !== undefined) {
474
- formParams = formParams.append('file_PROMO_BANNER', file_PROMO_BANNER) || formParams;
475
- }
476
- if (file_PROMO_MUSIC !== undefined) {
477
- formParams = formParams.append('file_PROMO_MUSIC', file_PROMO_MUSIC) || formParams;
478
- }
479
- if (file_PROMO_VIDEO !== undefined) {
480
- formParams = formParams.append('file_PROMO_VIDEO', file_PROMO_VIDEO) || formParams;
481
- }
482
- if (templateId !== undefined) {
483
- formParams = formParams.append('templateId', templateId) || formParams;
484
- }
485
- return this.httpClient.post(`${this.basePath}/v2/api/dcovideo/settings/assets/upload`, convertFormParamsToString ? formParams.toString() : formParams, {
486
- withCredentials: this.configuration.withCredentials,
487
- headers: headers,
488
- observe: observe,
489
- reportProgress: reportProgress
490
- });
491
- }
492
- }
493
- DCOVideoSettingsControllerService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DCOVideoSettingsControllerService, deps: [{ token: i1.HttpClient }, { token: BASE_PATH, optional: true }, { token: i2.Configuration, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
494
- DCOVideoSettingsControllerService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DCOVideoSettingsControllerService });
495
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DCOVideoSettingsControllerService, decorators: [{
496
- type: Injectable
497
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: undefined, decorators: [{
498
- type: Optional
499
- }, {
500
- type: Inject,
501
- args: [BASE_PATH]
502
- }] }, { type: i2.Configuration, decorators: [{
503
- type: Optional
504
- }] }]; } });
505
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZENPVmlkZW9TZXR0aW5nc0NvbnRyb2xsZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2FwaS9kQ09WaWRlb1NldHRpbmdzQ29udHJvbGxlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFDSCx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQTJCLGVBQWUsQ0FBQztBQUNsRixPQUFPLEVBQWMsV0FBVyxFQUFFLFVBQVUsRUFDVixNQUFnQyxzQkFBc0IsQ0FBQztBQUN6RixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBNkIsWUFBWSxDQUFDO0FBb0IvRSxPQUFPLEVBQUUsU0FBUyxFQUFzQixNQUEwQixjQUFjLENBQUM7QUFDakYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUEwQyxrQkFBa0IsQ0FBQzs7OztBQUlyRixNQUFNLE9BQU8saUNBQWlDO0lBTTFDLFlBQXNCLFVBQXNCLEVBQWdDLFFBQWdCLEVBQWMsYUFBNEI7UUFBaEgsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUpsQyxhQUFRLEdBQUcsZ0NBQWdDLENBQUM7UUFDL0MsbUJBQWMsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ25DLGtCQUFhLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUd2QyxJQUFJLFFBQVEsRUFBRTtZQUNWLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1NBQzVCO1FBQ0QsSUFBSSxhQUFhLEVBQUU7WUFDZixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztZQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsSUFBSSxhQUFhLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDdkU7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssY0FBYyxDQUFDLFFBQWtCO1FBQ3JDLE1BQU0sSUFBSSxHQUFH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a0JBQWtCLEVBQU8sZ0JBQWdCLENBQUMsSUFBSSxVQUFVLENBQUM7U0FDM0Y7UUFDRCxJQUFJLGdCQUFnQixLQUFLLFNBQVMsRUFBRTtZQUNoQyxVQUFVLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBTyxnQkFBZ0IsQ0FBQyxJQUFJLFVBQVUsQ0FBQztTQUMzRjtRQUNELElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtZQUMxQixVQUFVLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQU8sVUFBVSxDQUFDLElBQUksVUFBVSxDQUFDO1NBQy9FO1FBRUQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBK0MsR0FBRyxJQUFJLENBQUMsUUFBUSx5Q0FBeUMsRUFDL0gseUJBQXlCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUM5RDtZQUNJLGVBQWUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWU7WUFDbkQsT0FBTyxFQUFFLE9BQU87WUFDaEIsT0FBTyxFQUFFLE9BQU87WUFDaEIsY0FBYyxFQUFFLGNBQWM7U0FDakMsQ0FDSixDQUFDO0lBQ04sQ0FBQzs7K0hBOXdCUSxpQ0FBaUMsNENBTXVCLFNBQVM7bUlBTmpFLGlDQUFpQzs0RkFBakMsaUNBQWlDO2tCQUQ3QyxVQUFVOzswQkFPd0MsUUFBUTs7MEJBQUcsTUFBTTsyQkFBQyxTQUFTOzswQkFBcUIsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBpIERvY3VtZW50YXRpb25cbiAqIEFwaSBEb2N1bWVudGF0aW9uXG4gKlxuICogT3BlbkFQSSBzcGVjIHZlcnNpb246IDEuMFxuICogXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc3dhZ2dlciBjb2RlIGdlbmVyYXRvciBwcm9ncmFtLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbi5naXRcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuLyogdHNsaW50OmRpc2FibGU6bm8tdW51c2VkLXZhcmlhYmxlIG1lbWJlci1vcmRlcmluZyAqL1xuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gICAgICAgICAgICAgICAgICAgICAgZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcyxcbiAgICAgICAgIEh0dHBSZXNwb25zZSwgSHR0cEV2ZW50IH0gICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBDdXN0b21IdHRwVXJsRW5jb2RpbmdDb2RlYyB9ICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vZW5jb2Rlcic7XG5cbmltcG9ydCB7IE9ic2VydmFibGUgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQXBpUmVzcG9uc2VPYmplY3REY29WaWRlb0FjdGl2YXRlUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbC9hcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvQWN0aXZhdGVSZXNwb25zZSc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvQXNzZXRVcGxvYWRSZXNwb25zZSB9IGZyb20gJy4uL21vZGVsL2FwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9Bc3NldFVwbG9hZFJlc3BvbnNlJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9EZWxldGVSZXNwb25zZSB9IGZyb20gJy4uL21vZGVsL2FwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9EZWxldGVSZXNwb25zZSc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvR2VuZXJhdGVTYW1wbGVSZXNwb25zZSB9IGZyb20gJy4uL21vZGVsL2FwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9HZW5lcmF0ZVNhbXBsZVJlc3BvbnNlJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9HZW5lcmF0ZWRDb3VudFJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWwvYXBpUmVzcG9uc2VPYmplY3REY29WaWRlb0dlbmVyYXRlZENvdW50UmVzcG9uc2UnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VPYmplY3REY29WaWRlb1NldHRpbmdzRFRPIH0gZnJvbSAnLi4vbW9kZWwvYXBpUmVzcG9uc2VPYmplY3REY29WaWRlb1NldHRpbmdzRFRPJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlT2JqZWN0TGlzdERjb1ZpZGVvQnJhbmRHdWlkZWxpbmVEVE8gfSBmcm9tICcuLi9tb2RlbC9hcGlSZXNwb25zZU9iamVjdExpc3REY29WaWRlb0JyYW5kR3VpZGVsaW5lRFRPJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlT2JqZWN0TGlzdERjb1ZpZGVvRGltZW5zaW9uRFRPIH0gZnJvbSAnLi4vbW9kZWwvYXBpUmVzcG9uc2VPYmplY3RMaXN0RGNvVmlkZW9EaW1lbnNpb25EVE8nO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VPYmplY3RMaXN0RGNvVmlkZW9TZXR0aW5nc0RUTyB9IGZyb20gJy4uL21vZGVsL2FwaVJlc3BvbnNlT2JqZWN0TGlzdERjb1ZpZGVvU2V0dGluZ3NEVE8nO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VPYmplY3RMaXN0RGNvVmlkZW9UZW1wbGF0ZURUTyB9IGZyb20gJy4uL21vZGVsL2FwaVJlc3BvbnNlT2JqZWN0TGlzdERjb1ZpZGVvVGVtcGxhdGVEVE8nO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VPYmplY3RMaXN0c3RyaW5nIH0gZnJvbSAnLi4vbW9kZWwvYXBpUmVzcG9uc2VPYmplY3RMaXN0c3RyaW5nJztcbmltcG9ydCB7IERjb1ZpZGVvQWN0aXZhdGVSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWwvZGNvVmlkZW9BY3RpdmF0ZVJlcXVlc3QnO1xuaW1wb3J0IHsgRGNvVmlkZW9HZW5lcmF0ZVNhbXBsZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbC9kY29WaWRlb0dlbmVyYXRlU2FtcGxlUmVxdWVzdCc7XG5pbXBvcnQgeyBEY29WaWRlb1NldHRpbmdzQ3JlYXRlUmVxdWVzdCB9IGZyb20gJy4uL21vZGVsL2Rjb1ZpZGVvU2V0dGluZ3NDcmVhdGVSZXF1ZXN0JztcbmltcG9ydCB7IERjb1ZpZGVvU2V0dGluZ3NVcGRhdGVSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWwvZGNvVmlkZW9TZXR0aW5nc1VwZGF0ZVJlcXVlc3QnO1xuXG5pbXBvcnQgeyBCQVNFX1BBVEgsIENPTExFQ1RJT05fRk9STUFUUyB9ICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vdmFyaWFibGVzJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb24gfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICcuLi9jb25maWd1cmF0aW9uJztcblxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRENPVmlkZW9TZXR0aW5nc0NvbnRyb2xsZXJTZXJ2aWNlIHtcblxuICAgIHByb3RlY3RlZCBiYXNlUGF0aCA9ICdodHRwczovL2FwaXYyc3RhZ2U3LmF0b21leC5uZXQnO1xuICAgIHB1YmxpYyBkZWZhdWx0SGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xuICAgIHB1YmxpYyBjb25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKUBJbmplY3QoQkFTRV9QQVRIKSBiYXNlUGF0aDogc3RyaW5nLCBAT3B0aW9uYWwoKSBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uKSB7XG4gICAgICAgIGlmIChiYXNlUGF0aCkge1xuICAgICAgICAgICAgdGhpcy5iYXNlUGF0aCA9IGJhc2VQYXRoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uO1xuICAgICAgICAgICAgdGhpcy5iYXNlUGF0aCA9IGJhc2VQYXRoIHx8IGNvbmZpZ3VyYXRpb24uYmFzZVBhdGggfHwgdGhpcy5iYXNlUGF0aDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBjb25zdW1lcyBzdHJpbmdbXSBtaW1lLXR5cGVzXG4gICAgICogQHJldHVybiB0cnVlOiBjb25zdW1lcyBjb250YWlucyAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScsIGZhbHNlOiBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBwcml2YXRlIGNhbkNvbnN1bWVGb3JtKGNvbnN1bWVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBmb3JtID0gJ211bHRpcGFydC9mb3JtLWRhdGEnO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnN1bWUgb2YgY29uc3VtZXMpIHtcbiAgICAgICAgICAgIGlmIChmb3JtID09PSBjb25zdW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQWN0aXZhdGUgb3IgZGVhY3RpdmF0ZSBhIERDTyB2aWRlbyBzZXR0aW5ncyBjb25maWd1cmF0aW9uXG4gICAgICogXG4gICAgICogQHBhcmFtIHJlcXVlc3QgQWN0aXZhdGUvRGVhY3RpdmF0ZSByZXF1ZXN0XG4gICAgICogQHBhcmFtIHJlcUlkIHJlcXVlc3QgaWRcbiAgICAgKiBAcGFyYW0gdG9rZW4gQXV0aCBUb2tlblxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBhY3RpdmF0ZVNldHRpbmdzVXNpbmdQT1NUKHJlcXVlc3Q6IERjb1ZpZGVvQWN0aXZhdGVSZXF1ZXN0LCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXBpUmVzcG9uc2VPYmplY3REY29WaWRlb0FjdGl2YXRlUmVzcG9uc2U+O1xuICAgIHB1YmxpYyBhY3RpdmF0ZVNldHRpbmdzVXNpbmdQT1NUKHJlcXVlc3Q6IERjb1ZpZGVvQWN0aXZhdGVSZXF1ZXN0LCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvQWN0aXZhdGVSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBhY3RpdmF0ZVNldHRpbmdzVXNpbmdQT1NUKHJlcXVlc3Q6IERjb1ZpZGVvQWN0aXZhdGVSZXF1ZXN0LCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXBpUmVzcG9uc2VPYmplY3REY29WaWRlb0FjdGl2YXRlUmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgYWN0aXZhdGVTZXR0aW5nc1VzaW5nUE9TVChyZXF1ZXN0OiBEY29WaWRlb0FjdGl2YXRlUmVxdWVzdCwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAocmVxdWVzdCA9PT0gbnVsbCB8fCByZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHJlcXVlc3Qgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBhY3RpdmF0ZVNldHRpbmdzVXNpbmdQT1NULicpO1xuICAgICAgICB9XG5cblxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgaWYgKHJlcUlkICE9PSB1bmRlZmluZWQgJiYgcmVxSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgncmVxSWQnLCBTdHJpbmcocmVxSWQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4gIT09IHVuZGVmaW5lZCAmJiB0b2tlbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCd0b2tlbicsIFN0cmluZyh0b2tlbikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgaWYgKGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9BY3RpdmF0ZVJlc3BvbnNlPihgJHt0aGlzLmJhc2VQYXRofS92Mi9hcGkvZGNvdmlkZW8vc2V0dGluZ3MvYWN0aXZhdGVgLFxuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBEQ08gdmlkZW8gc2V0dGluZ3MgY29uZmlndXJhdGlvblxuICAgICAqIEpTT04gYm9keS4gJiN4NjA7c2FtcGxlVmlkZW9VcmwmI3g2MDsgaXMgcmVxdWlyZWQgKGZyb20gUE9TVCAvc2V0dGluZ3MvZ2VuZXJhdGUtc2FtcGxlKS4gJiN4NjA7YXNzZXRzW10mI3g2MDsgc2hvdWxkIGNhcnJ5IENETiBVUkxzIGZyb20gUE9TVCAvc2V0dGluZ3MvYXNzZXRzL3VwbG9hZCAoaW5jbHVkZSAmI3g2MDt7IFxcJnF1b3Q7dHlwZVxcJnF1b3Q7OiBcXCZxdW90O1BST01PX01VU0lDXFwmcXVvdDssIFxcJnF1b3Q7dXJsXFwmcXVvdDs6IFxcJnF1b3Q7Li4uXFwmcXVvdDsgfSYjeDYwOyB3aGVuIHRoZSB0ZW1wbGF0ZSByZXF1aXJlcyBtdXNpYykuXG4gICAgICogQHBhcmFtIHJlcXVlc3QgRENPIFZpZGVvIFNldHRpbmdzIGNyZWF0aW9uIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gcmVxSWQgcmVxdWVzdCBpZFxuICAgICAqIEBwYXJhbSB0b2tlbiBBdXRoIFRva2VuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVNldHRpbmdzVXNpbmdQT1NUKHJlcXVlc3Q6IERjb1ZpZGVvU2V0dGluZ3NDcmVhdGVSZXF1ZXN0LCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXBpUmVzcG9uc2VPYmplY3REY29WaWRlb1NldHRpbmdzRFRPPjtcbiAgICBwdWJsaWMgY3JlYXRlU2V0dGluZ3NVc2luZ1BPU1QocmVxdWVzdDogRGNvVmlkZW9TZXR0aW5nc0NyZWF0ZVJlcXVlc3QsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9TZXR0aW5nc0RUTz4+O1xuICAgIHB1YmxpYyBjcmVhdGVTZXR0aW5nc1VzaW5nUE9TVChyZXF1ZXN0OiBEY29WaWRlb1NldHRpbmdzQ3JlYXRlUmVxdWVzdCwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9TZXR0aW5nc0RUTz4+O1xuICAgIHB1YmxpYyBjcmVhdGVTZXR0aW5nc1VzaW5nUE9TVChyZXF1ZXN0OiBEY29WaWRlb1NldHRpbmdzQ3JlYXRlUmVxdWVzdCwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAocmVxdWVzdCA9PT0gbnVsbCB8fCByZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHJlcXVlc3Qgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBjcmVhdGVTZXR0aW5nc1VzaW5nUE9TVC4nKTtcbiAgICAgICAgfVxuXG5cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIGlmIChyZXFJZCAhPT0gdW5kZWZpbmVkICYmIHJlcUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3JlcUlkJywgU3RyaW5nKHJlcUlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQgJiYgdG9rZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgndG9rZW4nLCBTdHJpbmcodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvU2V0dGluZ3NEVE8+KGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9kY292aWRlby9zZXR0aW5nc2AsXG4gICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXJjaGl2ZSAoc29mdC1kZWxldGUpIGEgRENPIHZpZGVvIHNldHRpbmdzIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBQT1NUIChDT1JTLXNhZmUpLiBNYXJrcyB0aGUgY29uZmlndXJhdGlvbiBhcyBhcmNoaXZlZCBhbmQgaW5hY3RpdmUuIFRoZSBkYXRhYmFzZSByb3cgYW5kIGFzc2V0cyBhcmUgcmV0YWluZWQgYnV0IHRoZSBjb25maWd1cmF0aW9uIGlzIGV4Y2x1ZGVkIGZyb20gVUkgbGlzdCBBUElzLiBJZGVtcG90ZW50IGlmIGFscmVhZHkgYXJjaGl2ZWQuXG4gICAgICogQHBhcmFtIGlkIFNldHRpbmdzIGNvbmZpZ3VyYXRpb24gSURcbiAgICAgKiBAcGFyYW0gcmVxSWQgcmVxdWVzdCBpZFxuICAgICAqIEBwYXJhbSB0b2tlbiBBdXRoIFRva2VuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZVNldHRpbmdzVXNpbmdQT1NUKGlkOiBudW1iZXIsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvRGVsZXRlUmVzcG9uc2U+O1xuICAgIHB1YmxpYyBkZWxldGVTZXR0aW5nc1VzaW5nUE9TVChpZDogbnVtYmVyLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvRGVsZXRlUmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgZGVsZXRlU2V0dGluZ3NVc2luZ1BPU1QoaWQ6IG51bWJlciwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9EZWxldGVSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBkZWxldGVTZXR0aW5nc1VzaW5nUE9TVChpZDogbnVtYmVyLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSApOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGlmIChpZCA9PT0gbnVsbCB8fCBpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBpZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGRlbGV0ZVNldHRpbmdzVXNpbmdQT1NULicpO1xuICAgICAgICB9XG5cblxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgaWYgKHJlcUlkICE9PSB1bmRlZmluZWQgJiYgcmVxSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgncmVxSWQnLCBTdHJpbmcocmVxSWQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4gIT09IHVuZGVmaW5lZCAmJiB0b2tlbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCd0b2tlbicsIFN0cmluZyh0b2tlbikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgaWYgKGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBvc3Q8QXBpUmVzcG9uc2VPYmplY3REY29WaWRlb0RlbGV0ZVJlc3BvbnNlPihgJHt0aGlzLmJhc2VQYXRofS92Mi9hcGkvZGNvdmlkZW8vc2V0dGluZ3MvJHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGlkKSl9L2FyY2hpdmVgLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIGEgc2FtcGxlIHZpZGVvIHByZXZpZXcgZnJvbSBhc3NldCBVUkxzXG4gICAgICogSlNPTiBib2R5LiBQYXNzICYjeDYwO2Fzc2V0c1tdJiN4NjA7IHdpdGggQ0ROIFVSTHMgKGZyb20gUE9TVCAvc2V0dGluZ3MvYXNzZXRzL3VwbG9hZCksIGluY2x1ZGluZyAmI3g2MDtQUk9NT19NVVNJQyYjeDYwOyB3aGVuIHJlcXVpcmVkLiBPbWl0ICYjeDYwO3NldHRpbmdzSWQmI3g2MDsgZm9yIGNyZWF0ZS1wcmV2aWV3OyBzZXQgJiN4NjA7c2V0dGluZ3NJZCYjeDYwOyB0byBtZXJnZSB3aXRoIHN0b3JlZCBhc3NldHMgZm9yIGVkaXQuIFJlc3BvbnNlICYjeDYwO2Fzc2V0cyYjeDYwOyBtYXAgaW5jbHVkZXMgJiN4NjA7UFJPTU9fTVVTSUMmI3g2MDsgd2hlbiBtdXNpYyBpcyBzZXQuIFJldHVybnMgYSBzeW50aGV0aWMgJiN4NjA7c2FtcGxlVmlkZW9VcmwmI3g2MDsgKG5vIGV4dGVybmFsIHJlbmRlciBlbmdpbmUpLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IEdlbmVyYXRlIHNhbXBsZSByZXF1ZXN0XG4gICAgICogQHBhcmFtIHJlcUlkIHJlcXVlc3QgaWRcbiAgICAgKiBAcGFyYW0gdG9rZW4gQXV0aCBUb2tlblxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZW5lcmF0ZVNhbXBsZVVzaW5nUE9TVChyZXF1ZXN0OiBEY29WaWRlb0dlbmVyYXRlU2FtcGxlUmVxdWVzdCwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9HZW5lcmF0ZVNhbXBsZVJlc3BvbnNlPjtcbiAgICBwdWJsaWMgZ2VuZXJhdGVTYW1wbGVVc2luZ1BPU1QocmVxdWVzdDogRGNvVmlkZW9HZW5lcmF0ZVNhbXBsZVJlcXVlc3QsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9HZW5lcmF0ZVNhbXBsZVJlc3BvbnNlPj47XG4gICAgcHVibGljIGdlbmVyYXRlU2FtcGxlVXNpbmdQT1NUKHJlcXVlc3Q6IERjb1ZpZGVvR2VuZXJhdGVTYW1wbGVSZXF1ZXN0LCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXBpUmVzcG9uc2VPYmplY3REY29WaWRlb0dlbmVyYXRlU2FtcGxlUmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgZ2VuZXJhdGVTYW1wbGVVc2luZ1BPU1QocmVxdWVzdDogRGNvVmlkZW9HZW5lcmF0ZVNhbXBsZVJlcXVlc3QsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKHJlcXVlc3QgPT09IG51bGwgfHwgcmVxdWVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciByZXF1ZXN0IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2VuZXJhdGVTYW1wbGVVc2luZ1BPU1QuJyk7XG4gICAgICAgIH1cblxuXG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuICAgICAgICBpZiAocmVxSWQgIT09IHVuZGVmaW5lZCAmJiByZXFJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdyZXFJZCcsIFN0cmluZyhyZXFJZCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbiAhPT0gdW5kZWZpbmVkICYmIHRva2VuICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3Rva2VuJywgU3RyaW5nKHRva2VuKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBvc3Q8QXBpUmVzcG9uc2VPYmplY3REY29WaWRlb0dlbmVyYXRlU2FtcGxlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9kY292aWRlby9zZXR0aW5ncy9nZW5lcmF0ZS1zYW1wbGVgLFxuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgYnJhbmQgZ3VpZGVsaW5lcyBmb3IgYSBnaXZlbiBhZHZlcnRpc2VyXG4gICAgICogXG4gICAgICogQHBhcmFtIGFkdmVydGlzZXJJZCBBZHZlcnRpc2VyIElEXG4gICAgICogQHBhcmFtIGluY2x1ZGVJbmFjdGl2ZSBJbmNsdWRlIGluYWN0aXZlIGJyYW5kIGd1aWRlbGluZXMgKGN1cnJlbnRseSBhIG5vLW9wOiBBZHZlcnRpc2VyTGF5b3V0VmFyaWFibGVzIGhhcyBubyBpc19hY3RpdmUgY29sdW1uOyByZXNlcnZlZCBmb3IgZm9yd2FyZCBjb21wYXRpYmlsaXR5KVxuICAgICAqIEBwYXJhbSByZXFJZCByZXF1ZXN0IGlkXG4gICAgICogQHBhcmFtIHRva2VuIEF1dGggVG9rZW5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QnJhbmRHdWlkZWxpbmVzVXNpbmdHRVQoYWR2ZXJ0aXNlcklkOiBudW1iZXIsIGluY2x1ZGVJbmFjdGl2ZT86IGJvb2xlYW4sIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxBcGlSZXNwb25zZU9iamVjdExpc3REY29WaWRlb0JyYW5kR3VpZGVsaW5lRFRPPjtcbiAgICBwdWJsaWMgZ2V0QnJhbmRHdWlkZWxpbmVzVXNpbmdHRVQoYWR2ZXJ0aXNlcklkOiBudW1iZXIsIGluY2x1ZGVJbmFjdGl2ZT86IGJvb2xlYW4sIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEFwaVJlc3BvbnNlT2JqZWN0TGlzdERjb1ZpZGVvQnJhbmRHdWlkZWxpbmVEVE8+PjtcbiAgICBwdWJsaWMgZ2V0QnJhbmRHdWlkZWxpbmVzVXNpbmdHRVQoYWR2ZXJ0aXNlcklkOiBudW1iZXIsIGluY2x1ZGVJbmFjdGl2ZT86IGJvb2xlYW4sIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcGlSZXNwb25zZU9iamVjdExpc3REY29WaWRlb0JyYW5kR3VpZGVsaW5lRFRPPj47XG4gICAgcHVibGljIGdldEJyYW5kR3VpZGVsaW5lc1VzaW5nR0VUKGFkdmVydGlzZXJJZDogbnVtYmVyLCBpbmNsdWRlSW5hY3RpdmU/OiBib29sZWFuLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSApOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGlmIChhZHZlcnRpc2VySWQgPT09IG51bGwgfHwgYWR2ZXJ0aXNlcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGFkdmVydGlzZXJJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldEJyYW5kR3VpZGVsaW5lc1VzaW5nR0VULicpO1xuICAgICAgICB9XG5cblxuXG5cbiAgICAgICAgbGV0IHF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiBuZXcgQ3VzdG9tSHR0cFVybEVuY29kaW5nQ29kZWMoKX0pO1xuICAgICAgICBpZiAoaW5jbHVkZUluYWN0aXZlICE9PSB1bmRlZmluZWQgJiYgaW5jbHVkZUluYWN0aXZlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtZXRlcnMuc2V0KCdpbmNsdWRlSW5hY3RpdmUnLCA8YW55PmluY2x1ZGVJbmFjdGl2ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIGlmIChyZXFJZCAhPT0gdW5kZWZpbmVkICYmIHJlcUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3JlcUlkJywgU3RyaW5nKHJlcUlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQgJiYgdG9rZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgndG9rZW4nLCBTdHJpbmcodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PEFwaVJlc3BvbnNlT2JqZWN0TGlzdERjb1ZpZGVvQnJhbmRHdWlkZWxpbmVEVE8+KGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9kY292aWRlby9hZHZlcnRpc2VyLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhhZHZlcnRpc2VySWQpKX0vYnJhbmQtZ3VpZGVsaW5lc2AsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGFyYW1zOiBxdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIHVuaXF1ZSB2aWRlbyBkaW1lbnNpb25zIHJlYWNoYWJsZSBmb3IgYW4gYWR2ZXJ0aXNlclxuICAgICAqIFdhbGtzIHRoZSBhZHZlcnRpc2VyJiMzOTtzIERDTyB2aWRlbyBzZXR0aW5ncywgY29sbGVjdHMgdGhlIHRlbXBsYXRlcyB0aGV5IHJlZmVyZW5jZSwgYW5kIHJldHVybnMgdGhlIGRlLWR1cGxpY2F0ZWQgc2V0IG9mIHt3aWR0aCwgaGVpZ2h0fSBwYWlycyB0aG9zZSB0ZW1wbGF0ZXMgcHJvZHVjZS4gVXNlZnVsIGZvciBwb3B1bGF0aW5nIHNpemUtZmlsdGVyIFVJcyB3aXRob3V0IGFuIGV4dHJhIHJvdW5kLXRyaXAgdGhyb3VnaCBHRVQgL3NldHRpbmdzICsgR0VUIC90ZW1wbGF0ZXMuXG4gICAgICogQHBhcmFtIGFkdmVydGlzZXJJZCBBZHZlcnRpc2VyIElEXG4gICAgICogQHBhcmFtIGluY2x1ZGVJbmFjdGl2ZSBJbmNsdWRlIGRpbWVuc2lvbnMgcmVhY2hhYmxlIHZpYSBpbmFjdGl2ZSBzZXR0aW5nc1xuICAgICAqIEBwYXJhbSByZXFJZCByZXF1ZXN0IGlkXG4gICAgICogQHBhcmFtIHRva2VuIEF1dGggVG9rZW5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RGltZW5zaW9uc1VzaW5nR0VUKGFkdmVydGlzZXJJZDogbnVtYmVyLCBpbmNsdWRlSW5hY3RpdmU/OiBib29sZWFuLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXBpUmVzcG9uc2VPYmplY3RMaXN0RGNvVmlkZW9EaW1lbnNpb25EVE8+O1xuICAgIHB1YmxpYyBnZXREaW1lbnNpb25zVXNpbmdHRVQoYWR2ZXJ0aXNlcklkOiBudW1iZXIsIGluY2x1ZGVJbmFjdGl2ZT86IGJvb2xlYW4sIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEFwaVJlc3BvbnNlT2JqZWN0TGlzdERjb1ZpZGVvRGltZW5zaW9uRFRPPj47XG4gICAgcHVibGljIGdldERpbWVuc2lvbnNVc2luZ0dFVChhZHZlcnRpc2VySWQ6IG51bWJlciwgaW5jbHVkZUluYWN0aXZlPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0TGlzdERjb1ZpZGVvRGltZW5zaW9uRFRPPj47XG4gICAgcHVibGljIGdldERpbWVuc2lvbnNVc2luZ0dFVChhZHZlcnRpc2VySWQ6IG51bWJlciwgaW5jbHVkZUluYWN0aXZlPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAoYWR2ZXJ0aXNlcklkID09PSBudWxsIHx8IGFkdmVydGlzZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBhZHZlcnRpc2VySWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXREaW1lbnNpb25zVXNpbmdHRVQuJyk7XG4gICAgICAgIH1cblxuXG5cblxuICAgICAgICBsZXQgcXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IG5ldyBDdXN0b21IdHRwVXJsRW5jb2RpbmdDb2RlYygpfSk7XG4gICAgICAgIGlmIChpbmNsdWRlSW5hY3RpdmUgIT09IHVuZGVmaW5lZCAmJiBpbmNsdWRlSW5hY3RpdmUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVycyA9IHF1ZXJ5UGFyYW1ldGVycy5zZXQoJ2luY2x1ZGVJbmFjdGl2ZScsIDxhbnk+aW5jbHVkZUluYWN0aXZlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgaWYgKHJlcUlkICE9PSB1bmRlZmluZWQgJiYgcmVxSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgncmVxSWQnLCBTdHJpbmcocmVxSWQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4gIT09IHVuZGVmaW5lZCAmJiB0b2tlbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCd0b2tlbicsIFN0cmluZyh0b2tlbikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgaWYgKGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8QXBpUmVzcG9uc2VPYmplY3RMaXN0RGNvVmlkZW9EaW1lbnNpb25EVE8+KGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9kY292aWRlby9hZHZlcnRpc2VyLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhhZHZlcnRpc2VySWQpKX0vZGltZW5zaW9uc2AsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGFyYW1zOiBxdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIGRpc3RpbmN0IGFjdGl2ZSBmZWVkIGtleXMgZm9yIGEgZ2l2ZW4gYWR2ZXJ0aXNlclxuICAgICAqIFxuICAgICAqIEBwYXJhbSBhZHZlcnRpc2VySWQgQWR2ZXJ0aXNlciBJRFxuICAgICAqIEBwYXJhbSByZXFJZCByZXF1ZXN0IGlkXG4gICAgICogQHBhcmFtIHRva2VuIEF1dGggVG9rZW5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RmVlZEtleXNVc2luZ0dFVChhZHZlcnRpc2VySWQ6IG51bWJlciwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlT2JqZWN0TGlzdHN0cmluZz47XG4gICAgcHVibGljIGdldEZlZWRLZXlzVXNpbmdHRVQoYWR2ZXJ0aXNlcklkOiBudW1iZXIsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEFwaVJlc3BvbnNlT2JqZWN0TGlzdHN0cmluZz4+O1xuICAgIHB1YmxpYyBnZXRGZWVkS2V5c1VzaW5nR0VUKGFkdmVydGlzZXJJZDogbnVtYmVyLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXBpUmVzcG9uc2VPYmplY3RMaXN0c3RyaW5nPj47XG4gICAgcHVibGljIGdldEZlZWRLZXlzVXNpbmdHRVQoYWR2ZXJ0aXNlcklkOiBudW1iZXIsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGFkdmVydGlzZXJJZCA9PT0gbnVsbCB8fCBhZHZlcnRpc2VySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgYWR2ZXJ0aXNlcklkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0RmVlZEtleXNVc2luZ0dFVC4nKTtcbiAgICAgICAgfVxuXG5cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIGlmIChyZXFJZCAhPT0gdW5kZWZpbmVkICYmIHJlcUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3JlcUlkJywgU3RyaW5nKHJlcUlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQgJiYgdG9rZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgndG9rZW4nLCBTdHJpbmcodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PEFwaVJlc3BvbnNlT2JqZWN0TGlzdHN0cmluZz4oYCR7dGhpcy5iYXNlUGF0aH0vdjIvYXBpL2Rjb3ZpZGVvL2FkdmVydGlzZXIvJHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGFkdmVydGlzZXJJZCkpfS9mZWVkLWtleXNgLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGdlbmVyYXRlZCB2aWRlbyBjb3VudCBmb3IgYSBEQ08gdmlkZW8gc2V0dGluZ3MgY29uZmlndXJhdGlvblxuICAgICAqIFxuICAgICAqIEBwYXJhbSBpZCBTZXR0aW5ncyBjb25maWd1cmF0aW9uIElEXG4gICAgICogQHBhcmFtIHJlcUlkIHJlcXVlc3QgaWRcbiAgICAgKiBAcGFyYW0gdG9rZW4gQXV0aCBUb2tlblxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRHZW5lcmF0ZWRWaWRlb0NvdW50VXNpbmdHRVQoaWQ6IG51bWJlciwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9HZW5lcmF0ZWRDb3VudFJlc3BvbnNlPjtcbiAgICBwdWJsaWMgZ2V0R2VuZXJhdGVkVmlkZW9Db3VudFVzaW5nR0VUKGlkOiBudW1iZXIsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9HZW5lcmF0ZWRDb3VudFJlc3BvbnNlPj47XG4gICAgcHVibGljIGdldEdlbmVyYXRlZFZpZGVvQ291bnRVc2luZ0dFVChpZDogbnVtYmVyLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXBpUmVzcG9uc2VPYmplY3REY29WaWRlb0dlbmVyYXRlZENvdW50UmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgZ2V0R2VuZXJhdGVkVmlkZW9Db3VudFVzaW5nR0VUKGlkOiBudW1iZXIsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGlkID09PSBudWxsIHx8IGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGlkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0R2VuZXJhdGVkVmlkZW9Db3VudFVzaW5nR0VULicpO1xuICAgICAgICB9XG5cblxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgaWYgKHJlcUlkICE9PSB1bmRlZmluZWQgJiYgcmVxSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgncmVxSWQnLCBTdHJpbmcocmVxSWQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4gIT09IHVuZGVmaW5lZCAmJiB0b2tlbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCd0b2tlbicsIFN0cmluZyh0b2tlbikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgaWYgKGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8QXBpUmVzcG9uc2VPYmplY3REY29WaWRlb0dlbmVyYXRlZENvdW50UmVzcG9uc2U+KGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9kY292aWRlby9zZXR0aW5ncy8ke2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoaWQpKX0vZ2VuZXJhdGVkLXZpZGVvLWNvdW50YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgRENPIHZpZGVvIHNldHRpbmdzIGZvciBhbiBhZHZlcnRpc2VyXG4gICAgICogQXNzZXRzIGFyZSBhbHdheXMgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlLiBCYWNrZ3JvdW5kIG11c2ljIGlzIHJldHVybmVkIGluICYjeDYwO2Fzc2V0c1tdJiN4NjA7IGFzICYjeDYwO3R5cGUmI3gzRDtQUk9NT19NVVNJQyYjeDYwOy4gUm93cyB3aXRoIG5vIGFzc29jaWF0ZWQgYXNzZXRzIHJldHVybiBhbiBlbXB0eSAmI3g2MDthc3NldHMmI3g2MDsgYXJyYXkuIFJldHVybnMgYm90aCBhY3RpdmUgYW5kIGluYWN0aXZlIGNvbmZpZ3VyYXRpb25zIGJ5IGRlZmF1bHQ7IHBhc3MgJiN4NjA7aW5jbHVkZUluYWN0aXZlJiN4M0Q7ZmFsc2UmI3g2MDsgdG8gaGlkZSBpbmFjdGl2ZSByb3dzLiBBcmNoaXZlZCAoc29mdC1kZWxldGVkKSBjb25maWd1cmF0aW9ucyBhcmUgbmV2ZXIgcmV0dXJuZWQuXG4gICAgICogQHBhcmFtIGFkdmVydGlzZXJJZCBBZHZlcnRpc2VyIElEXG4gICAgICogQHBhcmFtIGluY2x1ZGVJbmFjdGl2ZSBJbmNsdWRlIGluYWN0aXZlIGNvbmZpZ3VyYXRpb25zIChkZWZhdWx0cyB0byB0cnVlKVxuICAgICAqIEBwYXJhbSByZXFJZCByZXF1ZXN0IGlkXG4gICAgICogQHBhcmFtIHRva2VuIEF1dGggVG9rZW5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2V0dGluZ3NVc2luZ0dFVChhZHZlcnRpc2VySWQ6IG51bWJlciwgaW5jbHVkZUluYWN0aXZlPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlT2JqZWN0TGlzdERjb1ZpZGVvU2V0dGluZ3NEVE8+O1xuICAgIHB1YmxpYyBnZXRTZXR0aW5nc1VzaW5nR0VUKGFkdmVydGlzZXJJZDogbnVtYmVyLCBpbmNsdWRlSW5hY3RpdmU/OiBib29sZWFuLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcGlSZXNwb25zZU9iamVjdExpc3REY29WaWRlb1NldHRpbmdzRFRPPj47XG4gICAgcHVibGljIGdldFNldHRpbmdzVXNpbmdHRVQoYWR2ZXJ0aXNlcklkOiBudW1iZXIsIGluY2x1ZGVJbmFjdGl2ZT86IGJvb2xlYW4sIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcGlSZXNwb25zZU9iamVjdExpc3REY29WaWRlb1NldHRpbmdzRFRPPj47XG4gICAgcHVibGljIGdldFNldHRpbmdzVXNpbmdHRVQoYWR2ZXJ0aXNlcklkOiBudW1iZXIsIGluY2x1ZGVJbmFjdGl2ZT86IGJvb2xlYW4sIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGFkdmVydGlzZXJJZCA9PT0gbnVsbCB8fCBhZHZlcnRpc2VySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgYWR2ZXJ0aXNlcklkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0U2V0dGluZ3NVc2luZ0dFVC4nKTtcbiAgICAgICAgfVxuXG5cblxuXG4gICAgICAgIGxldCBxdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogbmV3IEN1c3RvbUh0dHBVcmxFbmNvZGluZ0NvZGVjKCl9KTtcbiAgICAgICAgaWYgKGluY2x1ZGVJbmFjdGl2ZSAhPT0gdW5kZWZpbmVkICYmIGluY2x1ZGVJbmFjdGl2ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLnNldCgnaW5jbHVkZUluYWN0aXZlJywgPGFueT5pbmNsdWRlSW5hY3RpdmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuICAgICAgICBpZiAocmVxSWQgIT09IHVuZGVmaW5lZCAmJiByZXFJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdyZXFJZCcsIFN0cmluZyhyZXFJZCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbiAhPT0gdW5kZWZpbmVkICYmIHRva2VuICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3Rva2VuJywgU3RyaW5nKHRva2VuKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxBcGlSZXNwb25zZU9iamVjdExpc3REY29WaWRlb1NldHRpbmdzRFRPPihgJHt0aGlzLmJhc2VQYXRofS92Mi9hcGkvZGNvdmlkZW8vc2V0dGluZ3MvJHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGFkdmVydGlzZXJJZCkpfWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGFyYW1zOiBxdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYXZhaWxhYmxlIERDTyB2aWRlbyB0ZW1wbGF0ZXMgZmlsdGVyZWQgYnkgYXNzZXQgYXZhaWxhYmlsaXR5XG4gICAgICogXG4gICAgICogQHBhcmFtIGFkdmVydGlzZXJJZCBBZHZlcnRpc2VyIElEXG4gICAgICogQHBhcmFtIGhhc0JhY2tncm91bmRJbWFnZSBIYXMgYmFja2dyb3VuZCBpbWFnZSBhc3NldFxuICAgICAqIEBwYXJhbSBoYXNQcm9tb0Jhbm5lciBIYXMgcHJvbW8gYmFubmVyIGFzc2V0XG4gICAgICogQHBhcmFtIGhhc1Byb21vVmlkZW8gSGFzIHByb21vIHZpZGVvIGFzc2V0XG4gICAgICogQHBhcmFtIHJlcUlkIHJlcXVlc3QgaWRcbiAgICAgKiBAcGFyYW0gdG9rZW4gQXV0aCBUb2tlblxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRUZW1wbGF0ZXNVc2luZ0dFVChhZHZlcnRpc2VySWQ6IG51bWJlciwgaGFzQmFja2dyb3VuZEltYWdlPzogYm9vbGVhbiwgaGFzUHJvbW9CYW5uZXI/OiBib29sZWFuLCBoYXNQcm9tb1ZpZGVvPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlT2JqZWN0TGlzdERjb1ZpZGVvVGVtcGxhdGVEVE8+O1xuICAgIHB1YmxpYyBnZXRUZW1wbGF0ZXNVc2luZ0dFVChhZHZlcnRpc2VySWQ6IG51bWJlciwgaGFzQmFja2dyb3VuZEltYWdlPzogYm9vbGVhbiwgaGFzUHJvbW9CYW5uZXI/OiBib29sZWFuLCBoYXNQcm9tb1ZpZGVvPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3RMaXN0RGNvVmlkZW9UZW1wbGF0ZURUTz4+O1xuICAgIHB1YmxpYyBnZXRUZW1wbGF0ZXNVc2luZ0dFVChhZHZlcnRpc2VySWQ6IG51bWJlciwgaGFzQmFja2dyb3VuZEltYWdlPzogYm9vbGVhbiwgaGFzUHJvbW9CYW5uZXI/OiBib29sZWFuLCBoYXNQcm9tb1ZpZGVvPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0TGlzdERjb1ZpZGVvVGVtcGxhdGVEVE8+PjtcbiAgICBwdWJsaWMgZ2V0VGVtcGxhdGVzVXNpbmdHRVQoYWR2ZXJ0aXNlcklkOiBudW1iZXIsIGhhc0JhY2tncm91bmRJbWFnZT86IGJvb2xlYW4sIGhhc1Byb21vQmFubmVyPzogYm9vbGVhbiwgaGFzUHJvbW9WaWRlbz86IGJvb2xlYW4sIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGFkdmVydGlzZXJJZCA9PT0gbnVsbCB8fCBhZHZlcnRpc2VySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgYWR2ZXJ0aXNlcklkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0VGVtcGxhdGVzVXNpbmdHRVQuJyk7XG4gICAgICAgIH1cblxuXG5cblxuXG5cbiAgICAgICAgbGV0IHF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiBuZXcgQ3VzdG9tSHR0cFVybEVuY29kaW5nQ29kZWMoKX0pO1xuICAgICAgICBpZiAoYWR2ZXJ0aXNlcklkICE9PSB1bmRlZmluZWQgJiYgYWR2ZXJ0aXNlcklkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtZXRlcnMuc2V0KCdhZHZlcnRpc2VySWQnLCA8YW55PmFkdmVydGlzZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0JhY2tncm91bmRJbWFnZSAhPT0gdW5kZWZpbmVkICYmIGhhc0JhY2tncm91bmRJbWFnZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLnNldCgnaGFzQmFja2dyb3VuZEltYWdlJywgPGFueT5oYXNCYWNrZ3JvdW5kSW1hZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNQcm9tb0Jhbm5lciAhPT0gdW5kZWZpbmVkICYmIGhhc1Byb21vQmFubmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtZXRlcnMuc2V0KCdoYXNQcm9tb0Jhbm5lcicsIDxhbnk+aGFzUHJvbW9CYW5uZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNQcm9tb1ZpZGVvICE9PSB1bmRlZmluZWQgJiYgaGFzUHJvbW9WaWRlbyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLnNldCgnaGFzUHJvbW9WaWRlbycsIDxhbnk+aGFzUHJvbW9WaWRlbyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIGlmIChyZXFJZCAhPT0gdW5kZWZpbmVkICYmIHJlcUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3JlcUlkJywgU3RyaW5nKHJlcUlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQgJiYgdG9rZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgndG9rZW4nLCBTdHJpbmcodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PEFwaVJlc3BvbnNlT2JqZWN0TGlzdERjb1ZpZGVvVGVtcGxhdGVEVE8+KGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9kY292aWRlby90ZW1wbGF0ZXNgLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhcmFtczogcXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIGFuIGV4aXN0aW5nIERDTyB2aWRlbyBzZXR0aW5ncyBjb25maWd1cmF0aW9uXG4gICAgICogSlNPTiBib2R5LiAmI3g2MDthc3NldHNbXSYjeDYwOyAod2hlbiBzdXBwbGllZCkgc2hvdWxkIGNhcnJ5IENETiBVUkxzIGZyb20gUE9TVCAvc2V0dGluZ3MvYXNzZXRzL3VwbG9hZC4gVG8gY2xlYXIgbXVzaWMsIHNlbmQgJiN4NjA7eyBcXCZxdW90O3R5cGVcXCZxdW90OzogXFwmcXVvdDtQUk9NT19NVVNJQ1xcJnF1b3Q7LCBcXCZxdW90O3VybFxcJnF1b3Q7OiBcXCZxdW90O1xcJnF1b3Q7IH0mI3g2MDsuXG4gICAgICogQHBhcmFtIGlkIFNldHRpbmdzIGNvbmZpZ3VyYXRpb24gSURcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBEQ08gVmlkZW8gU2V0dGluZ3MgdXBkYXRlIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gcmVnZW5lcmF0ZVNhbXBsZSBXaGVuIHRydWUgKGRlZmF1bHQpLCBjbGVhciBzYW1wbGVWaWRlb1VybCBpZiB0ZW1wbGF0ZSBvciBhc3NldHMgY2hhbmdlIHVubGVzcyBzYW1wbGVWaWRlb1VybCBpcyBzdXBwbGllZCBpbiB0aGUgSlNPTiByZXF1ZXN0LiBTZXQgZmFsc2UgdG8ga2VlcCB0aGUgZXhpc3Rpbmcgc2FtcGxlIFVSTC5cbiAgICAgKiBAcGFyYW0gcmVxSWQgcmVxdWVzdCBpZFxuICAgICAqIEBwYXJhbSB0b2tlbiBBdXRoIFRva2VuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZVNldHRpbmdzVXNpbmdQT1NUKGlkOiBudW1iZXIsIHJlcXVlc3Q6IERjb1ZpZGVvU2V0dGluZ3NVcGRhdGVSZXF1ZXN0LCByZWdlbmVyYXRlU2FtcGxlPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9TZXR0aW5nc0RUTz47XG4gICAgcHVibGljIHVwZGF0ZVNldHRpbmdzVXNpbmdQT1NUKGlkOiBudW1iZXIsIHJlcXVlc3Q6IERjb1ZpZGVvU2V0dGluZ3NVcGRhdGVSZXF1ZXN0LCByZWdlbmVyYXRlU2FtcGxlPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3REY29WaWRlb1NldHRpbmdzRFRPPj47XG4gICAgcHVibGljIHVwZGF0ZVNldHRpbmdzVXNpbmdQT1NUKGlkOiBudW1iZXIsIHJlcXVlc3Q6IERjb1ZpZGVvU2V0dGluZ3NVcGRhdGVSZXF1ZXN0LCByZWdlbmVyYXRlU2FtcGxlPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9TZXR0aW5nc0RUTz4+O1xuICAgIHB1YmxpYyB1cGRhdGVTZXR0aW5nc1VzaW5nUE9TVChpZDogbnVtYmVyLCByZXF1ZXN0OiBEY29WaWRlb1NldHRpbmdzVXBkYXRlUmVxdWVzdCwgcmVnZW5lcmF0ZVNhbXBsZT86IGJvb2xlYW4sIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGlkID09PSBudWxsIHx8IGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGlkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBkYXRlU2V0dGluZ3NVc2luZ1BPU1QuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVxdWVzdCA9PT0gbnVsbCB8fCByZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHJlcXVlc3Qgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyB1cGRhdGVTZXR0aW5nc1VzaW5nUE9TVC4nKTtcbiAgICAgICAgfVxuXG5cblxuXG4gICAgICAgIGxldCBxdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogbmV3IEN1c3RvbUh0dHBVcmxFbmNvZGluZ0NvZGVjKCl9KTtcbiAgICAgICAgaWYgKHJlZ2VuZXJhdGVTYW1wbGUgIT09IHVuZGVmaW5lZCAmJiByZWdlbmVyYXRlU2FtcGxlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtZXRlcnMuc2V0KCdyZWdlbmVyYXRlU2FtcGxlJywgPGFueT5yZWdlbmVyYXRlU2FtcGxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgaWYgKHJlcUlkICE9PSB1bmRlZmluZWQgJiYgcmVxSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgncmVxSWQnLCBTdHJpbmcocmVxSWQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4gIT09IHVuZGVmaW5lZCAmJiB0b2tlbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCd0b2tlbicsIFN0cmluZyh0b2tlbikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgaWYgKGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9TZXR0aW5nc0RUTz4oYCR7dGhpcy5iYXNlUGF0aH0vdjIvYXBpL2Rjb3ZpZGVvL3NldHRpbmdzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhpZCkpfWAsXG4gICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhcmFtczogcXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBsb2FkIERDTyB2aWRlbyBzdGFnaW5nIGFzc2V0cyAoQ0ROIFVSTHMgb25seSwgbm8gc2V0dGluZ3Mgcm93KVxuICAgICAqIE11bHRpcGFydC4gUHJvdmlkZSAmI3g2MDthZHZlcnRpc2VySWQmI3g2MDsgYW5kICYjeDYwO3RlbXBsYXRlSWQmI3g2MDsgYXMgZm9ybSBmaWVsZHMgYW5kIG9uZSBvciBtb3JlIG9mICYjeDYwO2ZpbGVfUFJPTU9fVklERU8mI3g2MDssICYjeDYwO2ZpbGVfUFJPTU9fQkFOTkVSJiN4NjA7LCAmI3g2MDtmaWxlX0JBQ0tHUk9VTkRfSU1BR0UmI3g2MDssIGFuZC9vciBvcHRpb25hbCAmI3g2MDtmaWxlX1BST01PX01VU0lDJiN4NjA7LiBVc2UgcmV0dXJuZWQgJiN4NjA7YXNzZXRzW10mI3g2MDsgVVJMcyAoaW5jbHVkaW5nICYjeDYwO1BST01PX01VU0lDJiN4NjA7KSBpbiBQT1NUIC9zZXR0aW5ncy9nZW5lcmF0ZS1zYW1wbGUsIHRoZW4gcGFzcyAmI3g2MDtzYW1wbGVWaWRlb1VybCYjeDYwOyBmcm9tIHRoYXQgcmVzcG9uc2Ugd2hlbiBjcmVhdGluZyBzZXR0aW5ncy5cbiAgICAgKiBAcGFyYW0gYWR2ZXJ0aXNlcklkIEFkdmVydGlzZXIgSURcbiAgICAgKiBAcGFyYW0gdGVtcGxhdGVJZCBUZW1wbGF0ZSBJRCAoc3RvcmFnZSBwYXRoKVxuICAgICAqIEBwYXJhbSBmaWxlX0JBQ0tHUk9VTkRfSU1BR0UgQmFja2dyb3VuZCBpbWFnZSBmaWxlXG4gICAgICogQHBhcmFtIGZpbGVfUFJPTU9fQkFOTkVSIFByb21vIGJhbm5lciBmaWxlXG4gICAgICogQHBhcmFtIGZpbGVfUFJPTU9fTVVTSUMgQmFja2dyb3VuZCBtdXNpYyBmaWxlXG4gICAgICogQHBhcmFtIGZpbGVfUFJPTU9fVklERU8gUHJvbW8gdmlkZW8gZmlsZVxuICAgICAqIEBwYXJhbSByZXFJZCByZXF1ZXN0IGlkXG4gICAgICogQHBhcmFtIHRva2VuIEF1dGggVG9rZW5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBsb2FkU3RhZ2luZ0Fzc2V0c1VzaW5nUE9TVChhZHZlcnRpc2VySWQ6IGFueSwgdGVtcGxhdGVJZDogYW55LCBmaWxlX0JBQ0tHUk9VTkRfSU1BR0U/OiBCbG9iLCBmaWxlX1BST01PX0JBTk5FUj86IEJsb2IsIGZpbGVfUFJPTU9fTVVTSUM/OiBCbG9iLCBmaWxlX1BST01PX1ZJREVPPzogQmxvYiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9Bc3NldFVwbG9hZFJlc3BvbnNlPjtcbiAgICBwdWJsaWMgdXBsb2FkU3RhZ2luZ0Fzc2V0c1VzaW5nUE9TVChhZHZlcnRpc2VySWQ6IGFueSwgdGVtcGxhdGVJZDogYW55LCBmaWxlX0JBQ0tHUk9VTkRfSU1BR0U/OiBCbG9iLCBmaWxlX1BST01PX0JBTk5FUj86IEJsb2IsIGZpbGVfUFJPTU9fTVVTSUM/OiBCbG9iLCBmaWxlX1BST01PX1ZJREVPPzogQmxvYiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3REY29WaWRlb0Fzc2V0VXBsb2FkUmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgdXBsb2FkU3RhZ2luZ0Fzc2V0c1VzaW5nUE9TVChhZHZlcnRpc2VySWQ6IGFueSwgdGVtcGxhdGVJZDogYW55LCBmaWxlX0JBQ0tHUk9VTkRfSU1BR0U/OiBCbG9iLCBmaWxlX1BST01PX0JBTk5FUj86IEJsb2IsIGZpbGVfUFJPTU9fTVVTSUM/OiBCbG9iLCBmaWxlX1BST01PX1ZJREVPPzogQmxvYiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9Bc3NldFVwbG9hZFJlc3BvbnNlPj47XG4gICAgcHVibGljIHVwbG9hZFN0YWdpbmdBc3NldHNVc2luZ1BPU1QoYWR2ZXJ0aXNlcklkOiBhbnksIHRlbXBsYXRlSWQ6IGFueSwgZmlsZV9CQUNLR1JPVU5EX0lNQUdFPzogQmxvYiwgZmlsZV9QUk9NT19CQU5ORVI/OiBCbG9iLCBmaWxlX1BST01PX01VU0lDPzogQmxvYiwgZmlsZV9QUk9NT19WSURFTz86IEJsb2IsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGFkdmVydGlzZXJJZCA9PT0gbnVsbCB8fCBhZHZlcnRpc2VySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgYWR2ZXJ0aXNlcklkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBsb2FkU3RhZ2luZ0Fzc2V0c1VzaW5nUE9TVC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0ZW1wbGF0ZUlkID09PSBudWxsIHx8IHRlbXBsYXRlSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgdGVtcGxhdGVJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHVwbG9hZFN0YWdpbmdBc3NldHNVc2luZ1BPU1QuJyk7XG4gICAgICAgIH1cblxuXG5cblxuXG5cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIGlmIChyZXFJZCAhPT0gdW5kZWZpbmVkICYmIHJlcUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3JlcUlkJywgU3RyaW5nKHJlcUlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQgJiYgdG9rZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgndG9rZW4nLCBTdHJpbmcodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ211bHRpcGFydC9mb3JtLWRhdGEnXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgY2FuQ29uc3VtZUZvcm0gPSB0aGlzLmNhbkNvbnN1bWVGb3JtKGNvbnN1bWVzKTtcblxuICAgICAgICBsZXQgZm9ybVBhcmFtczogeyBhcHBlbmQocGFyYW06IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQgfCBIdHRwUGFyYW1zOyB9O1xuICAgICAgICBsZXQgdXNlRm9ybSA9IGZhbHNlO1xuICAgICAgICBsZXQgY29udmVydEZvcm1QYXJhbXNUb1N0cmluZyA9IGZhbHNlO1xuICAgICAgICAvLyB1c2UgRm9ybURhdGEgdG8gdHJhbnNtaXQgZmlsZXMgdXNpbmcgY29udGVudC10eXBlIFwibXVsdGlwYXJ0L2Zvcm0tZGF0YVwiXG4gICAgICAgIC8vIHNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80MDA3OTY5L2FwcGxpY2F0aW9uLXgtd3d3LWZvcm0tdXJsZW5jb2RlZC1vci1tdWx0aXBhcnQtZm9ybS1kYXRhXG4gICAgICAgIHVzZUZvcm0gPSBjYW5Db25zdW1lRm9ybTtcbiAgICAgICAgLy8gdXNlIEZvcm1EYXRhIHRvIHRyYW5zbWl0IGZpbGVzIHVzaW5nIGNvbnRlbnQtdHlwZSBcIm11bHRpcGFydC9mb3JtLWRhdGFcIlxuICAgICAgICAvLyBzZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDAwNzk2OS9hcHBsaWNhdGlvbi14LXd3dy1mb3JtLXVybGVuY29kZWQtb3ItbXVsdGlwYXJ0LWZvcm0tZGF0YVxuICAgICAgICB1c2VGb3JtID0gY2FuQ29uc3VtZUZvcm07XG4gICAgICAgIC8vIHVzZSBGb3JtRGF0YSB0byB0cmFuc21pdCBmaWxlcyB1c2luZyBjb250ZW50LXR5cGUgXCJtdWx0aXBhcnQvZm9ybS1kYXRhXCJcbiAgICAgICAgLy8gc2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQwMDc5NjkvYXBwbGljYXRpb24teC13d3ctZm9ybS11cmxlbmNvZGVkLW9yLW11bHRpcGFydC1mb3JtLWRhdGFcbiAgICAgICAgdXNlRm9ybSA9IGNhbkNvbnN1bWVGb3JtO1xuICAgICAgICAvLyB1c2UgRm9ybURhdGEgdG8gdHJhbnNtaXQgZmlsZXMgdXNpbmcgY29udGVudC10eXBlIFwibXVsdGlwYXJ0L2Zvcm0tZGF0YVwiXG4gICAgICAgIC8vIHNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80MDA3OTY5L2FwcGxpY2F0aW9uLXgtd3d3LWZvcm0tdXJsZW5jb2RlZC1vci1tdWx0aXBhcnQtZm9ybS1kYXRhXG4gICAgICAgIHVzZUZvcm0gPSBjYW5Db25zdW1lRm9ybTtcbiAgICAgICAgaWYgKHVzZUZvcm0pIHtcbiAgICAgICAgICAgIGZvcm1QYXJhbXMgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvcm1QYXJhbXMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogbmV3IEN1c3RvbUh0dHBVcmxFbmNvZGluZ0NvZGVjKCl9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhZHZlcnRpc2VySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZm9ybVBhcmFtcyA9IGZvcm1QYXJhbXMuYXBwZW5kKCdhZHZlcnRpc2VySWQnLCA8YW55PmFkdmVydGlzZXJJZCkgfHwgZm9ybVBhcmFtcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZV9CQUNLR1JPVU5EX0lNQUdFICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZvcm1QYXJhbXMgPSBmb3JtUGFyYW1zLmFwcGVuZCgnZmlsZV9CQUNLR1JPVU5EX0lNQUdFJywgPGFueT5maWxlX0JBQ0tHUk9VTkRfSU1BR0UpIHx8IGZvcm1QYXJhbXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVfUFJPTU9fQkFOTkVSICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZvcm1QYXJhbXMgPSBmb3JtUGFyYW1zLmFwcGVuZCgnZmlsZV9QUk9NT19CQU5ORVInLCA8YW55PmZpbGVfUFJPTU9fQkFOTkVSKSB8fCBmb3JtUGFyYW1zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWxlX1BST01PX01VU0lDICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZvcm1QYXJhbXMgPSBmb3JtUGFyYW1zLmFwcGVuZCgnZmlsZV9QUk9NT19NVVNJQycsIDxhbnk+ZmlsZV9QUk9NT19NVVNJQykgfHwgZm9ybVBhcmFtcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZV9QUk9NT19WSURFTyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmb3JtUGFyYW1zID0gZm9ybVBhcmFtcy5hcHBlbmQoJ2ZpbGVfUFJPTU9fVklERU8nLCA8YW55PmZpbGVfUFJPTU9fVklERU8pIHx8IGZvcm1QYXJhbXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRlbXBsYXRlSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZm9ybVBhcmFtcyA9IGZvcm1QYXJhbXMuYXBwZW5kKCd0ZW1wbGF0ZUlkJywgPGFueT50ZW1wbGF0ZUlkKSB8fCBmb3JtUGFyYW1zO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9Bc3NldFVwbG9hZFJlc3BvbnNlPihgJHt0aGlzLmJhc2VQYXRofS92Mi9hcGkvZGNvdmlkZW8vc2V0dGluZ3MvYXNzZXRzL3VwbG9hZGAsXG4gICAgICAgICAgICBjb252ZXJ0Rm9ybVBhcmFtc1RvU3RyaW5nID8gZm9ybVBhcmFtcy50b1N0cmluZygpIDogZm9ybVBhcmFtcyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxufVxuIl19