@vendasta/social-posts 3.10.4 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/esm2020/lib/_generated/host.service.mjs +25 -0
  2. package/esm2020/lib/_internal/enums/index.mjs +9 -0
  3. package/esm2020/lib/_internal/enums/multilocation-post.enum.mjs +12 -0
  4. package/esm2020/lib/_internal/enums/social-posts.enum.mjs +39 -0
  5. package/esm2020/lib/_internal/index.mjs +16 -0
  6. package/esm2020/lib/_internal/interfaces/api.interface.mjs +2 -0
  7. package/esm2020/lib/_internal/interfaces/field-mask.interface.mjs +8 -0
  8. package/esm2020/lib/_internal/interfaces/index.mjs +2 -0
  9. package/esm2020/lib/_internal/interfaces/multilocation-post.interface.mjs +8 -0
  10. package/esm2020/lib/_internal/interfaces/pixabay-image.interface.mjs +8 -0
  11. package/esm2020/lib/_internal/interfaces/post-templates.interface.mjs +8 -0
  12. package/esm2020/lib/_internal/interfaces/social-post-stats.interface.mjs +8 -0
  13. package/esm2020/lib/_internal/interfaces/social-posts.interface.mjs +8 -0
  14. package/esm2020/lib/_internal/interfaces/tenor-gif.interface.mjs +8 -0
  15. package/esm2020/lib/_internal/multilocation-post.api.service.mjs +64 -0
  16. package/esm2020/lib/_internal/objects/api.mjs +1246 -0
  17. package/esm2020/lib/_internal/objects/field-mask.mjs +27 -0
  18. package/esm2020/lib/_internal/objects/index.mjs +15 -0
  19. package/esm2020/lib/_internal/objects/multilocation-post.mjs +115 -0
  20. package/esm2020/lib/_internal/objects/pixabay-image.mjs +138 -0
  21. package/esm2020/lib/_internal/objects/post-templates.mjs +75 -0
  22. package/esm2020/lib/_internal/objects/social-post-stats.mjs +127 -0
  23. package/esm2020/lib/_internal/objects/social-posts.mjs +272 -0
  24. package/esm2020/lib/_internal/objects/tenor-gif.mjs +106 -0
  25. package/esm2020/lib/_internal/partner-social-posts.api.service.mjs +46 -0
  26. package/esm2020/lib/_internal/pixabay-images.api.service.mjs +41 -0
  27. package/esm2020/lib/_internal/post-templates.api.service.mjs +59 -0
  28. package/esm2020/lib/_internal/social-posts.api.service.mjs +70 -0
  29. package/esm2020/lib/_internal/tenor-gifs.api.service.mjs +46 -0
  30. package/esm2020/lib/index.mjs +5 -0
  31. package/esm2020/lib/multilocation-posts.service.mjs +76 -0
  32. package/esm2020/lib/post-templates.service.mjs +72 -0
  33. package/esm2020/lib/social-posts.service.mjs +43 -0
  34. package/esm2020/public_api.mjs +5 -0
  35. package/esm2020/vendasta-social-posts.mjs +5 -0
  36. package/fesm2015/vendasta-social-posts.mjs +2617 -0
  37. package/fesm2015/vendasta-social-posts.mjs.map +1 -0
  38. package/fesm2020/vendasta-social-posts.mjs +2617 -0
  39. package/fesm2020/vendasta-social-posts.mjs.map +1 -0
  40. package/lib/_generated/host.service.d.ts +5 -9
  41. package/lib/_internal/index.d.ts +2 -0
  42. package/lib/_internal/interfaces/api.interface.d.ts +31 -0
  43. package/lib/_internal/interfaces/index.d.ts +3 -1
  44. package/lib/_internal/interfaces/pixabay-image.interface.d.ts +26 -0
  45. package/lib/_internal/interfaces/tenor-gif.interface.d.ts +20 -0
  46. package/lib/_internal/multilocation-post.api.service.d.ts +4 -0
  47. package/lib/_internal/objects/api.d.ts +49 -0
  48. package/lib/_internal/objects/index.d.ts +3 -1
  49. package/lib/_internal/objects/pixabay-image.d.ts +31 -0
  50. package/lib/_internal/objects/tenor-gif.d.ts +31 -0
  51. package/lib/_internal/partner-social-posts.api.service.d.ts +4 -0
  52. package/lib/_internal/pixabay-images.api.service.d.ts +16 -0
  53. package/lib/_internal/post-templates.api.service.d.ts +4 -0
  54. package/lib/_internal/social-posts.api.service.d.ts +4 -0
  55. package/lib/_internal/tenor-gifs.api.service.d.ts +17 -0
  56. package/lib/index.d.ts +1 -2
  57. package/lib/multilocation-posts.service.d.ts +3 -0
  58. package/lib/post-templates.service.d.ts +3 -0
  59. package/lib/social-posts.service.d.ts +3 -0
  60. package/package.json +24 -16
  61. package/src/README.md +1 -0
  62. package/vendasta-social-posts.d.ts +1 -5
  63. package/bundles/vendasta-social-posts.umd.js +0 -3733
  64. package/bundles/vendasta-social-posts.umd.js.map +0 -1
  65. package/bundles/vendasta-social-posts.umd.min.js +0 -2
  66. package/bundles/vendasta-social-posts.umd.min.js.map +0 -1
  67. package/esm2015/lib/_generated/host.service.js +0 -104
  68. package/esm2015/lib/_internal/enums/index.js +0 -13
  69. package/esm2015/lib/_internal/enums/multilocation-post.enum.js +0 -19
  70. package/esm2015/lib/_internal/enums/social-posts.enum.js +0 -67
  71. package/esm2015/lib/_internal/index.js +0 -18
  72. package/esm2015/lib/_internal/interfaces/api.interface.js +0 -447
  73. package/esm2015/lib/_internal/interfaces/field-mask.interface.js +0 -19
  74. package/esm2015/lib/_internal/interfaces/index.js +0 -5
  75. package/esm2015/lib/_internal/interfaces/multilocation-post.interface.js +0 -59
  76. package/esm2015/lib/_internal/interfaces/post-templates.interface.js +0 -45
  77. package/esm2015/lib/_internal/interfaces/social-post-stats.interface.js +0 -57
  78. package/esm2015/lib/_internal/interfaces/social-posts.interface.js +0 -127
  79. package/esm2015/lib/_internal/multilocation-post.api.service.js +0 -136
  80. package/esm2015/lib/_internal/objects/api.js +0 -1805
  81. package/esm2015/lib/_internal/objects/field-mask.js +0 -53
  82. package/esm2015/lib/_internal/objects/index.js +0 -17
  83. package/esm2015/lib/_internal/objects/multilocation-post.js +0 -197
  84. package/esm2015/lib/_internal/objects/post-templates.js +0 -127
  85. package/esm2015/lib/_internal/objects/social-post-stats.js +0 -207
  86. package/esm2015/lib/_internal/objects/social-posts.js +0 -446
  87. package/esm2015/lib/_internal/partner-social-posts.api.service.js +0 -90
  88. package/esm2015/lib/_internal/post-templates.api.service.js +0 -122
  89. package/esm2015/lib/_internal/social-posts.api.service.js +0 -155
  90. package/esm2015/lib/index.js +0 -10
  91. package/esm2015/lib/multilocation-posts.service.js +0 -142
  92. package/esm2015/lib/post-templates.service.js +0 -135
  93. package/esm2015/lib/social-posts.module.js +0 -40
  94. package/esm2015/lib/social-posts.service.js +0 -82
  95. package/esm2015/public_api.js +0 -9
  96. package/esm2015/vendasta-social-posts.js +0 -14
  97. package/esm5/lib/_generated/host.service.js +0 -115
  98. package/esm5/lib/_internal/enums/index.js +0 -13
  99. package/esm5/lib/_internal/enums/multilocation-post.enum.js +0 -19
  100. package/esm5/lib/_internal/enums/social-posts.enum.js +0 -67
  101. package/esm5/lib/_internal/index.js +0 -18
  102. package/esm5/lib/_internal/interfaces/api.interface.js +0 -447
  103. package/esm5/lib/_internal/interfaces/field-mask.interface.js +0 -19
  104. package/esm5/lib/_internal/interfaces/index.js +0 -5
  105. package/esm5/lib/_internal/interfaces/multilocation-post.interface.js +0 -59
  106. package/esm5/lib/_internal/interfaces/post-templates.interface.js +0 -45
  107. package/esm5/lib/_internal/interfaces/social-post-stats.interface.js +0 -57
  108. package/esm5/lib/_internal/interfaces/social-posts.interface.js +0 -127
  109. package/esm5/lib/_internal/multilocation-post.api.service.js +0 -163
  110. package/esm5/lib/_internal/objects/api.js +0 -2015
  111. package/esm5/lib/_internal/objects/field-mask.js +0 -59
  112. package/esm5/lib/_internal/objects/index.js +0 -17
  113. package/esm5/lib/_internal/objects/multilocation-post.js +0 -215
  114. package/esm5/lib/_internal/objects/post-templates.js +0 -133
  115. package/esm5/lib/_internal/objects/social-post-stats.js +0 -225
  116. package/esm5/lib/_internal/objects/social-posts.js +0 -482
  117. package/esm5/lib/_internal/partner-social-posts.api.service.js +0 -100
  118. package/esm5/lib/_internal/post-templates.api.service.js +0 -145
  119. package/esm5/lib/_internal/social-posts.api.service.js +0 -186
  120. package/esm5/lib/index.js +0 -10
  121. package/esm5/lib/multilocation-posts.service.js +0 -188
  122. package/esm5/lib/post-templates.service.js +0 -179
  123. package/esm5/lib/social-posts.module.js +0 -44
  124. package/esm5/lib/social-posts.service.js +0 -103
  125. package/esm5/public_api.js +0 -9
  126. package/esm5/vendasta-social-posts.js +0 -14
  127. package/fesm2015/vendasta-social-posts.js +0 -3241
  128. package/fesm2015/vendasta-social-posts.js.map +0 -1
  129. package/fesm5/vendasta-social-posts.js +0 -3692
  130. package/fesm5/vendasta-social-posts.js.map +0 -1
  131. package/lib/social-posts.module.d.ts +0 -2
  132. package/vendasta-social-posts.metadata.json +0 -1
@@ -1,3241 +0,0 @@
1
- import { Injectable, NgModule, ɵɵdefineInjectable, ɵɵinject } from '@angular/core';
2
- import { EnvironmentService, Environment, SessionServiceModule, EnvironmentServiceModule } from '@vendasta/core';
3
- import { HttpHeaders, HttpClient } from '@angular/common/http';
4
- import { map, share } from 'rxjs/operators';
5
- import { of } from 'rxjs';
6
-
7
- /**
8
- * @fileoverview added by tsickle
9
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
10
- */
11
- class HostService {
12
- /**
13
- * @param {?} environmentService
14
- */
15
- constructor(environmentService) {
16
- this.environmentService = environmentService;
17
- }
18
- /**
19
- * @return {?}
20
- */
21
- host() {
22
- if (this._host) {
23
- return this._host;
24
- }
25
- switch (this.environmentService.getEnvironment()) {
26
- case Environment.LOCAL:
27
- this._host = 'social-post.vendasta-local.com';
28
- break;
29
- case Environment.TEST:
30
- this._host = '';
31
- break;
32
- case Environment.DEMO:
33
- this._host = 'social-posts-demo.apigateway.co';
34
- break;
35
- case Environment.PROD:
36
- this._host = 'social-posts-prod.apigateway.co';
37
- break;
38
- }
39
- return this._host;
40
- }
41
- /**
42
- * @return {?}
43
- */
44
- httpsHost() {
45
- if (this._httpsHost) {
46
- return this._httpsHost;
47
- }
48
- switch (this.environmentService.getEnvironment()) {
49
- case Environment.LOCAL:
50
- this._httpsHost = 'social-post.vendasta-local.com';
51
- break;
52
- case Environment.TEST:
53
- this._httpsHost = '';
54
- break;
55
- case Environment.DEMO:
56
- this._httpsHost = 'social-posts-api-demo.apigateway.co';
57
- break;
58
- case Environment.PROD:
59
- this._httpsHost = 'social-posts-api-prod.apigateway.co';
60
- break;
61
- }
62
- return this._httpsHost;
63
- }
64
- /**
65
- * @return {?}
66
- */
67
- hostWithScheme() {
68
- /** @type {?} */
69
- const scheme = this.environmentService.getEnvironment() === Environment.LOCAL ? 'http://' : 'https://';
70
- return scheme + this.host();
71
- }
72
- /**
73
- * @return {?}
74
- */
75
- httpsHostWithScheme() {
76
- /** @type {?} */
77
- const scheme = this.environmentService.getEnvironment() === Environment.LOCAL ? 'http://' : 'https://';
78
- return scheme + this.httpsHost();
79
- }
80
- }
81
- HostService.decorators = [
82
- { type: Injectable, args: [{ providedIn: 'root' },] }
83
- ];
84
- /** @nocollapse */
85
- HostService.ctorParameters = () => [
86
- { type: EnvironmentService }
87
- ];
88
- /** @nocollapse */ HostService.ngInjectableDef = ɵɵdefineInjectable({ factory: function HostService_Factory() { return new HostService(ɵɵinject(EnvironmentService)); }, token: HostService, providedIn: "root" });
89
-
90
- /**
91
- * @fileoverview added by tsickle
92
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
93
- */
94
- // *********************************
95
- // Code generated by sdkgen
96
- // DO NOT EDIT!.
97
- //
98
- // Enums.
99
- // *********************************
100
- /** @enum {number} */
101
- const CallToActionCallToActionType = {
102
- LEARN_MORE: 0,
103
- BOOK: 1,
104
- ORDER: 2,
105
- SHOP: 3,
106
- SIGN_UP: 4,
107
- GET_OFFER: 5,
108
- CALL: 6,
109
- };
110
- CallToActionCallToActionType[CallToActionCallToActionType.LEARN_MORE] = 'LEARN_MORE';
111
- CallToActionCallToActionType[CallToActionCallToActionType.BOOK] = 'BOOK';
112
- CallToActionCallToActionType[CallToActionCallToActionType.ORDER] = 'ORDER';
113
- CallToActionCallToActionType[CallToActionCallToActionType.SHOP] = 'SHOP';
114
- CallToActionCallToActionType[CallToActionCallToActionType.SIGN_UP] = 'SIGN_UP';
115
- CallToActionCallToActionType[CallToActionCallToActionType.GET_OFFER] = 'GET_OFFER';
116
- CallToActionCallToActionType[CallToActionCallToActionType.CALL] = 'CALL';
117
- /** @enum {number} */
118
- const SocialPostDeletionStatus = {
119
- NONE: 0,
120
- FAILED: 1,
121
- IN_PROGRESS: 2,
122
- };
123
- SocialPostDeletionStatus[SocialPostDeletionStatus.NONE] = 'NONE';
124
- SocialPostDeletionStatus[SocialPostDeletionStatus.FAILED] = 'FAILED';
125
- SocialPostDeletionStatus[SocialPostDeletionStatus.IN_PROGRESS] = 'IN_PROGRESS';
126
- /** @enum {number} */
127
- const PostingStatus = {
128
- POSTING_IN_PROGRESS: 0,
129
- POSTING_FAILED: 1,
130
- POSTING_COMPLETED: 2,
131
- };
132
- PostingStatus[PostingStatus.POSTING_IN_PROGRESS] = 'POSTING_IN_PROGRESS';
133
- PostingStatus[PostingStatus.POSTING_FAILED] = 'POSTING_FAILED';
134
- PostingStatus[PostingStatus.POSTING_COMPLETED] = 'POSTING_COMPLETED';
135
- /** @enum {number} */
136
- const SocialPostService = {
137
- TWITTER: 0,
138
- FACEBOOK: 1,
139
- LINKED_IN: 2,
140
- GOOGLE_PLUS: 3,
141
- GOOGLE_MY_BUSINESS: 4,
142
- UNKNOWN: 5,
143
- INSTAGRAM: 6,
144
- };
145
- SocialPostService[SocialPostService.TWITTER] = 'TWITTER';
146
- SocialPostService[SocialPostService.FACEBOOK] = 'FACEBOOK';
147
- SocialPostService[SocialPostService.LINKED_IN] = 'LINKED_IN';
148
- SocialPostService[SocialPostService.GOOGLE_PLUS] = 'GOOGLE_PLUS';
149
- SocialPostService[SocialPostService.GOOGLE_MY_BUSINESS] = 'GOOGLE_MY_BUSINESS';
150
- SocialPostService[SocialPostService.UNKNOWN] = 'UNKNOWN';
151
- SocialPostService[SocialPostService.INSTAGRAM] = 'INSTAGRAM';
152
-
153
- /**
154
- * @fileoverview added by tsickle
155
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
156
- */
157
- // *********************************
158
- // Code generated by sdkgen
159
- // DO NOT EDIT!.
160
- //
161
- // Enums.
162
- // *********************************
163
- /** @enum {number} */
164
- const RemoveReason = {
165
- REMOVE_REASON_EDIT: 0,
166
- REMOVE_REASON_DELETE: 1,
167
- };
168
- RemoveReason[RemoveReason.REMOVE_REASON_EDIT] = 'REMOVE_REASON_EDIT';
169
- RemoveReason[RemoveReason.REMOVE_REASON_DELETE] = 'REMOVE_REASON_DELETE';
170
-
171
- /**
172
- * @fileoverview added by tsickle
173
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
174
- */
175
-
176
- /**
177
- * @fileoverview added by tsickle
178
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
179
- */
180
- /**
181
- * @template E
182
- * @param {?} enumRef
183
- * @param {?} value
184
- * @return {?}
185
- */
186
- function enumStringToValue(enumRef, value) {
187
- if (typeof value === 'number') {
188
- return value;
189
- }
190
- return enumRef[value];
191
- }
192
- class CallToAction {
193
- /**
194
- * @param {?} proto
195
- * @return {?}
196
- */
197
- static fromProto(proto) {
198
- /** @type {?} */
199
- let m = new CallToAction();
200
- m = Object.assign(m, proto);
201
- if (proto.actionType) {
202
- m.actionType = enumStringToValue(CallToActionCallToActionType, proto.actionType);
203
- }
204
- return m;
205
- }
206
- /**
207
- * @param {?=} kwargs
208
- */
209
- constructor(kwargs) {
210
- if (!kwargs) {
211
- return;
212
- }
213
- Object.assign(this, kwargs);
214
- }
215
- /**
216
- * @return {?}
217
- */
218
- toApiJson() {
219
- /** @type {?} */
220
- const toReturn = {};
221
- if (typeof this.url !== 'undefined') {
222
- toReturn['url'] = this.url;
223
- }
224
- if (typeof this.actionType !== 'undefined') {
225
- toReturn['actionType'] = this.actionType;
226
- }
227
- return toReturn;
228
- }
229
- }
230
- class Error {
231
- /**
232
- * @param {?} proto
233
- * @return {?}
234
- */
235
- static fromProto(proto) {
236
- /** @type {?} */
237
- let m = new Error();
238
- m = Object.assign(m, proto);
239
- return m;
240
- }
241
- /**
242
- * @param {?=} kwargs
243
- */
244
- constructor(kwargs) {
245
- if (!kwargs) {
246
- return;
247
- }
248
- Object.assign(this, kwargs);
249
- }
250
- /**
251
- * @return {?}
252
- */
253
- toApiJson() {
254
- /** @type {?} */
255
- const toReturn = {};
256
- if (typeof this.reason !== 'undefined') {
257
- toReturn['reason'] = this.reason;
258
- }
259
- if (typeof this.category !== 'undefined') {
260
- toReturn['category'] = this.category;
261
- }
262
- return toReturn;
263
- }
264
- }
265
- class Event {
266
- /**
267
- * @param {?} proto
268
- * @return {?}
269
- */
270
- static fromProto(proto) {
271
- /** @type {?} */
272
- let m = new Event();
273
- m = Object.assign(m, proto);
274
- if (proto.startDatetime) {
275
- m.startDatetime = new Date(proto.startDatetime);
276
- }
277
- if (proto.endDatetime) {
278
- m.endDatetime = new Date(proto.endDatetime);
279
- }
280
- return m;
281
- }
282
- /**
283
- * @param {?=} kwargs
284
- */
285
- constructor(kwargs) {
286
- if (!kwargs) {
287
- return;
288
- }
289
- Object.assign(this, kwargs);
290
- }
291
- /**
292
- * @return {?}
293
- */
294
- toApiJson() {
295
- /** @type {?} */
296
- const toReturn = {};
297
- if (typeof this.title !== 'undefined') {
298
- toReturn['title'] = this.title;
299
- }
300
- if (typeof this.startDatetime !== 'undefined' && this.startDatetime !== null) {
301
- toReturn['startDatetime'] = 'toApiJson' in this.startDatetime ? ((/** @type {?} */ (this.startDatetime))).toApiJson() : this.startDatetime;
302
- }
303
- if (typeof this.endDatetime !== 'undefined' && this.endDatetime !== null) {
304
- toReturn['endDatetime'] = 'toApiJson' in this.endDatetime ? ((/** @type {?} */ (this.endDatetime))).toApiJson() : this.endDatetime;
305
- }
306
- return toReturn;
307
- }
308
- }
309
- class SchedulePostStatus {
310
- /**
311
- * @param {?} proto
312
- * @return {?}
313
- */
314
- static fromProto(proto) {
315
- /** @type {?} */
316
- let m = new SchedulePostStatus();
317
- m = Object.assign(m, proto);
318
- if (proto.error) {
319
- m.error = Error.fromProto(proto.error);
320
- }
321
- return m;
322
- }
323
- /**
324
- * @param {?=} kwargs
325
- */
326
- constructor(kwargs) {
327
- if (!kwargs) {
328
- return;
329
- }
330
- Object.assign(this, kwargs);
331
- }
332
- /**
333
- * @return {?}
334
- */
335
- toApiJson() {
336
- /** @type {?} */
337
- const toReturn = {};
338
- if (typeof this.socialPostId !== 'undefined') {
339
- toReturn['socialPostId'] = this.socialPostId;
340
- }
341
- if (typeof this.socialServiceId !== 'undefined') {
342
- toReturn['socialServiceId'] = this.socialServiceId;
343
- }
344
- if (typeof this.socialServiceLabel !== 'undefined') {
345
- toReturn['socialServiceLabel'] = this.socialServiceLabel;
346
- }
347
- if (typeof this.error !== 'undefined' && this.error !== null) {
348
- toReturn['error'] = 'toApiJson' in this.error ? ((/** @type {?} */ (this.error))).toApiJson() : this.error;
349
- }
350
- return toReturn;
351
- }
352
- }
353
- class SocialPost {
354
- /**
355
- * @param {?} proto
356
- * @return {?}
357
- */
358
- static fromProto(proto) {
359
- /** @type {?} */
360
- let m = new SocialPost();
361
- m = Object.assign(m, proto);
362
- if (proto.posted) {
363
- m.posted = new Date(proto.posted);
364
- }
365
- if (proto.deletionStatus) {
366
- m.deletionStatus = enumStringToValue(SocialPostDeletionStatus, proto.deletionStatus);
367
- }
368
- if (proto.service) {
369
- m.service = enumStringToValue(SocialPostService, proto.service);
370
- }
371
- if (proto.created) {
372
- m.created = new Date(proto.created);
373
- }
374
- if (proto.scheduled) {
375
- m.scheduled = new Date(proto.scheduled);
376
- }
377
- if (proto.status) {
378
- m.status = enumStringToValue(PostingStatus, proto.status);
379
- }
380
- if (proto.event) {
381
- m.event = Event.fromProto(proto.event);
382
- }
383
- if (proto.callToAction) {
384
- m.callToAction = CallToAction.fromProto(proto.callToAction);
385
- }
386
- if (proto.error) {
387
- m.error = Error.fromProto(proto.error);
388
- }
389
- return m;
390
- }
391
- /**
392
- * @param {?=} kwargs
393
- */
394
- constructor(kwargs) {
395
- if (!kwargs) {
396
- return;
397
- }
398
- Object.assign(this, kwargs);
399
- }
400
- /**
401
- * @return {?}
402
- */
403
- toApiJson() {
404
- /** @type {?} */
405
- const toReturn = {};
406
- if (typeof this.businessId !== 'undefined') {
407
- toReturn['businessId'] = this.businessId;
408
- }
409
- if (typeof this.socialPostId !== 'undefined') {
410
- toReturn['socialPostId'] = this.socialPostId;
411
- }
412
- if (typeof this.postText !== 'undefined') {
413
- toReturn['postText'] = this.postText;
414
- }
415
- if (typeof this.posted !== 'undefined' && this.posted !== null) {
416
- toReturn['posted'] = 'toApiJson' in this.posted ? ((/** @type {?} */ (this.posted))).toApiJson() : this.posted;
417
- }
418
- if (typeof this.isError !== 'undefined') {
419
- toReturn['isError'] = this.isError;
420
- }
421
- if (typeof this.deletionStatus !== 'undefined') {
422
- toReturn['deletionStatus'] = this.deletionStatus;
423
- }
424
- if (typeof this.service !== 'undefined') {
425
- toReturn['service'] = this.service;
426
- }
427
- if (typeof this.permalink !== 'undefined') {
428
- toReturn['permalink'] = this.permalink;
429
- }
430
- if (typeof this.created !== 'undefined' && this.created !== null) {
431
- toReturn['created'] = 'toApiJson' in this.created ? ((/** @type {?} */ (this.created))).toApiJson() : this.created;
432
- }
433
- if (typeof this.profileUrl !== 'undefined') {
434
- toReturn['profileUrl'] = this.profileUrl;
435
- }
436
- if (typeof this.profileImageUrl !== 'undefined') {
437
- toReturn['profileImageUrl'] = this.profileImageUrl;
438
- }
439
- if (typeof this.scheduled !== 'undefined' && this.scheduled !== null) {
440
- toReturn['scheduled'] = 'toApiJson' in this.scheduled ? ((/** @type {?} */ (this.scheduled))).toApiJson() : this.scheduled;
441
- }
442
- if (typeof this.status !== 'undefined') {
443
- toReturn['status'] = this.status;
444
- }
445
- if (typeof this.imageUrl !== 'undefined') {
446
- toReturn['imageUrl'] = this.imageUrl;
447
- }
448
- if (typeof this.name !== 'undefined') {
449
- toReturn['name'] = this.name;
450
- }
451
- if (typeof this.username !== 'undefined') {
452
- toReturn['username'] = this.username;
453
- }
454
- if (typeof this.parentId !== 'undefined') {
455
- toReturn['parentId'] = this.parentId;
456
- }
457
- if (typeof this.socialServiceId !== 'undefined') {
458
- toReturn['socialServiceId'] = this.socialServiceId;
459
- }
460
- if (typeof this.event !== 'undefined' && this.event !== null) {
461
- toReturn['event'] = 'toApiJson' in this.event ? ((/** @type {?} */ (this.event))).toApiJson() : this.event;
462
- }
463
- if (typeof this.callToAction !== 'undefined' && this.callToAction !== null) {
464
- toReturn['callToAction'] = 'toApiJson' in this.callToAction ? ((/** @type {?} */ (this.callToAction))).toApiJson() : this.callToAction;
465
- }
466
- if (typeof this.videoUrl !== 'undefined') {
467
- toReturn['videoUrl'] = this.videoUrl;
468
- }
469
- if (typeof this.error !== 'undefined' && this.error !== null) {
470
- toReturn['error'] = 'toApiJson' in this.error ? ((/** @type {?} */ (this.error))).toApiJson() : this.error;
471
- }
472
- if (typeof this.imageUrls !== 'undefined') {
473
- toReturn['imageUrls'] = this.imageUrls;
474
- }
475
- if (typeof this.linkPreviewImageUrl !== 'undefined') {
476
- toReturn['linkPreviewImageUrl'] = this.linkPreviewImageUrl;
477
- }
478
- if (typeof this.brandId !== 'undefined') {
479
- toReturn['brandId'] = this.brandId;
480
- }
481
- if (typeof this.multilocationPostId !== 'undefined') {
482
- toReturn['multilocationPostId'] = this.multilocationPostId;
483
- }
484
- return toReturn;
485
- }
486
- }
487
- class SocialPostData {
488
- /**
489
- * @param {?} proto
490
- * @return {?}
491
- */
492
- static fromProto(proto) {
493
- /** @type {?} */
494
- let m = new SocialPostData();
495
- m = Object.assign(m, proto);
496
- if (proto.scheduleFor) {
497
- m.scheduleFor = new Date(proto.scheduleFor);
498
- }
499
- return m;
500
- }
501
- /**
502
- * @param {?=} kwargs
503
- */
504
- constructor(kwargs) {
505
- if (!kwargs) {
506
- return;
507
- }
508
- Object.assign(this, kwargs);
509
- }
510
- /**
511
- * @return {?}
512
- */
513
- toApiJson() {
514
- /** @type {?} */
515
- const toReturn = {};
516
- if (typeof this.postText !== 'undefined') {
517
- toReturn['postText'] = this.postText;
518
- }
519
- if (typeof this.imageUrl !== 'undefined') {
520
- toReturn['imageUrl'] = this.imageUrl;
521
- }
522
- if (typeof this.scheduleFor !== 'undefined' && this.scheduleFor !== null) {
523
- toReturn['scheduleFor'] = 'toApiJson' in this.scheduleFor ? ((/** @type {?} */ (this.scheduleFor))).toApiJson() : this.scheduleFor;
524
- }
525
- return toReturn;
526
- }
527
- }
528
-
529
- /**
530
- * @fileoverview added by tsickle
531
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
532
- */
533
- class FacebookPostStats {
534
- /**
535
- * @param {?} proto
536
- * @return {?}
537
- */
538
- static fromProto(proto) {
539
- /** @type {?} */
540
- let m = new FacebookPostStats();
541
- m = Object.assign(m, proto);
542
- if (proto.commentCount) {
543
- m.commentCount = parseInt(proto.commentCount, 10);
544
- }
545
- if (proto.shareCount) {
546
- m.shareCount = parseInt(proto.shareCount, 10);
547
- }
548
- if (proto.likeCount) {
549
- m.likeCount = parseInt(proto.likeCount, 10);
550
- }
551
- if (proto.reactions) {
552
- m.reactions = parseInt(proto.reactions, 10);
553
- }
554
- if (proto.peopleReached) {
555
- m.peopleReached = parseInt(proto.peopleReached, 10);
556
- }
557
- return m;
558
- }
559
- /**
560
- * @param {?=} kwargs
561
- */
562
- constructor(kwargs) {
563
- if (!kwargs) {
564
- return;
565
- }
566
- Object.assign(this, kwargs);
567
- }
568
- /**
569
- * @return {?}
570
- */
571
- toApiJson() {
572
- /** @type {?} */
573
- const toReturn = {};
574
- if (typeof this.commentCount !== 'undefined') {
575
- toReturn['commentCount'] = this.commentCount;
576
- }
577
- if (typeof this.shareCount !== 'undefined') {
578
- toReturn['shareCount'] = this.shareCount;
579
- }
580
- if (typeof this.likeCount !== 'undefined') {
581
- toReturn['likeCount'] = this.likeCount;
582
- }
583
- if (typeof this.hasLike !== 'undefined') {
584
- toReturn['hasLike'] = this.hasLike;
585
- }
586
- if (typeof this.canLike !== 'undefined') {
587
- toReturn['canLike'] = this.canLike;
588
- }
589
- if (typeof this.reactions !== 'undefined') {
590
- toReturn['reactions'] = this.reactions;
591
- }
592
- if (typeof this.peopleReached !== 'undefined') {
593
- toReturn['peopleReached'] = this.peopleReached;
594
- }
595
- return toReturn;
596
- }
597
- }
598
- class SocialPostStats {
599
- /**
600
- * @param {?} proto
601
- * @return {?}
602
- */
603
- static fromProto(proto) {
604
- /** @type {?} */
605
- let m = new SocialPostStats();
606
- m = Object.assign(m, proto);
607
- if (proto.facebookPostStats) {
608
- m.facebookPostStats = FacebookPostStats.fromProto(proto.facebookPostStats);
609
- }
610
- if (proto.twitterPostStats) {
611
- m.twitterPostStats = TwitterPostStats.fromProto(proto.twitterPostStats);
612
- }
613
- return m;
614
- }
615
- /**
616
- * @param {?=} kwargs
617
- */
618
- constructor(kwargs) {
619
- if (!kwargs) {
620
- return;
621
- }
622
- Object.assign(this, kwargs);
623
- }
624
- /**
625
- * @return {?}
626
- */
627
- toApiJson() {
628
- /** @type {?} */
629
- const toReturn = {};
630
- if (typeof this.internalPostId !== 'undefined') {
631
- toReturn['internalPostId'] = this.internalPostId;
632
- }
633
- if (typeof this.facebookPostStats !== 'undefined' && this.facebookPostStats !== null) {
634
- toReturn['facebookPostStats'] = 'toApiJson' in this.facebookPostStats ? ((/** @type {?} */ (this.facebookPostStats))).toApiJson() : this.facebookPostStats;
635
- }
636
- if (typeof this.twitterPostStats !== 'undefined' && this.twitterPostStats !== null) {
637
- toReturn['twitterPostStats'] = 'toApiJson' in this.twitterPostStats ? ((/** @type {?} */ (this.twitterPostStats))).toApiJson() : this.twitterPostStats;
638
- }
639
- return toReturn;
640
- }
641
- }
642
- class TwitterPostStats {
643
- /**
644
- * @param {?} proto
645
- * @return {?}
646
- */
647
- static fromProto(proto) {
648
- /** @type {?} */
649
- let m = new TwitterPostStats();
650
- m = Object.assign(m, proto);
651
- if (proto.favourites) {
652
- m.favourites = parseInt(proto.favourites, 10);
653
- }
654
- if (proto.retweets) {
655
- m.retweets = parseInt(proto.retweets, 10);
656
- }
657
- return m;
658
- }
659
- /**
660
- * @param {?=} kwargs
661
- */
662
- constructor(kwargs) {
663
- if (!kwargs) {
664
- return;
665
- }
666
- Object.assign(this, kwargs);
667
- }
668
- /**
669
- * @return {?}
670
- */
671
- toApiJson() {
672
- /** @type {?} */
673
- const toReturn = {};
674
- if (typeof this.favourites !== 'undefined') {
675
- toReturn['favourites'] = this.favourites;
676
- }
677
- if (typeof this.hasFavourited !== 'undefined') {
678
- toReturn['hasFavourited'] = this.hasFavourited;
679
- }
680
- if (typeof this.retweets !== 'undefined') {
681
- toReturn['retweets'] = this.retweets;
682
- }
683
- if (typeof this.hasRetweeted !== 'undefined') {
684
- toReturn['hasRetweeted'] = this.hasRetweeted;
685
- }
686
- return toReturn;
687
- }
688
- }
689
-
690
- /**
691
- * @fileoverview added by tsickle
692
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
693
- */
694
- class PostTemplate {
695
- /**
696
- * @param {?} proto
697
- * @return {?}
698
- */
699
- static fromProto(proto) {
700
- /** @type {?} */
701
- let m = new PostTemplate();
702
- m = Object.assign(m, proto);
703
- if (proto.created) {
704
- m.created = new Date(proto.created);
705
- }
706
- if (proto.updated) {
707
- m.updated = new Date(proto.updated);
708
- }
709
- if (proto.postDateTime) {
710
- m.postDateTime = new Date(proto.postDateTime);
711
- }
712
- return m;
713
- }
714
- /**
715
- * @param {?=} kwargs
716
- */
717
- constructor(kwargs) {
718
- if (!kwargs) {
719
- return;
720
- }
721
- Object.assign(this, kwargs);
722
- }
723
- /**
724
- * @return {?}
725
- */
726
- toApiJson() {
727
- /** @type {?} */
728
- const toReturn = {};
729
- if (typeof this.accountGroupId !== 'undefined') {
730
- toReturn['accountGroupId'] = this.accountGroupId;
731
- }
732
- if (typeof this.templateId !== 'undefined') {
733
- toReturn['templateId'] = this.templateId;
734
- }
735
- if (typeof this.title !== 'undefined') {
736
- toReturn['title'] = this.title;
737
- }
738
- if (typeof this.created !== 'undefined' && this.created !== null) {
739
- toReturn['created'] = 'toApiJson' in this.created ? ((/** @type {?} */ (this.created))).toApiJson() : this.created;
740
- }
741
- if (typeof this.updated !== 'undefined' && this.updated !== null) {
742
- toReturn['updated'] = 'toApiJson' in this.updated ? ((/** @type {?} */ (this.updated))).toApiJson() : this.updated;
743
- }
744
- if (typeof this.postText !== 'undefined') {
745
- toReturn['postText'] = this.postText;
746
- }
747
- if (typeof this.postDateTime !== 'undefined' && this.postDateTime !== null) {
748
- toReturn['postDateTime'] = 'toApiJson' in this.postDateTime ? ((/** @type {?} */ (this.postDateTime))).toApiJson() : this.postDateTime;
749
- }
750
- if (typeof this.gmbPostCustomization !== 'undefined') {
751
- toReturn['gmbPostCustomization'] = this.gmbPostCustomization;
752
- }
753
- if (typeof this.imageUrl !== 'undefined') {
754
- toReturn['imageUrl'] = this.imageUrl;
755
- }
756
- if (typeof this.imagePath !== 'undefined') {
757
- toReturn['imagePath'] = this.imagePath;
758
- }
759
- if (typeof this.imageSize !== 'undefined') {
760
- toReturn['imageSize'] = this.imageSize;
761
- }
762
- if (typeof this.previews !== 'undefined') {
763
- toReturn['previews'] = this.previews;
764
- }
765
- if (typeof this.options !== 'undefined') {
766
- toReturn['options'] = this.options;
767
- }
768
- if (typeof this.videoUrl !== 'undefined') {
769
- toReturn['videoUrl'] = this.videoUrl;
770
- }
771
- return toReturn;
772
- }
773
- }
774
-
775
- /**
776
- * @fileoverview added by tsickle
777
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
778
- */
779
- class Location {
780
- /**
781
- * @param {?} proto
782
- * @return {?}
783
- */
784
- static fromProto(proto) {
785
- /** @type {?} */
786
- let m = new Location();
787
- m = Object.assign(m, proto);
788
- return m;
789
- }
790
- /**
791
- * @param {?=} kwargs
792
- */
793
- constructor(kwargs) {
794
- if (!kwargs) {
795
- return;
796
- }
797
- Object.assign(this, kwargs);
798
- }
799
- /**
800
- * @return {?}
801
- */
802
- toApiJson() {
803
- /** @type {?} */
804
- const toReturn = {};
805
- if (typeof this.socialServiceIds !== 'undefined') {
806
- toReturn['socialServiceIds'] = this.socialServiceIds;
807
- }
808
- if (typeof this.accountGroupId !== 'undefined') {
809
- toReturn['accountGroupId'] = this.accountGroupId;
810
- }
811
- return toReturn;
812
- }
813
- }
814
- class MultilocationPost {
815
- /**
816
- * @param {?} proto
817
- * @return {?}
818
- */
819
- static fromProto(proto) {
820
- /** @type {?} */
821
- let m = new MultilocationPost();
822
- m = Object.assign(m, proto);
823
- if (proto.originalScheduledDate) {
824
- m.originalScheduledDate = new Date(proto.originalScheduledDate);
825
- }
826
- if (proto.originalLocations) {
827
- m.originalLocations = proto.originalLocations.map(Location.fromProto);
828
- }
829
- if (proto.editedLocations) {
830
- m.editedLocations = proto.editedLocations.map(Location.fromProto);
831
- }
832
- if (proto.deletedLocations) {
833
- m.deletedLocations = proto.deletedLocations.map(Location.fromProto);
834
- }
835
- return m;
836
- }
837
- /**
838
- * @param {?=} kwargs
839
- */
840
- constructor(kwargs) {
841
- if (!kwargs) {
842
- return;
843
- }
844
- Object.assign(this, kwargs);
845
- }
846
- /**
847
- * @return {?}
848
- */
849
- toApiJson() {
850
- /** @type {?} */
851
- const toReturn = {};
852
- if (typeof this.brandId !== 'undefined') {
853
- toReturn['brandId'] = this.brandId;
854
- }
855
- if (typeof this.multilocationId !== 'undefined') {
856
- toReturn['multilocationId'] = this.multilocationId;
857
- }
858
- if (typeof this.originalText !== 'undefined') {
859
- toReturn['originalText'] = this.originalText;
860
- }
861
- if (typeof this.originalScheduledDate !== 'undefined' && this.originalScheduledDate !== null) {
862
- toReturn['originalScheduledDate'] = 'toApiJson' in this.originalScheduledDate ? ((/** @type {?} */ (this.originalScheduledDate))).toApiJson() : this.originalScheduledDate;
863
- }
864
- if (typeof this.originalMedia !== 'undefined') {
865
- toReturn['originalMedia'] = this.originalMedia;
866
- }
867
- if (typeof this.originalLocations !== 'undefined' && this.originalLocations !== null) {
868
- toReturn['originalLocations'] = 'toApiJson' in this.originalLocations ? ((/** @type {?} */ (this.originalLocations))).toApiJson() : this.originalLocations;
869
- }
870
- if (typeof this.editedLocations !== 'undefined' && this.editedLocations !== null) {
871
- toReturn['editedLocations'] = 'toApiJson' in this.editedLocations ? ((/** @type {?} */ (this.editedLocations))).toApiJson() : this.editedLocations;
872
- }
873
- if (typeof this.deletedLocations !== 'undefined' && this.deletedLocations !== null) {
874
- toReturn['deletedLocations'] = 'toApiJson' in this.deletedLocations ? ((/** @type {?} */ (this.deletedLocations))).toApiJson() : this.deletedLocations;
875
- }
876
- if (typeof this.originalGifs !== 'undefined') {
877
- toReturn['originalGifs'] = this.originalGifs;
878
- }
879
- if (typeof this.originalVideos !== 'undefined') {
880
- toReturn['originalVideos'] = this.originalVideos;
881
- }
882
- return toReturn;
883
- }
884
- }
885
- class MultilocationPostError {
886
- /**
887
- * @param {?} proto
888
- * @return {?}
889
- */
890
- static fromProto(proto) {
891
- /** @type {?} */
892
- let m = new MultilocationPostError();
893
- m = Object.assign(m, proto);
894
- return m;
895
- }
896
- /**
897
- * @param {?=} kwargs
898
- */
899
- constructor(kwargs) {
900
- if (!kwargs) {
901
- return;
902
- }
903
- Object.assign(this, kwargs);
904
- }
905
- /**
906
- * @return {?}
907
- */
908
- toApiJson() {
909
- /** @type {?} */
910
- const toReturn = {};
911
- if (typeof this.socialServiceId !== 'undefined') {
912
- toReturn['socialServiceId'] = this.socialServiceId;
913
- }
914
- if (typeof this.accountGroupId !== 'undefined') {
915
- toReturn['accountGroupId'] = this.accountGroupId;
916
- }
917
- if (typeof this.errorReason !== 'undefined') {
918
- toReturn['errorReason'] = this.errorReason;
919
- }
920
- return toReturn;
921
- }
922
- }
923
-
924
- /**
925
- * @fileoverview added by tsickle
926
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
927
- */
928
- class FieldMask {
929
- /**
930
- * @param {?} proto
931
- * @return {?}
932
- */
933
- static fromProto(proto) {
934
- /** @type {?} */
935
- let m = new FieldMask();
936
- m = Object.assign(m, proto);
937
- return m;
938
- }
939
- /**
940
- * @param {?=} kwargs
941
- */
942
- constructor(kwargs) {
943
- if (!kwargs) {
944
- return;
945
- }
946
- Object.assign(this, kwargs);
947
- }
948
- /**
949
- * @return {?}
950
- */
951
- toApiJson() {
952
- /** @type {?} */
953
- const toReturn = {};
954
- if (typeof this.paths !== 'undefined') {
955
- toReturn['paths'] = this.paths;
956
- }
957
- return toReturn;
958
- }
959
- }
960
-
961
- /**
962
- * @fileoverview added by tsickle
963
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
964
- */
965
- /**
966
- * @template E
967
- * @param {?} enumRef
968
- * @param {?} value
969
- * @return {?}
970
- */
971
- function enumStringToValue$5(enumRef, value) {
972
- if (typeof value === 'number') {
973
- return value;
974
- }
975
- return enumRef[value];
976
- }
977
- class CreateMultilocationPostRequest {
978
- /**
979
- * @param {?} proto
980
- * @return {?}
981
- */
982
- static fromProto(proto) {
983
- /** @type {?} */
984
- let m = new CreateMultilocationPostRequest();
985
- m = Object.assign(m, proto);
986
- if (proto.scheduledDate) {
987
- m.scheduledDate = new Date(proto.scheduledDate);
988
- }
989
- if (proto.locations) {
990
- m.locations = proto.locations.map(Location.fromProto);
991
- }
992
- return m;
993
- }
994
- /**
995
- * @param {?=} kwargs
996
- */
997
- constructor(kwargs) {
998
- if (!kwargs) {
999
- return;
1000
- }
1001
- Object.assign(this, kwargs);
1002
- }
1003
- /**
1004
- * @return {?}
1005
- */
1006
- toApiJson() {
1007
- /** @type {?} */
1008
- const toReturn = {};
1009
- if (typeof this.brandId !== 'undefined') {
1010
- toReturn['brandId'] = this.brandId;
1011
- }
1012
- if (typeof this.text !== 'undefined') {
1013
- toReturn['text'] = this.text;
1014
- }
1015
- if (typeof this.media !== 'undefined') {
1016
- toReturn['media'] = this.media;
1017
- }
1018
- if (typeof this.scheduledDate !== 'undefined' && this.scheduledDate !== null) {
1019
- toReturn['scheduledDate'] = 'toApiJson' in this.scheduledDate ? ((/** @type {?} */ (this.scheduledDate))).toApiJson() : this.scheduledDate;
1020
- }
1021
- if (typeof this.locations !== 'undefined' && this.locations !== null) {
1022
- toReturn['locations'] = 'toApiJson' in this.locations ? ((/** @type {?} */ (this.locations))).toApiJson() : this.locations;
1023
- }
1024
- if (typeof this.gifs !== 'undefined') {
1025
- toReturn['gifs'] = this.gifs;
1026
- }
1027
- if (typeof this.videos !== 'undefined') {
1028
- toReturn['videos'] = this.videos;
1029
- }
1030
- return toReturn;
1031
- }
1032
- }
1033
- class CreateMultilocationPostResponse {
1034
- /**
1035
- * @param {?} proto
1036
- * @return {?}
1037
- */
1038
- static fromProto(proto) {
1039
- /** @type {?} */
1040
- let m = new CreateMultilocationPostResponse();
1041
- m = Object.assign(m, proto);
1042
- if (proto.post) {
1043
- m.post = MultilocationPost.fromProto(proto.post);
1044
- }
1045
- if (proto.errors) {
1046
- m.errors = proto.errors.map(MultilocationPostError.fromProto);
1047
- }
1048
- return m;
1049
- }
1050
- /**
1051
- * @param {?=} kwargs
1052
- */
1053
- constructor(kwargs) {
1054
- if (!kwargs) {
1055
- return;
1056
- }
1057
- Object.assign(this, kwargs);
1058
- }
1059
- /**
1060
- * @return {?}
1061
- */
1062
- toApiJson() {
1063
- /** @type {?} */
1064
- const toReturn = {};
1065
- if (typeof this.post !== 'undefined' && this.post !== null) {
1066
- toReturn['post'] = 'toApiJson' in this.post ? ((/** @type {?} */ (this.post))).toApiJson() : this.post;
1067
- }
1068
- if (typeof this.errors !== 'undefined' && this.errors !== null) {
1069
- toReturn['errors'] = 'toApiJson' in this.errors ? ((/** @type {?} */ (this.errors))).toApiJson() : this.errors;
1070
- }
1071
- return toReturn;
1072
- }
1073
- }
1074
- class CreatePostTemplateRequest {
1075
- /**
1076
- * @param {?} proto
1077
- * @return {?}
1078
- */
1079
- static fromProto(proto) {
1080
- /** @type {?} */
1081
- let m = new CreatePostTemplateRequest();
1082
- m = Object.assign(m, proto);
1083
- if (proto.postDateTime) {
1084
- m.postDateTime = new Date(proto.postDateTime);
1085
- }
1086
- return m;
1087
- }
1088
- /**
1089
- * @param {?=} kwargs
1090
- */
1091
- constructor(kwargs) {
1092
- if (!kwargs) {
1093
- return;
1094
- }
1095
- Object.assign(this, kwargs);
1096
- }
1097
- /**
1098
- * @return {?}
1099
- */
1100
- toApiJson() {
1101
- /** @type {?} */
1102
- const toReturn = {};
1103
- if (typeof this.accountGroupId !== 'undefined') {
1104
- toReturn['accountGroupId'] = this.accountGroupId;
1105
- }
1106
- if (typeof this.title !== 'undefined') {
1107
- toReturn['title'] = this.title;
1108
- }
1109
- if (typeof this.postText !== 'undefined') {
1110
- toReturn['postText'] = this.postText;
1111
- }
1112
- if (typeof this.postDateTime !== 'undefined' && this.postDateTime !== null) {
1113
- toReturn['postDateTime'] = 'toApiJson' in this.postDateTime ? ((/** @type {?} */ (this.postDateTime))).toApiJson() : this.postDateTime;
1114
- }
1115
- if (typeof this.gmbPostCustomization !== 'undefined') {
1116
- toReturn['gmbPostCustomization'] = this.gmbPostCustomization;
1117
- }
1118
- if (typeof this.imageUrl !== 'undefined') {
1119
- toReturn['imageUrl'] = this.imageUrl;
1120
- }
1121
- if (typeof this.imagePath !== 'undefined') {
1122
- toReturn['imagePath'] = this.imagePath;
1123
- }
1124
- if (typeof this.imageSize !== 'undefined') {
1125
- toReturn['imageSize'] = this.imageSize;
1126
- }
1127
- if (typeof this.previews !== 'undefined') {
1128
- toReturn['previews'] = this.previews;
1129
- }
1130
- if (typeof this.options !== 'undefined') {
1131
- toReturn['options'] = this.options;
1132
- }
1133
- if (typeof this.videoUrl !== 'undefined') {
1134
- toReturn['videoUrl'] = this.videoUrl;
1135
- }
1136
- return toReturn;
1137
- }
1138
- }
1139
- class CreatePostTemplateResponse {
1140
- /**
1141
- * @param {?} proto
1142
- * @return {?}
1143
- */
1144
- static fromProto(proto) {
1145
- /** @type {?} */
1146
- let m = new CreatePostTemplateResponse();
1147
- m = Object.assign(m, proto);
1148
- return m;
1149
- }
1150
- /**
1151
- * @param {?=} kwargs
1152
- */
1153
- constructor(kwargs) {
1154
- if (!kwargs) {
1155
- return;
1156
- }
1157
- Object.assign(this, kwargs);
1158
- }
1159
- /**
1160
- * @return {?}
1161
- */
1162
- toApiJson() {
1163
- /** @type {?} */
1164
- const toReturn = {};
1165
- if (typeof this.templateId !== 'undefined') {
1166
- toReturn['templateId'] = this.templateId;
1167
- }
1168
- return toReturn;
1169
- }
1170
- }
1171
- class DateRangeFilter {
1172
- /**
1173
- * @param {?} proto
1174
- * @return {?}
1175
- */
1176
- static fromProto(proto) {
1177
- /** @type {?} */
1178
- let m = new DateRangeFilter();
1179
- m = Object.assign(m, proto);
1180
- if (proto.beginRange) {
1181
- m.beginRange = new Date(proto.beginRange);
1182
- }
1183
- if (proto.endRange) {
1184
- m.endRange = new Date(proto.endRange);
1185
- }
1186
- return m;
1187
- }
1188
- /**
1189
- * @param {?=} kwargs
1190
- */
1191
- constructor(kwargs) {
1192
- if (!kwargs) {
1193
- return;
1194
- }
1195
- Object.assign(this, kwargs);
1196
- }
1197
- /**
1198
- * @return {?}
1199
- */
1200
- toApiJson() {
1201
- /** @type {?} */
1202
- const toReturn = {};
1203
- if (typeof this.beginRange !== 'undefined' && this.beginRange !== null) {
1204
- toReturn['beginRange'] = 'toApiJson' in this.beginRange ? ((/** @type {?} */ (this.beginRange))).toApiJson() : this.beginRange;
1205
- }
1206
- if (typeof this.endRange !== 'undefined' && this.endRange !== null) {
1207
- toReturn['endRange'] = 'toApiJson' in this.endRange ? ((/** @type {?} */ (this.endRange))).toApiJson() : this.endRange;
1208
- }
1209
- return toReturn;
1210
- }
1211
- }
1212
- class DeleteMultilocationPostRequest {
1213
- /**
1214
- * @param {?} proto
1215
- * @return {?}
1216
- */
1217
- static fromProto(proto) {
1218
- /** @type {?} */
1219
- let m = new DeleteMultilocationPostRequest();
1220
- m = Object.assign(m, proto);
1221
- return m;
1222
- }
1223
- /**
1224
- * @param {?=} kwargs
1225
- */
1226
- constructor(kwargs) {
1227
- if (!kwargs) {
1228
- return;
1229
- }
1230
- Object.assign(this, kwargs);
1231
- }
1232
- /**
1233
- * @return {?}
1234
- */
1235
- toApiJson() {
1236
- /** @type {?} */
1237
- const toReturn = {};
1238
- if (typeof this.brandId !== 'undefined') {
1239
- toReturn['brandId'] = this.brandId;
1240
- }
1241
- if (typeof this.multilocationId !== 'undefined') {
1242
- toReturn['multilocationId'] = this.multilocationId;
1243
- }
1244
- return toReturn;
1245
- }
1246
- }
1247
- class DeletePostTemplateRequest {
1248
- /**
1249
- * @param {?} proto
1250
- * @return {?}
1251
- */
1252
- static fromProto(proto) {
1253
- /** @type {?} */
1254
- let m = new DeletePostTemplateRequest();
1255
- m = Object.assign(m, proto);
1256
- return m;
1257
- }
1258
- /**
1259
- * @param {?=} kwargs
1260
- */
1261
- constructor(kwargs) {
1262
- if (!kwargs) {
1263
- return;
1264
- }
1265
- Object.assign(this, kwargs);
1266
- }
1267
- /**
1268
- * @return {?}
1269
- */
1270
- toApiJson() {
1271
- /** @type {?} */
1272
- const toReturn = {};
1273
- if (typeof this.accountGroupId !== 'undefined') {
1274
- toReturn['accountGroupId'] = this.accountGroupId;
1275
- }
1276
- if (typeof this.templateId !== 'undefined') {
1277
- toReturn['templateId'] = this.templateId;
1278
- }
1279
- return toReturn;
1280
- }
1281
- }
1282
- class DeleteSocialPostRequest {
1283
- /**
1284
- * @param {?} proto
1285
- * @return {?}
1286
- */
1287
- static fromProto(proto) {
1288
- /** @type {?} */
1289
- let m = new DeleteSocialPostRequest();
1290
- m = Object.assign(m, proto);
1291
- return m;
1292
- }
1293
- /**
1294
- * @param {?=} kwargs
1295
- */
1296
- constructor(kwargs) {
1297
- if (!kwargs) {
1298
- return;
1299
- }
1300
- Object.assign(this, kwargs);
1301
- }
1302
- /**
1303
- * @return {?}
1304
- */
1305
- toApiJson() {
1306
- /** @type {?} */
1307
- const toReturn = {};
1308
- if (typeof this.businessId !== 'undefined') {
1309
- toReturn['businessId'] = this.businessId;
1310
- }
1311
- if (typeof this.socialPostId !== 'undefined') {
1312
- toReturn['socialPostId'] = this.socialPostId;
1313
- }
1314
- return toReturn;
1315
- }
1316
- }
1317
- class EditMultilocationPostRequest {
1318
- /**
1319
- * @param {?} proto
1320
- * @return {?}
1321
- */
1322
- static fromProto(proto) {
1323
- /** @type {?} */
1324
- let m = new EditMultilocationPostRequest();
1325
- m = Object.assign(m, proto);
1326
- if (proto.scheduledDate) {
1327
- m.scheduledDate = new Date(proto.scheduledDate);
1328
- }
1329
- if (proto.fieldMask) {
1330
- m.fieldMask = FieldMask.fromProto(proto.fieldMask);
1331
- }
1332
- if (proto.locations) {
1333
- m.locations = proto.locations.map(Location.fromProto);
1334
- }
1335
- return m;
1336
- }
1337
- /**
1338
- * @param {?=} kwargs
1339
- */
1340
- constructor(kwargs) {
1341
- if (!kwargs) {
1342
- return;
1343
- }
1344
- Object.assign(this, kwargs);
1345
- }
1346
- /**
1347
- * @return {?}
1348
- */
1349
- toApiJson() {
1350
- /** @type {?} */
1351
- const toReturn = {};
1352
- if (typeof this.brandId !== 'undefined') {
1353
- toReturn['brandId'] = this.brandId;
1354
- }
1355
- if (typeof this.multilocationId !== 'undefined') {
1356
- toReturn['multilocationId'] = this.multilocationId;
1357
- }
1358
- if (typeof this.text !== 'undefined') {
1359
- toReturn['text'] = this.text;
1360
- }
1361
- if (typeof this.media !== 'undefined') {
1362
- toReturn['media'] = this.media;
1363
- }
1364
- if (typeof this.scheduledDate !== 'undefined' && this.scheduledDate !== null) {
1365
- toReturn['scheduledDate'] = 'toApiJson' in this.scheduledDate ? ((/** @type {?} */ (this.scheduledDate))).toApiJson() : this.scheduledDate;
1366
- }
1367
- if (typeof this.fieldMask !== 'undefined' && this.fieldMask !== null) {
1368
- toReturn['fieldMask'] = 'toApiJson' in this.fieldMask ? ((/** @type {?} */ (this.fieldMask))).toApiJson() : this.fieldMask;
1369
- }
1370
- if (typeof this.gifs !== 'undefined') {
1371
- toReturn['gifs'] = this.gifs;
1372
- }
1373
- if (typeof this.videos !== 'undefined') {
1374
- toReturn['videos'] = this.videos;
1375
- }
1376
- if (typeof this.locations !== 'undefined' && this.locations !== null) {
1377
- toReturn['locations'] = 'toApiJson' in this.locations ? ((/** @type {?} */ (this.locations))).toApiJson() : this.locations;
1378
- }
1379
- return toReturn;
1380
- }
1381
- }
1382
- class EditMultilocationPostResponse {
1383
- /**
1384
- * @param {?} proto
1385
- * @return {?}
1386
- */
1387
- static fromProto(proto) {
1388
- /** @type {?} */
1389
- let m = new EditMultilocationPostResponse();
1390
- m = Object.assign(m, proto);
1391
- if (proto.post) {
1392
- m.post = MultilocationPost.fromProto(proto.post);
1393
- }
1394
- if (proto.errors) {
1395
- m.errors = proto.errors.map(MultilocationPostError.fromProto);
1396
- }
1397
- return m;
1398
- }
1399
- /**
1400
- * @param {?=} kwargs
1401
- */
1402
- constructor(kwargs) {
1403
- if (!kwargs) {
1404
- return;
1405
- }
1406
- Object.assign(this, kwargs);
1407
- }
1408
- /**
1409
- * @return {?}
1410
- */
1411
- toApiJson() {
1412
- /** @type {?} */
1413
- const toReturn = {};
1414
- if (typeof this.post !== 'undefined' && this.post !== null) {
1415
- toReturn['post'] = 'toApiJson' in this.post ? ((/** @type {?} */ (this.post))).toApiJson() : this.post;
1416
- }
1417
- if (typeof this.errors !== 'undefined' && this.errors !== null) {
1418
- toReturn['errors'] = 'toApiJson' in this.errors ? ((/** @type {?} */ (this.errors))).toApiJson() : this.errors;
1419
- }
1420
- return toReturn;
1421
- }
1422
- }
1423
- class PartnerListScheduledSocialPostsRequestFilters {
1424
- /**
1425
- * @param {?} proto
1426
- * @return {?}
1427
- */
1428
- static fromProto(proto) {
1429
- /** @type {?} */
1430
- let m = new PartnerListScheduledSocialPostsRequestFilters();
1431
- m = Object.assign(m, proto);
1432
- if (proto.dateRange) {
1433
- m.dateRange = DateRangeFilter.fromProto(proto.dateRange);
1434
- }
1435
- return m;
1436
- }
1437
- /**
1438
- * @param {?=} kwargs
1439
- */
1440
- constructor(kwargs) {
1441
- if (!kwargs) {
1442
- return;
1443
- }
1444
- Object.assign(this, kwargs);
1445
- }
1446
- /**
1447
- * @return {?}
1448
- */
1449
- toApiJson() {
1450
- /** @type {?} */
1451
- const toReturn = {};
1452
- if (typeof this.dateRange !== 'undefined' && this.dateRange !== null) {
1453
- toReturn['dateRange'] = 'toApiJson' in this.dateRange ? ((/** @type {?} */ (this.dateRange))).toApiJson() : this.dateRange;
1454
- }
1455
- if (typeof this.partnerId !== 'undefined') {
1456
- toReturn['partnerId'] = this.partnerId;
1457
- }
1458
- return toReturn;
1459
- }
1460
- }
1461
- class GetMultiSocialPostStatsRequest {
1462
- /**
1463
- * @param {?} proto
1464
- * @return {?}
1465
- */
1466
- static fromProto(proto) {
1467
- /** @type {?} */
1468
- let m = new GetMultiSocialPostStatsRequest();
1469
- m = Object.assign(m, proto);
1470
- return m;
1471
- }
1472
- /**
1473
- * @param {?=} kwargs
1474
- */
1475
- constructor(kwargs) {
1476
- if (!kwargs) {
1477
- return;
1478
- }
1479
- Object.assign(this, kwargs);
1480
- }
1481
- /**
1482
- * @return {?}
1483
- */
1484
- toApiJson() {
1485
- /** @type {?} */
1486
- const toReturn = {};
1487
- if (typeof this.internalPostIds !== 'undefined') {
1488
- toReturn['internalPostIds'] = this.internalPostIds;
1489
- }
1490
- if (typeof this.businessId !== 'undefined') {
1491
- toReturn['businessId'] = this.businessId;
1492
- }
1493
- if (typeof this.partnerId !== 'undefined') {
1494
- toReturn['partnerId'] = this.partnerId;
1495
- }
1496
- return toReturn;
1497
- }
1498
- }
1499
- class GetMultiSocialPostStatsResponse {
1500
- /**
1501
- * @param {?} proto
1502
- * @return {?}
1503
- */
1504
- static fromProto(proto) {
1505
- /** @type {?} */
1506
- let m = new GetMultiSocialPostStatsResponse();
1507
- m = Object.assign(m, proto);
1508
- if (proto.socialPostStats) {
1509
- m.socialPostStats = proto.socialPostStats.map(SocialPostStats.fromProto);
1510
- }
1511
- return m;
1512
- }
1513
- /**
1514
- * @param {?=} kwargs
1515
- */
1516
- constructor(kwargs) {
1517
- if (!kwargs) {
1518
- return;
1519
- }
1520
- Object.assign(this, kwargs);
1521
- }
1522
- /**
1523
- * @return {?}
1524
- */
1525
- toApiJson() {
1526
- /** @type {?} */
1527
- const toReturn = {};
1528
- if (typeof this.socialPostStats !== 'undefined' && this.socialPostStats !== null) {
1529
- toReturn['socialPostStats'] = 'toApiJson' in this.socialPostStats ? ((/** @type {?} */ (this.socialPostStats))).toApiJson() : this.socialPostStats;
1530
- }
1531
- return toReturn;
1532
- }
1533
- }
1534
- class GetMultiSocialPostsRequest {
1535
- /**
1536
- * @param {?} proto
1537
- * @return {?}
1538
- */
1539
- static fromProto(proto) {
1540
- /** @type {?} */
1541
- let m = new GetMultiSocialPostsRequest();
1542
- m = Object.assign(m, proto);
1543
- return m;
1544
- }
1545
- /**
1546
- * @param {?=} kwargs
1547
- */
1548
- constructor(kwargs) {
1549
- if (!kwargs) {
1550
- return;
1551
- }
1552
- Object.assign(this, kwargs);
1553
- }
1554
- /**
1555
- * @return {?}
1556
- */
1557
- toApiJson() {
1558
- /** @type {?} */
1559
- const toReturn = {};
1560
- if (typeof this.businessId !== 'undefined') {
1561
- toReturn['businessId'] = this.businessId;
1562
- }
1563
- if (typeof this.internalPostIds !== 'undefined') {
1564
- toReturn['internalPostIds'] = this.internalPostIds;
1565
- }
1566
- return toReturn;
1567
- }
1568
- }
1569
- class GetMultiSocialPostsResponse {
1570
- /**
1571
- * @param {?} proto
1572
- * @return {?}
1573
- */
1574
- static fromProto(proto) {
1575
- /** @type {?} */
1576
- let m = new GetMultiSocialPostsResponse();
1577
- m = Object.assign(m, proto);
1578
- if (proto.socialPosts) {
1579
- m.socialPosts = proto.socialPosts.map(SocialPost.fromProto);
1580
- }
1581
- return m;
1582
- }
1583
- /**
1584
- * @param {?=} kwargs
1585
- */
1586
- constructor(kwargs) {
1587
- if (!kwargs) {
1588
- return;
1589
- }
1590
- Object.assign(this, kwargs);
1591
- }
1592
- /**
1593
- * @return {?}
1594
- */
1595
- toApiJson() {
1596
- /** @type {?} */
1597
- const toReturn = {};
1598
- if (typeof this.socialPosts !== 'undefined' && this.socialPosts !== null) {
1599
- toReturn['socialPosts'] = 'toApiJson' in this.socialPosts ? ((/** @type {?} */ (this.socialPosts))).toApiJson() : this.socialPosts;
1600
- }
1601
- return toReturn;
1602
- }
1603
- }
1604
- class GetMultilocationPostRequest {
1605
- /**
1606
- * @param {?} proto
1607
- * @return {?}
1608
- */
1609
- static fromProto(proto) {
1610
- /** @type {?} */
1611
- let m = new GetMultilocationPostRequest();
1612
- m = Object.assign(m, proto);
1613
- return m;
1614
- }
1615
- /**
1616
- * @param {?=} kwargs
1617
- */
1618
- constructor(kwargs) {
1619
- if (!kwargs) {
1620
- return;
1621
- }
1622
- Object.assign(this, kwargs);
1623
- }
1624
- /**
1625
- * @return {?}
1626
- */
1627
- toApiJson() {
1628
- /** @type {?} */
1629
- const toReturn = {};
1630
- if (typeof this.brandId !== 'undefined') {
1631
- toReturn['brandId'] = this.brandId;
1632
- }
1633
- if (typeof this.multilocationId !== 'undefined') {
1634
- toReturn['multilocationId'] = this.multilocationId;
1635
- }
1636
- return toReturn;
1637
- }
1638
- }
1639
- class GetMultilocationPostResponse {
1640
- /**
1641
- * @param {?} proto
1642
- * @return {?}
1643
- */
1644
- static fromProto(proto) {
1645
- /** @type {?} */
1646
- let m = new GetMultilocationPostResponse();
1647
- m = Object.assign(m, proto);
1648
- if (proto.multilocationPost) {
1649
- m.multilocationPost = MultilocationPost.fromProto(proto.multilocationPost);
1650
- }
1651
- return m;
1652
- }
1653
- /**
1654
- * @param {?=} kwargs
1655
- */
1656
- constructor(kwargs) {
1657
- if (!kwargs) {
1658
- return;
1659
- }
1660
- Object.assign(this, kwargs);
1661
- }
1662
- /**
1663
- * @return {?}
1664
- */
1665
- toApiJson() {
1666
- /** @type {?} */
1667
- const toReturn = {};
1668
- if (typeof this.multilocationPost !== 'undefined' && this.multilocationPost !== null) {
1669
- toReturn['multilocationPost'] = 'toApiJson' in this.multilocationPost ? ((/** @type {?} */ (this.multilocationPost))).toApiJson() : this.multilocationPost;
1670
- }
1671
- return toReturn;
1672
- }
1673
- }
1674
- class GetPostTemplateRequest {
1675
- /**
1676
- * @param {?} proto
1677
- * @return {?}
1678
- */
1679
- static fromProto(proto) {
1680
- /** @type {?} */
1681
- let m = new GetPostTemplateRequest();
1682
- m = Object.assign(m, proto);
1683
- return m;
1684
- }
1685
- /**
1686
- * @param {?=} kwargs
1687
- */
1688
- constructor(kwargs) {
1689
- if (!kwargs) {
1690
- return;
1691
- }
1692
- Object.assign(this, kwargs);
1693
- }
1694
- /**
1695
- * @return {?}
1696
- */
1697
- toApiJson() {
1698
- /** @type {?} */
1699
- const toReturn = {};
1700
- if (typeof this.accountGroupId !== 'undefined') {
1701
- toReturn['accountGroupId'] = this.accountGroupId;
1702
- }
1703
- if (typeof this.templateId !== 'undefined') {
1704
- toReturn['templateId'] = this.templateId;
1705
- }
1706
- return toReturn;
1707
- }
1708
- }
1709
- class GetPostTemplateResponse {
1710
- /**
1711
- * @param {?} proto
1712
- * @return {?}
1713
- */
1714
- static fromProto(proto) {
1715
- /** @type {?} */
1716
- let m = new GetPostTemplateResponse();
1717
- m = Object.assign(m, proto);
1718
- if (proto.postTemplate) {
1719
- m.postTemplate = PostTemplate.fromProto(proto.postTemplate);
1720
- }
1721
- return m;
1722
- }
1723
- /**
1724
- * @param {?=} kwargs
1725
- */
1726
- constructor(kwargs) {
1727
- if (!kwargs) {
1728
- return;
1729
- }
1730
- Object.assign(this, kwargs);
1731
- }
1732
- /**
1733
- * @return {?}
1734
- */
1735
- toApiJson() {
1736
- /** @type {?} */
1737
- const toReturn = {};
1738
- if (typeof this.postTemplate !== 'undefined' && this.postTemplate !== null) {
1739
- toReturn['postTemplate'] = 'toApiJson' in this.postTemplate ? ((/** @type {?} */ (this.postTemplate))).toApiJson() : this.postTemplate;
1740
- }
1741
- return toReturn;
1742
- }
1743
- }
1744
- class GetScheduledPostCountRequest {
1745
- /**
1746
- * @param {?} proto
1747
- * @return {?}
1748
- */
1749
- static fromProto(proto) {
1750
- /** @type {?} */
1751
- let m = new GetScheduledPostCountRequest();
1752
- m = Object.assign(m, proto);
1753
- return m;
1754
- }
1755
- /**
1756
- * @param {?=} kwargs
1757
- */
1758
- constructor(kwargs) {
1759
- if (!kwargs) {
1760
- return;
1761
- }
1762
- Object.assign(this, kwargs);
1763
- }
1764
- /**
1765
- * @return {?}
1766
- */
1767
- toApiJson() {
1768
- /** @type {?} */
1769
- const toReturn = {};
1770
- if (typeof this.partnerId !== 'undefined') {
1771
- toReturn['partnerId'] = this.partnerId;
1772
- }
1773
- if (typeof this.businessId !== 'undefined') {
1774
- toReturn['businessId'] = this.businessId;
1775
- }
1776
- if (typeof this.socialServiceIds !== 'undefined') {
1777
- toReturn['socialServiceIds'] = this.socialServiceIds;
1778
- }
1779
- return toReturn;
1780
- }
1781
- }
1782
- class GetScheduledPostCountResponse {
1783
- /**
1784
- * @param {?} proto
1785
- * @return {?}
1786
- */
1787
- static fromProto(proto) {
1788
- /** @type {?} */
1789
- let m = new GetScheduledPostCountResponse();
1790
- m = Object.assign(m, proto);
1791
- if (proto.count) {
1792
- m.count = parseInt(proto.count, 10);
1793
- }
1794
- return m;
1795
- }
1796
- /**
1797
- * @param {?=} kwargs
1798
- */
1799
- constructor(kwargs) {
1800
- if (!kwargs) {
1801
- return;
1802
- }
1803
- Object.assign(this, kwargs);
1804
- }
1805
- /**
1806
- * @return {?}
1807
- */
1808
- toApiJson() {
1809
- /** @type {?} */
1810
- const toReturn = {};
1811
- if (typeof this.count !== 'undefined') {
1812
- toReturn['count'] = this.count;
1813
- }
1814
- return toReturn;
1815
- }
1816
- }
1817
- class ListMultilocationPostsForBrandRequest {
1818
- /**
1819
- * @param {?} proto
1820
- * @return {?}
1821
- */
1822
- static fromProto(proto) {
1823
- /** @type {?} */
1824
- let m = new ListMultilocationPostsForBrandRequest();
1825
- m = Object.assign(m, proto);
1826
- if (proto.startDate) {
1827
- m.startDate = new Date(proto.startDate);
1828
- }
1829
- if (proto.endDate) {
1830
- m.endDate = new Date(proto.endDate);
1831
- }
1832
- if (proto.pageSize) {
1833
- m.pageSize = parseInt(proto.pageSize, 10);
1834
- }
1835
- return m;
1836
- }
1837
- /**
1838
- * @param {?=} kwargs
1839
- */
1840
- constructor(kwargs) {
1841
- if (!kwargs) {
1842
- return;
1843
- }
1844
- Object.assign(this, kwargs);
1845
- }
1846
- /**
1847
- * @return {?}
1848
- */
1849
- toApiJson() {
1850
- /** @type {?} */
1851
- const toReturn = {};
1852
- if (typeof this.brandId !== 'undefined') {
1853
- toReturn['brandId'] = this.brandId;
1854
- }
1855
- if (typeof this.startDate !== 'undefined' && this.startDate !== null) {
1856
- toReturn['startDate'] = 'toApiJson' in this.startDate ? ((/** @type {?} */ (this.startDate))).toApiJson() : this.startDate;
1857
- }
1858
- if (typeof this.endDate !== 'undefined' && this.endDate !== null) {
1859
- toReturn['endDate'] = 'toApiJson' in this.endDate ? ((/** @type {?} */ (this.endDate))).toApiJson() : this.endDate;
1860
- }
1861
- if (typeof this.cursor !== 'undefined') {
1862
- toReturn['cursor'] = this.cursor;
1863
- }
1864
- if (typeof this.pageSize !== 'undefined') {
1865
- toReturn['pageSize'] = this.pageSize;
1866
- }
1867
- return toReturn;
1868
- }
1869
- }
1870
- class ListMultilocationPostsForBrandResponse {
1871
- /**
1872
- * @param {?} proto
1873
- * @return {?}
1874
- */
1875
- static fromProto(proto) {
1876
- /** @type {?} */
1877
- let m = new ListMultilocationPostsForBrandResponse();
1878
- m = Object.assign(m, proto);
1879
- if (proto.multilocationPosts) {
1880
- m.multilocationPosts = proto.multilocationPosts.map(MultilocationPost.fromProto);
1881
- }
1882
- if (proto.failedSocialPosts) {
1883
- m.failedSocialPosts = proto.failedSocialPosts.map(SocialPost.fromProto);
1884
- }
1885
- return m;
1886
- }
1887
- /**
1888
- * @param {?=} kwargs
1889
- */
1890
- constructor(kwargs) {
1891
- if (!kwargs) {
1892
- return;
1893
- }
1894
- Object.assign(this, kwargs);
1895
- }
1896
- /**
1897
- * @return {?}
1898
- */
1899
- toApiJson() {
1900
- /** @type {?} */
1901
- const toReturn = {};
1902
- if (typeof this.multilocationPosts !== 'undefined' && this.multilocationPosts !== null) {
1903
- toReturn['multilocationPosts'] = 'toApiJson' in this.multilocationPosts ? ((/** @type {?} */ (this.multilocationPosts))).toApiJson() : this.multilocationPosts;
1904
- }
1905
- if (typeof this.nextCursor !== 'undefined') {
1906
- toReturn['nextCursor'] = this.nextCursor;
1907
- }
1908
- if (typeof this.hasMore !== 'undefined') {
1909
- toReturn['hasMore'] = this.hasMore;
1910
- }
1911
- if (typeof this.failedSocialPosts !== 'undefined' && this.failedSocialPosts !== null) {
1912
- toReturn['failedSocialPosts'] = 'toApiJson' in this.failedSocialPosts ? ((/** @type {?} */ (this.failedSocialPosts))).toApiJson() : this.failedSocialPosts;
1913
- }
1914
- return toReturn;
1915
- }
1916
- }
1917
- class ListPostTemplatesRequest {
1918
- /**
1919
- * @param {?} proto
1920
- * @return {?}
1921
- */
1922
- static fromProto(proto) {
1923
- /** @type {?} */
1924
- let m = new ListPostTemplatesRequest();
1925
- m = Object.assign(m, proto);
1926
- if (proto.pageSize) {
1927
- m.pageSize = parseInt(proto.pageSize, 10);
1928
- }
1929
- return m;
1930
- }
1931
- /**
1932
- * @param {?=} kwargs
1933
- */
1934
- constructor(kwargs) {
1935
- if (!kwargs) {
1936
- return;
1937
- }
1938
- Object.assign(this, kwargs);
1939
- }
1940
- /**
1941
- * @return {?}
1942
- */
1943
- toApiJson() {
1944
- /** @type {?} */
1945
- const toReturn = {};
1946
- if (typeof this.accountGroupId !== 'undefined') {
1947
- toReturn['accountGroupId'] = this.accountGroupId;
1948
- }
1949
- if (typeof this.cursor !== 'undefined') {
1950
- toReturn['cursor'] = this.cursor;
1951
- }
1952
- if (typeof this.pageSize !== 'undefined') {
1953
- toReturn['pageSize'] = this.pageSize;
1954
- }
1955
- return toReturn;
1956
- }
1957
- }
1958
- class ListPostTemplatesResponse {
1959
- /**
1960
- * @param {?} proto
1961
- * @return {?}
1962
- */
1963
- static fromProto(proto) {
1964
- /** @type {?} */
1965
- let m = new ListPostTemplatesResponse();
1966
- m = Object.assign(m, proto);
1967
- if (proto.postTemplate) {
1968
- m.postTemplate = proto.postTemplate.map(PostTemplate.fromProto);
1969
- }
1970
- return m;
1971
- }
1972
- /**
1973
- * @param {?=} kwargs
1974
- */
1975
- constructor(kwargs) {
1976
- if (!kwargs) {
1977
- return;
1978
- }
1979
- Object.assign(this, kwargs);
1980
- }
1981
- /**
1982
- * @return {?}
1983
- */
1984
- toApiJson() {
1985
- /** @type {?} */
1986
- const toReturn = {};
1987
- if (typeof this.postTemplate !== 'undefined' && this.postTemplate !== null) {
1988
- toReturn['postTemplate'] = 'toApiJson' in this.postTemplate ? ((/** @type {?} */ (this.postTemplate))).toApiJson() : this.postTemplate;
1989
- }
1990
- if (typeof this.nextCursor !== 'undefined') {
1991
- toReturn['nextCursor'] = this.nextCursor;
1992
- }
1993
- if (typeof this.hasMore !== 'undefined') {
1994
- toReturn['hasMore'] = this.hasMore;
1995
- }
1996
- return toReturn;
1997
- }
1998
- }
1999
- class ListSocialPostsRequest {
2000
- /**
2001
- * @param {?} proto
2002
- * @return {?}
2003
- */
2004
- static fromProto(proto) {
2005
- /** @type {?} */
2006
- let m = new ListSocialPostsRequest();
2007
- m = Object.assign(m, proto);
2008
- if (proto.start) {
2009
- m.start = new Date(proto.start);
2010
- }
2011
- if (proto.end) {
2012
- m.end = new Date(proto.end);
2013
- }
2014
- if (proto.pageSize) {
2015
- m.pageSize = parseInt(proto.pageSize, 10);
2016
- }
2017
- return m;
2018
- }
2019
- /**
2020
- * @param {?=} kwargs
2021
- */
2022
- constructor(kwargs) {
2023
- if (!kwargs) {
2024
- return;
2025
- }
2026
- Object.assign(this, kwargs);
2027
- }
2028
- /**
2029
- * @return {?}
2030
- */
2031
- toApiJson() {
2032
- /** @type {?} */
2033
- const toReturn = {};
2034
- if (typeof this.start !== 'undefined' && this.start !== null) {
2035
- toReturn['start'] = 'toApiJson' in this.start ? ((/** @type {?} */ (this.start))).toApiJson() : this.start;
2036
- }
2037
- if (typeof this.end !== 'undefined' && this.end !== null) {
2038
- toReturn['end'] = 'toApiJson' in this.end ? ((/** @type {?} */ (this.end))).toApiJson() : this.end;
2039
- }
2040
- if (typeof this.businessId !== 'undefined') {
2041
- toReturn['businessId'] = this.businessId;
2042
- }
2043
- if (typeof this.partnerId !== 'undefined') {
2044
- toReturn['partnerId'] = this.partnerId;
2045
- }
2046
- if (typeof this.cursor !== 'undefined') {
2047
- toReturn['cursor'] = this.cursor;
2048
- }
2049
- if (typeof this.socialServiceIds !== 'undefined') {
2050
- toReturn['socialServiceIds'] = this.socialServiceIds;
2051
- }
2052
- if (typeof this.tags !== 'undefined') {
2053
- toReturn['tags'] = this.tags;
2054
- }
2055
- if (typeof this.pageSize !== 'undefined') {
2056
- toReturn['pageSize'] = this.pageSize;
2057
- }
2058
- return toReturn;
2059
- }
2060
- }
2061
- class ListSocialPostsResponse {
2062
- /**
2063
- * @param {?} proto
2064
- * @return {?}
2065
- */
2066
- static fromProto(proto) {
2067
- /** @type {?} */
2068
- let m = new ListSocialPostsResponse();
2069
- m = Object.assign(m, proto);
2070
- if (proto.socialPosts) {
2071
- m.socialPosts = proto.socialPosts.map(SocialPost.fromProto);
2072
- }
2073
- return m;
2074
- }
2075
- /**
2076
- * @param {?=} kwargs
2077
- */
2078
- constructor(kwargs) {
2079
- if (!kwargs) {
2080
- return;
2081
- }
2082
- Object.assign(this, kwargs);
2083
- }
2084
- /**
2085
- * @return {?}
2086
- */
2087
- toApiJson() {
2088
- /** @type {?} */
2089
- const toReturn = {};
2090
- if (typeof this.socialPosts !== 'undefined' && this.socialPosts !== null) {
2091
- toReturn['socialPosts'] = 'toApiJson' in this.socialPosts ? ((/** @type {?} */ (this.socialPosts))).toApiJson() : this.socialPosts;
2092
- }
2093
- if (typeof this.nextCursor !== 'undefined') {
2094
- toReturn['nextCursor'] = this.nextCursor;
2095
- }
2096
- if (typeof this.hasMore !== 'undefined') {
2097
- toReturn['hasMore'] = this.hasMore;
2098
- }
2099
- return toReturn;
2100
- }
2101
- }
2102
- class PartnerListScheduledPostsResponse {
2103
- /**
2104
- * @param {?} proto
2105
- * @return {?}
2106
- */
2107
- static fromProto(proto) {
2108
- /** @type {?} */
2109
- let m = new PartnerListScheduledPostsResponse();
2110
- m = Object.assign(m, proto);
2111
- if (proto.socialPosts) {
2112
- m.socialPosts = proto.socialPosts.map(SocialPost.fromProto);
2113
- }
2114
- return m;
2115
- }
2116
- /**
2117
- * @param {?=} kwargs
2118
- */
2119
- constructor(kwargs) {
2120
- if (!kwargs) {
2121
- return;
2122
- }
2123
- Object.assign(this, kwargs);
2124
- }
2125
- /**
2126
- * @return {?}
2127
- */
2128
- toApiJson() {
2129
- /** @type {?} */
2130
- const toReturn = {};
2131
- if (typeof this.socialPosts !== 'undefined' && this.socialPosts !== null) {
2132
- toReturn['socialPosts'] = 'toApiJson' in this.socialPosts ? ((/** @type {?} */ (this.socialPosts))).toApiJson() : this.socialPosts;
2133
- }
2134
- if (typeof this.nextCursor !== 'undefined') {
2135
- toReturn['nextCursor'] = this.nextCursor;
2136
- }
2137
- if (typeof this.hasMore !== 'undefined') {
2138
- toReturn['hasMore'] = this.hasMore;
2139
- }
2140
- return toReturn;
2141
- }
2142
- }
2143
- class PartnerListScheduledSocialPostsRequest {
2144
- /**
2145
- * @param {?} proto
2146
- * @return {?}
2147
- */
2148
- static fromProto(proto) {
2149
- /** @type {?} */
2150
- let m = new PartnerListScheduledSocialPostsRequest();
2151
- m = Object.assign(m, proto);
2152
- if (proto.filters) {
2153
- m.filters = PartnerListScheduledSocialPostsRequestFilters.fromProto(proto.filters);
2154
- }
2155
- if (proto.pageSize) {
2156
- m.pageSize = parseInt(proto.pageSize, 10);
2157
- }
2158
- return m;
2159
- }
2160
- /**
2161
- * @param {?=} kwargs
2162
- */
2163
- constructor(kwargs) {
2164
- if (!kwargs) {
2165
- return;
2166
- }
2167
- Object.assign(this, kwargs);
2168
- }
2169
- /**
2170
- * @return {?}
2171
- */
2172
- toApiJson() {
2173
- /** @type {?} */
2174
- const toReturn = {};
2175
- if (typeof this.cursor !== 'undefined') {
2176
- toReturn['cursor'] = this.cursor;
2177
- }
2178
- if (typeof this.filters !== 'undefined' && this.filters !== null) {
2179
- toReturn['filters'] = 'toApiJson' in this.filters ? ((/** @type {?} */ (this.filters))).toApiJson() : this.filters;
2180
- }
2181
- if (typeof this.pageSize !== 'undefined') {
2182
- toReturn['pageSize'] = this.pageSize;
2183
- }
2184
- return toReturn;
2185
- }
2186
- }
2187
- class RemoveFromMultilocationPostRequest {
2188
- /**
2189
- * @param {?} proto
2190
- * @return {?}
2191
- */
2192
- static fromProto(proto) {
2193
- /** @type {?} */
2194
- let m = new RemoveFromMultilocationPostRequest();
2195
- m = Object.assign(m, proto);
2196
- if (proto.reason) {
2197
- m.reason = enumStringToValue$5(RemoveReason, proto.reason);
2198
- }
2199
- if (proto.locations) {
2200
- m.locations = proto.locations.map(Location.fromProto);
2201
- }
2202
- return m;
2203
- }
2204
- /**
2205
- * @param {?=} kwargs
2206
- */
2207
- constructor(kwargs) {
2208
- if (!kwargs) {
2209
- return;
2210
- }
2211
- Object.assign(this, kwargs);
2212
- }
2213
- /**
2214
- * @return {?}
2215
- */
2216
- toApiJson() {
2217
- /** @type {?} */
2218
- const toReturn = {};
2219
- if (typeof this.reason !== 'undefined') {
2220
- toReturn['reason'] = this.reason;
2221
- }
2222
- if (typeof this.brandId !== 'undefined') {
2223
- toReturn['brandId'] = this.brandId;
2224
- }
2225
- if (typeof this.multilocationId !== 'undefined') {
2226
- toReturn['multilocationId'] = this.multilocationId;
2227
- }
2228
- if (typeof this.locations !== 'undefined' && this.locations !== null) {
2229
- toReturn['locations'] = 'toApiJson' in this.locations ? ((/** @type {?} */ (this.locations))).toApiJson() : this.locations;
2230
- }
2231
- return toReturn;
2232
- }
2233
- }
2234
- class SchedulePostRequest {
2235
- /**
2236
- * @param {?} proto
2237
- * @return {?}
2238
- */
2239
- static fromProto(proto) {
2240
- /** @type {?} */
2241
- let m = new SchedulePostRequest();
2242
- m = Object.assign(m, proto);
2243
- if (proto.socialPost) {
2244
- m.socialPost = SocialPostData.fromProto(proto.socialPost);
2245
- }
2246
- return m;
2247
- }
2248
- /**
2249
- * @param {?=} kwargs
2250
- */
2251
- constructor(kwargs) {
2252
- if (!kwargs) {
2253
- return;
2254
- }
2255
- Object.assign(this, kwargs);
2256
- }
2257
- /**
2258
- * @return {?}
2259
- */
2260
- toApiJson() {
2261
- /** @type {?} */
2262
- const toReturn = {};
2263
- if (typeof this.socialPost !== 'undefined' && this.socialPost !== null) {
2264
- toReturn['socialPost'] = 'toApiJson' in this.socialPost ? ((/** @type {?} */ (this.socialPost))).toApiJson() : this.socialPost;
2265
- }
2266
- if (typeof this.socialServiceIds !== 'undefined') {
2267
- toReturn['socialServiceIds'] = this.socialServiceIds;
2268
- }
2269
- if (typeof this.partnerId !== 'undefined') {
2270
- toReturn['partnerId'] = this.partnerId;
2271
- }
2272
- if (typeof this.businessId !== 'undefined') {
2273
- toReturn['businessId'] = this.businessId;
2274
- }
2275
- return toReturn;
2276
- }
2277
- }
2278
- class SchedulePostResponse {
2279
- /**
2280
- * @param {?} proto
2281
- * @return {?}
2282
- */
2283
- static fromProto(proto) {
2284
- /** @type {?} */
2285
- let m = new SchedulePostResponse();
2286
- m = Object.assign(m, proto);
2287
- if (proto.statuses) {
2288
- m.statuses = proto.statuses.map(SchedulePostStatus.fromProto);
2289
- }
2290
- return m;
2291
- }
2292
- /**
2293
- * @param {?=} kwargs
2294
- */
2295
- constructor(kwargs) {
2296
- if (!kwargs) {
2297
- return;
2298
- }
2299
- Object.assign(this, kwargs);
2300
- }
2301
- /**
2302
- * @return {?}
2303
- */
2304
- toApiJson() {
2305
- /** @type {?} */
2306
- const toReturn = {};
2307
- if (typeof this.statuses !== 'undefined' && this.statuses !== null) {
2308
- toReturn['statuses'] = 'toApiJson' in this.statuses ? ((/** @type {?} */ (this.statuses))).toApiJson() : this.statuses;
2309
- }
2310
- return toReturn;
2311
- }
2312
- }
2313
- class ScheduleToAllPagesRequest {
2314
- /**
2315
- * @param {?} proto
2316
- * @return {?}
2317
- */
2318
- static fromProto(proto) {
2319
- /** @type {?} */
2320
- let m = new ScheduleToAllPagesRequest();
2321
- m = Object.assign(m, proto);
2322
- if (proto.socialPost) {
2323
- m.socialPost = SocialPostData.fromProto(proto.socialPost);
2324
- }
2325
- return m;
2326
- }
2327
- /**
2328
- * @param {?=} kwargs
2329
- */
2330
- constructor(kwargs) {
2331
- if (!kwargs) {
2332
- return;
2333
- }
2334
- Object.assign(this, kwargs);
2335
- }
2336
- /**
2337
- * @return {?}
2338
- */
2339
- toApiJson() {
2340
- /** @type {?} */
2341
- const toReturn = {};
2342
- if (typeof this.socialPost !== 'undefined' && this.socialPost !== null) {
2343
- toReturn['socialPost'] = 'toApiJson' in this.socialPost ? ((/** @type {?} */ (this.socialPost))).toApiJson() : this.socialPost;
2344
- }
2345
- if (typeof this.partnerId !== 'undefined') {
2346
- toReturn['partnerId'] = this.partnerId;
2347
- }
2348
- if (typeof this.businessId !== 'undefined') {
2349
- toReturn['businessId'] = this.businessId;
2350
- }
2351
- return toReturn;
2352
- }
2353
- }
2354
- class ScheduleToAllPagesResponse {
2355
- /**
2356
- * @param {?} proto
2357
- * @return {?}
2358
- */
2359
- static fromProto(proto) {
2360
- /** @type {?} */
2361
- let m = new ScheduleToAllPagesResponse();
2362
- m = Object.assign(m, proto);
2363
- if (proto.statuses) {
2364
- m.statuses = proto.statuses.map(SchedulePostStatus.fromProto);
2365
- }
2366
- return m;
2367
- }
2368
- /**
2369
- * @param {?=} kwargs
2370
- */
2371
- constructor(kwargs) {
2372
- if (!kwargs) {
2373
- return;
2374
- }
2375
- Object.assign(this, kwargs);
2376
- }
2377
- /**
2378
- * @return {?}
2379
- */
2380
- toApiJson() {
2381
- /** @type {?} */
2382
- const toReturn = {};
2383
- if (typeof this.statuses !== 'undefined' && this.statuses !== null) {
2384
- toReturn['statuses'] = 'toApiJson' in this.statuses ? ((/** @type {?} */ (this.statuses))).toApiJson() : this.statuses;
2385
- }
2386
- return toReturn;
2387
- }
2388
- }
2389
- class UpdatePostTemplateRequest {
2390
- /**
2391
- * @param {?} proto
2392
- * @return {?}
2393
- */
2394
- static fromProto(proto) {
2395
- /** @type {?} */
2396
- let m = new UpdatePostTemplateRequest();
2397
- m = Object.assign(m, proto);
2398
- if (proto.postDateTime) {
2399
- m.postDateTime = new Date(proto.postDateTime);
2400
- }
2401
- return m;
2402
- }
2403
- /**
2404
- * @param {?=} kwargs
2405
- */
2406
- constructor(kwargs) {
2407
- if (!kwargs) {
2408
- return;
2409
- }
2410
- Object.assign(this, kwargs);
2411
- }
2412
- /**
2413
- * @return {?}
2414
- */
2415
- toApiJson() {
2416
- /** @type {?} */
2417
- const toReturn = {};
2418
- if (typeof this.accountGroupId !== 'undefined') {
2419
- toReturn['accountGroupId'] = this.accountGroupId;
2420
- }
2421
- if (typeof this.templateId !== 'undefined') {
2422
- toReturn['templateId'] = this.templateId;
2423
- }
2424
- if (typeof this.title !== 'undefined') {
2425
- toReturn['title'] = this.title;
2426
- }
2427
- if (typeof this.postText !== 'undefined') {
2428
- toReturn['postText'] = this.postText;
2429
- }
2430
- if (typeof this.postDateTime !== 'undefined' && this.postDateTime !== null) {
2431
- toReturn['postDateTime'] = 'toApiJson' in this.postDateTime ? ((/** @type {?} */ (this.postDateTime))).toApiJson() : this.postDateTime;
2432
- }
2433
- if (typeof this.gmbPostCustomization !== 'undefined') {
2434
- toReturn['gmbPostCustomization'] = this.gmbPostCustomization;
2435
- }
2436
- if (typeof this.imageUrl !== 'undefined') {
2437
- toReturn['imageUrl'] = this.imageUrl;
2438
- }
2439
- if (typeof this.imagePath !== 'undefined') {
2440
- toReturn['imagePath'] = this.imagePath;
2441
- }
2442
- if (typeof this.imageSize !== 'undefined') {
2443
- toReturn['imageSize'] = this.imageSize;
2444
- }
2445
- if (typeof this.previews !== 'undefined') {
2446
- toReturn['previews'] = this.previews;
2447
- }
2448
- if (typeof this.options !== 'undefined') {
2449
- toReturn['options'] = this.options;
2450
- }
2451
- if (typeof this.videoUrl !== 'undefined') {
2452
- toReturn['videoUrl'] = this.videoUrl;
2453
- }
2454
- return toReturn;
2455
- }
2456
- }
2457
-
2458
- /**
2459
- * @fileoverview added by tsickle
2460
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
2461
- */
2462
-
2463
- /**
2464
- * @fileoverview added by tsickle
2465
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
2466
- */
2467
- class PostTemplatesApiService {
2468
- /**
2469
- * @param {?} http
2470
- * @param {?} hostService
2471
- */
2472
- constructor(http, hostService) {
2473
- this.http = http;
2474
- this.hostService = hostService;
2475
- }
2476
- /**
2477
- * @private
2478
- * @return {?}
2479
- */
2480
- apiOptions() {
2481
- return {
2482
- headers: new HttpHeaders({
2483
- 'Content-Type': 'application/json'
2484
- }),
2485
- withCredentials: true
2486
- };
2487
- }
2488
- /**
2489
- * @param {?} r
2490
- * @return {?}
2491
- */
2492
- updatePostTemplate(r) {
2493
- /** @type {?} */
2494
- const request = (((/** @type {?} */ (r))).toApiJson) ? ((/** @type {?} */ (r))) : new UpdatePostTemplateRequest(r);
2495
- return this.http.post(this.hostService.hostWithScheme() + "/socialposts.v1.PostTemplates/UpdatePostTemplate", request.toApiJson(), Object.assign({}, this.apiOptions(), { observe: 'response' }));
2496
- }
2497
- /**
2498
- * @param {?} r
2499
- * @return {?}
2500
- */
2501
- createPostTemplate(r) {
2502
- /** @type {?} */
2503
- const request = (((/** @type {?} */ (r))).toApiJson) ? ((/** @type {?} */ (r))) : new CreatePostTemplateRequest(r);
2504
- return this.http.post(this.hostService.hostWithScheme() + "/socialposts.v1.PostTemplates/CreatePostTemplate", request.toApiJson(), this.apiOptions())
2505
- .pipe(map((/**
2506
- * @param {?} resp
2507
- * @return {?}
2508
- */
2509
- resp => CreatePostTemplateResponse.fromProto(resp))), share());
2510
- }
2511
- /**
2512
- * @param {?} r
2513
- * @return {?}
2514
- */
2515
- getPostTemplate(r) {
2516
- /** @type {?} */
2517
- const request = (((/** @type {?} */ (r))).toApiJson) ? ((/** @type {?} */ (r))) : new GetPostTemplateRequest(r);
2518
- return this.http.post(this.hostService.hostWithScheme() + "/socialposts.v1.PostTemplates/GetPostTemplate", request.toApiJson(), this.apiOptions())
2519
- .pipe(map((/**
2520
- * @param {?} resp
2521
- * @return {?}
2522
- */
2523
- resp => GetPostTemplateResponse.fromProto(resp))), share());
2524
- }
2525
- /**
2526
- * @param {?} r
2527
- * @return {?}
2528
- */
2529
- listPostTemplates(r) {
2530
- /** @type {?} */
2531
- const request = (((/** @type {?} */ (r))).toApiJson) ? ((/** @type {?} */ (r))) : new ListPostTemplatesRequest(r);
2532
- return this.http.post(this.hostService.hostWithScheme() + "/socialposts.v1.PostTemplates/ListPostTemplates", request.toApiJson(), this.apiOptions())
2533
- .pipe(map((/**
2534
- * @param {?} resp
2535
- * @return {?}
2536
- */
2537
- resp => ListPostTemplatesResponse.fromProto(resp))), share());
2538
- }
2539
- /**
2540
- * @param {?} r
2541
- * @return {?}
2542
- */
2543
- deletePostTemplate(r) {
2544
- /** @type {?} */
2545
- const request = (((/** @type {?} */ (r))).toApiJson) ? ((/** @type {?} */ (r))) : new DeletePostTemplateRequest(r);
2546
- return this.http.post(this.hostService.hostWithScheme() + "/socialposts.v1.PostTemplates/DeletePostTemplate", request.toApiJson(), Object.assign({}, this.apiOptions(), { observe: 'response' }));
2547
- }
2548
- }
2549
- PostTemplatesApiService.decorators = [
2550
- { type: Injectable, args: [{ providedIn: 'root' },] }
2551
- ];
2552
- /** @nocollapse */
2553
- PostTemplatesApiService.ctorParameters = () => [
2554
- { type: HttpClient },
2555
- { type: HostService }
2556
- ];
2557
- /** @nocollapse */ PostTemplatesApiService.ngInjectableDef = ɵɵdefineInjectable({ factory: function PostTemplatesApiService_Factory() { return new PostTemplatesApiService(ɵɵinject(HttpClient), ɵɵinject(HostService)); }, token: PostTemplatesApiService, providedIn: "root" });
2558
-
2559
- /**
2560
- * @fileoverview added by tsickle
2561
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
2562
- */
2563
- class SocialPostsApiService {
2564
- /**
2565
- * @param {?} http
2566
- * @param {?} hostService
2567
- */
2568
- constructor(http, hostService) {
2569
- this.http = http;
2570
- this.hostService = hostService;
2571
- }
2572
- /**
2573
- * @private
2574
- * @return {?}
2575
- */
2576
- apiOptions() {
2577
- return {
2578
- headers: new HttpHeaders({
2579
- 'Content-Type': 'application/json'
2580
- }),
2581
- withCredentials: true
2582
- };
2583
- }
2584
- /**
2585
- * @param {?} r
2586
- * @return {?}
2587
- */
2588
- list(r) {
2589
- /** @type {?} */
2590
- const request = (((/** @type {?} */ (r))).toApiJson) ? ((/** @type {?} */ (r))) : new ListSocialPostsRequest(r);
2591
- return this.http.post(this.hostService.hostWithScheme() + "/socialposts.v1.SocialPosts/List", request.toApiJson(), this.apiOptions())
2592
- .pipe(map((/**
2593
- * @param {?} resp
2594
- * @return {?}
2595
- */
2596
- resp => ListSocialPostsResponse.fromProto(resp))), share());
2597
- }
2598
- /**
2599
- * @param {?} r
2600
- * @return {?}
2601
- */
2602
- deleteSocialPost(r) {
2603
- /** @type {?} */
2604
- const request = (((/** @type {?} */ (r))).toApiJson) ? ((/** @type {?} */ (r))) : new DeleteSocialPostRequest(r);
2605
- return this.http.post(this.hostService.hostWithScheme() + "/socialposts.v1.SocialPosts/DeleteSocialPost", request.toApiJson(), Object.assign({}, this.apiOptions(), { observe: 'response' }));
2606
- }
2607
- /**
2608
- * @param {?} r
2609
- * @return {?}
2610
- */
2611
- scheduleToAllPages(r) {
2612
- /** @type {?} */
2613
- const request = (((/** @type {?} */ (r))).toApiJson) ? ((/** @type {?} */ (r))) : new ScheduleToAllPagesRequest(r);
2614
- return this.http.post(this.hostService.hostWithScheme() + "/socialposts.v1.SocialPosts/ScheduleToAllPages", request.toApiJson(), this.apiOptions())
2615
- .pipe(map((/**
2616
- * @param {?} resp
2617
- * @return {?}
2618
- */
2619
- resp => ScheduleToAllPagesResponse.fromProto(resp))), share());
2620
- }
2621
- /**
2622
- * @param {?} r
2623
- * @return {?}
2624
- */
2625
- schedule(r) {
2626
- /** @type {?} */
2627
- const request = (((/** @type {?} */ (r))).toApiJson) ? ((/** @type {?} */ (r))) : new SchedulePostRequest(r);
2628
- return this.http.post(this.hostService.hostWithScheme() + "/socialposts.v1.SocialPosts/Schedule", request.toApiJson(), this.apiOptions())
2629
- .pipe(map((/**
2630
- * @param {?} resp
2631
- * @return {?}
2632
- */
2633
- resp => SchedulePostResponse.fromProto(resp))), share());
2634
- }
2635
- /**
2636
- * @param {?} r
2637
- * @return {?}
2638
- */
2639
- getMultiSocialPosts(r) {
2640
- /** @type {?} */
2641
- const request = (((/** @type {?} */ (r))).toApiJson) ? ((/** @type {?} */ (r))) : new GetMultiSocialPostsRequest(r);
2642
- return this.http.post(this.hostService.hostWithScheme() + "/socialposts.v1.SocialPosts/GetMultiSocialPosts", request.toApiJson(), this.apiOptions())
2643
- .pipe(map((/**
2644
- * @param {?} resp
2645
- * @return {?}
2646
- */
2647
- resp => GetMultiSocialPostsResponse.fromProto(resp))), share());
2648
- }
2649
- /**
2650
- * @param {?} r
2651
- * @return {?}
2652
- */
2653
- getMultiSocialPostStats(r) {
2654
- /** @type {?} */
2655
- const request = (((/** @type {?} */ (r))).toApiJson) ? ((/** @type {?} */ (r))) : new GetMultiSocialPostStatsRequest(r);
2656
- return this.http.post(this.hostService.hostWithScheme() + "/socialposts.v1.SocialPosts/GetMultiSocialPostStats", request.toApiJson(), this.apiOptions())
2657
- .pipe(map((/**
2658
- * @param {?} resp
2659
- * @return {?}
2660
- */
2661
- resp => GetMultiSocialPostStatsResponse.fromProto(resp))), share());
2662
- }
2663
- /**
2664
- * @param {?} r
2665
- * @return {?}
2666
- */
2667
- getScheduledPostCount(r) {
2668
- /** @type {?} */
2669
- const request = (((/** @type {?} */ (r))).toApiJson) ? ((/** @type {?} */ (r))) : new GetScheduledPostCountRequest(r);
2670
- return this.http.post(this.hostService.hostWithScheme() + "/socialposts.v1.SocialPosts/GetScheduledPostCount", request.toApiJson(), this.apiOptions())
2671
- .pipe(map((/**
2672
- * @param {?} resp
2673
- * @return {?}
2674
- */
2675
- resp => GetScheduledPostCountResponse.fromProto(resp))), share());
2676
- }
2677
- }
2678
- SocialPostsApiService.decorators = [
2679
- { type: Injectable, args: [{ providedIn: 'root' },] }
2680
- ];
2681
- /** @nocollapse */
2682
- SocialPostsApiService.ctorParameters = () => [
2683
- { type: HttpClient },
2684
- { type: HostService }
2685
- ];
2686
- /** @nocollapse */ SocialPostsApiService.ngInjectableDef = ɵɵdefineInjectable({ factory: function SocialPostsApiService_Factory() { return new SocialPostsApiService(ɵɵinject(HttpClient), ɵɵinject(HostService)); }, token: SocialPostsApiService, providedIn: "root" });
2687
-
2688
- /**
2689
- * @fileoverview added by tsickle
2690
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
2691
- */
2692
- class MultilocationPostApiService {
2693
- /**
2694
- * @param {?} http
2695
- * @param {?} hostService
2696
- */
2697
- constructor(http, hostService) {
2698
- this.http = http;
2699
- this.hostService = hostService;
2700
- }
2701
- /**
2702
- * @private
2703
- * @return {?}
2704
- */
2705
- apiOptions() {
2706
- return {
2707
- headers: new HttpHeaders({
2708
- 'Content-Type': 'application/json'
2709
- }),
2710
- withCredentials: true
2711
- };
2712
- }
2713
- /**
2714
- * @param {?} r
2715
- * @return {?}
2716
- */
2717
- createMultilocationPost(r) {
2718
- /** @type {?} */
2719
- const request = (((/** @type {?} */ (r))).toApiJson) ? ((/** @type {?} */ (r))) : new CreateMultilocationPostRequest(r);
2720
- return this.http.post(this.hostService.hostWithScheme() + "/socialposts.v1.MultilocationPostService/CreateMultilocationPost", request.toApiJson(), this.apiOptions())
2721
- .pipe(map((/**
2722
- * @param {?} resp
2723
- * @return {?}
2724
- */
2725
- resp => CreateMultilocationPostResponse.fromProto(resp))), share());
2726
- }
2727
- /**
2728
- * @param {?} r
2729
- * @return {?}
2730
- */
2731
- editMultilocationPost(r) {
2732
- /** @type {?} */
2733
- const request = (((/** @type {?} */ (r))).toApiJson) ? ((/** @type {?} */ (r))) : new EditMultilocationPostRequest(r);
2734
- return this.http.post(this.hostService.hostWithScheme() + "/socialposts.v1.MultilocationPostService/EditMultilocationPost", request.toApiJson(), this.apiOptions())
2735
- .pipe(map((/**
2736
- * @param {?} resp
2737
- * @return {?}
2738
- */
2739
- resp => EditMultilocationPostResponse.fromProto(resp))), share());
2740
- }
2741
- /**
2742
- * @param {?} r
2743
- * @return {?}
2744
- */
2745
- removeFromMultilocationPost(r) {
2746
- /** @type {?} */
2747
- const request = (((/** @type {?} */ (r))).toApiJson) ? ((/** @type {?} */ (r))) : new RemoveFromMultilocationPostRequest(r);
2748
- return this.http.post(this.hostService.hostWithScheme() + "/socialposts.v1.MultilocationPostService/RemoveFromMultilocationPost", request.toApiJson(), Object.assign({}, this.apiOptions(), { observe: 'response' }));
2749
- }
2750
- /**
2751
- * @param {?} r
2752
- * @return {?}
2753
- */
2754
- listMultilocationPostsForBrand(r) {
2755
- /** @type {?} */
2756
- const request = (((/** @type {?} */ (r))).toApiJson) ? ((/** @type {?} */ (r))) : new ListMultilocationPostsForBrandRequest(r);
2757
- return this.http.post(this.hostService.hostWithScheme() + "/socialposts.v1.MultilocationPostService/ListMultilocationPostsForBrand", request.toApiJson(), this.apiOptions())
2758
- .pipe(map((/**
2759
- * @param {?} resp
2760
- * @return {?}
2761
- */
2762
- resp => ListMultilocationPostsForBrandResponse.fromProto(resp))), share());
2763
- }
2764
- /**
2765
- * @param {?} r
2766
- * @return {?}
2767
- */
2768
- deleteMultilocationPost(r) {
2769
- /** @type {?} */
2770
- const request = (((/** @type {?} */ (r))).toApiJson) ? ((/** @type {?} */ (r))) : new DeleteMultilocationPostRequest(r);
2771
- return this.http.post(this.hostService.hostWithScheme() + "/socialposts.v1.MultilocationPostService/DeleteMultilocationPost", request.toApiJson(), Object.assign({}, this.apiOptions(), { observe: 'response' }));
2772
- }
2773
- /**
2774
- * @param {?} r
2775
- * @return {?}
2776
- */
2777
- getMultilocationPost(r) {
2778
- /** @type {?} */
2779
- const request = (((/** @type {?} */ (r))).toApiJson) ? ((/** @type {?} */ (r))) : new GetMultilocationPostRequest(r);
2780
- return this.http.post(this.hostService.hostWithScheme() + "/socialposts.v1.MultilocationPostService/GetMultilocationPost", request.toApiJson(), this.apiOptions())
2781
- .pipe(map((/**
2782
- * @param {?} resp
2783
- * @return {?}
2784
- */
2785
- resp => GetMultilocationPostResponse.fromProto(resp))), share());
2786
- }
2787
- }
2788
- MultilocationPostApiService.decorators = [
2789
- { type: Injectable, args: [{ providedIn: 'root' },] }
2790
- ];
2791
- /** @nocollapse */
2792
- MultilocationPostApiService.ctorParameters = () => [
2793
- { type: HttpClient },
2794
- { type: HostService }
2795
- ];
2796
- /** @nocollapse */ MultilocationPostApiService.ngInjectableDef = ɵɵdefineInjectable({ factory: function MultilocationPostApiService_Factory() { return new MultilocationPostApiService(ɵɵinject(HttpClient), ɵɵinject(HostService)); }, token: MultilocationPostApiService, providedIn: "root" });
2797
-
2798
- /**
2799
- * @fileoverview added by tsickle
2800
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
2801
- */
2802
- class PartnerSocialPostsApiService {
2803
- /**
2804
- * @param {?} http
2805
- * @param {?} hostService
2806
- */
2807
- constructor(http, hostService) {
2808
- this.http = http;
2809
- this.hostService = hostService;
2810
- }
2811
- /**
2812
- * @private
2813
- * @return {?}
2814
- */
2815
- apiOptions() {
2816
- return {
2817
- headers: new HttpHeaders({
2818
- 'Content-Type': 'application/json'
2819
- }),
2820
- withCredentials: true
2821
- };
2822
- }
2823
- /**
2824
- * @param {?} r
2825
- * @return {?}
2826
- */
2827
- listScheduled(r) {
2828
- /** @type {?} */
2829
- const request = (((/** @type {?} */ (r))).toApiJson) ? ((/** @type {?} */ (r))) : new PartnerListScheduledSocialPostsRequest(r);
2830
- return this.http.post(this.hostService.hostWithScheme() + "/socialposts.v1.PartnerSocialPosts/ListScheduled", request.toApiJson(), this.apiOptions())
2831
- .pipe(map((/**
2832
- * @param {?} resp
2833
- * @return {?}
2834
- */
2835
- resp => PartnerListScheduledPostsResponse.fromProto(resp))), share());
2836
- }
2837
- /**
2838
- * @param {?} r
2839
- * @return {?}
2840
- */
2841
- listScheduledByCreated(r) {
2842
- /** @type {?} */
2843
- const request = (((/** @type {?} */ (r))).toApiJson) ? ((/** @type {?} */ (r))) : new PartnerListScheduledSocialPostsRequest(r);
2844
- return this.http.post(this.hostService.hostWithScheme() + "/socialposts.v1.PartnerSocialPosts/ListScheduledByCreated", request.toApiJson(), this.apiOptions())
2845
- .pipe(map((/**
2846
- * @param {?} resp
2847
- * @return {?}
2848
- */
2849
- resp => PartnerListScheduledPostsResponse.fromProto(resp))), share());
2850
- }
2851
- }
2852
- PartnerSocialPostsApiService.decorators = [
2853
- { type: Injectable, args: [{ providedIn: 'root' },] }
2854
- ];
2855
- /** @nocollapse */
2856
- PartnerSocialPostsApiService.ctorParameters = () => [
2857
- { type: HttpClient },
2858
- { type: HostService }
2859
- ];
2860
- /** @nocollapse */ PartnerSocialPostsApiService.ngInjectableDef = ɵɵdefineInjectable({ factory: function PartnerSocialPostsApiService_Factory() { return new PartnerSocialPostsApiService(ɵɵinject(HttpClient), ɵɵinject(HostService)); }, token: PartnerSocialPostsApiService, providedIn: "root" });
2861
-
2862
- /**
2863
- * @fileoverview added by tsickle
2864
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
2865
- */
2866
- class PostTemplatesService {
2867
- /**
2868
- * @param {?} socialPostsApiService
2869
- */
2870
- constructor(socialPostsApiService) {
2871
- this.socialPostsApiService = socialPostsApiService;
2872
- }
2873
- /**
2874
- * @param {?} accountGroupId
2875
- * @param {?} templateId
2876
- * @param {?} title
2877
- * @param {?} postText
2878
- * @param {?} postDateTime
2879
- * @param {?} gmbPostCustomization
2880
- * @param {?} imageUrl
2881
- * @param {?} imagePath
2882
- * @param {?} imageSize
2883
- * @param {?} previews
2884
- * @param {?} options
2885
- * @param {?} videoUrl
2886
- * @return {?}
2887
- */
2888
- updatePostTemplate(accountGroupId, templateId, title, postText, postDateTime, gmbPostCustomization, imageUrl, imagePath, imageSize, previews, options, videoUrl) {
2889
- /** @type {?} */
2890
- const req = new UpdatePostTemplateRequest({
2891
- accountGroupId: accountGroupId,
2892
- templateId: templateId,
2893
- title: title,
2894
- postText: postText,
2895
- postDateTime: postDateTime,
2896
- gmbPostCustomization: gmbPostCustomization,
2897
- imageUrl: imageUrl,
2898
- imagePath: imagePath,
2899
- imageSize: imageSize,
2900
- previews: previews,
2901
- options: options,
2902
- videoUrl: videoUrl
2903
- });
2904
- return this.socialPostsApiService.updatePostTemplate(req);
2905
- }
2906
- /**
2907
- * @param {?} accountGroupId
2908
- * @param {?} title
2909
- * @param {?} postText
2910
- * @param {?} postDateTime
2911
- * @param {?} gmbPostCustomization
2912
- * @param {?} imageUrl
2913
- * @param {?} imagePath
2914
- * @param {?} imageSize
2915
- * @param {?} previews
2916
- * @param {?} options
2917
- * @param {?} videoUrl
2918
- * @return {?}
2919
- */
2920
- createPostTemplate(accountGroupId, title, postText, postDateTime, gmbPostCustomization, imageUrl, imagePath, imageSize, previews, options, videoUrl) {
2921
- /** @type {?} */
2922
- const req = new CreatePostTemplateRequest({
2923
- accountGroupId: accountGroupId,
2924
- title: title,
2925
- postText: postText,
2926
- postDateTime: postDateTime,
2927
- gmbPostCustomization: gmbPostCustomization,
2928
- imageUrl: imageUrl,
2929
- imagePath: imagePath,
2930
- imageSize: imageSize,
2931
- previews: previews,
2932
- options: options,
2933
- videoUrl: videoUrl
2934
- });
2935
- return this.socialPostsApiService.createPostTemplate(req);
2936
- }
2937
- /**
2938
- * @param {?} accountGroupId
2939
- * @param {?} templateId
2940
- * @return {?}
2941
- */
2942
- getPostTemplate(accountGroupId, templateId) {
2943
- /** @type {?} */
2944
- const req = new GetPostTemplateRequest({
2945
- accountGroupId: accountGroupId,
2946
- templateId: templateId
2947
- });
2948
- return this.socialPostsApiService.getPostTemplate(req);
2949
- }
2950
- /**
2951
- * @param {?} accountGroupId
2952
- * @param {?} cursor
2953
- * @param {?} pageSize
2954
- * @return {?}
2955
- */
2956
- listPostTemplates(accountGroupId, cursor, pageSize) {
2957
- /** @type {?} */
2958
- const req = new ListPostTemplatesRequest({
2959
- accountGroupId: accountGroupId,
2960
- cursor: cursor,
2961
- pageSize: pageSize
2962
- });
2963
- return this.socialPostsApiService.listPostTemplates(req);
2964
- }
2965
- /**
2966
- * @param {?} accountGroupId
2967
- * @param {?} templateId
2968
- * @return {?}
2969
- */
2970
- deletePostTemplate(accountGroupId, templateId) {
2971
- /** @type {?} */
2972
- const req = new DeletePostTemplateRequest({
2973
- accountGroupId: accountGroupId,
2974
- templateId: templateId
2975
- });
2976
- return this.socialPostsApiService.deletePostTemplate(req);
2977
- }
2978
- }
2979
- PostTemplatesService.decorators = [
2980
- { type: Injectable }
2981
- ];
2982
- /** @nocollapse */
2983
- PostTemplatesService.ctorParameters = () => [
2984
- { type: PostTemplatesApiService }
2985
- ];
2986
-
2987
- /**
2988
- * @fileoverview added by tsickle
2989
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
2990
- */
2991
- class SocialPostsService {
2992
- /**
2993
- * @param {?} socialPostsApiService
2994
- */
2995
- constructor(socialPostsApiService) {
2996
- this.socialPostsApiService = socialPostsApiService;
2997
- }
2998
- /**
2999
- * @param {?} start
3000
- * @param {?} end
3001
- * @param {?} socialServiceIds
3002
- * @param {?} businessId
3003
- * @param {?} partnerId
3004
- * @param {?} cursor
3005
- * @param {?} tags
3006
- * @param {?} pageSize
3007
- * @return {?}
3008
- */
3009
- list(start, end, socialServiceIds, businessId, partnerId, cursor, tags, pageSize) {
3010
- /** @type {?} */
3011
- const req = new ListSocialPostsRequest({
3012
- start: start,
3013
- end: end,
3014
- businessId: businessId,
3015
- partnerId: partnerId,
3016
- cursor: cursor,
3017
- socialServiceIds: socialServiceIds,
3018
- tags: tags,
3019
- pageSize: pageSize,
3020
- });
3021
- return this.socialPostsApiService.list(req);
3022
- }
3023
- /**
3024
- * @param {?} businessId
3025
- * @param {?} internalPostIds
3026
- * @return {?}
3027
- */
3028
- getMultiSocialPosts(businessId, internalPostIds) {
3029
- if (!internalPostIds || internalPostIds.length === 0) {
3030
- /** @type {?} */
3031
- const res = new GetMultiSocialPostsResponse();
3032
- return of(res);
3033
- }
3034
- /** @type {?} */
3035
- const req = new GetMultiSocialPostsRequest({ businessId: businessId, internalPostIds: internalPostIds });
3036
- return this.socialPostsApiService.getMultiSocialPosts(req);
3037
- }
3038
- /**
3039
- * @param {?} partnerId
3040
- * @param {?} businessId
3041
- * @param {?} socialServiceIds
3042
- * @return {?}
3043
- */
3044
- getScheduledPostCount(partnerId, businessId, socialServiceIds) {
3045
- /** @type {?} */
3046
- const req = new GetScheduledPostCountRequest({ partnerId: partnerId, businessId: businessId, socialServiceIds: socialServiceIds });
3047
- return this.socialPostsApiService.getScheduledPostCount(req);
3048
- }
3049
- }
3050
- SocialPostsService.decorators = [
3051
- { type: Injectable }
3052
- ];
3053
- /** @nocollapse */
3054
- SocialPostsService.ctorParameters = () => [
3055
- { type: SocialPostsApiService }
3056
- ];
3057
-
3058
- /**
3059
- * @fileoverview added by tsickle
3060
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
3061
- */
3062
- class MultilocationPostsService {
3063
- /**
3064
- * @param {?} multilocationApiService
3065
- */
3066
- constructor(multilocationApiService) {
3067
- this.multilocationApiService = multilocationApiService;
3068
- }
3069
- /**
3070
- * @param {?} brandId
3071
- * @param {?} text
3072
- * @param {?} media
3073
- * @param {?} gifs
3074
- * @param {?} videos
3075
- * @param {?} scheduledDate
3076
- * @param {?} locations
3077
- * @return {?}
3078
- */
3079
- createMultilocationPost(brandId, text, media, gifs, videos, scheduledDate, locations) {
3080
- /** @type {?} */
3081
- const req = new CreateMultilocationPostRequest({
3082
- brandId: brandId,
3083
- text: text,
3084
- media: media,
3085
- gifs: gifs,
3086
- videos: videos,
3087
- scheduledDate: scheduledDate,
3088
- locations: locations
3089
- });
3090
- return this.multilocationApiService.createMultilocationPost(req);
3091
- }
3092
- /**
3093
- * @param {?} brandId
3094
- * @param {?} multilocationId
3095
- * @param {?} text
3096
- * @param {?} media
3097
- * @param {?} gifs
3098
- * @param {?} videos
3099
- * @param {?} scheduledDate
3100
- * @param {?} locations
3101
- * @param {?} fieldMask
3102
- * @return {?}
3103
- */
3104
- editMultilocationPost(brandId, multilocationId, text, media, gifs, videos, scheduledDate, locations, fieldMask) {
3105
- /** @type {?} */
3106
- const req = new EditMultilocationPostRequest({
3107
- brandId: brandId,
3108
- multilocationId: multilocationId,
3109
- text: text,
3110
- media: media,
3111
- gifs: gifs,
3112
- videos: videos,
3113
- scheduledDate: scheduledDate,
3114
- locations: locations,
3115
- fieldMask: fieldMask
3116
- });
3117
- return this.multilocationApiService.editMultilocationPost(req);
3118
- }
3119
- /**
3120
- * @param {?} reason
3121
- * @param {?} brandId
3122
- * @param {?} multilocationId
3123
- * @param {?} locations
3124
- * @return {?}
3125
- */
3126
- removeFromMultilocationPost(reason, brandId, multilocationId, locations) {
3127
- /** @type {?} */
3128
- const req = new RemoveFromMultilocationPostRequest({
3129
- reason: reason,
3130
- brandId: brandId,
3131
- multilocationId: multilocationId,
3132
- locations: locations
3133
- });
3134
- return this.multilocationApiService.removeFromMultilocationPost(req);
3135
- }
3136
- /**
3137
- * @param {?} brandId
3138
- * @param {?} startDate
3139
- * @param {?} endDate
3140
- * @param {?} cursor
3141
- * @param {?} pageSize
3142
- * @return {?}
3143
- */
3144
- listMultilocationPostsForBrand(brandId, startDate, endDate, cursor, pageSize) {
3145
- /** @type {?} */
3146
- const req = new ListMultilocationPostsForBrandRequest({
3147
- brandId: brandId,
3148
- startDate: startDate,
3149
- endDate: endDate,
3150
- cursor: cursor,
3151
- pageSize: pageSize
3152
- });
3153
- return this.multilocationApiService.listMultilocationPostsForBrand(req);
3154
- }
3155
- /**
3156
- * @param {?} brandId
3157
- * @param {?} multilocationId
3158
- * @return {?}
3159
- */
3160
- deleteMultilocationPost(brandId, multilocationId) {
3161
- /** @type {?} */
3162
- const req = new DeleteMultilocationPostRequest({
3163
- brandId: brandId,
3164
- multilocationId: multilocationId
3165
- });
3166
- return this.multilocationApiService.deleteMultilocationPost(req);
3167
- }
3168
- /**
3169
- * @param {?} brandId
3170
- * @param {?} multilocationId
3171
- * @return {?}
3172
- */
3173
- getMultilocationPost(brandId, multilocationId) {
3174
- /** @type {?} */
3175
- const req = new GetMultilocationPostRequest({
3176
- brandId: brandId,
3177
- multilocationId: multilocationId
3178
- });
3179
- return this.multilocationApiService.getMultilocationPost(req);
3180
- }
3181
- }
3182
- MultilocationPostsService.decorators = [
3183
- { type: Injectable }
3184
- ];
3185
- /** @nocollapse */
3186
- MultilocationPostsService.ctorParameters = () => [
3187
- { type: MultilocationPostApiService }
3188
- ];
3189
-
3190
- /**
3191
- * @fileoverview added by tsickle
3192
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
3193
- */
3194
- class SocialPostsModule {
3195
- }
3196
- SocialPostsModule.decorators = [
3197
- { type: NgModule, args: [{
3198
- imports: [SessionServiceModule, EnvironmentServiceModule],
3199
- providers: [
3200
- MultilocationPostApiService,
3201
- PartnerSocialPostsApiService,
3202
- PostTemplatesApiService,
3203
- SocialPostsApiService,
3204
- HostService,
3205
- PostTemplatesService,
3206
- SocialPostsService,
3207
- MultilocationPostsService
3208
- ],
3209
- exports: [],
3210
- entryComponents: []
3211
- },] }
3212
- ];
3213
-
3214
- /**
3215
- * @fileoverview added by tsickle
3216
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
3217
- */
3218
-
3219
- /**
3220
- * @fileoverview added by tsickle
3221
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
3222
- */
3223
-
3224
- /**
3225
- * @fileoverview added by tsickle
3226
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
3227
- */
3228
-
3229
- /**
3230
- * @fileoverview added by tsickle
3231
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
3232
- */
3233
-
3234
- /**
3235
- * @fileoverview added by tsickle
3236
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
3237
- */
3238
-
3239
- export { SocialPostsModule, SocialPostsService, PostTemplatesService, MultilocationPostsService, FieldMask, Location, PostingStatus, MultilocationPostApiService, GetMultilocationPostRequest, DeleteMultilocationPostRequest, ListMultilocationPostsForBrandRequest, HostService as ɵb, MultilocationPostApiService as ɵa, PartnerSocialPostsApiService as ɵc, PostTemplatesApiService as ɵd, SocialPostsApiService as ɵe };
3240
-
3241
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVuZGFzdGEtc29jaWFsLXBvc3RzLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9AdmVuZGFzdGEvc29jaWFsLXBvc3RzL2xpYi9fZ2VuZXJhdGVkL2hvc3Quc2VydmljZS50cyIsIm5nOi8vQHZlbmRhc3RhL3NvY2lhbC1wb3N0cy9saWIvX2ludGVybmFsL2VudW1zL3NvY2lhbC1wb3N0cy5lbnVtLnRzIiwibmc6Ly9AdmVuZGFzdGEvc29jaWFsLXBvc3RzL2xpYi9faW50ZXJuYWwvZW51bXMvbXVsdGlsb2NhdGlvbi1wb3N0LmVudW0udHMiLCJuZzovL0B2ZW5kYXN0YS9zb2NpYWwtcG9zdHMvbGliL19pbnRlcm5hbC9vYmplY3RzL3NvY2lhbC1wb3N0cy50cyIsIm5nOi8vQHZlbmRhc3RhL3NvY2lhbC1wb3N0cy9saWIvX2ludGVybmFsL29iamVjdHMvc29jaWFsLXBvc3Qtc3RhdHMudHMiLCJuZzovL0B2ZW5kYXN0YS9zb2NpYWwtcG9zdHMvbGliL19pbnRlcm5hbC9vYmplY3RzL3Bvc3QtdGVtcGxhdGVzLnRzIiwibmc6Ly9AdmVuZGFzdGEvc29jaWFsLXBvc3RzL2xpYi9faW50ZXJuYWwvb2JqZWN0cy9tdWx0aWxvY2F0aW9uLXBvc3QudHMiLCJuZzovL0B2ZW5kYXN0YS9zb2NpYWwtcG9zdHMvbGliL19pbnRlcm5hbC9vYmplY3RzL2ZpZWxkLW1hc2sudHMiLCJuZzovL0B2ZW5kYXN0YS9zb2NpYWwtcG9zdHMvbGliL19pbnRlcm5hbC9vYmplY3RzL2FwaS50cyIsIm5nOi8vQHZlbmRhc3RhL3NvY2lhbC1wb3N0cy9saWIvX2ludGVybmFsL3Bvc3QtdGVtcGxhdGVzLmFwaS5zZXJ2aWNlLnRzIiwibmc6Ly9AdmVuZGFzdGEvc29jaWFsLXBvc3RzL2xpYi9faW50ZXJuYWwvc29jaWFsLXBvc3RzLmFwaS5zZXJ2aWNlLnRzIiwibmc6Ly9AdmVuZGFzdGEvc29jaWFsLXBvc3RzL2xpYi9faW50ZXJuYWwvbXVsdGlsb2NhdGlvbi1wb3N0LmFwaS5zZXJ2aWNlLnRzIiwibmc6Ly9AdmVuZGFzdGEvc29jaWFsLXBvc3RzL2xpYi9faW50ZXJuYWwvcGFydG5lci1zb2NpYWwtcG9zdHMuYXBpLnNlcnZpY2UudHMiLCJuZzovL0B2ZW5kYXN0YS9zb2NpYWwtcG9zdHMvbGliL3Bvc3QtdGVtcGxhdGVzLnNlcnZpY2UudHMiLCJuZzovL0B2ZW5kYXN0YS9zb2NpYWwtcG9zdHMvbGliL3NvY2lhbC1wb3N0cy5zZXJ2aWNlLnRzIiwibmc6Ly9AdmVuZGFzdGEvc29jaWFsLXBvc3RzL2xpYi9tdWx0aWxvY2F0aW9uLXBvc3RzLnNlcnZpY2UudHMiLCJuZzovL0B2ZW5kYXN0YS9zb2NpYWwtcG9zdHMvbGliL3NvY2lhbC1wb3N0cy5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnRTZXJ2aWNlLCBFbnZpcm9ubWVudCB9IGZyb20gJ0B2ZW5kYXN0YS9jb3JlJztcblxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXG5leHBvcnQgY2xhc3MgSG9zdFNlcnZpY2Uge1xuICAgIHByaXZhdGUgX2hvc3Q6IHN0cmluZztcbiAgICBwcml2YXRlIF9odHRwc0hvc3Q6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZW52aXJvbm1lbnRTZXJ2aWNlOiBFbnZpcm9ubWVudFNlcnZpY2UpIHtcbiAgICB9XG5cbiAgICBob3N0KCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLl9ob3N0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faG9zdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAodGhpcy5lbnZpcm9ubWVudFNlcnZpY2UuZ2V0RW52aXJvbm1lbnQoKSkge1xuICAgICAgICAgICAgY2FzZSBFbnZpcm9ubWVudC5MT0NBTDpcbiAgICAgICAgICAgICAgICB0aGlzLl9ob3N0ID0gJ3NvY2lhbC1wb3N0LnZlbmRhc3RhLWxvY2FsLmNvbSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEVudmlyb25tZW50LlRFU1Q6XG4gICAgICAgICAgICAgICAgdGhpcy5faG9zdCA9ICcnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBFbnZpcm9ubWVudC5ERU1POlxuICAgICAgICAgICAgICAgIHRoaXMuX2hvc3QgPSAnc29jaWFsLXBvc3RzLWRlbW8uYXBpZ2F0ZXdheS5jbyc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEVudmlyb25tZW50LlBST0Q6XG4gICAgICAgICAgICAgICAgdGhpcy5faG9zdCA9ICdzb2NpYWwtcG9zdHMtcHJvZC5hcGlnYXRld2F5LmNvJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faG9zdDtcbiAgICB9XG5cbiAgICBodHRwc0hvc3QoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuX2h0dHBzSG9zdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBzSG9zdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAodGhpcy5lbnZpcm9ubWVudFNlcnZpY2UuZ2V0RW52aXJvbm1lbnQoKSkge1xuICAgICAgICAgICAgY2FzZSBFbnZpcm9ubWVudC5MT0NBTDpcbiAgICAgICAgICAgICAgICB0aGlzLl9odHRwc0hvc3QgPSAnc29jaWFsLXBvc3QudmVuZGFzdGEtbG9jYWwuY29tJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRW52aXJvbm1lbnQuVEVTVDpcbiAgICAgICAgICAgICAgICB0aGlzLl9odHRwc0hvc3QgPSAnJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRW52aXJvbm1lbnQuREVNTzpcbiAgICAgICAgICAgICAgICB0aGlzLl9odHRwc0hvc3QgPSAnc29jaWFsLXBvc3RzLWFwaS1kZW1vLmFwaWdhdGV3YXkuY28nO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBFbnZpcm9ubWVudC5QUk9EOlxuICAgICAgICAgICAgICAgIHRoaXMuX2h0dHBzSG9zdCA9ICdzb2NpYWwtcG9zdHMtYXBpLXByb2QuYXBpZ2F0ZXdheS5jbyc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBzSG9zdDtcbiAgICB9XG5cbiAgICBob3N0V2l0aFNjaGVtZSgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBzY2hlbWUgPSB0aGlzLmVudmlyb25tZW50U2VydmljZS5nZXRFbnZpcm9ubWVudCgpID09PSBFbnZpcm9ubWVudC5MT0NBTCA/ICdodHRwOi8vJyA6ICdodHRwczovLyc7XG4gICAgICAgIHJldHVybiBzY2hlbWUgKyB0aGlzLmhvc3QoKVxuICAgIH1cblxuICAgIGh0dHBzSG9zdFdpdGhTY2hlbWUoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgc2NoZW1lID0gdGhpcy5lbnZpcm9ubWVudFNlcnZpY2UuZ2V0RW52aXJvbm1lbnQoKSA9PT0gRW52aXJvbm1lbnQuTE9DQUwgPyAnaHR0cDovLycgOiAnaHR0cHM6Ly8nO1xuICAgICAgICByZXR1cm4gc2NoZW1lICsgdGhpcy5odHRwc0hvc3QoKVxuICAgIH1cbn1cbiIsIi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuLy8gQ29kZSBnZW5lcmF0ZWQgYnkgc2RrZ2VuXG4vLyBETyBOT1QgRURJVCEuXG4vL1xuLy8gRW51bXMuXG4vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuZXhwb3J0IGVudW0gQ2FsbFRvQWN0aW9uQ2FsbFRvQWN0aW9uVHlwZSB7XG4gICAgTEVBUk5fTU9SRSA9IDAsXG4gICAgQk9PSyA9IDEsXG4gICAgT1JERVIgPSAyLFxuICAgIFNIT1AgPSAzLFxuICAgIFNJR05fVVAgPSA0LFxuICAgIEdFVF9PRkZFUiA9IDUsXG4gICAgQ0FMTCA9IDYsXG59XG5cbmV4cG9ydCBlbnVtIFNvY2lhbFBvc3REZWxldGlvblN0YXR1cyB7XG4gICAgTk9ORSA9IDAsXG4gICAgRkFJTEVEID0gMSxcbiAgICBJTl9QUk9HUkVTUyA9IDIsXG59XG5cbmV4cG9ydCBlbnVtIFBvc3RpbmdTdGF0dXMge1xuICAgIFBPU1RJTkdfSU5fUFJPR1JFU1MgPSAwLFxuICAgIFBPU1RJTkdfRkFJTEVEID0gMSxcbiAgICBQT1NUSU5HX0NPTVBMRVRFRCA9IDIsXG59XG5cbmV4cG9ydCBlbnVtIFNvY2lhbFBvc3RTZXJ2aWNlIHtcbiAgICBUV0lUVEVSID0gMCxcbiAgICBGQUNFQk9PSyA9IDEsXG4gICAgTElOS0VEX0lOID0gMixcbiAgICBHT09HTEVfUExVUyA9IDMsXG4gICAgR09PR0xFX01ZX0JVU0lORVNTID0gNCxcbiAgICBVTktOT1dOID0gNSxcbiAgICBJTlNUQUdSQU0gPSA2LFxufVxuIiwiLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vLyBDb2RlIGdlbmVyYXRlZCBieSBzZGtnZW5cbi8vIERPIE5PVCBFRElUIS5cbi8vXG4vLyBFbnVtcy5cbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5leHBvcnQgZW51bSBSZW1vdmVSZWFzb24ge1xuICAgIFJFTU9WRV9SRUFTT05fRURJVCA9IDAsXG4gICAgUkVNT1ZFX1JFQVNPTl9ERUxFVEUgPSAxLFxufVxuIiwiLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vLyBDb2RlIGdlbmVyYXRlZCBieSBzZGtnZW5cbi8vIERPIE5PVCBFRElUIS5cbi8vXG4vLyBPYmplY3RzLlxuLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5pbXBvcnQgKiBhcyBpIGZyb20gJy4uL2ludGVyZmFjZXMnO1xuXG5pbXBvcnQgKiBhcyBlIGZyb20gJy4uL2VudW1zJztcblxuZXhwb3J0IGZ1bmN0aW9uIGVudW1TdHJpbmdUb1ZhbHVlPEU+KGVudW1SZWY6IGFueSwgdmFsdWU6IHN0cmluZyk6IEUge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gZW51bVJlZlt2YWx1ZV07XG59XG5cbmV4cG9ydCBjbGFzcyBDYWxsVG9BY3Rpb24gaW1wbGVtZW50cyBpLkNhbGxUb0FjdGlvbkludGVyZmFjZSB7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgYWN0aW9uVHlwZTogZS5DYWxsVG9BY3Rpb25DYWxsVG9BY3Rpb25UeXBlO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogQ2FsbFRvQWN0aW9uIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgQ2FsbFRvQWN0aW9uKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLmFjdGlvblR5cGUpIHttLmFjdGlvblR5cGUgPSBlbnVtU3RyaW5nVG9WYWx1ZTxlLkNhbGxUb0FjdGlvbkNhbGxUb0FjdGlvblR5cGU+KGUuQ2FsbFRvQWN0aW9uQ2FsbFRvQWN0aW9uVHlwZSwgcHJvdG8uYWN0aW9uVHlwZSk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkNhbGxUb0FjdGlvbkludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnVybCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndXJsJ10gPSB0aGlzLnVybDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hY3Rpb25UeXBlICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydhY3Rpb25UeXBlJ10gPSB0aGlzLmFjdGlvblR5cGU7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRXJyb3IgaW1wbGVtZW50cyBpLkVycm9ySW50ZXJmYWNlIHtcbiAgICByZWFzb246IHN0cmluZztcbiAgICBjYXRlZ29yeTogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogRXJyb3Ige1xuICAgICAgICBsZXQgbSA9IG5ldyBFcnJvcigpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuRXJyb3JJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5yZWFzb24gIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3JlYXNvbiddID0gdGhpcy5yZWFzb247fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY2F0ZWdvcnkgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2NhdGVnb3J5J10gPSB0aGlzLmNhdGVnb3J5O31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50IGltcGxlbWVudHMgaS5FdmVudEludGVyZmFjZSB7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBzdGFydERhdGV0aW1lOiBEYXRlO1xuICAgIGVuZERhdGV0aW1lOiBEYXRlO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogRXZlbnQge1xuICAgICAgICBsZXQgbSA9IG5ldyBFdmVudCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5zdGFydERhdGV0aW1lKSB7bS5zdGFydERhdGV0aW1lID0gbmV3IERhdGUocHJvdG8uc3RhcnREYXRldGltZSk7fVxuICAgICAgICBpZiAocHJvdG8uZW5kRGF0ZXRpbWUpIHttLmVuZERhdGV0aW1lID0gbmV3IERhdGUocHJvdG8uZW5kRGF0ZXRpbWUpO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5FdmVudEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRpdGxlICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWyd0aXRsZSddID0gdGhpcy50aXRsZTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zdGFydERhdGV0aW1lICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnN0YXJ0RGF0ZXRpbWUgIT09IG51bGwpIHt0b1JldHVyblsnc3RhcnREYXRldGltZSddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5zdGFydERhdGV0aW1lID8gKHRoaXMuc3RhcnREYXRldGltZSBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5zdGFydERhdGV0aW1lO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmVuZERhdGV0aW1lICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmVuZERhdGV0aW1lICE9PSBudWxsKSB7dG9SZXR1cm5bJ2VuZERhdGV0aW1lJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmVuZERhdGV0aW1lID8gKHRoaXMuZW5kRGF0ZXRpbWUgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuZW5kRGF0ZXRpbWU7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2NoZWR1bGVQb3N0U3RhdHVzIGltcGxlbWVudHMgaS5TY2hlZHVsZVBvc3RTdGF0dXNJbnRlcmZhY2Uge1xuICAgIHNvY2lhbFBvc3RJZDogc3RyaW5nO1xuICAgIHNvY2lhbFNlcnZpY2VJZDogc3RyaW5nO1xuICAgIHNvY2lhbFNlcnZpY2VMYWJlbDogc3RyaW5nO1xuICAgIGVycm9yOiBFcnJvcjtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IFNjaGVkdWxlUG9zdFN0YXR1cyB7XG4gICAgICAgIGxldCBtID0gbmV3IFNjaGVkdWxlUG9zdFN0YXR1cygpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5lcnJvcikge20uZXJyb3IgPSBFcnJvci5mcm9tUHJvdG8ocHJvdG8uZXJyb3IpO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5TY2hlZHVsZVBvc3RTdGF0dXNJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zb2NpYWxQb3N0SWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3NvY2lhbFBvc3RJZCddID0gdGhpcy5zb2NpYWxQb3N0SWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc29jaWFsU2VydmljZUlkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydzb2NpYWxTZXJ2aWNlSWQnXSA9IHRoaXMuc29jaWFsU2VydmljZUlkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNvY2lhbFNlcnZpY2VMYWJlbCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnc29jaWFsU2VydmljZUxhYmVsJ10gPSB0aGlzLnNvY2lhbFNlcnZpY2VMYWJlbDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5lcnJvciAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5lcnJvciAhPT0gbnVsbCkge3RvUmV0dXJuWydlcnJvciddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5lcnJvciA/ICh0aGlzLmVycm9yIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmVycm9yO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNvY2lhbFBvc3QgaW1wbGVtZW50cyBpLlNvY2lhbFBvc3RJbnRlcmZhY2Uge1xuICAgIGJ1c2luZXNzSWQ6IHN0cmluZztcbiAgICBzb2NpYWxQb3N0SWQ6IHN0cmluZztcbiAgICBwb3N0VGV4dDogc3RyaW5nO1xuICAgIHBvc3RlZDogRGF0ZTtcbiAgICBpc0Vycm9yOiBib29sZWFuO1xuICAgIGRlbGV0aW9uU3RhdHVzOiBlLlNvY2lhbFBvc3REZWxldGlvblN0YXR1cztcbiAgICBzZXJ2aWNlOiBlLlNvY2lhbFBvc3RTZXJ2aWNlO1xuICAgIHBlcm1hbGluazogc3RyaW5nO1xuICAgIGNyZWF0ZWQ6IERhdGU7XG4gICAgcHJvZmlsZVVybDogc3RyaW5nO1xuICAgIHByb2ZpbGVJbWFnZVVybDogc3RyaW5nO1xuICAgIHNjaGVkdWxlZDogRGF0ZTtcbiAgICBzdGF0dXM6IGUuUG9zdGluZ1N0YXR1cztcbiAgICBpbWFnZVVybDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB1c2VybmFtZTogc3RyaW5nO1xuICAgIHBhcmVudElkOiBzdHJpbmc7XG4gICAgc29jaWFsU2VydmljZUlkOiBzdHJpbmc7XG4gICAgZXZlbnQ6IEV2ZW50O1xuICAgIGNhbGxUb0FjdGlvbjogQ2FsbFRvQWN0aW9uO1xuICAgIHZpZGVvVXJsOiBzdHJpbmc7XG4gICAgZXJyb3I6IEVycm9yO1xuICAgIGltYWdlVXJsczogc3RyaW5nW107XG4gICAgbGlua1ByZXZpZXdJbWFnZVVybDogc3RyaW5nO1xuICAgIGJyYW5kSWQ6IHN0cmluZztcbiAgICBtdWx0aWxvY2F0aW9uUG9zdElkOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBTb2NpYWxQb3N0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgU29jaWFsUG9zdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5wb3N0ZWQpIHttLnBvc3RlZCA9IG5ldyBEYXRlKHByb3RvLnBvc3RlZCk7fVxuICAgICAgICBpZiAocHJvdG8uZGVsZXRpb25TdGF0dXMpIHttLmRlbGV0aW9uU3RhdHVzID0gZW51bVN0cmluZ1RvVmFsdWU8ZS5Tb2NpYWxQb3N0RGVsZXRpb25TdGF0dXM+KGUuU29jaWFsUG9zdERlbGV0aW9uU3RhdHVzLCBwcm90by5kZWxldGlvblN0YXR1cyk7fVxuICAgICAgICBpZiAocHJvdG8uc2VydmljZSkge20uc2VydmljZSA9IGVudW1TdHJpbmdUb1ZhbHVlPGUuU29jaWFsUG9zdFNlcnZpY2U+KGUuU29jaWFsUG9zdFNlcnZpY2UsIHByb3RvLnNlcnZpY2UpO31cbiAgICAgICAgaWYgKHByb3RvLmNyZWF0ZWQpIHttLmNyZWF0ZWQgPSBuZXcgRGF0ZShwcm90by5jcmVhdGVkKTt9XG4gICAgICAgIGlmIChwcm90by5zY2hlZHVsZWQpIHttLnNjaGVkdWxlZCA9IG5ldyBEYXRlKHByb3RvLnNjaGVkdWxlZCk7fVxuICAgICAgICBpZiAocHJvdG8uc3RhdHVzKSB7bS5zdGF0dXMgPSBlbnVtU3RyaW5nVG9WYWx1ZTxlLlBvc3RpbmdTdGF0dXM+KGUuUG9zdGluZ1N0YXR1cywgcHJvdG8uc3RhdHVzKTt9XG4gICAgICAgIGlmIChwcm90by5ldmVudCkge20uZXZlbnQgPSBFdmVudC5mcm9tUHJvdG8ocHJvdG8uZXZlbnQpO31cbiAgICAgICAgaWYgKHByb3RvLmNhbGxUb0FjdGlvbikge20uY2FsbFRvQWN0aW9uID0gQ2FsbFRvQWN0aW9uLmZyb21Qcm90byhwcm90by5jYWxsVG9BY3Rpb24pO31cbiAgICAgICAgaWYgKHByb3RvLmVycm9yKSB7bS5lcnJvciA9IEVycm9yLmZyb21Qcm90byhwcm90by5lcnJvcik7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLlNvY2lhbFBvc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5idXNpbmVzc0lkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydidXNpbmVzc0lkJ10gPSB0aGlzLmJ1c2luZXNzSWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc29jaWFsUG9zdElkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydzb2NpYWxQb3N0SWQnXSA9IHRoaXMuc29jaWFsUG9zdElkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBvc3RUZXh0ICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydwb3N0VGV4dCddID0gdGhpcy5wb3N0VGV4dDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wb3N0ZWQgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucG9zdGVkICE9PSBudWxsKSB7dG9SZXR1cm5bJ3Bvc3RlZCddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5wb3N0ZWQgPyAodGhpcy5wb3N0ZWQgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMucG9zdGVkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmlzRXJyb3IgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2lzRXJyb3InXSA9IHRoaXMuaXNFcnJvcjt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5kZWxldGlvblN0YXR1cyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnZGVsZXRpb25TdGF0dXMnXSA9IHRoaXMuZGVsZXRpb25TdGF0dXM7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2VydmljZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnc2VydmljZSddID0gdGhpcy5zZXJ2aWNlO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBlcm1hbGluayAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsncGVybWFsaW5rJ10gPSB0aGlzLnBlcm1hbGluazt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jcmVhdGVkICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmNyZWF0ZWQgIT09IG51bGwpIHt0b1JldHVyblsnY3JlYXRlZCddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5jcmVhdGVkID8gKHRoaXMuY3JlYXRlZCBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5jcmVhdGVkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb2ZpbGVVcmwgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3Byb2ZpbGVVcmwnXSA9IHRoaXMucHJvZmlsZVVybDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9maWxlSW1hZ2VVcmwgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3Byb2ZpbGVJbWFnZVVybCddID0gdGhpcy5wcm9maWxlSW1hZ2VVcmw7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2NoZWR1bGVkICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnNjaGVkdWxlZCAhPT0gbnVsbCkge3RvUmV0dXJuWydzY2hlZHVsZWQnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuc2NoZWR1bGVkID8gKHRoaXMuc2NoZWR1bGVkIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnNjaGVkdWxlZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zdGF0dXMgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3N0YXR1cyddID0gdGhpcy5zdGF0dXM7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaW1hZ2VVcmwgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2ltYWdlVXJsJ10gPSB0aGlzLmltYWdlVXJsO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm5hbWUgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ25hbWUnXSA9IHRoaXMubmFtZTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy51c2VybmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndXNlcm5hbWUnXSA9IHRoaXMudXNlcm5hbWU7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucGFyZW50SWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3BhcmVudElkJ10gPSB0aGlzLnBhcmVudElkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNvY2lhbFNlcnZpY2VJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnc29jaWFsU2VydmljZUlkJ10gPSB0aGlzLnNvY2lhbFNlcnZpY2VJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5ldmVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5ldmVudCAhPT0gbnVsbCkge3RvUmV0dXJuWydldmVudCddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5ldmVudCA/ICh0aGlzLmV2ZW50IGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmV2ZW50O31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNhbGxUb0FjdGlvbiAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5jYWxsVG9BY3Rpb24gIT09IG51bGwpIHt0b1JldHVyblsnY2FsbFRvQWN0aW9uJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmNhbGxUb0FjdGlvbiA/ICh0aGlzLmNhbGxUb0FjdGlvbiBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5jYWxsVG9BY3Rpb247fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudmlkZW9VcmwgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3ZpZGVvVXJsJ10gPSB0aGlzLnZpZGVvVXJsO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmVycm9yICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmVycm9yICE9PSBudWxsKSB7dG9SZXR1cm5bJ2Vycm9yJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmVycm9yID8gKHRoaXMuZXJyb3IgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuZXJyb3I7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaW1hZ2VVcmxzICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydpbWFnZVVybHMnXSA9IHRoaXMuaW1hZ2VVcmxzO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmxpbmtQcmV2aWV3SW1hZ2VVcmwgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2xpbmtQcmV2aWV3SW1hZ2VVcmwnXSA9IHRoaXMubGlua1ByZXZpZXdJbWFnZVVybDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5icmFuZElkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydicmFuZElkJ10gPSB0aGlzLmJyYW5kSWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubXVsdGlsb2NhdGlvblBvc3RJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnbXVsdGlsb2NhdGlvblBvc3RJZCddID0gdGhpcy5tdWx0aWxvY2F0aW9uUG9zdElkO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNvY2lhbFBvc3REYXRhIGltcGxlbWVudHMgaS5Tb2NpYWxQb3N0RGF0YUludGVyZmFjZSB7XG4gICAgcG9zdFRleHQ6IHN0cmluZztcbiAgICBpbWFnZVVybDogc3RyaW5nO1xuICAgIHNjaGVkdWxlRm9yOiBEYXRlO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogU29jaWFsUG9zdERhdGEge1xuICAgICAgICBsZXQgbSA9IG5ldyBTb2NpYWxQb3N0RGF0YSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5zY2hlZHVsZUZvcikge20uc2NoZWR1bGVGb3IgPSBuZXcgRGF0ZShwcm90by5zY2hlZHVsZUZvcik7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLlNvY2lhbFBvc3REYXRhSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucG9zdFRleHQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3Bvc3RUZXh0J10gPSB0aGlzLnBvc3RUZXh0O31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmltYWdlVXJsICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydpbWFnZVVybCddID0gdGhpcy5pbWFnZVVybDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zY2hlZHVsZUZvciAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5zY2hlZHVsZUZvciAhPT0gbnVsbCkge3RvUmV0dXJuWydzY2hlZHVsZUZvciddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5zY2hlZHVsZUZvciA/ICh0aGlzLnNjaGVkdWxlRm9yIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnNjaGVkdWxlRm9yO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuIiwiLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vLyBDb2RlIGdlbmVyYXRlZCBieSBzZGtnZW5cbi8vIERPIE5PVCBFRElUIS5cbi8vXG4vLyBPYmplY3RzLlxuLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5pbXBvcnQgKiBhcyBpIGZyb20gJy4uL2ludGVyZmFjZXMnO1xuXG5pbXBvcnQgKiBhcyBlIGZyb20gJy4uL2VudW1zJztcblxuZXhwb3J0IGZ1bmN0aW9uIGVudW1TdHJpbmdUb1ZhbHVlPEU+KGVudW1SZWY6IGFueSwgdmFsdWU6IHN0cmluZyk6IEUge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gZW51bVJlZlt2YWx1ZV07XG59XG5cbmV4cG9ydCBjbGFzcyBGYWNlYm9va1Bvc3RTdGF0cyBpbXBsZW1lbnRzIGkuRmFjZWJvb2tQb3N0U3RhdHNJbnRlcmZhY2Uge1xuICAgIGNvbW1lbnRDb3VudDogbnVtYmVyO1xuICAgIHNoYXJlQ291bnQ6IG51bWJlcjtcbiAgICBsaWtlQ291bnQ6IG51bWJlcjtcbiAgICBoYXNMaWtlOiBib29sZWFuO1xuICAgIGNhbkxpa2U6IGJvb2xlYW47XG4gICAgcmVhY3Rpb25zOiBudW1iZXI7XG4gICAgcGVvcGxlUmVhY2hlZDogbnVtYmVyO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogRmFjZWJvb2tQb3N0U3RhdHMge1xuICAgICAgICBsZXQgbSA9IG5ldyBGYWNlYm9va1Bvc3RTdGF0cygpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5jb21tZW50Q291bnQpIHttLmNvbW1lbnRDb3VudCA9IHBhcnNlSW50KHByb3RvLmNvbW1lbnRDb3VudCwgMTApO31cbiAgICAgICAgaWYgKHByb3RvLnNoYXJlQ291bnQpIHttLnNoYXJlQ291bnQgPSBwYXJzZUludChwcm90by5zaGFyZUNvdW50LCAxMCk7fVxuICAgICAgICBpZiAocHJvdG8ubGlrZUNvdW50KSB7bS5saWtlQ291bnQgPSBwYXJzZUludChwcm90by5saWtlQ291bnQsIDEwKTt9XG4gICAgICAgIGlmIChwcm90by5yZWFjdGlvbnMpIHttLnJlYWN0aW9ucyA9IHBhcnNlSW50KHByb3RvLnJlYWN0aW9ucywgMTApO31cbiAgICAgICAgaWYgKHByb3RvLnBlb3BsZVJlYWNoZWQpIHttLnBlb3BsZVJlYWNoZWQgPSBwYXJzZUludChwcm90by5wZW9wbGVSZWFjaGVkLCAxMCk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkZhY2Vib29rUG9zdFN0YXRzSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY29tbWVudENvdW50ICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydjb21tZW50Q291bnQnXSA9IHRoaXMuY29tbWVudENvdW50O31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNoYXJlQ291bnQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3NoYXJlQ291bnQnXSA9IHRoaXMuc2hhcmVDb3VudDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5saWtlQ291bnQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2xpa2VDb3VudCddID0gdGhpcy5saWtlQ291bnQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaGFzTGlrZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnaGFzTGlrZSddID0gdGhpcy5oYXNMaWtlO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNhbkxpa2UgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2Nhbkxpa2UnXSA9IHRoaXMuY2FuTGlrZTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5yZWFjdGlvbnMgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3JlYWN0aW9ucyddID0gdGhpcy5yZWFjdGlvbnM7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucGVvcGxlUmVhY2hlZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsncGVvcGxlUmVhY2hlZCddID0gdGhpcy5wZW9wbGVSZWFjaGVkO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNvY2lhbFBvc3RTdGF0cyBpbXBsZW1lbnRzIGkuU29jaWFsUG9zdFN0YXRzSW50ZXJmYWNlIHtcbiAgICBpbnRlcm5hbFBvc3RJZDogc3RyaW5nO1xuICAgIGZhY2Vib29rUG9zdFN0YXRzOiBGYWNlYm9va1Bvc3RTdGF0cztcbiAgICB0d2l0dGVyUG9zdFN0YXRzOiBUd2l0dGVyUG9zdFN0YXRzO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogU29jaWFsUG9zdFN0YXRzIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgU29jaWFsUG9zdFN0YXRzKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLmZhY2Vib29rUG9zdFN0YXRzKSB7bS5mYWNlYm9va1Bvc3RTdGF0cyA9IEZhY2Vib29rUG9zdFN0YXRzLmZyb21Qcm90byhwcm90by5mYWNlYm9va1Bvc3RTdGF0cyk7fVxuICAgICAgICBpZiAocHJvdG8udHdpdHRlclBvc3RTdGF0cykge20udHdpdHRlclBvc3RTdGF0cyA9IFR3aXR0ZXJQb3N0U3RhdHMuZnJvbVByb3RvKHByb3RvLnR3aXR0ZXJQb3N0U3RhdHMpO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5Tb2NpYWxQb3N0U3RhdHNJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5pbnRlcm5hbFBvc3RJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnaW50ZXJuYWxQb3N0SWQnXSA9IHRoaXMuaW50ZXJuYWxQb3N0SWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZmFjZWJvb2tQb3N0U3RhdHMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuZmFjZWJvb2tQb3N0U3RhdHMgIT09IG51bGwpIHt0b1JldHVyblsnZmFjZWJvb2tQb3N0U3RhdHMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuZmFjZWJvb2tQb3N0U3RhdHMgPyAodGhpcy5mYWNlYm9va1Bvc3RTdGF0cyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5mYWNlYm9va1Bvc3RTdGF0czt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50d2l0dGVyUG9zdFN0YXRzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnR3aXR0ZXJQb3N0U3RhdHMgIT09IG51bGwpIHt0b1JldHVyblsndHdpdHRlclBvc3RTdGF0cyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy50d2l0dGVyUG9zdFN0YXRzID8gKHRoaXMudHdpdHRlclBvc3RTdGF0cyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy50d2l0dGVyUG9zdFN0YXRzO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFR3aXR0ZXJQb3N0U3RhdHMgaW1wbGVtZW50cyBpLlR3aXR0ZXJQb3N0U3RhdHNJbnRlcmZhY2Uge1xuICAgIGZhdm91cml0ZXM6IG51bWJlcjtcbiAgICBoYXNGYXZvdXJpdGVkOiBib29sZWFuO1xuICAgIHJldHdlZXRzOiBudW1iZXI7XG4gICAgaGFzUmV0d2VldGVkOiBib29sZWFuO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogVHdpdHRlclBvc3RTdGF0cyB7XG4gICAgICAgIGxldCBtID0gbmV3IFR3aXR0ZXJQb3N0U3RhdHMoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uZmF2b3VyaXRlcykge20uZmF2b3VyaXRlcyA9IHBhcnNlSW50KHByb3RvLmZhdm91cml0ZXMsIDEwKTt9XG4gICAgICAgIGlmIChwcm90by5yZXR3ZWV0cykge20ucmV0d2VldHMgPSBwYXJzZUludChwcm90by5yZXR3ZWV0cywgMTApO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5Ud2l0dGVyUG9zdFN0YXRzSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZmF2b3VyaXRlcyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnZmF2b3VyaXRlcyddID0gdGhpcy5mYXZvdXJpdGVzO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmhhc0Zhdm91cml0ZWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2hhc0Zhdm91cml0ZWQnXSA9IHRoaXMuaGFzRmF2b3VyaXRlZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5yZXR3ZWV0cyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsncmV0d2VldHMnXSA9IHRoaXMucmV0d2VldHM7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaGFzUmV0d2VldGVkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydoYXNSZXR3ZWV0ZWQnXSA9IHRoaXMuaGFzUmV0d2VldGVkO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuIiwiLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vLyBDb2RlIGdlbmVyYXRlZCBieSBzZGtnZW5cbi8vIERPIE5PVCBFRElUIS5cbi8vXG4vLyBPYmplY3RzLlxuLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5pbXBvcnQgKiBhcyBpIGZyb20gJy4uL2ludGVyZmFjZXMnO1xuXG5pbXBvcnQgKiBhcyBlIGZyb20gJy4uL2VudW1zJztcblxuZXhwb3J0IGZ1bmN0aW9uIGVudW1TdHJpbmdUb1ZhbHVlPEU+KGVudW1SZWY6IGFueSwgdmFsdWU6IHN0cmluZyk6IEUge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gZW51bVJlZlt2YWx1ZV07XG59XG5cbmV4cG9ydCBjbGFzcyBQb3N0VGVtcGxhdGUgaW1wbGVtZW50cyBpLlBvc3RUZW1wbGF0ZUludGVyZmFjZSB7XG4gICAgYWNjb3VudEdyb3VwSWQ6IHN0cmluZztcbiAgICB0ZW1wbGF0ZUlkOiBzdHJpbmc7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBjcmVhdGVkOiBEYXRlO1xuICAgIHVwZGF0ZWQ6IERhdGU7XG4gICAgcG9zdFRleHQ6IHN0cmluZztcbiAgICBwb3N0RGF0ZVRpbWU6IERhdGU7XG4gICAgZ21iUG9zdEN1c3RvbWl6YXRpb246IHN0cmluZztcbiAgICBpbWFnZVVybDogc3RyaW5nO1xuICAgIGltYWdlUGF0aDogc3RyaW5nO1xuICAgIGltYWdlU2l6ZTogc3RyaW5nO1xuICAgIHByZXZpZXdzOiBzdHJpbmc7XG4gICAgb3B0aW9uczogc3RyaW5nW107XG4gICAgdmlkZW9Vcmw6IHN0cmluZztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IFBvc3RUZW1wbGF0ZSB7XG4gICAgICAgIGxldCBtID0gbmV3IFBvc3RUZW1wbGF0ZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5jcmVhdGVkKSB7bS5jcmVhdGVkID0gbmV3IERhdGUocHJvdG8uY3JlYXRlZCk7fVxuICAgICAgICBpZiAocHJvdG8udXBkYXRlZCkge20udXBkYXRlZCA9IG5ldyBEYXRlKHByb3RvLnVwZGF0ZWQpO31cbiAgICAgICAgaWYgKHByb3RvLnBvc3REYXRlVGltZSkge20ucG9zdERhdGVUaW1lID0gbmV3IERhdGUocHJvdG8ucG9zdERhdGVUaW1lKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuUG9zdFRlbXBsYXRlSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYWNjb3VudEdyb3VwSWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2FjY291bnRHcm91cElkJ10gPSB0aGlzLmFjY291bnRHcm91cElkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRlbXBsYXRlSWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3RlbXBsYXRlSWQnXSA9IHRoaXMudGVtcGxhdGVJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50aXRsZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndGl0bGUnXSA9IHRoaXMudGl0bGU7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY3JlYXRlZCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5jcmVhdGVkICE9PSBudWxsKSB7dG9SZXR1cm5bJ2NyZWF0ZWQnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuY3JlYXRlZCA/ICh0aGlzLmNyZWF0ZWQgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuY3JlYXRlZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy51cGRhdGVkICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnVwZGF0ZWQgIT09IG51bGwpIHt0b1JldHVyblsndXBkYXRlZCddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy51cGRhdGVkID8gKHRoaXMudXBkYXRlZCBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy51cGRhdGVkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBvc3RUZXh0ICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydwb3N0VGV4dCddID0gdGhpcy5wb3N0VGV4dDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wb3N0RGF0ZVRpbWUgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucG9zdERhdGVUaW1lICE9PSBudWxsKSB7dG9SZXR1cm5bJ3Bvc3REYXRlVGltZSddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5wb3N0RGF0ZVRpbWUgPyAodGhpcy5wb3N0RGF0ZVRpbWUgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMucG9zdERhdGVUaW1lO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmdtYlBvc3RDdXN0b21pemF0aW9uICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydnbWJQb3N0Q3VzdG9taXphdGlvbiddID0gdGhpcy5nbWJQb3N0Q3VzdG9taXphdGlvbjt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5pbWFnZVVybCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnaW1hZ2VVcmwnXSA9IHRoaXMuaW1hZ2VVcmw7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaW1hZ2VQYXRoICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydpbWFnZVBhdGgnXSA9IHRoaXMuaW1hZ2VQYXRoO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmltYWdlU2l6ZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnaW1hZ2VTaXplJ10gPSB0aGlzLmltYWdlU2l6ZTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcmV2aWV3cyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsncHJldmlld3MnXSA9IHRoaXMucHJldmlld3M7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnb3B0aW9ucyddID0gdGhpcy5vcHRpb25zO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnZpZGVvVXJsICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWyd2aWRlb1VybCddID0gdGhpcy52aWRlb1VybDt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbiIsIi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuLy8gQ29kZSBnZW5lcmF0ZWQgYnkgc2RrZ2VuXG4vLyBETyBOT1QgRURJVCEuXG4vL1xuLy8gT2JqZWN0cy5cbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuaW1wb3J0ICogYXMgaSBmcm9tICcuLi9pbnRlcmZhY2VzJztcblxuaW1wb3J0ICogYXMgZSBmcm9tICcuLi9lbnVtcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBlbnVtU3RyaW5nVG9WYWx1ZTxFPihlbnVtUmVmOiBhbnksIHZhbHVlOiBzdHJpbmcpOiBFIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGVudW1SZWZbdmFsdWVdO1xufVxuXG5leHBvcnQgY2xhc3MgTG9jYXRpb24gaW1wbGVtZW50cyBpLkxvY2F0aW9uSW50ZXJmYWNlIHtcbiAgICBzb2NpYWxTZXJ2aWNlSWRzOiBzdHJpbmdbXTtcbiAgICBhY2NvdW50R3JvdXBJZDogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogTG9jYXRpb24ge1xuICAgICAgICBsZXQgbSA9IG5ldyBMb2NhdGlvbigpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuTG9jYXRpb25JbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zb2NpYWxTZXJ2aWNlSWRzICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydzb2NpYWxTZXJ2aWNlSWRzJ10gPSB0aGlzLnNvY2lhbFNlcnZpY2VJZHM7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYWNjb3VudEdyb3VwSWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2FjY291bnRHcm91cElkJ10gPSB0aGlzLmFjY291bnRHcm91cElkO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIE11bHRpbG9jYXRpb25Qb3N0IGltcGxlbWVudHMgaS5NdWx0aWxvY2F0aW9uUG9zdEludGVyZmFjZSB7XG4gICAgYnJhbmRJZDogc3RyaW5nO1xuICAgIG11bHRpbG9jYXRpb25JZDogc3RyaW5nO1xuICAgIG9yaWdpbmFsVGV4dDogc3RyaW5nO1xuICAgIG9yaWdpbmFsU2NoZWR1bGVkRGF0ZTogRGF0ZTtcbiAgICBvcmlnaW5hbE1lZGlhOiBzdHJpbmdbXTtcbiAgICBvcmlnaW5hbExvY2F0aW9uczogTG9jYXRpb25bXTtcbiAgICBlZGl0ZWRMb2NhdGlvbnM6IExvY2F0aW9uW107XG4gICAgZGVsZXRlZExvY2F0aW9uczogTG9jYXRpb25bXTtcbiAgICBvcmlnaW5hbEdpZnM6IHN0cmluZ1tdO1xuICAgIG9yaWdpbmFsVmlkZW9zOiBzdHJpbmdbXTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IE11bHRpbG9jYXRpb25Qb3N0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgTXVsdGlsb2NhdGlvblBvc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8ub3JpZ2luYWxTY2hlZHVsZWREYXRlKSB7bS5vcmlnaW5hbFNjaGVkdWxlZERhdGUgPSBuZXcgRGF0ZShwcm90by5vcmlnaW5hbFNjaGVkdWxlZERhdGUpO31cbiAgICAgICAgaWYgKHByb3RvLm9yaWdpbmFsTG9jYXRpb25zKSB7bS5vcmlnaW5hbExvY2F0aW9ucyA9IHByb3RvLm9yaWdpbmFsTG9jYXRpb25zLm1hcChMb2NhdGlvbi5mcm9tUHJvdG8pO31cbiAgICAgICAgaWYgKHByb3RvLmVkaXRlZExvY2F0aW9ucykge20uZWRpdGVkTG9jYXRpb25zID0gcHJvdG8uZWRpdGVkTG9jYXRpb25zLm1hcChMb2NhdGlvbi5mcm9tUHJvdG8pO31cbiAgICAgICAgaWYgKHByb3RvLmRlbGV0ZWRMb2NhdGlvbnMpIHttLmRlbGV0ZWRMb2NhdGlvbnMgPSBwcm90by5kZWxldGVkTG9jYXRpb25zLm1hcChMb2NhdGlvbi5mcm9tUHJvdG8pO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5NdWx0aWxvY2F0aW9uUG9zdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmJyYW5kSWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2JyYW5kSWQnXSA9IHRoaXMuYnJhbmRJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5tdWx0aWxvY2F0aW9uSWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ211bHRpbG9jYXRpb25JZCddID0gdGhpcy5tdWx0aWxvY2F0aW9uSWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3JpZ2luYWxUZXh0ICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydvcmlnaW5hbFRleHQnXSA9IHRoaXMub3JpZ2luYWxUZXh0O31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9yaWdpbmFsU2NoZWR1bGVkRGF0ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5vcmlnaW5hbFNjaGVkdWxlZERhdGUgIT09IG51bGwpIHt0b1JldHVyblsnb3JpZ2luYWxTY2hlZHVsZWREYXRlJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLm9yaWdpbmFsU2NoZWR1bGVkRGF0ZSA/ICh0aGlzLm9yaWdpbmFsU2NoZWR1bGVkRGF0ZSBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5vcmlnaW5hbFNjaGVkdWxlZERhdGU7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3JpZ2luYWxNZWRpYSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnb3JpZ2luYWxNZWRpYSddID0gdGhpcy5vcmlnaW5hbE1lZGlhO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9yaWdpbmFsTG9jYXRpb25zICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLm9yaWdpbmFsTG9jYXRpb25zICE9PSBudWxsKSB7dG9SZXR1cm5bJ29yaWdpbmFsTG9jYXRpb25zJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLm9yaWdpbmFsTG9jYXRpb25zID8gKHRoaXMub3JpZ2luYWxMb2NhdGlvbnMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMub3JpZ2luYWxMb2NhdGlvbnM7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZWRpdGVkTG9jYXRpb25zICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmVkaXRlZExvY2F0aW9ucyAhPT0gbnVsbCkge3RvUmV0dXJuWydlZGl0ZWRMb2NhdGlvbnMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuZWRpdGVkTG9jYXRpb25zID8gKHRoaXMuZWRpdGVkTG9jYXRpb25zIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmVkaXRlZExvY2F0aW9uczt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5kZWxldGVkTG9jYXRpb25zICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmRlbGV0ZWRMb2NhdGlvbnMgIT09IG51bGwpIHt0b1JldHVyblsnZGVsZXRlZExvY2F0aW9ucyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5kZWxldGVkTG9jYXRpb25zID8gKHRoaXMuZGVsZXRlZExvY2F0aW9ucyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5kZWxldGVkTG9jYXRpb25zO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9yaWdpbmFsR2lmcyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnb3JpZ2luYWxHaWZzJ10gPSB0aGlzLm9yaWdpbmFsR2lmczt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcmlnaW5hbFZpZGVvcyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnb3JpZ2luYWxWaWRlb3MnXSA9IHRoaXMub3JpZ2luYWxWaWRlb3M7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTXVsdGlsb2NhdGlvblBvc3RFcnJvciBpbXBsZW1lbnRzIGkuTXVsdGlsb2NhdGlvblBvc3RFcnJvckludGVyZmFjZSB7XG4gICAgc29jaWFsU2VydmljZUlkOiBzdHJpbmc7XG4gICAgYWNjb3VudEdyb3VwSWQ6IHN0cmluZztcbiAgICBlcnJvclJlYXNvbjogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogTXVsdGlsb2NhdGlvblBvc3RFcnJvciB7XG4gICAgICAgIGxldCBtID0gbmV3IE11bHRpbG9jYXRpb25Qb3N0RXJyb3IoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLk11bHRpbG9jYXRpb25Qb3N0RXJyb3JJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zb2NpYWxTZXJ2aWNlSWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3NvY2lhbFNlcnZpY2VJZCddID0gdGhpcy5zb2NpYWxTZXJ2aWNlSWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYWNjb3VudEdyb3VwSWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2FjY291bnRHcm91cElkJ10gPSB0aGlzLmFjY291bnRHcm91cElkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmVycm9yUmVhc29uICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydlcnJvclJlYXNvbiddID0gdGhpcy5lcnJvclJlYXNvbjt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbiIsIi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuLy8gQ29kZSBnZW5lcmF0ZWQgYnkgc2RrZ2VuXG4vLyBETyBOT1QgRURJVCEuXG4vL1xuLy8gT2JqZWN0cy5cbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuaW1wb3J0ICogYXMgaSBmcm9tICcuLi9pbnRlcmZhY2VzJztcblxuaW1wb3J0ICogYXMgZSBmcm9tICcuLi9lbnVtcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBlbnVtU3RyaW5nVG9WYWx1ZTxFPihlbnVtUmVmOiBhbnksIHZhbHVlOiBzdHJpbmcpOiBFIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGVudW1SZWZbdmFsdWVdO1xufVxuXG5leHBvcnQgY2xhc3MgRmllbGRNYXNrIGltcGxlbWVudHMgaS5GaWVsZE1hc2tJbnRlcmZhY2Uge1xuICAgIHBhdGhzOiBzdHJpbmdbXTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IEZpZWxkTWFzayB7XG4gICAgICAgIGxldCBtID0gbmV3IEZpZWxkTWFzaygpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuRmllbGRNYXNrSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucGF0aHMgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3BhdGhzJ10gPSB0aGlzLnBhdGhzO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuIiwiLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vLyBDb2RlIGdlbmVyYXRlZCBieSBzZGtnZW5cbi8vIERPIE5PVCBFRElUIS5cbi8vXG4vLyBPYmplY3RzLlxuLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5pbXBvcnQgKiBhcyBpIGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgRmllbGRNYXNrIH0gZnJvbSAnLi9maWVsZC1tYXNrJztcbmltcG9ydCB7IExvY2F0aW9uLCBNdWx0aWxvY2F0aW9uUG9zdCwgTXVsdGlsb2NhdGlvblBvc3RFcnJvciB9IGZyb20gJy4vbXVsdGlsb2NhdGlvbi1wb3N0JztcbmltcG9ydCB7IFBvc3RUZW1wbGF0ZSB9IGZyb20gJy4vcG9zdC10ZW1wbGF0ZXMnO1xuaW1wb3J0IHsgU29jaWFsUG9zdCwgU29jaWFsUG9zdERhdGEsIFNjaGVkdWxlUG9zdFN0YXR1cyB9IGZyb20gJy4vc29jaWFsLXBvc3RzJztcbmltcG9ydCB7IFNvY2lhbFBvc3RTdGF0cyB9IGZyb20gJy4vc29jaWFsLXBvc3Qtc3RhdHMnO1xuaW1wb3J0ICogYXMgZSBmcm9tICcuLi9lbnVtcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBlbnVtU3RyaW5nVG9WYWx1ZTxFPihlbnVtUmVmOiBhbnksIHZhbHVlOiBzdHJpbmcpOiBFIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGVudW1SZWZbdmFsdWVdO1xufVxuXG5leHBvcnQgY2xhc3MgQ3JlYXRlTXVsdGlsb2NhdGlvblBvc3RSZXF1ZXN0IGltcGxlbWVudHMgaS5DcmVhdGVNdWx0aWxvY2F0aW9uUG9zdFJlcXVlc3RJbnRlcmZhY2Uge1xuICAgIGJyYW5kSWQ6IHN0cmluZztcbiAgICB0ZXh0OiBzdHJpbmc7XG4gICAgbWVkaWE6IHN0cmluZ1tdO1xuICAgIHNjaGVkdWxlZERhdGU6IERhdGU7XG4gICAgbG9jYXRpb25zOiBMb2NhdGlvbltdO1xuICAgIGdpZnM6IHN0cmluZ1tdO1xuICAgIHZpZGVvczogc3RyaW5nW107XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBDcmVhdGVNdWx0aWxvY2F0aW9uUG9zdFJlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBDcmVhdGVNdWx0aWxvY2F0aW9uUG9zdFJlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uc2NoZWR1bGVkRGF0ZSkge20uc2NoZWR1bGVkRGF0ZSA9IG5ldyBEYXRlKHByb3RvLnNjaGVkdWxlZERhdGUpO31cbiAgICAgICAgaWYgKHByb3RvLmxvY2F0aW9ucykge20ubG9jYXRpb25zID0gcHJvdG8ubG9jYXRpb25zLm1hcChMb2NhdGlvbi5mcm9tUHJvdG8pO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5DcmVhdGVNdWx0aWxvY2F0aW9uUG9zdFJlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5icmFuZElkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydicmFuZElkJ10gPSB0aGlzLmJyYW5kSWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndGV4dCddID0gdGhpcy50ZXh0O31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1lZGlhICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydtZWRpYSddID0gdGhpcy5tZWRpYTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zY2hlZHVsZWREYXRlICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnNjaGVkdWxlZERhdGUgIT09IG51bGwpIHt0b1JldHVyblsnc2NoZWR1bGVkRGF0ZSddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5zY2hlZHVsZWREYXRlID8gKHRoaXMuc2NoZWR1bGVkRGF0ZSBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5zY2hlZHVsZWREYXRlO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmxvY2F0aW9ucyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5sb2NhdGlvbnMgIT09IG51bGwpIHt0b1JldHVyblsnbG9jYXRpb25zJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmxvY2F0aW9ucyA/ICh0aGlzLmxvY2F0aW9ucyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5sb2NhdGlvbnM7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZ2lmcyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnZ2lmcyddID0gdGhpcy5naWZzO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnZpZGVvcyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndmlkZW9zJ10gPSB0aGlzLnZpZGVvczt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVNdWx0aWxvY2F0aW9uUG9zdFJlc3BvbnNlIGltcGxlbWVudHMgaS5DcmVhdGVNdWx0aWxvY2F0aW9uUG9zdFJlc3BvbnNlSW50ZXJmYWNlIHtcbiAgICBwb3N0OiBNdWx0aWxvY2F0aW9uUG9zdDtcbiAgICBlcnJvcnM6IE11bHRpbG9jYXRpb25Qb3N0RXJyb3JbXTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IENyZWF0ZU11bHRpbG9jYXRpb25Qb3N0UmVzcG9uc2Uge1xuICAgICAgICBsZXQgbSA9IG5ldyBDcmVhdGVNdWx0aWxvY2F0aW9uUG9zdFJlc3BvbnNlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLnBvc3QpIHttLnBvc3QgPSBNdWx0aWxvY2F0aW9uUG9zdC5mcm9tUHJvdG8ocHJvdG8ucG9zdCk7fVxuICAgICAgICBpZiAocHJvdG8uZXJyb3JzKSB7bS5lcnJvcnMgPSBwcm90by5lcnJvcnMubWFwKE11bHRpbG9jYXRpb25Qb3N0RXJyb3IuZnJvbVByb3RvKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuQ3JlYXRlTXVsdGlsb2NhdGlvblBvc3RSZXNwb25zZUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBvc3QgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucG9zdCAhPT0gbnVsbCkge3RvUmV0dXJuWydwb3N0J10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnBvc3QgPyAodGhpcy5wb3N0IGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnBvc3Q7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZXJyb3JzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmVycm9ycyAhPT0gbnVsbCkge3RvUmV0dXJuWydlcnJvcnMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuZXJyb3JzID8gKHRoaXMuZXJyb3JzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmVycm9yczt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVQb3N0VGVtcGxhdGVSZXF1ZXN0IGltcGxlbWVudHMgaS5DcmVhdGVQb3N0VGVtcGxhdGVSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBhY2NvdW50R3JvdXBJZDogc3RyaW5nO1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgcG9zdFRleHQ6IHN0cmluZztcbiAgICBwb3N0RGF0ZVRpbWU6IERhdGU7XG4gICAgZ21iUG9zdEN1c3RvbWl6YXRpb246IHN0cmluZztcbiAgICBpbWFnZVVybDogc3RyaW5nO1xuICAgIGltYWdlUGF0aDogc3RyaW5nO1xuICAgIGltYWdlU2l6ZTogc3RyaW5nO1xuICAgIHByZXZpZXdzOiBzdHJpbmc7XG4gICAgb3B0aW9uczogc3RyaW5nW107XG4gICAgdmlkZW9Vcmw6IHN0cmluZztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IENyZWF0ZVBvc3RUZW1wbGF0ZVJlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBDcmVhdGVQb3N0VGVtcGxhdGVSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLnBvc3REYXRlVGltZSkge20ucG9zdERhdGVUaW1lID0gbmV3IERhdGUocHJvdG8ucG9zdERhdGVUaW1lKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuQ3JlYXRlUG9zdFRlbXBsYXRlUmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmFjY291bnRHcm91cElkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydhY2NvdW50R3JvdXBJZCddID0gdGhpcy5hY2NvdW50R3JvdXBJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50aXRsZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndGl0bGUnXSA9IHRoaXMudGl0bGU7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucG9zdFRleHQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3Bvc3RUZXh0J10gPSB0aGlzLnBvc3RUZXh0O31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBvc3REYXRlVGltZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5wb3N0RGF0ZVRpbWUgIT09IG51bGwpIHt0b1JldHVyblsncG9zdERhdGVUaW1lJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnBvc3REYXRlVGltZSA/ICh0aGlzLnBvc3REYXRlVGltZSBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5wb3N0RGF0ZVRpbWU7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZ21iUG9zdEN1c3RvbWl6YXRpb24gIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2dtYlBvc3RDdXN0b21pemF0aW9uJ10gPSB0aGlzLmdtYlBvc3RDdXN0b21pemF0aW9uO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmltYWdlVXJsICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydpbWFnZVVybCddID0gdGhpcy5pbWFnZVVybDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5pbWFnZVBhdGggIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2ltYWdlUGF0aCddID0gdGhpcy5pbWFnZVBhdGg7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaW1hZ2VTaXplICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydpbWFnZVNpemUnXSA9IHRoaXMuaW1hZ2VTaXplO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByZXZpZXdzICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydwcmV2aWV3cyddID0gdGhpcy5wcmV2aWV3czt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydvcHRpb25zJ10gPSB0aGlzLm9wdGlvbnM7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudmlkZW9VcmwgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3ZpZGVvVXJsJ10gPSB0aGlzLnZpZGVvVXJsO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENyZWF0ZVBvc3RUZW1wbGF0ZVJlc3BvbnNlIGltcGxlbWVudHMgaS5DcmVhdGVQb3N0VGVtcGxhdGVSZXNwb25zZUludGVyZmFjZSB7XG4gICAgdGVtcGxhdGVJZDogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogQ3JlYXRlUG9zdFRlbXBsYXRlUmVzcG9uc2Uge1xuICAgICAgICBsZXQgbSA9IG5ldyBDcmVhdGVQb3N0VGVtcGxhdGVSZXNwb25zZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuQ3JlYXRlUG9zdFRlbXBsYXRlUmVzcG9uc2VJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50ZW1wbGF0ZUlkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWyd0ZW1wbGF0ZUlkJ10gPSB0aGlzLnRlbXBsYXRlSWQ7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGF0ZVJhbmdlRmlsdGVyIGltcGxlbWVudHMgaS5EYXRlUmFuZ2VGaWx0ZXJJbnRlcmZhY2Uge1xuICAgIGJlZ2luUmFuZ2U6IERhdGU7XG4gICAgZW5kUmFuZ2U6IERhdGU7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBEYXRlUmFuZ2VGaWx0ZXIge1xuICAgICAgICBsZXQgbSA9IG5ldyBEYXRlUmFuZ2VGaWx0ZXIoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uYmVnaW5SYW5nZSkge20uYmVnaW5SYW5nZSA9IG5ldyBEYXRlKHByb3RvLmJlZ2luUmFuZ2UpO31cbiAgICAgICAgaWYgKHByb3RvLmVuZFJhbmdlKSB7bS5lbmRSYW5nZSA9IG5ldyBEYXRlKHByb3RvLmVuZFJhbmdlKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuRGF0ZVJhbmdlRmlsdGVySW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYmVnaW5SYW5nZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5iZWdpblJhbmdlICE9PSBudWxsKSB7dG9SZXR1cm5bJ2JlZ2luUmFuZ2UnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuYmVnaW5SYW5nZSA/ICh0aGlzLmJlZ2luUmFuZ2UgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuYmVnaW5SYW5nZTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5lbmRSYW5nZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5lbmRSYW5nZSAhPT0gbnVsbCkge3RvUmV0dXJuWydlbmRSYW5nZSddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5lbmRSYW5nZSA/ICh0aGlzLmVuZFJhbmdlIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmVuZFJhbmdlO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlbGV0ZU11bHRpbG9jYXRpb25Qb3N0UmVxdWVzdCBpbXBsZW1lbnRzIGkuRGVsZXRlTXVsdGlsb2NhdGlvblBvc3RSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBicmFuZElkOiBzdHJpbmc7XG4gICAgbXVsdGlsb2NhdGlvbklkOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBEZWxldGVNdWx0aWxvY2F0aW9uUG9zdFJlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBEZWxldGVNdWx0aWxvY2F0aW9uUG9zdFJlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkRlbGV0ZU11bHRpbG9jYXRpb25Qb3N0UmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmJyYW5kSWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2JyYW5kSWQnXSA9IHRoaXMuYnJhbmRJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5tdWx0aWxvY2F0aW9uSWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ211bHRpbG9jYXRpb25JZCddID0gdGhpcy5tdWx0aWxvY2F0aW9uSWQ7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVsZXRlUG9zdFRlbXBsYXRlUmVxdWVzdCBpbXBsZW1lbnRzIGkuRGVsZXRlUG9zdFRlbXBsYXRlUmVxdWVzdEludGVyZmFjZSB7XG4gICAgYWNjb3VudEdyb3VwSWQ6IHN0cmluZztcbiAgICB0ZW1wbGF0ZUlkOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBEZWxldGVQb3N0VGVtcGxhdGVSZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgRGVsZXRlUG9zdFRlbXBsYXRlUmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuRGVsZXRlUG9zdFRlbXBsYXRlUmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmFjY291bnRHcm91cElkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydhY2NvdW50R3JvdXBJZCddID0gdGhpcy5hY2NvdW50R3JvdXBJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50ZW1wbGF0ZUlkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWyd0ZW1wbGF0ZUlkJ10gPSB0aGlzLnRlbXBsYXRlSWQ7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVsZXRlU29jaWFsUG9zdFJlcXVlc3QgaW1wbGVtZW50cyBpLkRlbGV0ZVNvY2lhbFBvc3RSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBidXNpbmVzc0lkOiBzdHJpbmc7XG4gICAgc29jaWFsUG9zdElkOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBEZWxldGVTb2NpYWxQb3N0UmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IERlbGV0ZVNvY2lhbFBvc3RSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5EZWxldGVTb2NpYWxQb3N0UmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmJ1c2luZXNzSWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2J1c2luZXNzSWQnXSA9IHRoaXMuYnVzaW5lc3NJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zb2NpYWxQb3N0SWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3NvY2lhbFBvc3RJZCddID0gdGhpcy5zb2NpYWxQb3N0SWQ7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRWRpdE11bHRpbG9jYXRpb25Qb3N0UmVxdWVzdCBpbXBsZW1lbnRzIGkuRWRpdE11bHRpbG9jYXRpb25Qb3N0UmVxdWVzdEludGVyZmFjZSB7XG4gICAgYnJhbmRJZDogc3RyaW5nO1xuICAgIG11bHRpbG9jYXRpb25JZDogc3RyaW5nO1xuICAgIHRleHQ6IHN0cmluZztcbiAgICBtZWRpYTogc3RyaW5nW107XG4gICAgc2NoZWR1bGVkRGF0ZTogRGF0ZTtcbiAgICBmaWVsZE1hc2s6IEZpZWxkTWFzaztcbiAgICBnaWZzOiBzdHJpbmdbXTtcbiAgICB2aWRlb3M6IHN0cmluZ1tdO1xuICAgIGxvY2F0aW9uczogTG9jYXRpb25bXTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IEVkaXRNdWx0aWxvY2F0aW9uUG9zdFJlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBFZGl0TXVsdGlsb2NhdGlvblBvc3RSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLnNjaGVkdWxlZERhdGUpIHttLnNjaGVkdWxlZERhdGUgPSBuZXcgRGF0ZShwcm90by5zY2hlZHVsZWREYXRlKTt9XG4gICAgICAgIGlmIChwcm90by5maWVsZE1hc2spIHttLmZpZWxkTWFzayA9IEZpZWxkTWFzay5mcm9tUHJvdG8ocHJvdG8uZmllbGRNYXNrKTt9XG4gICAgICAgIGlmIChwcm90by5sb2NhdGlvbnMpIHttLmxvY2F0aW9ucyA9IHByb3RvLmxvY2F0aW9ucy5tYXAoTG9jYXRpb24uZnJvbVByb3RvKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuRWRpdE11bHRpbG9jYXRpb25Qb3N0UmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmJyYW5kSWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2JyYW5kSWQnXSA9IHRoaXMuYnJhbmRJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5tdWx0aWxvY2F0aW9uSWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ211bHRpbG9jYXRpb25JZCddID0gdGhpcy5tdWx0aWxvY2F0aW9uSWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndGV4dCddID0gdGhpcy50ZXh0O31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1lZGlhICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydtZWRpYSddID0gdGhpcy5tZWRpYTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zY2hlZHVsZWREYXRlICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnNjaGVkdWxlZERhdGUgIT09IG51bGwpIHt0b1JldHVyblsnc2NoZWR1bGVkRGF0ZSddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5zY2hlZHVsZWREYXRlID8gKHRoaXMuc2NoZWR1bGVkRGF0ZSBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5zY2hlZHVsZWREYXRlO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmZpZWxkTWFzayAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5maWVsZE1hc2sgIT09IG51bGwpIHt0b1JldHVyblsnZmllbGRNYXNrJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmZpZWxkTWFzayA/ICh0aGlzLmZpZWxkTWFzayBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5maWVsZE1hc2s7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZ2lmcyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnZ2lmcyddID0gdGhpcy5naWZzO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnZpZGVvcyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndmlkZW9zJ10gPSB0aGlzLnZpZGVvczt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5sb2NhdGlvbnMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubG9jYXRpb25zICE9PSBudWxsKSB7dG9SZXR1cm5bJ2xvY2F0aW9ucyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5sb2NhdGlvbnMgPyAodGhpcy5sb2NhdGlvbnMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMubG9jYXRpb25zO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVkaXRNdWx0aWxvY2F0aW9uUG9zdFJlc3BvbnNlIGltcGxlbWVudHMgaS5FZGl0TXVsdGlsb2NhdGlvblBvc3RSZXNwb25zZUludGVyZmFjZSB7XG4gICAgcG9zdDogTXVsdGlsb2NhdGlvblBvc3Q7XG4gICAgZXJyb3JzOiBNdWx0aWxvY2F0aW9uUG9zdEVycm9yW107XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBFZGl0TXVsdGlsb2NhdGlvblBvc3RSZXNwb25zZSB7XG4gICAgICAgIGxldCBtID0gbmV3IEVkaXRNdWx0aWxvY2F0aW9uUG9zdFJlc3BvbnNlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLnBvc3QpIHttLnBvc3QgPSBNdWx0aWxvY2F0aW9uUG9zdC5mcm9tUHJvdG8ocHJvdG8ucG9zdCk7fVxuICAgICAgICBpZiAocHJvdG8uZXJyb3JzKSB7bS5lcnJvcnMgPSBwcm90by5lcnJvcnMubWFwKE11bHRpbG9jYXRpb25Qb3N0RXJyb3IuZnJvbVByb3RvKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuRWRpdE11bHRpbG9jYXRpb25Qb3N0UmVzcG9uc2VJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wb3N0ICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnBvc3QgIT09IG51bGwpIHt0b1JldHVyblsncG9zdCddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5wb3N0ID8gKHRoaXMucG9zdCBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5wb3N0O31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmVycm9ycyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5lcnJvcnMgIT09IG51bGwpIHt0b1JldHVyblsnZXJyb3JzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmVycm9ycyA/ICh0aGlzLmVycm9ycyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5lcnJvcnM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGFydG5lckxpc3RTY2hlZHVsZWRTb2NpYWxQb3N0c1JlcXVlc3RGaWx0ZXJzIGltcGxlbWVudHMgaS5QYXJ0bmVyTGlzdFNjaGVkdWxlZFNvY2lhbFBvc3RzUmVxdWVzdEZpbHRlcnNJbnRlcmZhY2Uge1xuICAgIGRhdGVSYW5nZTogRGF0ZVJhbmdlRmlsdGVyO1xuICAgIHBhcnRuZXJJZDogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogUGFydG5lckxpc3RTY2hlZHVsZWRTb2NpYWxQb3N0c1JlcXVlc3RGaWx0ZXJzIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgUGFydG5lckxpc3RTY2hlZHVsZWRTb2NpYWxQb3N0c1JlcXVlc3RGaWx0ZXJzKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLmRhdGVSYW5nZSkge20uZGF0ZVJhbmdlID0gRGF0ZVJhbmdlRmlsdGVyLmZyb21Qcm90byhwcm90by5kYXRlUmFuZ2UpO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5QYXJ0bmVyTGlzdFNjaGVkdWxlZFNvY2lhbFBvc3RzUmVxdWVzdEZpbHRlcnNJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5kYXRlUmFuZ2UgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuZGF0ZVJhbmdlICE9PSBudWxsKSB7dG9SZXR1cm5bJ2RhdGVSYW5nZSddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5kYXRlUmFuZ2UgPyAodGhpcy5kYXRlUmFuZ2UgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuZGF0ZVJhbmdlO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBhcnRuZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsncGFydG5lcklkJ10gPSB0aGlzLnBhcnRuZXJJZDt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRNdWx0aVNvY2lhbFBvc3RTdGF0c1JlcXVlc3QgaW1wbGVtZW50cyBpLkdldE11bHRpU29jaWFsUG9zdFN0YXRzUmVxdWVzdEludGVyZmFjZSB7XG4gICAgaW50ZXJuYWxQb3N0SWRzOiBzdHJpbmdbXTtcbiAgICBidXNpbmVzc0lkOiBzdHJpbmc7XG4gICAgcGFydG5lcklkOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBHZXRNdWx0aVNvY2lhbFBvc3RTdGF0c1JlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBHZXRNdWx0aVNvY2lhbFBvc3RTdGF0c1JlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkdldE11bHRpU29jaWFsUG9zdFN0YXRzUmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmludGVybmFsUG9zdElkcyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnaW50ZXJuYWxQb3N0SWRzJ10gPSB0aGlzLmludGVybmFsUG9zdElkczt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5idXNpbmVzc0lkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydidXNpbmVzc0lkJ10gPSB0aGlzLmJ1c2luZXNzSWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucGFydG5lcklkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydwYXJ0bmVySWQnXSA9IHRoaXMucGFydG5lcklkO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldE11bHRpU29jaWFsUG9zdFN0YXRzUmVzcG9uc2UgaW1wbGVtZW50cyBpLkdldE11bHRpU29jaWFsUG9zdFN0YXRzUmVzcG9uc2VJbnRlcmZhY2Uge1xuICAgIHNvY2lhbFBvc3RTdGF0czogU29jaWFsUG9zdFN0YXRzW107XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBHZXRNdWx0aVNvY2lhbFBvc3RTdGF0c1Jlc3BvbnNlIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgR2V0TXVsdGlTb2NpYWxQb3N0U3RhdHNSZXNwb25zZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5zb2NpYWxQb3N0U3RhdHMpIHttLnNvY2lhbFBvc3RTdGF0cyA9IHByb3RvLnNvY2lhbFBvc3RTdGF0cy5tYXAoU29jaWFsUG9zdFN0YXRzLmZyb21Qcm90byk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkdldE11bHRpU29jaWFsUG9zdFN0YXRzUmVzcG9uc2VJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zb2NpYWxQb3N0U3RhdHMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuc29jaWFsUG9zdFN0YXRzICE9PSBudWxsKSB7dG9SZXR1cm5bJ3NvY2lhbFBvc3RTdGF0cyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5zb2NpYWxQb3N0U3RhdHMgPyAodGhpcy5zb2NpYWxQb3N0U3RhdHMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuc29jaWFsUG9zdFN0YXRzO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldE11bHRpU29jaWFsUG9zdHNSZXF1ZXN0IGltcGxlbWVudHMgaS5HZXRNdWx0aVNvY2lhbFBvc3RzUmVxdWVzdEludGVyZmFjZSB7XG4gICAgYnVzaW5lc3NJZDogc3RyaW5nO1xuICAgIGludGVybmFsUG9zdElkczogc3RyaW5nW107XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBHZXRNdWx0aVNvY2lhbFBvc3RzUmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IEdldE11bHRpU29jaWFsUG9zdHNSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5HZXRNdWx0aVNvY2lhbFBvc3RzUmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmJ1c2luZXNzSWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2J1c2luZXNzSWQnXSA9IHRoaXMuYnVzaW5lc3NJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5pbnRlcm5hbFBvc3RJZHMgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2ludGVybmFsUG9zdElkcyddID0gdGhpcy5pbnRlcm5hbFBvc3RJZHM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgR2V0TXVsdGlTb2NpYWxQb3N0c1Jlc3BvbnNlIGltcGxlbWVudHMgaS5HZXRNdWx0aVNvY2lhbFBvc3RzUmVzcG9uc2VJbnRlcmZhY2Uge1xuICAgIHNvY2lhbFBvc3RzOiBTb2NpYWxQb3N0W107XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBHZXRNdWx0aVNvY2lhbFBvc3RzUmVzcG9uc2Uge1xuICAgICAgICBsZXQgbSA9IG5ldyBHZXRNdWx0aVNvY2lhbFBvc3RzUmVzcG9uc2UoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uc29jaWFsUG9zdHMpIHttLnNvY2lhbFBvc3RzID0gcHJvdG8uc29jaWFsUG9zdHMubWFwKFNvY2lhbFBvc3QuZnJvbVByb3RvKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuR2V0TXVsdGlTb2NpYWxQb3N0c1Jlc3BvbnNlSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc29jaWFsUG9zdHMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuc29jaWFsUG9zdHMgIT09IG51bGwpIHt0b1JldHVyblsnc29jaWFsUG9zdHMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuc29jaWFsUG9zdHMgPyAodGhpcy5zb2NpYWxQb3N0cyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5zb2NpYWxQb3N0czt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRNdWx0aWxvY2F0aW9uUG9zdFJlcXVlc3QgaW1wbGVtZW50cyBpLkdldE11bHRpbG9jYXRpb25Qb3N0UmVxdWVzdEludGVyZmFjZSB7XG4gICAgYnJhbmRJZDogc3RyaW5nO1xuICAgIG11bHRpbG9jYXRpb25JZDogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogR2V0TXVsdGlsb2NhdGlvblBvc3RSZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgR2V0TXVsdGlsb2NhdGlvblBvc3RSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5HZXRNdWx0aWxvY2F0aW9uUG9zdFJlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5icmFuZElkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydicmFuZElkJ10gPSB0aGlzLmJyYW5kSWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubXVsdGlsb2NhdGlvbklkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydtdWx0aWxvY2F0aW9uSWQnXSA9IHRoaXMubXVsdGlsb2NhdGlvbklkO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldE11bHRpbG9jYXRpb25Qb3N0UmVzcG9uc2UgaW1wbGVtZW50cyBpLkdldE11bHRpbG9jYXRpb25Qb3N0UmVzcG9uc2VJbnRlcmZhY2Uge1xuICAgIG11bHRpbG9jYXRpb25Qb3N0OiBNdWx0aWxvY2F0aW9uUG9zdDtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IEdldE11bHRpbG9jYXRpb25Qb3N0UmVzcG9uc2Uge1xuICAgICAgICBsZXQgbSA9IG5ldyBHZXRNdWx0aWxvY2F0aW9uUG9zdFJlc3BvbnNlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLm11bHRpbG9jYXRpb25Qb3N0KSB7bS5tdWx0aWxvY2F0aW9uUG9zdCA9IE11bHRpbG9jYXRpb25Qb3N0LmZyb21Qcm90byhwcm90by5tdWx0aWxvY2F0aW9uUG9zdCk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkdldE11bHRpbG9jYXRpb25Qb3N0UmVzcG9uc2VJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5tdWx0aWxvY2F0aW9uUG9zdCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5tdWx0aWxvY2F0aW9uUG9zdCAhPT0gbnVsbCkge3RvUmV0dXJuWydtdWx0aWxvY2F0aW9uUG9zdCddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5tdWx0aWxvY2F0aW9uUG9zdCA/ICh0aGlzLm11bHRpbG9jYXRpb25Qb3N0IGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLm11bHRpbG9jYXRpb25Qb3N0O31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldFBvc3RUZW1wbGF0ZVJlcXVlc3QgaW1wbGVtZW50cyBpLkdldFBvc3RUZW1wbGF0ZVJlcXVlc3RJbnRlcmZhY2Uge1xuICAgIGFjY291bnRHcm91cElkOiBzdHJpbmc7XG4gICAgdGVtcGxhdGVJZDogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogR2V0UG9zdFRlbXBsYXRlUmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IEdldFBvc3RUZW1wbGF0ZVJlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkdldFBvc3RUZW1wbGF0ZVJlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hY2NvdW50R3JvdXBJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnYWNjb3VudEdyb3VwSWQnXSA9IHRoaXMuYWNjb3VudEdyb3VwSWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGVtcGxhdGVJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndGVtcGxhdGVJZCddID0gdGhpcy50ZW1wbGF0ZUlkO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldFBvc3RUZW1wbGF0ZVJlc3BvbnNlIGltcGxlbWVudHMgaS5HZXRQb3N0VGVtcGxhdGVSZXNwb25zZUludGVyZmFjZSB7XG4gICAgcG9zdFRlbXBsYXRlOiBQb3N0VGVtcGxhdGU7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBHZXRQb3N0VGVtcGxhdGVSZXNwb25zZSB7XG4gICAgICAgIGxldCBtID0gbmV3IEdldFBvc3RUZW1wbGF0ZVJlc3BvbnNlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLnBvc3RUZW1wbGF0ZSkge20ucG9zdFRlbXBsYXRlID0gUG9zdFRlbXBsYXRlLmZyb21Qcm90byhwcm90by5wb3N0VGVtcGxhdGUpO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5HZXRQb3N0VGVtcGxhdGVSZXNwb25zZUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBvc3RUZW1wbGF0ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5wb3N0VGVtcGxhdGUgIT09IG51bGwpIHt0b1JldHVyblsncG9zdFRlbXBsYXRlJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnBvc3RUZW1wbGF0ZSA/ICh0aGlzLnBvc3RUZW1wbGF0ZSBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5wb3N0VGVtcGxhdGU7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgR2V0U2NoZWR1bGVkUG9zdENvdW50UmVxdWVzdCBpbXBsZW1lbnRzIGkuR2V0U2NoZWR1bGVkUG9zdENvdW50UmVxdWVzdEludGVyZmFjZSB7XG4gICAgcGFydG5lcklkOiBzdHJpbmc7XG4gICAgYnVzaW5lc3NJZDogc3RyaW5nO1xuICAgIHNvY2lhbFNlcnZpY2VJZHM6IHN0cmluZ1tdO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogR2V0U2NoZWR1bGVkUG9zdENvdW50UmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IEdldFNjaGVkdWxlZFBvc3RDb3VudFJlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkdldFNjaGVkdWxlZFBvc3RDb3VudFJlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wYXJ0bmVySWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3BhcnRuZXJJZCddID0gdGhpcy5wYXJ0bmVySWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYnVzaW5lc3NJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnYnVzaW5lc3NJZCddID0gdGhpcy5idXNpbmVzc0lkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNvY2lhbFNlcnZpY2VJZHMgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3NvY2lhbFNlcnZpY2VJZHMnXSA9IHRoaXMuc29jaWFsU2VydmljZUlkczt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRTY2hlZHVsZWRQb3N0Q291bnRSZXNwb25zZSBpbXBsZW1lbnRzIGkuR2V0U2NoZWR1bGVkUG9zdENvdW50UmVzcG9uc2VJbnRlcmZhY2Uge1xuICAgIGNvdW50OiBudW1iZXI7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBHZXRTY2hlZHVsZWRQb3N0Q291bnRSZXNwb25zZSB7XG4gICAgICAgIGxldCBtID0gbmV3IEdldFNjaGVkdWxlZFBvc3RDb3VudFJlc3BvbnNlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLmNvdW50KSB7bS5jb3VudCA9IHBhcnNlSW50KHByb3RvLmNvdW50LCAxMCk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkdldFNjaGVkdWxlZFBvc3RDb3VudFJlc3BvbnNlSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY291bnQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2NvdW50J10gPSB0aGlzLmNvdW50O31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIExpc3RNdWx0aWxvY2F0aW9uUG9zdHNGb3JCcmFuZFJlcXVlc3QgaW1wbGVtZW50cyBpLkxpc3RNdWx0aWxvY2F0aW9uUG9zdHNGb3JCcmFuZFJlcXVlc3RJbnRlcmZhY2Uge1xuICAgIGJyYW5kSWQ6IHN0cmluZztcbiAgICBzdGFydERhdGU6IERhdGU7XG4gICAgZW5kRGF0ZTogRGF0ZTtcbiAgICBjdXJzb3I6IHN0cmluZztcbiAgICBwYWdlU2l6ZTogbnVtYmVyO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogTGlzdE11bHRpbG9jYXRpb25Qb3N0c0ZvckJyYW5kUmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IExpc3RNdWx0aWxvY2F0aW9uUG9zdHNGb3JCcmFuZFJlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uc3RhcnREYXRlKSB7bS5zdGFydERhdGUgPSBuZXcgRGF0ZShwcm90by5zdGFydERhdGUpO31cbiAgICAgICAgaWYgKHByb3RvLmVuZERhdGUpIHttLmVuZERhdGUgPSBuZXcgRGF0ZShwcm90by5lbmREYXRlKTt9XG4gICAgICAgIGlmIChwcm90by5wYWdlU2l6ZSkge20ucGFnZVNpemUgPSBwYXJzZUludChwcm90by5wYWdlU2l6ZSwgMTApO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5MaXN0TXVsdGlsb2NhdGlvblBvc3RzRm9yQnJhbmRSZXF1ZXN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYnJhbmRJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnYnJhbmRJZCddID0gdGhpcy5icmFuZElkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnN0YXJ0RGF0ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5zdGFydERhdGUgIT09IG51bGwpIHt0b1JldHVyblsnc3RhcnREYXRlJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnN0YXJ0RGF0ZSA/ICh0aGlzLnN0YXJ0RGF0ZSBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5zdGFydERhdGU7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZW5kRGF0ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5lbmREYXRlICE9PSBudWxsKSB7dG9SZXR1cm5bJ2VuZERhdGUnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuZW5kRGF0ZSA/ICh0aGlzLmVuZERhdGUgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuZW5kRGF0ZTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jdXJzb3IgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2N1cnNvciddID0gdGhpcy5jdXJzb3I7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucGFnZVNpemUgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3BhZ2VTaXplJ10gPSB0aGlzLnBhZ2VTaXplO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIExpc3RNdWx0aWxvY2F0aW9uUG9zdHNGb3JCcmFuZFJlc3BvbnNlIGltcGxlbWVudHMgaS5MaXN0TXVsdGlsb2NhdGlvblBvc3RzRm9yQnJhbmRSZXNwb25zZUludGVyZmFjZSB7XG4gICAgbXVsdGlsb2NhdGlvblBvc3RzOiBNdWx0aWxvY2F0aW9uUG9zdFtdO1xuICAgIG5leHRDdXJzb3I6IHN0cmluZztcbiAgICBoYXNNb3JlOiBib29sZWFuO1xuICAgIGZhaWxlZFNvY2lhbFBvc3RzOiBTb2NpYWxQb3N0W107XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBMaXN0TXVsdGlsb2NhdGlvblBvc3RzRm9yQnJhbmRSZXNwb25zZSB7XG4gICAgICAgIGxldCBtID0gbmV3IExpc3RNdWx0aWxvY2F0aW9uUG9zdHNGb3JCcmFuZFJlc3BvbnNlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLm11bHRpbG9jYXRpb25Qb3N0cykge20ubXVsdGlsb2NhdGlvblBvc3RzID0gcHJvdG8ubXVsdGlsb2NhdGlvblBvc3RzLm1hcChNdWx0aWxvY2F0aW9uUG9zdC5mcm9tUHJvdG8pO31cbiAgICAgICAgaWYgKHByb3RvLmZhaWxlZFNvY2lhbFBvc3RzKSB7bS5mYWlsZWRTb2NpYWxQb3N0cyA9IHByb3RvLmZhaWxlZFNvY2lhbFBvc3RzLm1hcChTb2NpYWxQb3N0LmZyb21Qcm90byk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkxpc3RNdWx0aWxvY2F0aW9uUG9zdHNGb3JCcmFuZFJlc3BvbnNlSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubXVsdGlsb2NhdGlvblBvc3RzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLm11bHRpbG9jYXRpb25Qb3N0cyAhPT0gbnVsbCkge3RvUmV0dXJuWydtdWx0aWxvY2F0aW9uUG9zdHMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMubXVsdGlsb2NhdGlvblBvc3RzID8gKHRoaXMubXVsdGlsb2NhdGlvblBvc3RzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLm11bHRpbG9jYXRpb25Qb3N0czt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5uZXh0Q3Vyc29yICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWyduZXh0Q3Vyc29yJ10gPSB0aGlzLm5leHRDdXJzb3I7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaGFzTW9yZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnaGFzTW9yZSddID0gdGhpcy5oYXNNb3JlO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmZhaWxlZFNvY2lhbFBvc3RzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmZhaWxlZFNvY2lhbFBvc3RzICE9PSBudWxsKSB7dG9SZXR1cm5bJ2ZhaWxlZFNvY2lhbFBvc3RzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmZhaWxlZFNvY2lhbFBvc3RzID8gKHRoaXMuZmFpbGVkU29jaWFsUG9zdHMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuZmFpbGVkU29jaWFsUG9zdHM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTGlzdFBvc3RUZW1wbGF0ZXNSZXF1ZXN0IGltcGxlbWVudHMgaS5MaXN0UG9zdFRlbXBsYXRlc1JlcXVlc3RJbnRlcmZhY2Uge1xuICAgIGFjY291bnRHcm91cElkOiBzdHJpbmc7XG4gICAgY3Vyc29yOiBzdHJpbmc7XG4gICAgcGFnZVNpemU6IG51bWJlcjtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IExpc3RQb3N0VGVtcGxhdGVzUmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IExpc3RQb3N0VGVtcGxhdGVzUmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5wYWdlU2l6ZSkge20ucGFnZVNpemUgPSBwYXJzZUludChwcm90by5wYWdlU2l6ZSwgMTApO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5MaXN0UG9zdFRlbXBsYXRlc1JlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hY2NvdW50R3JvdXBJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnYWNjb3VudEdyb3VwSWQnXSA9IHRoaXMuYWNjb3VudEdyb3VwSWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY3Vyc29yICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydjdXJzb3InXSA9IHRoaXMuY3Vyc29yO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBhZ2VTaXplICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydwYWdlU2l6ZSddID0gdGhpcy5wYWdlU2l6ZTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMaXN0UG9zdFRlbXBsYXRlc1Jlc3BvbnNlIGltcGxlbWVudHMgaS5MaXN0UG9zdFRlbXBsYXRlc1Jlc3BvbnNlSW50ZXJmYWNlIHtcbiAgICBwb3N0VGVtcGxhdGU6IFBvc3RUZW1wbGF0ZVtdO1xuICAgIG5leHRDdXJzb3I6IHN0cmluZztcbiAgICBoYXNNb3JlOiBib29sZWFuO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogTGlzdFBvc3RUZW1wbGF0ZXNSZXNwb25zZSB7XG4gICAgICAgIGxldCBtID0gbmV3IExpc3RQb3N0VGVtcGxhdGVzUmVzcG9uc2UoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8ucG9zdFRlbXBsYXRlKSB7bS5wb3N0VGVtcGxhdGUgPSBwcm90by5wb3N0VGVtcGxhdGUubWFwKFBvc3RUZW1wbGF0ZS5mcm9tUHJvdG8pO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5MaXN0UG9zdFRlbXBsYXRlc1Jlc3BvbnNlSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucG9zdFRlbXBsYXRlICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnBvc3RUZW1wbGF0ZSAhPT0gbnVsbCkge3RvUmV0dXJuWydwb3N0VGVtcGxhdGUnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMucG9zdFRlbXBsYXRlID8gKHRoaXMucG9zdFRlbXBsYXRlIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnBvc3RUZW1wbGF0ZTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5uZXh0Q3Vyc29yICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWyduZXh0Q3Vyc29yJ10gPSB0aGlzLm5leHRDdXJzb3I7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaGFzTW9yZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnaGFzTW9yZSddID0gdGhpcy5oYXNNb3JlO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIExpc3RTb2NpYWxQb3N0c1JlcXVlc3QgaW1wbGVtZW50cyBpLkxpc3RTb2NpYWxQb3N0c1JlcXVlc3RJbnRlcmZhY2Uge1xuICAgIHN0YXJ0OiBEYXRlO1xuICAgIGVuZDogRGF0ZTtcbiAgICBidXNpbmVzc0lkOiBzdHJpbmc7XG4gICAgcGFydG5lcklkOiBzdHJpbmc7XG4gICAgY3Vyc29yOiBzdHJpbmc7XG4gICAgc29jaWFsU2VydmljZUlkczogc3RyaW5nW107XG4gICAgdGFnczogc3RyaW5nW107XG4gICAgcGFnZVNpemU6IG51bWJlcjtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IExpc3RTb2NpYWxQb3N0c1JlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBMaXN0U29jaWFsUG9zdHNSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLnN0YXJ0KSB7bS5zdGFydCA9IG5ldyBEYXRlKHByb3RvLnN0YXJ0KTt9XG4gICAgICAgIGlmIChwcm90by5lbmQpIHttLmVuZCA9IG5ldyBEYXRlKHByb3RvLmVuZCk7fVxuICAgICAgICBpZiAocHJvdG8ucGFnZVNpemUpIHttLnBhZ2VTaXplID0gcGFyc2VJbnQocHJvdG8ucGFnZVNpemUsIDEwKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuTGlzdFNvY2lhbFBvc3RzUmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnN0YXJ0ICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnN0YXJ0ICE9PSBudWxsKSB7dG9SZXR1cm5bJ3N0YXJ0J10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnN0YXJ0ID8gKHRoaXMuc3RhcnQgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuc3RhcnQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZW5kICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmVuZCAhPT0gbnVsbCkge3RvUmV0dXJuWydlbmQnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuZW5kID8gKHRoaXMuZW5kIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmVuZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5idXNpbmVzc0lkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydidXNpbmVzc0lkJ10gPSB0aGlzLmJ1c2luZXNzSWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucGFydG5lcklkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydwYXJ0bmVySWQnXSA9IHRoaXMucGFydG5lcklkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmN1cnNvciAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnY3Vyc29yJ10gPSB0aGlzLmN1cnNvcjt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zb2NpYWxTZXJ2aWNlSWRzICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydzb2NpYWxTZXJ2aWNlSWRzJ10gPSB0aGlzLnNvY2lhbFNlcnZpY2VJZHM7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGFncyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndGFncyddID0gdGhpcy50YWdzO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBhZ2VTaXplICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydwYWdlU2l6ZSddID0gdGhpcy5wYWdlU2l6ZTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMaXN0U29jaWFsUG9zdHNSZXNwb25zZSBpbXBsZW1lbnRzIGkuTGlzdFNvY2lhbFBvc3RzUmVzcG9uc2VJbnRlcmZhY2Uge1xuICAgIHNvY2lhbFBvc3RzOiBTb2NpYWxQb3N0W107XG4gICAgbmV4dEN1cnNvcjogc3RyaW5nO1xuICAgIGhhc01vcmU6IGJvb2xlYW47XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBMaXN0U29jaWFsUG9zdHNSZXNwb25zZSB7XG4gICAgICAgIGxldCBtID0gbmV3IExpc3RTb2NpYWxQb3N0c1Jlc3BvbnNlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLnNvY2lhbFBvc3RzKSB7bS5zb2NpYWxQb3N0cyA9IHByb3RvLnNvY2lhbFBvc3RzLm1hcChTb2NpYWxQb3N0LmZyb21Qcm90byk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkxpc3RTb2NpYWxQb3N0c1Jlc3BvbnNlSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc29jaWFsUG9zdHMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuc29jaWFsUG9zdHMgIT09IG51bGwpIHt0b1JldHVyblsnc29jaWFsUG9zdHMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuc29jaWFsUG9zdHMgPyAodGhpcy5zb2NpYWxQb3N0cyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5zb2NpYWxQb3N0czt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5uZXh0Q3Vyc29yICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWyduZXh0Q3Vyc29yJ10gPSB0aGlzLm5leHRDdXJzb3I7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaGFzTW9yZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnaGFzTW9yZSddID0gdGhpcy5oYXNNb3JlO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBhcnRuZXJMaXN0U2NoZWR1bGVkUG9zdHNSZXNwb25zZSBpbXBsZW1lbnRzIGkuUGFydG5lckxpc3RTY2hlZHVsZWRQb3N0c1Jlc3BvbnNlSW50ZXJmYWNlIHtcbiAgICBzb2NpYWxQb3N0czogU29jaWFsUG9zdFtdO1xuICAgIG5leHRDdXJzb3I6IHN0cmluZztcbiAgICBoYXNNb3JlOiBib29sZWFuO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogUGFydG5lckxpc3RTY2hlZHVsZWRQb3N0c1Jlc3BvbnNlIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgUGFydG5lckxpc3RTY2hlZHVsZWRQb3N0c1Jlc3BvbnNlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLnNvY2lhbFBvc3RzKSB7bS5zb2NpYWxQb3N0cyA9IHByb3RvLnNvY2lhbFBvc3RzLm1hcChTb2NpYWxQb3N0LmZyb21Qcm90byk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLlBhcnRuZXJMaXN0U2NoZWR1bGVkUG9zdHNSZXNwb25zZUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNvY2lhbFBvc3RzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnNvY2lhbFBvc3RzICE9PSBudWxsKSB7dG9SZXR1cm5bJ3NvY2lhbFBvc3RzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnNvY2lhbFBvc3RzID8gKHRoaXMuc29jaWFsUG9zdHMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuc29jaWFsUG9zdHM7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubmV4dEN1cnNvciAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnbmV4dEN1cnNvciddID0gdGhpcy5uZXh0Q3Vyc29yO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmhhc01vcmUgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2hhc01vcmUnXSA9IHRoaXMuaGFzTW9yZTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQYXJ0bmVyTGlzdFNjaGVkdWxlZFNvY2lhbFBvc3RzUmVxdWVzdCBpbXBsZW1lbnRzIGkuUGFydG5lckxpc3RTY2hlZHVsZWRTb2NpYWxQb3N0c1JlcXVlc3RJbnRlcmZhY2Uge1xuICAgIGN1cnNvcjogc3RyaW5nO1xuICAgIGZpbHRlcnM6IFBhcnRuZXJMaXN0U2NoZWR1bGVkU29jaWFsUG9zdHNSZXF1ZXN0RmlsdGVycztcbiAgICBwYWdlU2l6ZTogbnVtYmVyO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogUGFydG5lckxpc3RTY2hlZHVsZWRTb2NpYWxQb3N0c1JlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBQYXJ0bmVyTGlzdFNjaGVkdWxlZFNvY2lhbFBvc3RzUmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5maWx0ZXJzKSB7bS5maWx0ZXJzID0gUGFydG5lckxpc3RTY2hlZHVsZWRTb2NpYWxQb3N0c1JlcXVlc3RGaWx0ZXJzLmZyb21Qcm90byhwcm90by5maWx0ZXJzKTt9XG4gICAgICAgIGlmIChwcm90by5wYWdlU2l6ZSkge20ucGFnZVNpemUgPSBwYXJzZUludChwcm90by5wYWdlU2l6ZSwgMTApO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5QYXJ0bmVyTGlzdFNjaGVkdWxlZFNvY2lhbFBvc3RzUmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmN1cnNvciAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnY3Vyc29yJ10gPSB0aGlzLmN1cnNvcjt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5maWx0ZXJzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmZpbHRlcnMgIT09IG51bGwpIHt0b1JldHVyblsnZmlsdGVycyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5maWx0ZXJzID8gKHRoaXMuZmlsdGVycyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5maWx0ZXJzO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBhZ2VTaXplICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydwYWdlU2l6ZSddID0gdGhpcy5wYWdlU2l6ZTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZW1vdmVGcm9tTXVsdGlsb2NhdGlvblBvc3RSZXF1ZXN0IGltcGxlbWVudHMgaS5SZW1vdmVGcm9tTXVsdGlsb2NhdGlvblBvc3RSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICByZWFzb246IGUuUmVtb3ZlUmVhc29uO1xuICAgIGJyYW5kSWQ6IHN0cmluZztcbiAgICBtdWx0aWxvY2F0aW9uSWQ6IHN0cmluZztcbiAgICBsb2NhdGlvbnM6IExvY2F0aW9uW107XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBSZW1vdmVGcm9tTXVsdGlsb2NhdGlvblBvc3RSZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgUmVtb3ZlRnJvbU11bHRpbG9jYXRpb25Qb3N0UmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5yZWFzb24pIHttLnJlYXNvbiA9IGVudW1TdHJpbmdUb1ZhbHVlPGUuUmVtb3ZlUmVhc29uPihlLlJlbW92ZVJlYXNvbiwgcHJvdG8ucmVhc29uKTt9XG4gICAgICAgIGlmIChwcm90by5sb2NhdGlvbnMpIHttLmxvY2F0aW9ucyA9IHByb3RvLmxvY2F0aW9ucy5tYXAoTG9jYXRpb24uZnJvbVByb3RvKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuUmVtb3ZlRnJvbU11bHRpbG9jYXRpb25Qb3N0UmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnJlYXNvbiAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsncmVhc29uJ10gPSB0aGlzLnJlYXNvbjt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5icmFuZElkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydicmFuZElkJ10gPSB0aGlzLmJyYW5kSWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubXVsdGlsb2NhdGlvbklkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydtdWx0aWxvY2F0aW9uSWQnXSA9IHRoaXMubXVsdGlsb2NhdGlvbklkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmxvY2F0aW9ucyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5sb2NhdGlvbnMgIT09IG51bGwpIHt0b1JldHVyblsnbG9jYXRpb25zJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmxvY2F0aW9ucyA/ICh0aGlzLmxvY2F0aW9ucyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5sb2NhdGlvbnM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2NoZWR1bGVQb3N0UmVxdWVzdCBpbXBsZW1lbnRzIGkuU2NoZWR1bGVQb3N0UmVxdWVzdEludGVyZmFjZSB7XG4gICAgc29jaWFsUG9zdDogU29jaWFsUG9zdERhdGE7XG4gICAgc29jaWFsU2VydmljZUlkczogc3RyaW5nW107XG4gICAgcGFydG5lcklkOiBzdHJpbmc7XG4gICAgYnVzaW5lc3NJZDogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogU2NoZWR1bGVQb3N0UmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IFNjaGVkdWxlUG9zdFJlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uc29jaWFsUG9zdCkge20uc29jaWFsUG9zdCA9IFNvY2lhbFBvc3REYXRhLmZyb21Qcm90byhwcm90by5zb2NpYWxQb3N0KTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuU2NoZWR1bGVQb3N0UmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNvY2lhbFBvc3QgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuc29jaWFsUG9zdCAhPT0gbnVsbCkge3RvUmV0dXJuWydzb2NpYWxQb3N0J10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnNvY2lhbFBvc3QgPyAodGhpcy5zb2NpYWxQb3N0IGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnNvY2lhbFBvc3Q7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc29jaWFsU2VydmljZUlkcyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnc29jaWFsU2VydmljZUlkcyddID0gdGhpcy5zb2NpYWxTZXJ2aWNlSWRzO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBhcnRuZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsncGFydG5lcklkJ10gPSB0aGlzLnBhcnRuZXJJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5idXNpbmVzc0lkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydidXNpbmVzc0lkJ10gPSB0aGlzLmJ1c2luZXNzSWQ7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2NoZWR1bGVQb3N0UmVzcG9uc2UgaW1wbGVtZW50cyBpLlNjaGVkdWxlUG9zdFJlc3BvbnNlSW50ZXJmYWNlIHtcbiAgICBzdGF0dXNlczogU2NoZWR1bGVQb3N0U3RhdHVzW107XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBTY2hlZHVsZVBvc3RSZXNwb25zZSB7XG4gICAgICAgIGxldCBtID0gbmV3IFNjaGVkdWxlUG9zdFJlc3BvbnNlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLnN0YXR1c2VzKSB7bS5zdGF0dXNlcyA9IHByb3RvLnN0YXR1c2VzLm1hcChTY2hlZHVsZVBvc3RTdGF0dXMuZnJvbVByb3RvKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuU2NoZWR1bGVQb3N0UmVzcG9uc2VJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zdGF0dXNlcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5zdGF0dXNlcyAhPT0gbnVsbCkge3RvUmV0dXJuWydzdGF0dXNlcyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5zdGF0dXNlcyA/ICh0aGlzLnN0YXR1c2VzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnN0YXR1c2VzO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNjaGVkdWxlVG9BbGxQYWdlc1JlcXVlc3QgaW1wbGVtZW50cyBpLlNjaGVkdWxlVG9BbGxQYWdlc1JlcXVlc3RJbnRlcmZhY2Uge1xuICAgIHNvY2lhbFBvc3Q6IFNvY2lhbFBvc3REYXRhO1xuICAgIHBhcnRuZXJJZDogc3RyaW5nO1xuICAgIGJ1c2luZXNzSWQ6IHN0cmluZztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IFNjaGVkdWxlVG9BbGxQYWdlc1JlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBTY2hlZHVsZVRvQWxsUGFnZXNSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLnNvY2lhbFBvc3QpIHttLnNvY2lhbFBvc3QgPSBTb2NpYWxQb3N0RGF0YS5mcm9tUHJvdG8ocHJvdG8uc29jaWFsUG9zdCk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLlNjaGVkdWxlVG9BbGxQYWdlc1JlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zb2NpYWxQb3N0ICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnNvY2lhbFBvc3QgIT09IG51bGwpIHt0b1JldHVyblsnc29jaWFsUG9zdCddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5zb2NpYWxQb3N0ID8gKHRoaXMuc29jaWFsUG9zdCBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5zb2NpYWxQb3N0O31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBhcnRuZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsncGFydG5lcklkJ10gPSB0aGlzLnBhcnRuZXJJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5idXNpbmVzc0lkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydidXNpbmVzc0lkJ10gPSB0aGlzLmJ1c2luZXNzSWQ7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2NoZWR1bGVUb0FsbFBhZ2VzUmVzcG9uc2UgaW1wbGVtZW50cyBpLlNjaGVkdWxlVG9BbGxQYWdlc1Jlc3BvbnNlSW50ZXJmYWNlIHtcbiAgICBzdGF0dXNlczogU2NoZWR1bGVQb3N0U3RhdHVzW107XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBTY2hlZHVsZVRvQWxsUGFnZXNSZXNwb25zZSB7XG4gICAgICAgIGxldCBtID0gbmV3IFNjaGVkdWxlVG9BbGxQYWdlc1Jlc3BvbnNlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLnN0YXR1c2VzKSB7bS5zdGF0dXNlcyA9IHByb3RvLnN0YXR1c2VzLm1hcChTY2hlZHVsZVBvc3RTdGF0dXMuZnJvbVByb3RvKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuU2NoZWR1bGVUb0FsbFBhZ2VzUmVzcG9uc2VJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zdGF0dXNlcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5zdGF0dXNlcyAhPT0gbnVsbCkge3RvUmV0dXJuWydzdGF0dXNlcyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5zdGF0dXNlcyA/ICh0aGlzLnN0YXR1c2VzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnN0YXR1c2VzO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVwZGF0ZVBvc3RUZW1wbGF0ZVJlcXVlc3QgaW1wbGVtZW50cyBpLlVwZGF0ZVBvc3RUZW1wbGF0ZVJlcXVlc3RJbnRlcmZhY2Uge1xuICAgIGFjY291bnRHcm91cElkOiBzdHJpbmc7XG4gICAgdGVtcGxhdGVJZDogc3RyaW5nO1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgcG9zdFRleHQ6IHN0cmluZztcbiAgICBwb3N0RGF0ZVRpbWU6IERhdGU7XG4gICAgZ21iUG9zdEN1c3RvbWl6YXRpb246IHN0cmluZztcbiAgICBpbWFnZVVybDogc3RyaW5nO1xuICAgIGltYWdlUGF0aDogc3RyaW5nO1xuICAgIGltYWdlU2l6ZTogc3RyaW5nO1xuICAgIHByZXZpZXdzOiBzdHJpbmc7XG4gICAgb3B0aW9uczogc3RyaW5nW107XG4gICAgdmlkZW9Vcmw6IHN0cmluZztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IFVwZGF0ZVBvc3RUZW1wbGF0ZVJlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBVcGRhdGVQb3N0VGVtcGxhdGVSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLnBvc3REYXRlVGltZSkge20ucG9zdERhdGVUaW1lID0gbmV3IERhdGUocHJvdG8ucG9zdERhdGVUaW1lKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuVXBkYXRlUG9zdFRlbXBsYXRlUmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmFjY291bnRHcm91cElkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydhY2NvdW50R3JvdXBJZCddID0gdGhpcy5hY2NvdW50R3JvdXBJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50ZW1wbGF0ZUlkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWyd0ZW1wbGF0ZUlkJ10gPSB0aGlzLnRlbXBsYXRlSWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGl0bGUgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3RpdGxlJ10gPSB0aGlzLnRpdGxlO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBvc3RUZXh0ICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydwb3N0VGV4dCddID0gdGhpcy5wb3N0VGV4dDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wb3N0RGF0ZVRpbWUgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucG9zdERhdGVUaW1lICE9PSBudWxsKSB7dG9SZXR1cm5bJ3Bvc3REYXRlVGltZSddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5wb3N0RGF0ZVRpbWUgPyAodGhpcy5wb3N0RGF0ZVRpbWUgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMucG9zdERhdGVUaW1lO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmdtYlBvc3RDdXN0b21pemF0aW9uICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydnbWJQb3N0Q3VzdG9taXphdGlvbiddID0gdGhpcy5nbWJQb3N0Q3VzdG9taXphdGlvbjt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5pbWFnZVVybCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnaW1hZ2VVcmwnXSA9IHRoaXMuaW1hZ2VVcmw7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaW1hZ2VQYXRoICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydpbWFnZVBhdGgnXSA9IHRoaXMuaW1hZ2VQYXRoO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmltYWdlU2l6ZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnaW1hZ2VTaXplJ10gPSB0aGlzLmltYWdlU2l6ZTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcmV2aWV3cyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsncHJldmlld3MnXSA9IHRoaXMucHJldmlld3M7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnb3B0aW9ucyddID0gdGhpcy5vcHRpb25zO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnZpZGVvVXJsICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWyd2aWRlb1VybCddID0gdGhpcy52aWRlb1VybDt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbiIsIi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuLy8gQ29kZSBnZW5lcmF0ZWQgYnkgc2RrZ2VuXG4vLyBETyBOT1QgRURJVCEuXG4vL1xuLy8gQVBJIFNlcnZpY2UuXG4vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgICAgICBDcmVhdGVQb3N0VGVtcGxhdGVSZXF1ZXN0LFxuICAgICAgICBDcmVhdGVQb3N0VGVtcGxhdGVSZXNwb25zZSxcbiAgICAgICAgRGVsZXRlUG9zdFRlbXBsYXRlUmVxdWVzdCxcbiAgICAgICAgR2V0UG9zdFRlbXBsYXRlUmVxdWVzdCxcbiAgICAgICAgR2V0UG9zdFRlbXBsYXRlUmVzcG9uc2UsXG4gICAgICAgIExpc3RQb3N0VGVtcGxhdGVzUmVxdWVzdCxcbiAgICAgICAgTGlzdFBvc3RUZW1wbGF0ZXNSZXNwb25zZSxcbiAgICAgICAgVXBkYXRlUG9zdFRlbXBsYXRlUmVxdWVzdCxcbn0gZnJvbSAnLi9vYmplY3RzLyc7XG5pbXBvcnQge1xuICAgICAgICBDcmVhdGVQb3N0VGVtcGxhdGVSZXF1ZXN0SW50ZXJmYWNlLFxuICAgICAgICBDcmVhdGVQb3N0VGVtcGxhdGVSZXNwb25zZUludGVyZmFjZSxcbiAgICAgICAgRGVsZXRlUG9zdFRlbXBsYXRlUmVxdWVzdEludGVyZmFjZSxcbiAgICAgICAgR2V0UG9zdFRlbXBsYXRlUmVxdWVzdEludGVyZmFjZSxcbiAgICAgICAgR2V0UG9zdFRlbXBsYXRlUmVzcG9uc2VJbnRlcmZhY2UsXG4gICAgICAgIExpc3RQb3N0VGVtcGxhdGVzUmVxdWVzdEludGVyZmFjZSxcbiAgICAgICAgTGlzdFBvc3RUZW1wbGF0ZXNSZXNwb25zZUludGVyZmFjZSxcbiAgICAgICAgVXBkYXRlUG9zdFRlbXBsYXRlUmVxdWVzdEludGVyZmFjZSxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzLyc7XG5pbXBvcnQge0h0dHBIZWFkZXJzLCBIdHRwQ2xpZW50LCBIdHRwUmVzcG9uc2V9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7SG9zdFNlcnZpY2V9IGZyb20gJy4uL19nZW5lcmF0ZWQvaG9zdC5zZXJ2aWNlJztcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge21hcCwgc2hhcmV9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXG5leHBvcnQgY2xhc3MgUG9zdFRlbXBsYXRlc0FwaVNlcnZpY2Uge1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBwcml2YXRlIGhvc3RTZXJ2aWNlOiBIb3N0U2VydmljZSkge1xuICAgIH1cblxuICAgIHByaXZhdGUgYXBpT3B0aW9ucygpOiB7aGVhZGVyczogSHR0cEhlYWRlcnMsIHdpdGhDcmVkZW50aWFsczogYm9vbGVhbn0ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHVwZGF0ZVBvc3RUZW1wbGF0ZShyOiBVcGRhdGVQb3N0VGVtcGxhdGVSZXF1ZXN0IHwgVXBkYXRlUG9zdFRlbXBsYXRlUmVxdWVzdEludGVyZmFjZSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPG51bGw+PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSAoKDxVcGRhdGVQb3N0VGVtcGxhdGVSZXF1ZXN0PnIpLnRvQXBpSnNvbikgPyAoPFVwZGF0ZVBvc3RUZW1wbGF0ZVJlcXVlc3Q+cikgOiBuZXcgVXBkYXRlUG9zdFRlbXBsYXRlUmVxdWVzdChyKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PG51bGw+KHRoaXMuaG9zdFNlcnZpY2UuaG9zdFdpdGhTY2hlbWUoKSArIFwiL3NvY2lhbHBvc3RzLnYxLlBvc3RUZW1wbGF0ZXMvVXBkYXRlUG9zdFRlbXBsYXRlXCIsIHJlcXVlc3QudG9BcGlKc29uKCksIHsuLi50aGlzLmFwaU9wdGlvbnMoKSwgb2JzZXJ2ZTogJ3Jlc3BvbnNlJ30pO1xuICAgIH1cbiAgICBjcmVhdGVQb3N0VGVtcGxhdGUocjogQ3JlYXRlUG9zdFRlbXBsYXRlUmVxdWVzdCB8IENyZWF0ZVBvc3RUZW1wbGF0ZVJlcXVlc3RJbnRlcmZhY2UpOiBPYnNlcnZhYmxlPENyZWF0ZVBvc3RUZW1wbGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSAoKDxDcmVhdGVQb3N0VGVtcGxhdGVSZXF1ZXN0PnIpLnRvQXBpSnNvbikgPyAoPENyZWF0ZVBvc3RUZW1wbGF0ZVJlcXVlc3Q+cikgOiBuZXcgQ3JlYXRlUG9zdFRlbXBsYXRlUmVxdWVzdChyKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PENyZWF0ZVBvc3RUZW1wbGF0ZVJlc3BvbnNlSW50ZXJmYWNlPih0aGlzLmhvc3RTZXJ2aWNlLmhvc3RXaXRoU2NoZW1lKCkgKyBcIi9zb2NpYWxwb3N0cy52MS5Qb3N0VGVtcGxhdGVzL0NyZWF0ZVBvc3RUZW1wbGF0ZVwiLCByZXF1ZXN0LnRvQXBpSnNvbigpLCB0aGlzLmFwaU9wdGlvbnMoKSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcChyZXNwID0+IENyZWF0ZVBvc3RUZW1wbGF0ZVJlc3BvbnNlLmZyb21Qcm90byhyZXNwKSksXG4gICAgICAgICAgICAgICAgc2hhcmUoKVxuICAgICAgICAgICAgKTtcbiAgICB9XG4gICAgZ2V0UG9zdFRlbXBsYXRlKHI6IEdldFBvc3RUZW1wbGF0ZVJlcXVlc3QgfCBHZXRQb3N0VGVtcGxhdGVSZXF1ZXN0SW50ZXJmYWNlKTogT2JzZXJ2YWJsZTxHZXRQb3N0VGVtcGxhdGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gKCg8R2V0UG9zdFRlbXBsYXRlUmVxdWVzdD5yKS50b0FwaUpzb24pID8gKDxHZXRQb3N0VGVtcGxhdGVSZXF1ZXN0PnIpIDogbmV3IEdldFBvc3RUZW1wbGF0ZVJlcXVlc3Qocik7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxHZXRQb3N0VGVtcGxhdGVSZXNwb25zZUludGVyZmFjZT4odGhpcy5ob3N0U2VydmljZS5ob3N0V2l0aFNjaGVtZSgpICsgXCIvc29jaWFscG9zdHMudjEuUG9zdFRlbXBsYXRlcy9HZXRQb3N0VGVtcGxhdGVcIiwgcmVxdWVzdC50b0FwaUpzb24oKSwgdGhpcy5hcGlPcHRpb25zKCkpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAocmVzcCA9PiBHZXRQb3N0VGVtcGxhdGVSZXNwb25zZS5mcm9tUHJvdG8ocmVzcCkpLFxuICAgICAgICAgICAgICAgIHNoYXJlKClcbiAgICAgICAgICAgICk7XG4gICAgfVxuICAgIGxpc3RQb3N0VGVtcGxhdGVzKHI6IExpc3RQb3N0VGVtcGxhdGVzUmVxdWVzdCB8IExpc3RQb3N0VGVtcGxhdGVzUmVxdWVzdEludGVyZmFjZSk6IE9ic2VydmFibGU8TGlzdFBvc3RUZW1wbGF0ZXNSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gKCg8TGlzdFBvc3RUZW1wbGF0ZXNSZXF1ZXN0PnIpLnRvQXBpSnNvbikgPyAoPExpc3RQb3N0VGVtcGxhdGVzUmVxdWVzdD5yKSA6IG5ldyBMaXN0UG9zdFRlbXBsYXRlc1JlcXVlc3Qocik7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxMaXN0UG9zdFRlbXBsYXRlc1Jlc3BvbnNlSW50ZXJmYWNlPih0aGlzLmhvc3RTZXJ2aWNlLmhvc3RXaXRoU2NoZW1lKCkgKyBcIi9zb2NpYWxwb3N0cy52MS5Qb3N0VGVtcGxhdGVzL0xpc3RQb3N0VGVtcGxhdGVzXCIsIHJlcXVlc3QudG9BcGlKc29uKCksIHRoaXMuYXBpT3B0aW9ucygpKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKHJlc3AgPT4gTGlzdFBvc3RUZW1wbGF0ZXNSZXNwb25zZS5mcm9tUHJvdG8ocmVzcCkpLFxuICAgICAgICAgICAgICAgIHNoYXJlKClcbiAgICAgICAgICAgICk7XG4gICAgfVxuICAgIGRlbGV0ZVBvc3RUZW1wbGF0ZShyOiBEZWxldGVQb3N0VGVtcGxhdGVSZXF1ZXN0IHwgRGVsZXRlUG9zdFRlbXBsYXRlUmVxdWVzdEludGVyZmFjZSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPG51bGw+PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSAoKDxEZWxldGVQb3N0VGVtcGxhdGVSZXF1ZXN0PnIpLnRvQXBpSnNvbikgPyAoPERlbGV0ZVBvc3RUZW1wbGF0ZVJlcXVlc3Q+cikgOiBuZXcgRGVsZXRlUG9zdFRlbXBsYXRlUmVxdWVzdChyKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PG51bGw+KHRoaXMuaG9zdFNlcnZpY2UuaG9zdFdpdGhTY2hlbWUoKSArIFwiL3NvY2lhbHBvc3RzLnYxLlBvc3RUZW1wbGF0ZXMvRGVsZXRlUG9zdFRlbXBsYXRlXCIsIHJlcXVlc3QudG9BcGlKc29uKCksIHsuLi50aGlzLmFwaU9wdGlvbnMoKSwgb2JzZXJ2ZTogJ3Jlc3BvbnNlJ30pO1xuICAgIH1cbiAgICBcbn1cbiIsIi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuLy8gQ29kZSBnZW5lcmF0ZWQgYnkgc2RrZ2VuXG4vLyBETyBOT1QgRURJVCEuXG4vL1xuLy8gQVBJIFNlcnZpY2UuXG4vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgICAgICBEZWxldGVTb2NpYWxQb3N0UmVxdWVzdCxcbiAgICAgICAgR2V0TXVsdGlTb2NpYWxQb3N0U3RhdHNSZXF1ZXN0LFxuICAgICAgICBHZXRNdWx0aVNvY2lhbFBvc3RTdGF0c1Jlc3BvbnNlLFxuICAgICAgICBHZXRNdWx0aVNvY2lhbFBvc3RzUmVxdWVzdCxcbiAgICAgICAgR2V0TXVsdGlTb2NpYWxQb3N0c1Jlc3BvbnNlLFxuICAgICAgICBHZXRTY2hlZHVsZWRQb3N0Q291bnRSZXF1ZXN0LFxuICAgICAgICBHZXRTY2hlZHVsZWRQb3N0Q291bnRSZXNwb25zZSxcbiAgICAgICAgTGlzdFNvY2lhbFBvc3RzUmVxdWVzdCxcbiAgICAgICAgTGlzdFNvY2lhbFBvc3RzUmVzcG9uc2UsXG4gICAgICAgIFNjaGVkdWxlUG9zdFJlcXVlc3QsXG4gICAgICAgIFNjaGVkdWxlUG9zdFJlc3BvbnNlLFxuICAgICAgICBTY2hlZHVsZVRvQWxsUGFnZXNSZXF1ZXN0LFxuICAgICAgICBTY2hlZHVsZVRvQWxsUGFnZXNSZXNwb25zZSxcbn0gZnJvbSAnLi9vYmplY3RzLyc7XG5pbXBvcnQge1xuICAgICAgICBEZWxldGVTb2NpYWxQb3N0UmVxdWVzdEludGVyZmFjZSxcbiAgICAgICAgR2V0TXVsdGlTb2NpYWxQb3N0U3RhdHNSZXF1ZXN0SW50ZXJmYWNlLFxuICAgICAgICBHZXRNdWx0aVNvY2lhbFBvc3RTdGF0c1Jlc3BvbnNlSW50ZXJmYWNlLFxuICAgICAgICBHZXRNdWx0aVNvY2lhbFBvc3RzUmVxdWVzdEludGVyZmFjZSxcbiAgICAgICAgR2V0TXVsdGlTb2NpYWxQb3N0c1Jlc3BvbnNlSW50ZXJmYWNlLFxuICAgICAgICBHZXRTY2hlZHVsZWRQb3N0Q291bnRSZXF1ZXN0SW50ZXJmYWNlLFxuICAgICAgICBHZXRTY2hlZHVsZWRQb3N0Q291bnRSZXNwb25zZUludGVyZmFjZSxcbiAgICAgICAgTGlzdFNvY2lhbFBvc3RzUmVxdWVzdEludGVyZmFjZSxcbiAgICAgICAgTGlzdFNvY2lhbFBvc3RzUmVzcG9uc2VJbnRlcmZhY2UsXG4gICAgICAgIFNjaGVkdWxlUG9zdFJlcXVlc3RJbnRlcmZhY2UsXG4gICAgICAgIFNjaGVkdWxlUG9zdFJlc3BvbnNlSW50ZXJmYWNlLFxuICAgICAgICBTY2hlZHVsZVRvQWxsUGFnZXNSZXF1ZXN0SW50ZXJmYWNlLFxuICAgICAgICBTY2hlZHVsZVRvQWxsUGFnZXNSZXNwb25zZUludGVyZmFjZSxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzLyc7XG5pbXBvcnQge0h0dHBIZWFkZXJzLCBIdHRwQ2xpZW50LCBIdHRwUmVzcG9uc2V9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7SG9zdFNlcnZpY2V9IGZyb20gJy4uL19nZW5lcmF0ZWQvaG9zdC5zZXJ2aWNlJztcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge21hcCwgc2hhcmV9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXG5leHBvcnQgY2xhc3MgU29jaWFsUG9zdHNBcGlTZXJ2aWNlIHtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCwgcHJpdmF0ZSBob3N0U2VydmljZTogSG9zdFNlcnZpY2UpIHtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFwaU9wdGlvbnMoKToge2hlYWRlcnM6IEh0dHBIZWFkZXJzLCB3aXRoQ3JlZGVudGlhbHM6IGJvb2xlYW59IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRydWVcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBsaXN0KHI6IExpc3RTb2NpYWxQb3N0c1JlcXVlc3QgfCBMaXN0U29jaWFsUG9zdHNSZXF1ZXN0SW50ZXJmYWNlKTogT2JzZXJ2YWJsZTxMaXN0U29jaWFsUG9zdHNSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gKCg8TGlzdFNvY2lhbFBvc3RzUmVxdWVzdD5yKS50b0FwaUpzb24pID8gKDxMaXN0U29jaWFsUG9zdHNSZXF1ZXN0PnIpIDogbmV3IExpc3RTb2NpYWxQb3N0c1JlcXVlc3Qocik7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxMaXN0U29jaWFsUG9zdHNSZXNwb25zZUludGVyZmFjZT4odGhpcy5ob3N0U2VydmljZS5ob3N0V2l0aFNjaGVtZSgpICsgXCIvc29jaWFscG9zdHMudjEuU29jaWFsUG9zdHMvTGlzdFwiLCByZXF1ZXN0LnRvQXBpSnNvbigpLCB0aGlzLmFwaU9wdGlvbnMoKSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcChyZXNwID0+IExpc3RTb2NpYWxQb3N0c1Jlc3BvbnNlLmZyb21Qcm90byhyZXNwKSksXG4gICAgICAgICAgICAgICAgc2hhcmUoKVxuICAgICAgICAgICAgKTtcbiAgICB9XG4gICAgZGVsZXRlU29jaWFsUG9zdChyOiBEZWxldGVTb2NpYWxQb3N0UmVxdWVzdCB8IERlbGV0ZVNvY2lhbFBvc3RSZXF1ZXN0SW50ZXJmYWNlKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8bnVsbD4+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9ICgoPERlbGV0ZVNvY2lhbFBvc3RSZXF1ZXN0PnIpLnRvQXBpSnNvbikgPyAoPERlbGV0ZVNvY2lhbFBvc3RSZXF1ZXN0PnIpIDogbmV3IERlbGV0ZVNvY2lhbFBvc3RSZXF1ZXN0KHIpO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8bnVsbD4odGhpcy5ob3N0U2VydmljZS5ob3N0V2l0aFNjaGVtZSgpICsgXCIvc29jaWFscG9zdHMudjEuU29jaWFsUG9zdHMvRGVsZXRlU29jaWFsUG9zdFwiLCByZXF1ZXN0LnRvQXBpSnNvbigpLCB7Li4udGhpcy5hcGlPcHRpb25zKCksIG9ic2VydmU6ICdyZXNwb25zZSd9KTtcbiAgICB9XG4gICAgc2NoZWR1bGVUb0FsbFBhZ2VzKHI6IFNjaGVkdWxlVG9BbGxQYWdlc1JlcXVlc3QgfCBTY2hlZHVsZVRvQWxsUGFnZXNSZXF1ZXN0SW50ZXJmYWNlKTogT2JzZXJ2YWJsZTxTY2hlZHVsZVRvQWxsUGFnZXNSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gKCg8U2NoZWR1bGVUb0FsbFBhZ2VzUmVxdWVzdD5yKS50b0FwaUpzb24pID8gKDxTY2hlZHVsZVRvQWxsUGFnZXNSZXF1ZXN0PnIpIDogbmV3IFNjaGVkdWxlVG9BbGxQYWdlc1JlcXVlc3Qocik7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxTY2hlZHVsZVRvQWxsUGFnZXNSZXNwb25zZUludGVyZmFjZT4odGhpcy5ob3N0U2VydmljZS5ob3N0V2l0aFNjaGVtZSgpICsgXCIvc29jaWFscG9zdHMudjEuU29jaWFsUG9zdHMvU2NoZWR1bGVUb0FsbFBhZ2VzXCIsIHJlcXVlc3QudG9BcGlKc29uKCksIHRoaXMuYXBpT3B0aW9ucygpKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKHJlc3AgPT4gU2NoZWR1bGVUb0FsbFBhZ2VzUmVzcG9uc2UuZnJvbVByb3RvKHJlc3ApKSxcbiAgICAgICAgICAgICAgICBzaGFyZSgpXG4gICAgICAgICAgICApO1xuICAgIH1cbiAgICBzY2hlZHVsZShyOiBTY2hlZHVsZVBvc3RSZXF1ZXN0IHwgU2NoZWR1bGVQb3N0UmVxdWVzdEludGVyZmFjZSk6IE9ic2VydmFibGU8U2NoZWR1bGVQb3N0UmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9ICgoPFNjaGVkdWxlUG9zdFJlcXVlc3Q+cikudG9BcGlKc29uKSA/ICg8U2NoZWR1bGVQb3N0UmVxdWVzdD5yKSA6IG5ldyBTY2hlZHVsZVBvc3RSZXF1ZXN0KHIpO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8U2NoZWR1bGVQb3N0UmVzcG9uc2VJbnRlcmZhY2U+KHRoaXMuaG9zdFNlcnZpY2UuaG9zdFdpdGhTY2hlbWUoKSArIFwiL3NvY2lhbHBvc3RzLnYxLlNvY2lhbFBvc3RzL1NjaGVkdWxlXCIsIHJlcXVlc3QudG9BcGlKc29uKCksIHRoaXMuYXBpT3B0aW9ucygpKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKHJlc3AgPT4gU2NoZWR1bGVQb3N0UmVzcG9uc2UuZnJvbVByb3RvKHJlc3ApKSxcbiAgICAgICAgICAgICAgICBzaGFyZSgpXG4gICAgICAgICAgICApO1xuICAgIH1cbiAgICBnZXRNdWx0aVNvY2lhbFBvc3RzKHI6IEdldE11bHRpU29jaWFsUG9zdHNSZXF1ZXN0IHwgR2V0TXVsdGlTb2NpYWxQb3N0c1JlcXVlc3RJbnRlcmZhY2UpOiBPYnNlcnZhYmxlPEdldE11bHRpU29jaWFsUG9zdHNSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gKCg8R2V0TXVsdGlTb2NpYWxQb3N0c1JlcXVlc3Q+cikudG9BcGlKc29uKSA/ICg8R2V0TXVsdGlTb2NpYWxQb3N0c1JlcXVlc3Q+cikgOiBuZXcgR2V0TXVsdGlTb2NpYWxQb3N0c1JlcXVlc3Qocik7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxHZXRNdWx0aVNvY2lhbFBvc3RzUmVzcG9uc2VJbnRlcmZhY2U+KHRoaXMuaG9zdFNlcnZpY2UuaG9zdFdpdGhTY2hlbWUoKSArIFwiL3NvY2lhbHBvc3RzLnYxLlNvY2lhbFBvc3RzL0dldE11bHRpU29jaWFsUG9zdHNcIiwgcmVxdWVzdC50b0FwaUpzb24oKSwgdGhpcy5hcGlPcHRpb25zKCkpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAocmVzcCA9PiBHZXRNdWx0aVNvY2lhbFBvc3RzUmVzcG9uc2UuZnJvbVByb3RvKHJlc3ApKSxcbiAgICAgICAgICAgICAgICBzaGFyZSgpXG4gICAgICAgICAgICApO1xuICAgIH1cbiAgICBnZXRNdWx0aVNvY2lhbFBvc3RTdGF0cyhyOiBHZXRNdWx0aVNvY2lhbFBvc3RTdGF0c1JlcXVlc3QgfCBHZXRNdWx0aVNvY2lhbFBvc3RTdGF0c1JlcXVlc3RJbnRlcmZhY2UpOiBPYnNlcnZhYmxlPEdldE11bHRpU29jaWFsUG9zdFN0YXRzUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9ICgoPEdldE11bHRpU29jaWFsUG9zdFN0YXRzUmVxdWVzdD5yKS50b0FwaUpzb24pID8gKDxHZXRNdWx0aVNvY2lhbFBvc3RTdGF0c1JlcXVlc3Q+cikgOiBuZXcgR2V0TXVsdGlTb2NpYWxQb3N0U3RhdHNSZXF1ZXN0KHIpO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8R2V0TXVsdGlTb2NpYWxQb3N0U3RhdHNSZXNwb25zZUludGVyZmFjZT4odGhpcy5ob3N0U2VydmljZS5ob3N0V2l0aFNjaGVtZSgpICsgXCIvc29jaWFscG9zdHMudjEuU29jaWFsUG9zdHMvR2V0TXVsdGlTb2NpYWxQb3N0U3RhdHNcIiwgcmVxdWVzdC50b0FwaUpzb24oKSwgdGhpcy5hcGlPcHRpb25zKCkpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAocmVzcCA9PiBHZXRNdWx0aVNvY2lhbFBvc3RTdGF0c1Jlc3BvbnNlLmZyb21Qcm90byhyZXNwKSksXG4gICAgICAgICAgICAgICAgc2hhcmUoKVxuICAgICAgICAgICAgKTtcbiAgICB9XG4gICAgZ2V0U2NoZWR1bGVkUG9zdENvdW50KHI6IEdldFNjaGVkdWxlZFBvc3RDb3VudFJlcXVlc3QgfCBHZXRTY2hlZHVsZWRQb3N0Q291bnRSZXF1ZXN0SW50ZXJmYWNlKTogT2JzZXJ2YWJsZTxHZXRTY2hlZHVsZWRQb3N0Q291bnRSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gKCg8R2V0U2NoZWR1bGVkUG9zdENvdW50UmVxdWVzdD5yKS50b0FwaUpzb24pID8gKDxHZXRTY2hlZHVsZWRQb3N0Q291bnRSZXF1ZXN0PnIpIDogbmV3IEdldFNjaGVkdWxlZFBvc3RDb3VudFJlcXVlc3Qocik7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxHZXRTY2hlZHVsZWRQb3N0Q291bnRSZXNwb25zZUludGVyZmFjZT4odGhpcy5ob3N0U2VydmljZS5ob3N0V2l0aFNjaGVtZSgpICsgXCIvc29jaWFscG9zdHMudjEuU29jaWFsUG9zdHMvR2V0U2NoZWR1bGVkUG9zdENvdW50XCIsIHJlcXVlc3QudG9BcGlKc29uKCksIHRoaXMuYXBpT3B0aW9ucygpKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKHJlc3AgPT4gR2V0U2NoZWR1bGVkUG9zdENvdW50UmVzcG9uc2UuZnJvbVByb3RvKHJlc3ApKSxcbiAgICAgICAgICAgICAgICBzaGFyZSgpXG4gICAgICAgICAgICApO1xuICAgIH1cbiAgICBcbn1cbiIsIi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuLy8gQ29kZSBnZW5lcmF0ZWQgYnkgc2RrZ2VuXG4vLyBETyBOT1QgRURJVCEuXG4vL1xuLy8gQVBJIFNlcnZpY2UuXG4vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgICAgICBDcmVhdGVNdWx0aWxvY2F0aW9uUG9zdFJlcXVlc3QsXG4gICAgICAgIENyZWF0ZU11bHRpbG9jYXRpb25Qb3N0UmVzcG9uc2UsXG4gICAgICAgIERlbGV0ZU11bHRpbG9jYXRpb25Qb3N0UmVxdWVzdCxcbiAgICAgICAgRWRpdE11bHRpbG9jYXRpb25Qb3N0UmVxdWVzdCxcbiAgICAgICAgRWRpdE11bHRpbG9jYXRpb25Qb3N0UmVzcG9uc2UsXG4gICAgICAgIEdldE11bHRpbG9jYXRpb25Qb3N0UmVxdWVzdCxcbiAgICAgICAgR2V0TXVsdGlsb2NhdGlvblBvc3RSZXNwb25zZSxcbiAgICAgICAgTGlzdE11bHRpbG9jYXRpb25Qb3N0c0ZvckJyYW5kUmVxdWVzdCxcbiAgICAgICAgTGlzdE11bHRpbG9jYXRpb25Qb3N0c0ZvckJyYW5kUmVzcG9uc2UsXG4gICAgICAgIFJlbW92ZUZyb21NdWx0aWxvY2F0aW9uUG9zdFJlcXVlc3QsXG59IGZyb20gJy4vb2JqZWN0cy8nO1xuaW1wb3J0IHtcbiAgICAgICAgQ3JlYXRlTXVsdGlsb2NhdGlvblBvc3RSZXF1ZXN0SW50ZXJmYWNlLFxuICAgICAgICBDcmVhdGVNdWx0aWxvY2F0aW9uUG9zdFJlc3BvbnNlSW50ZXJmYWNlLFxuICAgICAgICBEZWxldGVNdWx0aWxvY2F0aW9uUG9zdFJlcXVlc3RJbnRlcmZhY2UsXG4gICAgICAgIEVkaXRNdWx0aWxvY2F0aW9uUG9zdFJlcXVlc3RJbnRlcmZhY2UsXG4gICAgICAgIEVkaXRNdWx0aWxvY2F0aW9uUG9zdFJlc3BvbnNlSW50ZXJmYWNlLFxuICAgICAgICBHZXRNdWx0aWxvY2F0aW9uUG9zdFJlcXVlc3RJbnRlcmZhY2UsXG4gICAgICAgIEdldE11bHRpbG9jYXRpb25Qb3N0UmVzcG9uc2VJbnRlcmZhY2UsXG4gICAgICAgIExpc3RNdWx0aWxvY2F0aW9uUG9zdHNGb3JCcmFuZFJlcXVlc3RJbnRlcmZhY2UsXG4gICAgICAgIExpc3RNdWx0aWxvY2F0aW9uUG9zdHNGb3JCcmFuZFJlc3BvbnNlSW50ZXJmYWNlLFxuICAgICAgICBSZW1vdmVGcm9tTXVsdGlsb2NhdGlvblBvc3RSZXF1ZXN0SW50ZXJmYWNlLFxufSBmcm9tICcuL2ludGVyZmFjZXMvJztcbmltcG9ydCB7SHR0cEhlYWRlcnMsIEh0dHBDbGllbnQsIEh0dHBSZXNwb25zZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtIb3N0U2VydmljZX0gZnJvbSAnLi4vX2dlbmVyYXRlZC9ob3N0LnNlcnZpY2UnO1xuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7bWFwLCBzaGFyZX0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBNdWx0aWxvY2F0aW9uUG9zdEFwaVNlcnZpY2Uge1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBwcml2YXRlIGhvc3RTZXJ2aWNlOiBIb3N0U2VydmljZSkge1xuICAgIH1cblxuICAgIHByaXZhdGUgYXBpT3B0aW9ucygpOiB7aGVhZGVyczogSHR0cEhlYWRlcnMsIHdpdGhDcmVkZW50aWFsczogYm9vbGVhbn0ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNyZWF0ZU11bHRpbG9jYXRpb25Qb3N0KHI6IENyZWF0ZU11bHRpbG9jYXRpb25Qb3N0UmVxdWVzdCB8IENyZWF0ZU11bHRpbG9jYXRpb25Qb3N0UmVxdWVzdEludGVyZmFjZSk6IE9ic2VydmFibGU8Q3JlYXRlTXVsdGlsb2NhdGlvblBvc3RSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gKCg8Q3JlYXRlTXVsdGlsb2NhdGlvblBvc3RSZXF1ZXN0PnIpLnRvQXBpSnNvbikgPyAoPENyZWF0ZU11bHRpbG9jYXRpb25Qb3N0UmVxdWVzdD5yKSA6IG5ldyBDcmVhdGVNdWx0aWxvY2F0aW9uUG9zdFJlcXVlc3Qocik7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxDcmVhdGVNdWx0aWxvY2F0aW9uUG9zdFJlc3BvbnNlSW50ZXJmYWNlPih0aGlzLmhvc3RTZXJ2aWNlLmhvc3RXaXRoU2NoZW1lKCkgKyBcIi9zb2NpYWxwb3N0cy52MS5NdWx0aWxvY2F0aW9uUG9zdFNlcnZpY2UvQ3JlYXRlTXVsdGlsb2NhdGlvblBvc3RcIiwgcmVxdWVzdC50b0FwaUpzb24oKSwgdGhpcy5hcGlPcHRpb25zKCkpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAocmVzcCA9PiBDcmVhdGVNdWx0aWxvY2F0aW9uUG9zdFJlc3BvbnNlLmZyb21Qcm90byhyZXNwKSksXG4gICAgICAgICAgICAgICAgc2hhcmUoKVxuICAgICAgICAgICAgKTtcbiAgICB9XG4gICAgZWRpdE11bHRpbG9jYXRpb25Qb3N0KHI6IEVkaXRNdWx0aWxvY2F0aW9uUG9zdFJlcXVlc3QgfCBFZGl0TXVsdGlsb2NhdGlvblBvc3RSZXF1ZXN0SW50ZXJmYWNlKTogT2JzZXJ2YWJsZTxFZGl0TXVsdGlsb2NhdGlvblBvc3RSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gKCg8RWRpdE11bHRpbG9jYXRpb25Qb3N0UmVxdWVzdD5yKS50b0FwaUpzb24pID8gKDxFZGl0TXVsdGlsb2NhdGlvblBvc3RSZXF1ZXN0PnIpIDogbmV3IEVkaXRNdWx0aWxvY2F0aW9uUG9zdFJlcXVlc3Qocik7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxFZGl0TXVsdGlsb2NhdGlvblBvc3RSZXNwb25zZUludGVyZmFjZT4odGhpcy5ob3N0U2VydmljZS5ob3N0V2l0aFNjaGVtZSgpICsgXCIvc29jaWFscG9zdHMudjEuTXVsdGlsb2NhdGlvblBvc3RTZXJ2aWNlL0VkaXRNdWx0aWxvY2F0aW9uUG9zdFwiLCByZXF1ZXN0LnRvQXBpSnNvbigpLCB0aGlzLmFwaU9wdGlvbnMoKSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcChyZXNwID0+IEVkaXRNdWx0aWxvY2F0aW9uUG9zdFJlc3BvbnNlLmZyb21Qcm90byhyZXNwKSksXG4gICAgICAgICAgICAgICAgc2hhcmUoKVxuICAgICAgICAgICAgKTtcbiAgICB9XG4gICAgcmVtb3ZlRnJvbU11bHRpbG9jYXRpb25Qb3N0KHI6IFJlbW92ZUZyb21NdWx0aWxvY2F0aW9uUG9zdFJlcXVlc3QgfCBSZW1vdmVGcm9tTXVsdGlsb2NhdGlvblBvc3RSZXF1ZXN0SW50ZXJmYWNlKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8bnVsbD4+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9ICgoPFJlbW92ZUZyb21NdWx0aWxvY2F0aW9uUG9zdFJlcXVlc3Q+cikudG9BcGlKc29uKSA/ICg8UmVtb3ZlRnJvbU11bHRpbG9jYXRpb25Qb3N0UmVxdWVzdD5yKSA6IG5ldyBSZW1vdmVGcm9tTXVsdGlsb2NhdGlvblBvc3RSZXF1ZXN0KHIpO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8bnVsbD4odGhpcy5ob3N0U2VydmljZS5ob3N0V2l0aFNjaGVtZSgpICsgXCIvc29jaWFscG9zdHMudjEuTXVsdGlsb2NhdGlvblBvc3RTZXJ2aWNlL1JlbW92ZUZyb21NdWx0aWxvY2F0aW9uUG9zdFwiLCByZXF1ZXN0LnRvQXBpSnNvbigpLCB7Li4udGhpcy5hcGlPcHRpb25zKCksIG9ic2VydmU6ICdyZXNwb25zZSd9KTtcbiAgICB9XG4gICAgbGlzdE11bHRpbG9jYXRpb25Qb3N0c0ZvckJyYW5kKHI6IExpc3RNdWx0aWxvY2F0aW9uUG9zdHNGb3JCcmFuZFJlcXVlc3QgfCBMaXN0TXVsdGlsb2NhdGlvblBvc3RzRm9yQnJhbmRSZXF1ZXN0SW50ZXJmYWNlKTogT2JzZXJ2YWJsZTxMaXN0TXVsdGlsb2NhdGlvblBvc3RzRm9yQnJhbmRSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gKCg8TGlzdE11bHRpbG9jYXRpb25Qb3N0c0ZvckJyYW5kUmVxdWVzdD5yKS50b0FwaUpzb24pID8gKDxMaXN0TXVsdGlsb2NhdGlvblBvc3RzRm9yQnJhbmRSZXF1ZXN0PnIpIDogbmV3IExpc3RNdWx0aWxvY2F0aW9uUG9zdHNGb3JCcmFuZFJlcXVlc3Qocik7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxMaXN0TXVsdGlsb2NhdGlvblBvc3RzRm9yQnJhbmRSZXNwb25zZUludGVyZmFjZT4odGhpcy5ob3N0U2VydmljZS5ob3N0V2l0aFNjaGVtZSgpICsgXCIvc29jaWFscG9zdHMudjEuTXVsdGlsb2NhdGlvblBvc3RTZXJ2aWNlL0xpc3RNdWx0aWxvY2F0aW9uUG9zdHNGb3JCcmFuZFwiLCByZXF1ZXN0LnRvQXBpSnNvbigpLCB0aGlzLmFwaU9wdGlvbnMoKSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcChyZXNwID0+IExpc3RNdWx0aWxvY2F0aW9uUG9zdHNGb3JCcmFuZFJlc3BvbnNlLmZyb21Qcm90byhyZXNwKSksXG4gICAgICAgICAgICAgICAgc2hhcmUoKVxuICAgICAgICAgICAgKTtcbiAgICB9XG4gICAgZGVsZXRlTXVsdGlsb2NhdGlvblBvc3QocjogRGVsZXRlTXVsdGlsb2NhdGlvblBvc3RSZXF1ZXN0IHwgRGVsZXRlTXVsdGlsb2NhdGlvblBvc3RSZXF1ZXN0SW50ZXJmYWNlKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8bnVsbD4+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9ICgoPERlbGV0ZU11bHRpbG9jYXRpb25Qb3N0UmVxdWVzdD5yKS50b0FwaUpzb24pID8gKDxEZWxldGVNdWx0aWxvY2F0aW9uUG9zdFJlcXVlc3Q+cikgOiBuZXcgRGVsZXRlTXVsdGlsb2NhdGlvblBvc3RSZXF1ZXN0KHIpO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8bnVsbD4odGhpcy5ob3N0U2VydmljZS5ob3N0V2l0aFNjaGVtZSgpICsgXCIvc29jaWFscG9zdHMudjEuTXVsdGlsb2NhdGlvblBvc3RTZXJ2aWNlL0RlbGV0ZU11bHRpbG9jYXRpb25Qb3N0XCIsIHJlcXVlc3QudG9BcGlKc29uKCksIHsuLi50aGlzLmFwaU9wdGlvbnMoKSwgb2JzZXJ2ZTogJ3Jlc3BvbnNlJ30pO1xuICAgIH1cbiAgICBnZXRNdWx0aWxvY2F0aW9uUG9zdChyOiBHZXRNdWx0aWxvY2F0aW9uUG9zdFJlcXVlc3QgfCBHZXRNdWx0aWxvY2F0aW9uUG9zdFJlcXVlc3RJbnRlcmZhY2UpOiBPYnNlcnZhYmxlPEdldE11bHRpbG9jYXRpb25Qb3N0UmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9ICgoPEdldE11bHRpbG9jYXRpb25Qb3N0UmVxdWVzdD5yKS50b0FwaUpzb24pID8gKDxHZXRNdWx0aWxvY2F0aW9uUG9zdFJlcXVlc3Q+cikgOiBuZXcgR2V0TXVsdGlsb2NhdGlvblBvc3RSZXF1ZXN0KHIpO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8R2V0TXVsdGlsb2NhdGlvblBvc3RSZXNwb25zZUludGVyZmFjZT4odGhpcy5ob3N0U2VydmljZS5ob3N0V2l0aFNjaGVtZSgpICsgXCIvc29jaWFscG9zdHMudjEuTXVsdGlsb2NhdGlvblBvc3RTZXJ2aWNlL0dldE11bHRpbG9jYXRpb25Qb3N0XCIsIHJlcXVlc3QudG9BcGlKc29uKCksIHRoaXMuYXBpT3B0aW9ucygpKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKHJlc3AgPT4gR2V0TXVsdGlsb2NhdGlvblBvc3RSZXNwb25zZS5mcm9tUHJvdG8ocmVzcCkpLFxuICAgICAgICAgICAgICAgIHNoYXJlKClcbiAgICAgICAgICAgICk7XG4gICAgfVxuICAgIFxufVxuIiwiLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vLyBDb2RlIGdlbmVyYXRlZCBieSBzZGtnZW5cbi8vIERPIE5PVCBFRElUIS5cbi8vXG4vLyBBUEkgU2VydmljZS5cbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgICAgIFBhcnRuZXJMaXN0U2NoZWR1bGVkUG9zdHNSZXNwb25zZSxcbiAgICAgICAgUGFydG5lckxpc3RTY2hlZHVsZWRTb2NpYWxQb3N0c1JlcXVlc3QsXG59IGZyb20gJy4vb2JqZWN0cy8nO1xuaW1wb3J0IHtcbiAgICAgICAgUGFydG5lckxpc3RTY2hlZHVsZWRQb3N0c1Jlc3BvbnNlSW50ZXJmYWNlLFxuICAgICAgICBQYXJ0bmVyTGlzdFNjaGVkdWxlZFNvY2lhbFBvc3RzUmVxdWVzdEludGVyZmFjZSxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzLyc7XG5pbXBvcnQge0h0dHBIZWFkZXJzLCBIdHRwQ2xpZW50LCBIdHRwUmVzcG9uc2V9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7SG9zdFNlcnZpY2V9IGZyb20gJy4uL19nZW5lcmF0ZWQvaG9zdC5zZXJ2aWNlJztcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge21hcCwgc2hhcmV9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXG5leHBvcnQgY2xhc3MgUGFydG5lclNvY2lhbFBvc3RzQXBpU2VydmljZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIHByaXZhdGUgaG9zdFNlcnZpY2U6IEhvc3RTZXJ2aWNlKSB7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhcGlPcHRpb25zKCk6IHtoZWFkZXJzOiBIdHRwSGVhZGVycywgd2l0aENyZWRlbnRpYWxzOiBib29sZWFufSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0cnVlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgbGlzdFNjaGVkdWxlZChyOiBQYXJ0bmVyTGlzdFNjaGVkdWxlZFNvY2lhbFBvc3RzUmVxdWVzdCB8IFBhcnRuZXJMaXN0U2NoZWR1bGVkU29jaWFsUG9zdHNSZXF1ZXN0SW50ZXJmYWNlKTogT2JzZXJ2YWJsZTxQYXJ0bmVyTGlzdFNjaGVkdWxlZFBvc3RzUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9ICgoPFBhcnRuZXJMaXN0U2NoZWR1bGVkU29jaWFsUG9zdHNSZXF1ZXN0PnIpLnRvQXBpSnNvbikgPyAoPFBhcnRuZXJMaXN0U2NoZWR1bGVkU29jaWFsUG9zdHNSZXF1ZXN0PnIpIDogbmV3IFBhcnRuZXJMaXN0U2NoZWR1bGVkU29jaWFsUG9zdHNSZXF1ZXN0KHIpO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8UGFydG5lckxpc3RTY2hlZHVsZWRQb3N0c1Jlc3BvbnNlSW50ZXJmYWNlPih0aGlzLmhvc3RTZXJ2aWNlLmhvc3RXaXRoU2NoZW1lKCkgKyBcIi9zb2NpYWxwb3N0cy52MS5QYXJ0bmVyU29jaWFsUG9zdHMvTGlzdFNjaGVkdWxlZFwiLCByZXF1ZXN0LnRvQXBpSnNvbigpLCB0aGlzLmFwaU9wdGlvbnMoKSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcChyZXNwID0+IFBhcnRuZXJMaXN0U2NoZWR1bGVkUG9zdHNSZXNwb25zZS5mcm9tUHJvdG8ocmVzcCkpLFxuICAgICAgICAgICAgICAgIHNoYXJlKClcbiAgICAgICAgICAgICk7XG4gICAgfVxuICAgIGxpc3RTY2hlZHVsZWRCeUNyZWF0ZWQocjogUGFydG5lckxpc3RTY2hlZHVsZWRTb2NpYWxQb3N0c1JlcXVlc3QgfCBQYXJ0bmVyTGlzdFNjaGVkdWxlZFNvY2lhbFBvc3RzUmVxdWVzdEludGVyZmFjZSk6IE9ic2VydmFibGU8UGFydG5lckxpc3RTY2hlZHVsZWRQb3N0c1Jlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSAoKDxQYXJ0bmVyTGlzdFNjaGVkdWxlZFNvY2lhbFBvc3RzUmVxdWVzdD5yKS50b0FwaUpzb24pID8gKDxQYXJ0bmVyTGlzdFNjaGVkdWxlZFNvY2lhbFBvc3RzUmVxdWVzdD5yKSA6IG5ldyBQYXJ0bmVyTGlzdFNjaGVkdWxlZFNvY2lhbFBvc3RzUmVxdWVzdChyKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFBhcnRuZXJMaXN0U2NoZWR1bGVkUG9zdHNSZXNwb25zZUludGVyZmFjZT4odGhpcy5ob3N0U2VydmljZS5ob3N0V2l0aFNjaGVtZSgpICsgXCIvc29jaWFscG9zdHMudjEuUGFydG5lclNvY2lhbFBvc3RzL0xpc3RTY2hlZHVsZWRCeUNyZWF0ZWRcIiwgcmVxdWVzdC50b0FwaUpzb24oKSwgdGhpcy5hcGlPcHRpb25zKCkpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAocmVzcCA9PiBQYXJ0bmVyTGlzdFNjaGVkdWxlZFBvc3RzUmVzcG9uc2UuZnJvbVByb3RvKHJlc3ApKSxcbiAgICAgICAgICAgICAgICBzaGFyZSgpXG4gICAgICAgICAgICApO1xuICAgIH1cbiAgICBcbn1cbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIENyZWF0ZVBvc3RUZW1wbGF0ZVJlcXVlc3QsXG4gIENyZWF0ZVBvc3RUZW1wbGF0ZVJlc3BvbnNlLFxuICBEZWxldGVQb3N0VGVtcGxhdGVSZXF1ZXN0LFxuICBHZXRQb3N0VGVtcGxhdGVSZXF1ZXN0LFxuICBHZXRQb3N0VGVtcGxhdGVSZXNwb25zZSxcbiAgTGlzdFBvc3RUZW1wbGF0ZXNSZXF1ZXN0LFxuICBMaXN0UG9zdFRlbXBsYXRlc1Jlc3BvbnNlLFxuICBVcGRhdGVQb3N0VGVtcGxhdGVSZXF1ZXN0LFxufSBmcm9tICcuL19pbnRlcm5hbC9vYmplY3RzL2FwaSc7XG5pbXBvcnQgeyBQb3N0VGVtcGxhdGVzQXBpU2VydmljZSB9IGZyb20gJy4vX2ludGVybmFsL3Bvc3QtdGVtcGxhdGVzLmFwaS5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFBvc3RUZW1wbGF0ZXNTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzb2NpYWxQb3N0c0FwaVNlcnZpY2U6IFBvc3RUZW1wbGF0ZXNBcGlTZXJ2aWNlKSB7XG4gIH1cblxuICB1cGRhdGVQb3N0VGVtcGxhdGUoYWNjb3VudEdyb3VwSWQ6IHN0cmluZywgdGVtcGxhdGVJZDogc3RyaW5nLCB0aXRsZTogc3RyaW5nLCBwb3N0VGV4dDogc3RyaW5nLCBwb3N0RGF0ZVRpbWU6IERhdGUsXG4gICAgICAgICAgICAgICAgICAgICBnbWJQb3N0Q3VzdG9taXphdGlvbjogc3RyaW5nLCBpbWFnZVVybDogc3RyaW5nLCBpbWFnZVBhdGg6IHN0cmluZywgaW1hZ2VTaXplOiBzdHJpbmcsIHByZXZpZXdzOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBzdHJpbmdbXSwgdmlkZW9Vcmw6IHN0cmluZyk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPG51bGw+PiB7XG4gICAgY29uc3QgcmVxID0gbmV3IFVwZGF0ZVBvc3RUZW1wbGF0ZVJlcXVlc3Qoe1xuICAgICAgYWNjb3VudEdyb3VwSWQ6IGFjY291bnRHcm91cElkLFxuICAgICAgdGVtcGxhdGVJZDogdGVtcGxhdGVJZCxcbiAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgIHBvc3RUZXh0OiBwb3N0VGV4dCxcbiAgICAgIHBvc3REYXRlVGltZTogcG9zdERhdGVUaW1lLFxuICAgICAgZ21iUG9zdEN1c3RvbWl6YXRpb246IGdtYlBvc3RDdXN0b21pemF0aW9uLFxuICAgICAgaW1hZ2VVcmw6IGltYWdlVXJsLFxuICAgICAgaW1hZ2VQYXRoOiBpbWFnZVBhdGgsXG4gICAgICBpbWFnZVNpemU6IGltYWdlU2l6ZSxcbiAgICAgIHByZXZpZXdzOiBwcmV2aWV3cyxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICB2aWRlb1VybDogdmlkZW9VcmxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5zb2NpYWxQb3N0c0FwaVNlcnZpY2UudXBkYXRlUG9zdFRlbXBsYXRlKHJlcSlcbiAgfVxuXG4gIGNyZWF0ZVBvc3RUZW1wbGF0ZShhY2NvdW50R3JvdXBJZDogc3RyaW5nLCB0aXRsZTogc3RyaW5nLCBwb3N0VGV4dDogc3RyaW5nLCBwb3N0RGF0ZVRpbWU6IERhdGUsIGdtYlBvc3RDdXN0b21pemF0aW9uOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICBpbWFnZVVybDogc3RyaW5nLCBpbWFnZVBhdGg6IHN0cmluZywgaW1hZ2VTaXplOiBzdHJpbmcsIHByZXZpZXdzOiBzdHJpbmcsIG9wdGlvbnM6IHN0cmluZ1tdLCB2aWRlb1VybDogc3RyaW5nKTpcbiAgICBPYnNlcnZhYmxlPENyZWF0ZVBvc3RUZW1wbGF0ZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxID0gbmV3IENyZWF0ZVBvc3RUZW1wbGF0ZVJlcXVlc3Qoe1xuICAgICAgYWNjb3VudEdyb3VwSWQ6IGFjY291bnRHcm91cElkLFxuICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgcG9zdFRleHQ6IHBvc3RUZXh0LFxuICAgICAgcG9zdERhdGVUaW1lOiBwb3N0RGF0ZVRpbWUsXG4gICAgICBnbWJQb3N0Q3VzdG9taXphdGlvbjogZ21iUG9zdEN1c3RvbWl6YXRpb24sXG4gICAgICBpbWFnZVVybDogaW1hZ2VVcmwsXG4gICAgICBpbWFnZVBhdGg6IGltYWdlUGF0aCxcbiAgICAgIGltYWdlU2l6ZTogaW1hZ2VTaXplLFxuICAgICAgcHJldmlld3M6IHByZXZpZXdzLFxuICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgIHZpZGVvVXJsOiB2aWRlb1VybFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLnNvY2lhbFBvc3RzQXBpU2VydmljZS5jcmVhdGVQb3N0VGVtcGxhdGUocmVxKTtcbiAgfVxuXG4gIGdldFBvc3RUZW1wbGF0ZShhY2NvdW50R3JvdXBJZDogc3RyaW5nLCB0ZW1wbGF0ZUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEdldFBvc3RUZW1wbGF0ZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxID0gbmV3IEdldFBvc3RUZW1wbGF0ZVJlcXVlc3Qoe1xuICAgICAgYWNjb3VudEdyb3VwSWQ6IGFjY291bnRHcm91cElkLFxuICAgICAgdGVtcGxhdGVJZDogdGVtcGxhdGVJZFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLnNvY2lhbFBvc3RzQXBpU2VydmljZS5nZXRQb3N0VGVtcGxhdGUocmVxKVxuICB9XG5cbiAgbGlzdFBvc3RUZW1wbGF0ZXMoYWNjb3VudEdyb3VwSWQ6IHN0cmluZywgY3Vyc29yOiBzdHJpbmcsIHBhZ2VTaXplOiBudW1iZXIpOiBPYnNlcnZhYmxlPExpc3RQb3N0VGVtcGxhdGVzUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXEgPSBuZXcgTGlzdFBvc3RUZW1wbGF0ZXNSZXF1ZXN0KHtcbiAgICAgIGFjY291bnRHcm91cElkOiBhY2NvdW50R3JvdXBJZCxcbiAgICAgIGN1cnNvcjogY3Vyc29yLFxuICAgICAgcGFnZVNpemU6IHBhZ2VTaXplXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuc29jaWFsUG9zdHNBcGlTZXJ2aWNlLmxpc3RQb3N0VGVtcGxhdGVzKHJlcSk7XG4gIH1cblxuICBkZWxldGVQb3N0VGVtcGxhdGUoYWNjb3VudEdyb3VwSWQ6IHN0cmluZywgdGVtcGxhdGVJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8bnVsbD4+IHtcbiAgICBjb25zdCByZXEgPSBuZXcgRGVsZXRlUG9zdFRlbXBsYXRlUmVxdWVzdCh7XG4gICAgICBhY2NvdW50R3JvdXBJZDogYWNjb3VudEdyb3VwSWQsXG4gICAgICB0ZW1wbGF0ZUlkOiB0ZW1wbGF0ZUlkXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuc29jaWFsUG9zdHNBcGlTZXJ2aWNlLmRlbGV0ZVBvc3RUZW1wbGF0ZShyZXEpO1xuICB9XG5cbn1cbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBMaXN0U29jaWFsUG9zdHNSZXF1ZXN0LFxuICBMaXN0U29jaWFsUG9zdHNSZXNwb25zZSxcbiAgR2V0TXVsdGlTb2NpYWxQb3N0c1JlcXVlc3QsXG4gIEdldE11bHRpU29jaWFsUG9zdHNSZXNwb25zZSxcbiAgR2V0U2NoZWR1bGVkUG9zdENvdW50UmVxdWVzdCxcbiAgR2V0U2NoZWR1bGVkUG9zdENvdW50UmVzcG9uc2UsXG59IGZyb20gJy4vX2ludGVybmFsL29iamVjdHMvYXBpJztcbmltcG9ydCB7IFNvY2lhbFBvc3RzQXBpU2VydmljZSB9IGZyb20gJy4vX2ludGVybmFsL3NvY2lhbC1wb3N0cy5hcGkuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTb2NpYWxQb3N0c1NlcnZpY2Uge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNvY2lhbFBvc3RzQXBpU2VydmljZTogU29jaWFsUG9zdHNBcGlTZXJ2aWNlKSB7XG4gIH1cblxuICBsaXN0KFxuICAgICBzdGFydDogRGF0ZSxcbiAgICAgZW5kOiBEYXRlLFxuICAgICBzb2NpYWxTZXJ2aWNlSWRzOiBzdHJpbmdbXSxcbiAgICAgYnVzaW5lc3NJZDogc3RyaW5nLFxuICAgICBwYXJ0bmVySWQ6IHN0cmluZyxcbiAgICAgY3Vyc29yOiBzdHJpbmcsXG4gICAgIHRhZ3M6IHN0cmluZ1tdLFxuICAgICBwYWdlU2l6ZTogbnVtYmVyXG4gICk6XG4gICAgT2JzZXJ2YWJsZTxMaXN0U29jaWFsUG9zdHNSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcSA9IG5ldyBMaXN0U29jaWFsUG9zdHNSZXF1ZXN0KHtcbiAgICAgIHN0YXJ0OiBzdGFydCxcbiAgICAgIGVuZDogZW5kLFxuICAgICAgYnVzaW5lc3NJZDogYnVzaW5lc3NJZCxcbiAgICAgIHBhcnRuZXJJZDogcGFydG5lcklkLFxuICAgICAgY3Vyc29yOiBjdXJzb3IsXG4gICAgICBzb2NpYWxTZXJ2aWNlSWRzOiBzb2NpYWxTZXJ2aWNlSWRzLFxuICAgICAgdGFnczogdGFncyxcbiAgICAgIHBhZ2VTaXplOiBwYWdlU2l6ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5zb2NpYWxQb3N0c0FwaVNlcnZpY2UubGlzdChyZXEpO1xuICB9XG5cbiAgZ2V0TXVsdGlTb2NpYWxQb3N0cyhidXNpbmVzc0lkOiBzdHJpbmcsIGludGVybmFsUG9zdElkczogc3RyaW5nW10pOiBPYnNlcnZhYmxlPEdldE11bHRpU29jaWFsUG9zdHNSZXNwb25zZT4ge1xuICAgIGlmICghaW50ZXJuYWxQb3N0SWRzIHx8IGludGVybmFsUG9zdElkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IHJlcyA9IG5ldyBHZXRNdWx0aVNvY2lhbFBvc3RzUmVzcG9uc2UoKTtcbiAgICAgIHJldHVybiBvZihyZXMpO1xuICAgIH1cbiAgICBjb25zdCByZXEgPSBuZXcgR2V0TXVsdGlTb2NpYWxQb3N0c1JlcXVlc3Qoe2J1c2luZXNzSWQ6IGJ1c2luZXNzSWQsIGludGVybmFsUG9zdElkczogaW50ZXJuYWxQb3N0SWRzfSk7XG4gICAgcmV0dXJuIHRoaXMuc29jaWFsUG9zdHNBcGlTZXJ2aWNlLmdldE11bHRpU29jaWFsUG9zdHMocmVxKTtcbiAgfVxuXG4gIGdldFNjaGVkdWxlZFBvc3RDb3VudChwYXJ0bmVySWQ6IHN0cmluZywgYnVzaW5lc3NJZDogc3RyaW5nLCBzb2NpYWxTZXJ2aWNlSWRzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8R2V0U2NoZWR1bGVkUG9zdENvdW50UmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXEgPSBuZXcgR2V0U2NoZWR1bGVkUG9zdENvdW50UmVxdWVzdCh7cGFydG5lcklkOiBwYXJ0bmVySWQsIGJ1c2luZXNzSWQ6IGJ1c2luZXNzSWQsIHNvY2lhbFNlcnZpY2VJZHM6IHNvY2lhbFNlcnZpY2VJZHN9KTtcbiAgICByZXR1cm4gdGhpcy5zb2NpYWxQb3N0c0FwaVNlcnZpY2UuZ2V0U2NoZWR1bGVkUG9zdENvdW50KHJlcSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIENyZWF0ZU11bHRpbG9jYXRpb25Qb3N0UmVxdWVzdCxcbiAgQ3JlYXRlTXVsdGlsb2NhdGlvblBvc3RSZXNwb25zZSxcbiAgRGVsZXRlTXVsdGlsb2NhdGlvblBvc3RSZXF1ZXN0LFxuICBFZGl0TXVsdGlsb2NhdGlvblBvc3RSZXF1ZXN0LFxuICBFZGl0TXVsdGlsb2NhdGlvblBvc3RSZXNwb25zZSxcbiAgR2V0TXVsdGlsb2NhdGlvblBvc3RSZXF1ZXN0LFxuICBHZXRNdWx0aWxvY2F0aW9uUG9zdFJlc3BvbnNlLFxuICBMaXN0TXVsdGlsb2NhdGlvblBvc3RzRm9yQnJhbmRSZXF1ZXN0LFxuICBMaXN0TXVsdGlsb2NhdGlvblBvc3RzRm9yQnJhbmRSZXNwb25zZSxcbiAgUmVtb3ZlRnJvbU11bHRpbG9jYXRpb25Qb3N0UmVxdWVzdCxcbn0gZnJvbSAnLi9faW50ZXJuYWwvb2JqZWN0cy9hcGknO1xuaW1wb3J0IHsgTXVsdGlsb2NhdGlvblBvc3RBcGlTZXJ2aWNlIH0gZnJvbSAnLi9faW50ZXJuYWwvbXVsdGlsb2NhdGlvbi1wb3N0LmFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IEZpZWxkTWFzayB9IGZyb20gJy4vX2ludGVybmFsL29iamVjdHMvZmllbGQtbWFzayc7XG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJy4vX2ludGVybmFsL29iamVjdHMvbXVsdGlsb2NhdGlvbi1wb3N0JztcbmltcG9ydCB7IFJlbW92ZVJlYXNvbiB9IGZyb20gJy4vX2ludGVybmFsL2VudW1zL211bHRpbG9jYXRpb24tcG9zdC5lbnVtJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE11bHRpbG9jYXRpb25Qb3N0c1NlcnZpY2Uge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG11bHRpbG9jYXRpb25BcGlTZXJ2aWNlOiBNdWx0aWxvY2F0aW9uUG9zdEFwaVNlcnZpY2UpIHtcbiAgfVxuXG4gIGNyZWF0ZU11bHRpbG9jYXRpb25Qb3N0KGJyYW5kSWQ6IHN0cmluZywgdGV4dDogc3RyaW5nLCBtZWRpYTogc3RyaW5nW10sIGdpZnM6IHN0cmluZ1tdLCB2aWRlb3M6IHN0cmluZ1tdLCBzY2hlZHVsZWREYXRlOiBEYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbnM6IExvY2F0aW9uW10pOiBPYnNlcnZhYmxlPENyZWF0ZU11bHRpbG9jYXRpb25Qb3N0UmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXEgPSBuZXcgQ3JlYXRlTXVsdGlsb2NhdGlvblBvc3RSZXF1ZXN0KHtcbiAgICAgIGJyYW5kSWQ6IGJyYW5kSWQsXG4gICAgICB0ZXh0OiB0ZXh0LFxuICAgICAgbWVkaWE6IG1lZGlhLFxuICAgICAgZ2lmczogZ2lmcyxcbiAgICAgIHZpZGVvczogdmlkZW9zLFxuICAgICAgc2NoZWR1bGVkRGF0ZTogc2NoZWR1bGVkRGF0ZSxcbiAgICAgIGxvY2F0aW9uczogbG9jYXRpb25zXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMubXVsdGlsb2NhdGlvbkFwaVNlcnZpY2UuY3JlYXRlTXVsdGlsb2NhdGlvblBvc3QocmVxKTtcbiAgfVxuXG4gIGVkaXRNdWx0aWxvY2F0aW9uUG9zdChicmFuZElkOiBzdHJpbmcsIG11bHRpbG9jYXRpb25JZDogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIG1lZGlhOiBzdHJpbmdbXSwgZ2lmczogc3RyaW5nW10sIHZpZGVvczogc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZWREYXRlOiBEYXRlLCBsb2NhdGlvbnM6IExvY2F0aW9uW10sIGZpZWxkTWFzazogRmllbGRNYXNrKTogT2JzZXJ2YWJsZTxFZGl0TXVsdGlsb2NhdGlvblBvc3RSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcSA9IG5ldyBFZGl0TXVsdGlsb2NhdGlvblBvc3RSZXF1ZXN0KHtcbiAgICAgIGJyYW5kSWQ6IGJyYW5kSWQsXG4gICAgICBtdWx0aWxvY2F0aW9uSWQ6IG11bHRpbG9jYXRpb25JZCxcbiAgICAgIHRleHQ6IHRleHQsXG4gICAgICBtZWRpYTogbWVkaWEsXG4gICAgICBnaWZzOiBnaWZzLFxuICAgICAgdmlkZW9zOiB2aWRlb3MsXG4gICAgICBzY2hlZHVsZWREYXRlOiBzY2hlZHVsZWREYXRlLFxuICAgICAgbG9jYXRpb25zOiBsb2NhdGlvbnMsXG4gICAgICBmaWVsZE1hc2s6IGZpZWxkTWFza1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLm11bHRpbG9jYXRpb25BcGlTZXJ2aWNlLmVkaXRNdWx0aWxvY2F0aW9uUG9zdChyZXEpO1xuICB9XG5cbiAgcmVtb3ZlRnJvbU11bHRpbG9jYXRpb25Qb3N0KHJlYXNvbjogUmVtb3ZlUmVhc29uLCBicmFuZElkOiBzdHJpbmcsIG11bHRpbG9jYXRpb25JZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25zOiBMb2NhdGlvbltdKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8bnVsbD4+IHtcbiAgICBjb25zdCByZXEgPSBuZXcgUmVtb3ZlRnJvbU11bHRpbG9jYXRpb25Qb3N0UmVxdWVzdCh7XG4gICAgICByZWFzb246IHJlYXNvbixcbiAgICAgIGJyYW5kSWQ6IGJyYW5kSWQsXG4gICAgICBtdWx0aWxvY2F0aW9uSWQ6IG11bHRpbG9jYXRpb25JZCxcbiAgICAgIGxvY2F0aW9uczogbG9jYXRpb25zXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMubXVsdGlsb2NhdGlvbkFwaVNlcnZpY2UucmVtb3ZlRnJvbU11bHRpbG9jYXRpb25Qb3N0KHJlcSk7XG4gIH1cblxuICBsaXN0TXVsdGlsb2NhdGlvblBvc3RzRm9yQnJhbmQoYnJhbmRJZDogc3RyaW5nLCBzdGFydERhdGU6IERhdGUsIGVuZERhdGU6IERhdGUsIGN1cnNvcjogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVNpemU6IG51bWJlcik6IE9ic2VydmFibGU8TGlzdE11bHRpbG9jYXRpb25Qb3N0c0ZvckJyYW5kUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXEgPSBuZXcgTGlzdE11bHRpbG9jYXRpb25Qb3N0c0ZvckJyYW5kUmVxdWVzdCh7XG4gICAgICBicmFuZElkOiBicmFuZElkLFxuICAgICAgc3RhcnREYXRlOiBzdGFydERhdGUsXG4gICAgICBlbmREYXRlOiBlbmREYXRlLFxuICAgICAgY3Vyc29yOiBjdXJzb3IsXG4gICAgICBwYWdlU2l6ZTogcGFnZVNpemVcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5tdWx0aWxvY2F0aW9uQXBpU2VydmljZS5saXN0TXVsdGlsb2NhdGlvblBvc3RzRm9yQnJhbmQocmVxKTtcbiAgfVxuXG4gIGRlbGV0ZU11bHRpbG9jYXRpb25Qb3N0KGJyYW5kSWQ6IHN0cmluZywgbXVsdGlsb2NhdGlvbklkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxudWxsPj4ge1xuICAgIGNvbnN0IHJlcSA9IG5ldyBEZWxldGVNdWx0aWxvY2F0aW9uUG9zdFJlcXVlc3Qoe1xuICAgICAgYnJhbmRJZDogYnJhbmRJZCxcbiAgICAgIG11bHRpbG9jYXRpb25JZDogbXVsdGlsb2NhdGlvbklkXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMubXVsdGlsb2NhdGlvbkFwaVNlcnZpY2UuZGVsZXRlTXVsdGlsb2NhdGlvblBvc3QocmVxKTtcbiAgfVxuXG4gIGdldE11bHRpbG9jYXRpb25Qb3N0KGJyYW5kSWQ6IHN0cmluZywgbXVsdGlsb2NhdGlvbklkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEdldE11bHRpbG9jYXRpb25Qb3N0UmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXEgPSBuZXcgR2V0TXVsdGlsb2NhdGlvblBvc3RSZXF1ZXN0KHtcbiAgICAgIGJyYW5kSWQ6IGJyYW5kSWQsXG4gICAgICBtdWx0aWxvY2F0aW9uSWQ6IG11bHRpbG9jYXRpb25JZFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLm11bHRpbG9jYXRpb25BcGlTZXJ2aWNlLmdldE11bHRpbG9jYXRpb25Qb3N0KHJlcSk7XG4gIH1cbn1cbiIsIi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuLy8gQ29kZSBnZW5lcmF0ZWQgYnkgc2RrZ2VuIC0gZWRpdGVkIGJ5IHlvdSFcbi8vXG4vLyBUaGlzIG1vZHVsZSBjb250YWlucyBhbnkgaGFuZC13cml0dGVuIHNlcnZpY2VzIG9yIG90aGVyIHRoaW5ncyB5b3VyIG1vZHVsZVxuLy8gbmVlZHMgdG8gc2hhcmUgd2l0aCBhcHBsaWNhdGlvbnMgdGhhdCB1c2UgaXQuXG4vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTZXNzaW9uU2VydmljZU1vZHVsZSwgRW52aXJvbm1lbnRTZXJ2aWNlTW9kdWxlIH0gZnJvbSAnQHZlbmRhc3RhL2NvcmUnO1xuaW1wb3J0IHsgSG9zdFNlcnZpY2UgfSBmcm9tICcuL19nZW5lcmF0ZWQvaG9zdC5zZXJ2aWNlJztcbmltcG9ydCB7IFBvc3RUZW1wbGF0ZXNBcGlTZXJ2aWNlIH0gZnJvbSAnLi9faW50ZXJuYWwvcG9zdC10ZW1wbGF0ZXMuYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgU29jaWFsUG9zdHNBcGlTZXJ2aWNlIH0gZnJvbSAnLi9faW50ZXJuYWwvc29jaWFsLXBvc3RzLmFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IE11bHRpbG9jYXRpb25Qb3N0QXBpU2VydmljZSB9IGZyb20gJy4vX2ludGVybmFsL211bHRpbG9jYXRpb24tcG9zdC5hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBQYXJ0bmVyU29jaWFsUG9zdHNBcGlTZXJ2aWNlIH0gZnJvbSAnLi9faW50ZXJuYWwvcGFydG5lci1zb2NpYWwtcG9zdHMuYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9zdFRlbXBsYXRlc1NlcnZpY2UgfSBmcm9tICcuL3Bvc3QtdGVtcGxhdGVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgU29jaWFsUG9zdHNTZXJ2aWNlIH0gZnJvbSAnLi9zb2NpYWwtcG9zdHMuc2VydmljZSc7XG5pbXBvcnQgeyBNdWx0aWxvY2F0aW9uUG9zdHNTZXJ2aWNlIH0gZnJvbSAnLi9tdWx0aWxvY2F0aW9uLXBvc3RzLnNlcnZpY2UnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbU2Vzc2lvblNlcnZpY2VNb2R1bGUsIEVudmlyb25tZW50U2VydmljZU1vZHVsZV0sXG4gIHByb3ZpZGVyczogW1xuICAgIE11bHRpbG9jYXRpb25Qb3N0QXBpU2VydmljZSxcbiAgICBQYXJ0bmVyU29jaWFsUG9zdHNBcGlTZXJ2aWNlLFxuICAgIFBvc3RUZW1wbGF0ZXNBcGlTZXJ2aWNlLFxuICAgIFNvY2lhbFBvc3RzQXBpU2VydmljZSxcbiAgICBIb3N0U2VydmljZSxcbiAgICBQb3N0VGVtcGxhdGVzU2VydmljZSxcbiAgICBTb2NpYWxQb3N0c1NlcnZpY2UsXG4gICAgTXVsdGlsb2NhdGlvblBvc3RzU2VydmljZVxuICBdLFxuICBleHBvcnRzOiBbXSxcbiAgZW50cnlDb21wb25lbnRzOiBbXVxufSlcbmV4cG9ydCBjbGFzcyBTb2NpYWxQb3N0c01vZHVsZSB7fVxuIl0sIm5hbWVzIjpbImUuQ2FsbFRvQWN0aW9uQ2FsbFRvQWN0aW9uVHlwZSIsImUuU29jaWFsUG9zdERlbGV0aW9uU3RhdHVzIiwiZS5Tb2NpYWxQb3N0U2VydmljZSIsImUuUG9zdGluZ1N0YXR1cyIsImVudW1TdHJpbmdUb1ZhbHVlIiwiZS5SZW1vdmVSZWFzb24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSxNQUlhLFdBQVc7Ozs7SUFJcEIsWUFBb0Isa0JBQXNDO1FBQXRDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7S0FDekQ7Ozs7SUFFRCxJQUFJO1FBQ0EsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1osT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1NBQ3JCO1FBRUQsUUFBUSxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxFQUFFO1lBQzVDLEtBQUssV0FBVyxDQUFDLEtBQUs7Z0JBQ2xCLElBQUksQ0FBQyxLQUFLLEdBQUcsZ0NBQWdDLENBQUM7Z0JBQzlDLE1BQU07WUFDVixLQUFLLFdBQVcsQ0FBQyxJQUFJO2dCQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDaEIsTUFBTTtZQUNWLEtBQUssV0FBVyxDQUFDLElBQUk7Z0JBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsaUNBQWlDLENBQUM7Z0JBQy9DLE1BQU07WUFDVixLQUFLLFdBQVcsQ0FBQyxJQUFJO2dCQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLGlDQUFpQyxDQUFDO2dCQUMvQyxNQUFNO1NBQ2I7UUFDRCxP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