@finbourne/lusid-sdk-angular18 0.11.9953 → 0.11.9972

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 (25) hide show
  1. package/esm2022/lib/.generated/api/entities.service.mjs +69 -1
  2. package/esm2022/lib/.generated/api/scenarios.service.mjs +69 -1
  3. package/esm2022/lib/.generated/model/apportionmentInput.mjs +12 -0
  4. package/esm2022/lib/.generated/model/apportionmentMemberFactor.mjs +1 -11
  5. package/esm2022/lib/.generated/model/complianceRuleEntity.mjs +2 -0
  6. package/esm2022/lib/.generated/model/complianceRuleResponse.mjs +1 -1
  7. package/esm2022/lib/.generated/model/fxForward.mjs +1 -1
  8. package/esm2022/lib/.generated/model/models.mjs +6 -1
  9. package/esm2022/lib/.generated/model/reverseStressRequest.mjs +2 -0
  10. package/esm2022/lib/.generated/model/reverseStressResponse.mjs +2 -0
  11. package/esm2022/lib/.generated/model/reverseStressRung.mjs +12 -0
  12. package/fesm2022/finbourne-lusid-sdk-angular18.mjs +147 -0
  13. package/fesm2022/finbourne-lusid-sdk-angular18.mjs.map +2 -2
  14. package/lib/.generated/api/entities.service.d.ts +31 -0
  15. package/lib/.generated/api/scenarios.service.d.ts +28 -0
  16. package/lib/.generated/model/apportionmentInput.d.ts +27 -0
  17. package/lib/.generated/model/apportionmentMemberFactor.d.ts +5 -0
  18. package/lib/.generated/model/complianceRuleEntity.d.ts +54 -0
  19. package/lib/.generated/model/complianceRuleResponse.d.ts +2 -0
  20. package/lib/.generated/model/fxForward.d.ts +8 -4
  21. package/lib/.generated/model/models.d.ts +5 -0
  22. package/lib/.generated/model/reverseStressRequest.d.ts +65 -0
  23. package/lib/.generated/model/reverseStressResponse.d.ts +56 -0
  24. package/lib/.generated/model/reverseStressRung.d.ts +27 -0
  25. package/package.json +1 -1
@@ -147,6 +147,74 @@ export class EntitiesService {
147
147
  reportProgress: reportProgress
148
148
  });
149
149
  }
150
+ getComplianceRuleByEntityUniqueId(requestParameters, observe = 'body', reportProgress = false, options) {
151
+ const entityUniqueId = requestParameters?.entityUniqueId;
152
+ if (entityUniqueId === null || entityUniqueId === undefined) {
153
+ throw new Error('Required parameter entityUniqueId was null or undefined when calling getComplianceRuleByEntityUniqueId.');
154
+ }
155
+ const asAt = requestParameters?.asAt;
156
+ const previews = requestParameters?.previews;
157
+ let localVarQueryParameters = new HttpParams({ encoder: this.encoder });
158
+ if (asAt !== undefined && asAt !== null) {
159
+ localVarQueryParameters = this.addToHttpParams(localVarQueryParameters, asAt, 'asAt');
160
+ }
161
+ if (previews) {
162
+ previews.forEach((element) => {
163
+ localVarQueryParameters = this.addToHttpParams(localVarQueryParameters, element, 'previews');
164
+ });
165
+ }
166
+ let localVarHeaders = this.defaultHeaders;
167
+ let localVarCredential;
168
+ // authentication (oauth2) required
169
+ localVarCredential = this.configuration.lookupCredential('oauth2');
170
+ if (localVarCredential) {
171
+ localVarHeaders = localVarHeaders.set('Authorization', 'Bearer ' + localVarCredential);
172
+ }
173
+ let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
174
+ if (localVarHttpHeaderAcceptSelected === undefined) {
175
+ // to determine the Accept header
176
+ const httpHeaderAccepts = [
177
+ 'text/plain',
178
+ 'application/json',
179
+ 'text/json'
180
+ ];
181
+ localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
182
+ }
183
+ if (localVarHttpHeaderAcceptSelected !== undefined) {
184
+ localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
185
+ }
186
+ let localVarHttpContext = options && options.context;
187
+ if (localVarHttpContext === undefined) {
188
+ localVarHttpContext = new HttpContext();
189
+ }
190
+ let localVarTransferCache = options && options.transferCache;
191
+ if (localVarTransferCache === undefined) {
192
+ localVarTransferCache = true;
193
+ }
194
+ let responseType_ = 'json';
195
+ if (localVarHttpHeaderAcceptSelected) {
196
+ if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
197
+ responseType_ = 'text';
198
+ }
199
+ else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
200
+ responseType_ = 'json';
201
+ }
202
+ else {
203
+ responseType_ = 'blob';
204
+ }
205
+ }
206
+ let localVarPath = `/api/entities/compliancerules/${this.configuration.encodeParam({ name: "entityUniqueId", value: entityUniqueId, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined })}`;
207
+ return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`, {
208
+ context: localVarHttpContext,
209
+ params: localVarQueryParameters,
210
+ responseType: responseType_,
211
+ withCredentials: this.configuration.withCredentials,
212
+ headers: localVarHeaders,
213
+ observe: observe,
214
+ transferCache: localVarTransferCache,
215
+ reportProgress: reportProgress
216
+ });
217
+ }
150
218
  getCustomEntityByEntityUniqueId(requestParameters, observe = 'body', reportProgress = false, options) {
151
219
  const entityUniqueId = requestParameters?.entityUniqueId;
152
220
  if (entityUniqueId === null || entityUniqueId === undefined) {
@@ -827,4 +895,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
827
895
  }] }, { type: i2.Configuration, decorators: [{
828
896
  type: Optional
829
897
  }] }] });
830
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRpZXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ZpbmJvdXJuZS9sdXNpZC1zZGstYW5ndWxhcjE4L3NyYy9saWIvLmdlbmVyYXRlZC9hcGkvZW50aXRpZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFDSCx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQTJCLGVBQWUsQ0FBQztBQUNsRixPQUFPLEVBQWMsV0FBVyxFQUFFLFVBQVUsRUFDVSxXQUFXLEVBQ3hELE1BQVksc0JBQXNCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQStCLFlBQVksQ0FBQztBQTRCL0UsYUFBYTtBQUNiLE9BQU8sRUFBRSxTQUFTLEVBQXNCLE1BQTBCLGNBQWMsQ0FBQztBQUNqRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQTBDLGtCQUFrQixDQUFDOzs7O0FBeUhyRixNQUFNLE9BQU8sZUFBZTtJQU9GO0lBTFosUUFBUSxHQUFHLDJCQUEyQixDQUFDO0lBQzFDLGNBQWMsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ25DLGFBQWEsR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO0lBQ3BDLE9BQU8sQ0FBcUI7SUFFbkMsWUFBc0IsVUFBc0IsRUFBZ0MsUUFBeUIsRUFBYyxhQUE0QjtRQUF6SCxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3hDLElBQUksYUFBYSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDdkMsQ0FBQztRQUNELElBQUksT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNsRCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENB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cm9kdWN0aW9uICBUaGlzIHBhZ2UgZG9jdW1lbnRzIHRoZSBbTFVTSUQgQVBJc10oLi4vLi4vLi4vYXBpL3N3YWdnZXIpLCB3aGljaCBhbGxvd3MgYXV0aG9yaXNlZCBjbGllbnRzIHRvIHF1ZXJ5IGFuZCB1cGRhdGUgdGhlaXIgZGF0YSB3aXRoaW4gdGhlIExVU0lEIHBsYXRmb3JtLiAgU0RLcyB0byBpbnRlcmFjdCB3aXRoIHRoZSBMVVNJRCBBUElzIGFyZSBhdmFpbGFibGUgaW4gdGhlIGZvbGxvd2luZyBsYW5ndWFnZXMgYW5kIGZyYW1ld29ya3M6ICAqIFtDI10oaHR0cHM6Ly9naXRodWIuY29tL2ZpbmJvdXJuZS9sdXNpZC1zZGstY3NoYXJwKSAqIFtKYXZhXShodHRwczovL2dpdGh1Yi5jb20vZmluYm91cm5lL2x1c2lkLXNkay1qYXZhKSAqIFtKYXZhU2NyaXB0XShodHRwczovL2dpdGh1Yi5jb20vZmluYm91cm5lL2x1c2lkLXNkay1qcykgKiBbUHl0aG9uXShodHRwczovL2dpdGh1Yi5jb20vZmluYm91cm5lL2x1c2lkLXNkay1weXRob24pICogW0FuZ3VsYXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9maW5ib3VybmUvbHVzaWQtc2RrLWFuZ3VsYXIpICBUaGUgTFVTSUQgcGxhdGZvcm0gaXMgbWFkZSB1cCBvZiBhIG51bWJlciBvZiBzdWItYXBwbGljYXRpb25zLiBZb3UgY2FuIGZpbmQgdGhlIEFQSSAvIHN3YWdnZXIgZG9jdW1lbnRhdGlvbiBieSBmb2xsb3dpbmcgdGhlIGxpbmtzIGluIHRoZSB0YWJsZSBiZWxvdy4gICB8IEFwcGxpY2F0aW9uICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBUEkgLyBTd2FnZ2VyIERvY3VtZW50YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgIHwgfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwgTFVTSUQgICAgICAgICB8IE9wZW4sIEFQSS1maXJzdCwgZGV2ZWxvcGVyLWZyaWVuZGx5IGludmVzdG1lbnQgZGF0YSBwbGF0Zm9ybS4gICAgICAgICAgICAgICAgICAgICB8IFtTd2FnZ2VyXSguLi8uLi8uLi9hcGkvc3dhZ2dlci9pbmRleC5odG1sKSAgICAgICAgICAgfCB8IFdlYiBhcHAgICAgICAgfCBVc2VyLWZhY2luZyBmcm9udCBlbmQgZm9yIExVU0lELiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBbU3dhZ2dlcl0oLi4vLi4vLi4vYXBwL3N3YWdnZXIvaW5kZXguaHRtbCkgICAgICAgICAgIHwgfCBTY2hlZHVsZXIgICAgIHwgQXV0b21hdGVkIGpvYiBzY2hlZHVsZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgW1N3YWdnZXJdKC4uLy4uLy4uL3NjaGVkdWxlcjIvc3dhZ2dlci9pbmRleC5odG1sKSAgICB8IHwgSW5zaWdodHMgICAgICB8IE1vbml0b3JpbmcgYW5kIHRyb3VibGVzaG9vdGluZyBzZXJ2aWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFtTd2FnZ2VyXSguLi8uLi8uLi9pbnNpZ2h0cy9zd2FnZ2VyL2luZGV4Lmh0bWwpICAgICAgfCB8IElkZW50aXR5ICAgICAgfCBJZGVudGl0eSBtYW5hZ2VtZW50IGZvciBMVVNJRCAoaW4gY29uanVuY3Rpb24gd2l0aCBBY2Nlc3MpICAgICAgICAgICAgICAgICAgICAgICAgfCBbU3dhZ2dlcl0oLi4vLi4vLi4vaWRlbnRpdHkvc3dhZ2dlci9pbmRleC5odG1sKSAgICAgIHwgfCBBY2Nlc3MgICAgICAgIHwgQWNjZXNzIGNvbnRyb2wgZm9yIExVU0lEIChpbiBjb25qdW5jdGlvbiB3aXRoIElkZW50aXR5KSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgW1N3YWdnZXJdKC4uLy4uLy4uL2FjY2Vzcy9zd2FnZ2VyL2luZGV4Lmh0bWwpICAgICAgICB8IHwgRHJpdmUgICAgICAgICB8IFNlY3VyZSBmaWxlIHJlcG9zaXRvcnkgYW5kIG1hbmFnZXIgZm9yIGNvbGxhYm9yYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFtTd2FnZ2VyXSguLi8uLi8uLi9kcml2ZS9zd2FnZ2VyL2luZGV4Lmh0bWwpICAgICAgICAgfCB8IEx1bWluZXNjZSAgICAgfCBEYXRhIHZpcnR1YWxpc2F0aW9uIHNlcnZpY2UgKHF1ZXJ5IGRhdGEgZnJvbSBtdWx0aXBsZSBwcm92aWRlcnMsIGluY2x1ZGluZyBMVVNJRCkgfCBbU3dhZ2dlcl0oLi4vLi4vLi4vaG9uZXljb21iL3N3YWdnZXIvaW5kZXguaHRtbCkgICAgIHwgfCBOb3RpZmljYXRpb24gIHwgTm90aWZpY2F0aW9uIHNlcnZpY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgW1N3YWdnZXJdKC4uLy4uLy4uL25vdGlmaWNhdGlvbi9zd2FnZ2VyL2luZGV4Lmh0bWwpICB8IHwgQ29uZmlndXJhdGlvbiB8IEZpbGUgc3RvcmUgZm9yIHNlY3JldHMgYW5kIG90aGVyIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICB8IFtTd2FnZ2VyXSguLi8uLi8uLi9jb25maWd1cmF0aW9uL3N3YWdnZXIvaW5kZXguaHRtbCkgfCB8IFdvcmtmbG93ICAgICAgfCBXb3JrZmxvdyBzZXJ2aWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBbU3dhZ2dlcl0oLi4vLi4vLi4vd29ya2Zsb3cvc3dhZ2dlci9pbmRleC5odG1sKSAgICAgIHwgICAjIEVycm9yIENvZGVzICB8IENvZGV8TmFtZXxEZXNjcmlwdGlvbiB8IHwgLS0tfC0tLXwtLS0gfCB8IDxhIG5hbWU9XFxcIi0xMFxcXCI+LTEwPC9hPnxTZXJ2ZXIgQ29uZmlndXJhdGlvbiBFcnJvcnwgIHwgfCA8YSBuYW1lPVxcXCItMVxcXCI+LTE8L2E+fFVua25vd24gZXJyb3J8QW4gdW5leHBlY3RlZCBlcnJvciB3YXMgZW5jb3VudGVyZWQgb24gb3VyIHNpZGUuIHwgfCA8YSBuYW1lPVxcXCIxMDJcXFwiPjEwMjwvYT58VmVyc2lvbiBOb3QgRm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMTAzXFxcIj4xMDM8L2E+fEFwaSBSYXRlIExpbWl0IFZpb2xhdGlvbnwgIHwgfCA8YSBuYW1lPVxcXCIxMDRcXFwiPjEwNDwvYT58SW5zdHJ1bWVudCBOb3QgRm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMTA1XFxcIj4xMDU8L2E+fFByb3BlcnR5IE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCIxMDZcXFwiPjEwNjwvYT58UG9ydGZvbGlvIFJlY3Vyc2lvbiBEZXB0aHwgIHwgfCA8YSBuYW1lPVxcXCIxMDhcXFwiPjEwODwvYT58R3JvdXAgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjEwOVxcXCI+MTA5PC9hPnxQb3J0Zm9saW8gTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjExMFxcXCI+MTEwPC9hPnxQcm9wZXJ0eSBTY2hlbWEgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjExMVxcXCI+MTExPC9hPnxQb3J0Zm9saW8gQW5jZXN0cnkgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjExMlxcXCI+MTEyPC9hPnxQb3J0Zm9saW8gV2l0aCBJZCBBbHJlYWR5IEV4aXN0c3wgIHwgfCA8YSBuYW1lPVxcXCIxMTNcXFwiPjExMzwvYT58T3JwaGFuZWQgUG9ydGZvbGlvfCAgfCB8IDxhIG5hbWU9XFxcIjExOVxcXCI+MTE5PC9hPnxNaXNzaW5nIEJhc2UgQ2xhaW1zfCAgfCB8IDxhIG5hbWU9XFxcIjEyMVxcXCI+MTIxPC9hPnxQcm9wZXJ0eSBOb3QgRGVmaW5lZHwgIHwgfCA8YSBuYW1lPVxcXCIxMjJcXFwiPjEyMjwvYT58Q2Fubm90IERlbGV0ZSBTeXN0ZW0gUHJvcGVydHl8ICB8IHwgPGEgbmFtZT1cXFwiMTIzXFxcIj4xMjM8L2E+fENhbm5vdCBNb2RpZnkgSW1tdXRhYmxlIFByb3BlcnR5IEZpZWxkfCAgfCB8IDxhIG5hbWU9XFxcIjEyNFxcXCI+MTI0PC9hPnxQcm9wZXJ0eSBBbHJlYWR5IEV4aXN0c3wgIHwgfCA8YSBuYW1lPVxcXCIxMjVcXFwiPjEyNTwvYT58SW52YWxpZCBQcm9wZXJ0eSBMaWZlIFRpbWV8ICB8IHwgPGEgbmFtZT1cXFwiMTI2XFxcIj4xMjY8L2E+fFByb3BlcnR5IENvbnN0cmFpbnQgU3R5bGUgRXhjbHVkZXMgUHJvcGVydGllc3wgIHwgfCA8YSBuYW1lPVxcXCIxMjdcXFwiPjEyNzwvYT58Q2Fubm90IE1vZGlmeSBEZWZhdWx0IERhdGEgVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCIxMjhcXFwiPjEyODwvYT58R3JvdXAgQWxyZWFkeSBFeGlzdHN8ICB8IHwgPGEgbmFtZT1cXFwiMTI5XFxcIj4xMjk8L2E+fE5vIFN1Y2ggRGF0YSBUeXBlfCAgfCB8IDxhIG5hbWU9XFxcIjEzMFxcXCI+MTMwPC9hPnxVbmRlZmluZWQgVmFsdWUgRm9yIERhdGEgVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCIxMzFcXFwiPjEzMTwvYT58VW5zdXBwb3J0ZWQgVmFsdWUgVHlwZSBEZWZpbmVkIE9uIERhdGEgVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCIxMzJcXFwiPjEzMjwvYT58VmFsaWRhdGlvbiBFcnJvcnwgIHwgfCA8YSBuYW1lPVxcXCIxMzNcXFwiPjEzMzwvYT58TG9vcCBEZXRlY3RlZCBJbiBHcm91cCBIaWVyYXJjaHl8ICB8IHwgPGEgbmFtZT1cXFwiMTM0XFxcIj4xMzQ8L2E+fFVuZGVmaW5lZCBBY2NlcHRhYmxlIFZhbHVlc3wgIHwgfCA8YSBuYW1lPVxcXCIxMzVcXFwiPjEzNTwvYT58U3ViIEdyb3VwIEFscmVhZHkgRXhpc3RzfCAgfCB8IDxhIG5hbWU9XFxcIjEzOFxcXCI+MTM4PC9hPnxQcmljZSBTb3VyY2UgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjEzOVxcXCI+MTM5PC9hPnxBbmFseXRpYyBTdG9yZSBOb3QgRm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMTQxXFxcIj4xNDE8L2E+fEFuYWx5dGljIFN0b3JlIEFscmVhZHkgRXhpc3RzfCAgfCB8IDxhIG5hbWU9XFxcIjE0M1xcXCI+MTQzPC9hPnxDbGllbnQgSW5zdHJ1bWVudCBBbHJlYWR5IEV4aXN0c3wgIHwgfCA8YSBuYW1lPVxcXCIxNDRcXFwiPjE0NDwvYT58RHVwbGljYXRlIEluIFBhcmFtZXRlciBTZXR8ICB8IHwgPGEgbmFtZT1cXFwiMTQ3XFxcIj4xNDc8L2E+fFJlc3VsdHMgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjE0OFxcXCI+MTQ4PC9hPnxPcmRlciBGaWVsZCBOb3QgSW4gUmVzdWx0IFNldHwgIHwgfCA8YSBuYW1lPVxcXCIxNDlcXFwiPjE0OTwvYT58T3BlcmF0aW9uIEZhaWxlZHwgIHwgfCA8YSBuYW1lPVxcXCIxNTBcXFwiPjE1MDwvYT58RWxhc3RpYyBTZWFyY2ggRXJyb3J8ICB8IHwgPGEgbmFtZT1cXFwiMTUxXFxcIj4xNTE8L2E+fEludmFsaWQgUGFyYW1ldGVyIFZhbHVlfCAgfCB8IDxhIG5hbWU9XFxcIjE1M1xcXCI+MTUzPC9hPnxDb21tYW5kIFByb2Nlc3NpbmcgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIxNTRcXFwiPjE1NDwvYT58RW50aXR5IFN0YXRlIENvbnN0cnVjdGlvbiBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjE1NVxcXCI+MTU1PC9hPnxFbnRpdHkgVGltZWxpbmUgRG9lcyBOb3QgRXhpc3R8ICB8IHwgPGEgbmFtZT1cXFwiMTU2XFxcIj4xNTY8L2E+fENvbmN1cnJlbmN5IENvbmZsaWN0IEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMTU3XFxcIj4xNTc8L2E+fEludmFsaWQgUmVxdWVzdHwgIHwgfCA8YSBuYW1lPVxcXCIxNThcXFwiPjE1ODwvYT58RXZlbnQgUHVibGlzaCBVbmtub3dufCAgfCB8IDxhIG5hbWU9XFxcIjE1OVxcXCI+MTU5PC9hPnxFdmVudCBRdWVyeSBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjE2MFxcXCI+MTYwPC9hPnxCbG9iIERpZCBOb3QgRXhpc3R8ICB8IHwgPGEgbmFtZT1cXFwiMTYyXFxcIj4xNjI8L2E+fFN1YiBTeXN0ZW0gUmVxdWVzdCBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjE2M1xcXCI+MTYzPC9hPnxTdWIgU3lzdGVtIENvbmZpZ3VyYXRpb24gRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIxNjVcXFwiPjE2NTwvYT58RmFpbGVkIFRvIERlbGV0ZXwgIHwgfCA8YSBuYW1lPVxcXCIxNjZcXFwiPjE2NjwvYT58VXBzZXJ0IENsaWVudCBJbnN0cnVtZW50IEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMTY3XFxcIj4xNjc8L2E+fElsbGVnYWwgQXMgQXQgSW50ZXJ2YWx8ICB8IHwgPGEgbmFtZT1cXFwiMTY4XFxcIj4xNjg8L2E+fElsbGVnYWwgQml0ZW1wb3JhbCBRdWVyeXwgIHwgfCA8YSBuYW1lPVxcXCIxNjlcXFwiPjE2OTwvYT58SW52YWxpZCBBbHRlcm5hdGUgSWR8ICB8IHwgPGEgbmFtZT1cXFwiMTcwXFxcIj4xNzA8L2E+fENhbm5vdCBBZGQgTm9uLVdyaXRhYmxlIFByb3BlcnRpZXMgVG8gRW50aXR5fCAgfCB8IDxhIG5hbWU9XFxcIjE3MVxcXCI+MTcxPC9hPnxFbnRpdHkgQWxyZWFkeSBFeGlzdHMgSW4gR3JvdXB8ICB8IHwgPGEgbmFtZT1cXFwiMTcyXFxcIj4xNzI8L2E+fEVudGl0eSBXaXRoIElkIERvZXMgTm90IEV4aXN0fCAgfCB8IDxhIG5hbWU9XFxcIjE3M1xcXCI+MTczPC9hPnxFbnRpdHkgV2l0aCBJZCBBbHJlYWR5IEV4aXN0c3wgIHwgfCA8YSBuYW1lPVxcXCIxNzRcXFwiPjE3NDwvYT58RGVyaXZlZCBQb3J0Zm9saW8gRGV0YWlscyBEbyBOb3QgRXhpc3R8ICB8IHwgPGEgbmFtZT1cXFwiMTc1XFxcIj4xNzU8L2E+fEVudGl0eSBOb3QgSW4gR3JvdXB8ICB8IHwgPGEgbmFtZT1cXFwiMTc2XFxcIj4xNzY8L2E+fFBvcnRmb2xpbyBXaXRoIE5hbWUgQWxyZWFkeSBFeGlzdHN8ICB8IHwgPGEgbmFtZT1cXFwiMTc3XFxcIj4xNzc8L2E+fEludmFsaWQgVHJhbnNhY3Rpb25zfCAgfCB8IDxhIG5hbWU9XFxcIjE3OFxcXCI+MTc4PC9hPnxSZWZlcmVuY2UgUG9ydGZvbGlvIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCIxNzlcXFwiPjE3OTwvYT58RHVwbGljYXRlIElkfCAgfCB8IDxhIG5hbWU9XFxcIjE4MFxcXCI+MTgwPC9hPnxDb21tYW5kIFJldHJpZXZhbCBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjE4MVxcXCI+MTgxPC9hPnxEYXRhIEZpbHRlciBBcHBsaWNhdGlvbiBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjE4MlxcXCI+MTgyPC9hPnxTZWFyY2ggRmFpbGVkfCAgfCB8IDxhIG5hbWU9XFxcIjE4M1xcXCI+MTgzPC9hPnxNb3ZlbWVudHMgRW5naW5lIENvbmZpZ3VyYXRpb24gS2V5IEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMTg0XFxcIj4xODQ8L2E+fEZ4IFJhdGUgU291cmNlIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCIxODVcXFwiPjE4NTwvYT58QWNjcnVhbCBTb3VyY2UgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjE4NlxcXCI+MTg2PC9hPnxBY2Nlc3MgRGVuaWVkfCAgfCB8IDxhIG5hbWU9XFxcIjE4N1xcXCI+MTg3PC9hPnxJbnZhbGlkIElkZW50aXR5IFRva2VufCAgfCB8IDxhIG5hbWU9XFxcIjE4OFxcXCI+MTg4PC9hPnxJbnZhbGlkIFJlcXVlc3QgSGVhZGVyc3wgIHwgfCA8YSBuYW1lPVxcXCIxODlcXFwiPjE4OTwvYT58UHJpY2UgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjE5MFxcXCI+MTkwPC9hPnxJbnZhbGlkIFN1YiBIb2xkaW5nIEtleXMgUHJvdmlkZWR8ICB8IHwgPGEgbmFtZT1cXFwiMTkxXFxcIj4xOTE8L2E+fER1cGxpY2F0ZSBTdWIgSG9sZGluZyBLZXlzIFByb3ZpZGVkfCAgfCB8IDxhIG5hbWU9XFxcIjE5MlxcXCI+MTkyPC9hPnxDdXQgRGVmaW5pdGlvbiBOb3QgRm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMTkzXFxcIj4xOTM8L2E+fEN1dCBEZWZpbml0aW9uIEludmFsaWR8ICB8IHwgPGEgbmFtZT1cXFwiMTk0XFxcIj4xOTQ8L2E+fFRpbWUgVmFyaWFudCBQcm9wZXJ0eSBEZWxldGlvbiBEYXRlIFVuc3BlY2lmaWVkfCAgfCB8IDxhIG5hbWU9XFxcIjE5NVxcXCI+MTk1PC9hPnxQZXJwZXR1YWwgUHJvcGVydHkgRGVsZXRpb24gRGF0ZSBTcGVjaWZpZWR8ICB8IHwgPGEgbmFtZT1cXFwiMTk2XFxcIj4xOTY8L2E+fFRpbWUgVmFyaWFudCBQcm9wZXJ0eSBVcHNlcnQgRGF0ZSBVbnNwZWNpZmllZHwgIHwgfCA8YSBuYW1lPVxcXCIxOTdcXFwiPjE5NzwvYT58UGVycGV0dWFsIFByb3BlcnR5IFVwc2VydCBEYXRlIFNwZWNpZmllZHwgIHwgfCA8YSBuYW1lPVxcXCIyMDBcXFwiPjIwMDwvYT58SW52YWxpZCBVbml0IEZvciBEYXRhIFR5cGV8ICB8IHwgPGEgbmFtZT1cXFwiMjAxXFxcIj4yMDE8L2E+fEludmFsaWQgVHlwZSBGb3IgRGF0YSBUeXBlfCAgfCB8IDxhIG5hbWU9XFxcIjIwMlxcXCI+MjAyPC9hPnxJbnZhbGlkIFZhbHVlIEZvciBEYXRhIFR5cGV8ICB8IHwgPGEgbmFtZT1cXFwiMjAzXFxcIj4yMDM8L2E+fFVuaXQgTm90IERlZmluZWQgRm9yIERhdGEgVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCIyMDRcXFwiPjIwNDwvYT58VW5pdHMgTm90IFN1cHBvcnRlZCBPbiBEYXRhIFR5cGV8ICB8IHwgPGEgbmFtZT1cXFwiMjA1XFxcIj4yMDU8L2E+fENhbm5vdCBTcGVjaWZ5IFVuaXRzIE9uIERhdGEgVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCIyMDZcXFwiPjIwNjwvYT58VW5pdCBTY2hlbWEgSW5jb25zaXN0ZW50IFdpdGggRGF0YSBUeXBlfCAgfCB8IDxhIG5hbWU9XFxcIjIwN1xcXCI+MjA3PC9hPnxVbml0IERlZmluaXRpb24gTm90IFNwZWNpZmllZHwgIHwgfCA8YSBuYW1lPVxcXCIyMDhcXFwiPjIwODwvYT58RHVwbGljYXRlIFVuaXQgRGVmaW5pdGlvbnMgU3BlY2lmaWVkfCAgfCB8IDxhIG5hbWU9XFxcIjIwOVxcXCI+MjA5PC9hPnxJbnZhbGlkIFVuaXRzIERlZmluaXRpb258ICB8IHwgPGEgbmFtZT1cXFwiMjEwXFxcIj4yMTA8L2E+fEludmFsaWQgSW5zdHJ1bWVudCBJZGVudGlmaWVyIFVuaXR8ICB8IHwgPGEgbmFtZT1cXFwiMjExXFxcIj4yMTE8L2E+fEhvbGRpbmdzIEFkanVzdG1lbnQgRG9lcyBOb3QgRXhpc3R8ICB8IHwgPGEgbmFtZT1cXFwiMjEyXFxcIj4yMTI8L2E+fENvdWxkIE5vdCBCdWlsZCBFeGNlbCBVcmx8ICB8IHwgPGEgbmFtZT1cXFwiMjEzXFxcIj4yMTM8L2E+fENvdWxkIE5vdCBHZXQgRXhjZWwgVmVyc2lvbnwgIHwgfCA8YSBuYW1lPVxcXCIyMTRcXFwiPjIxNDwvYT58SW5zdHJ1bWVudCBCeSBDb2RlIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCIyMTVcXFwiPjIxNTwvYT58RW50aXR5IFNjaGVtYSBEb2VzIE5vdCBFeGlzdHwgIHwgfCA8YSBuYW1lPVxcXCIyMTZcXFwiPjIxNjwvYT58RmVhdHVyZSBOb3QgU3VwcG9ydGVkIE9uIFBvcnRmb2xpbyBUeXBlfCAgfCB8IDxhIG5hbWU9XFxcIjIxN1xcXCI+MjE3PC9hPnxRdW90ZSBOb3QgRm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMjE4XFxcIj4yMTg8L2E+fEludmFsaWQgUXVvdGUgSWRlbnRpZmllcnwgIHwgfCA8YSBuYW1lPVxcXCIyMTlcXFwiPjIxOTwvYT58SW52YWxpZCBNZXRyaWMgRm9yIERhdGEgVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCIyMjBcXFwiPjIyMDwvYT58SW52YWxpZCBJbnN0cnVtZW50IERlZmluaXRpb258ICB8IHwgPGEgbmFtZT1cXFwiMjIxXFxcIj4yMjE8L2E+fEluc3RydW1lbnQgVXBzZXJ0IEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMjIyXFxcIj4yMjI8L2E+fFJlZmVyZW5jZSBQb3J0Zm9saW8gUmVxdWVzdCBOb3QgU3VwcG9ydGVkfCAgfCB8IDxhIG5hbWU9XFxcIjIyM1xcXCI+MjIzPC9hPnxUcmFuc2FjdGlvbiBQb3J0Zm9saW8gUmVxdWVzdCBOb3QgU3VwcG9ydGVkfCAgfCB8IDxhIG5hbWU9XFxcIjIyNFxcXCI+MjI0PC9hPnxJbnZhbGlkIFByb3BlcnR5IFZhbHVlIEFzc2lnbm1lbnR8ICB8IHwgPGEgbmFtZT1cXFwiMjMwXFxcIj4yMzA8L2E+fFRyYW5zYWN0aW9uIFR5cGUgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjIzMVxcXCI+MjMxPC9hPnxUcmFuc2FjdGlvbiBUeXBlIER1cGxpY2F0aW9ufCAgfCB8IDxhIG5hbWU9XFxcIjIzMlxcXCI+MjMyPC9hPnxQb3J0Zm9saW8gRG9lcyBOb3QgRXhpc3QgQXQgR2l2ZW4gRGF0ZXwgIHwgfCA8YSBuYW1lPVxcXCIyMzNcXFwiPjIzMzwvYT58UXVlcnkgUGFyc2VyIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMjM0XFxcIj4yMzQ8L2E+fER1cGxpY2F0ZSBDb25zdGl0dWVudHwgIHwgfCA8YSBuYW1lPVxcXCIyMzVcXFwiPjIzNTwvYT58VW5yZXNvbHZlZCBJbnN0cnVtZW50IENvbnN0aXR1ZW50fCAgfCB8IDxhIG5hbWU9XFxcIjIzNlxcXCI+MjM2PC9hPnxVbnJlc29sdmVkIEluc3RydW1lbnQgSW4gVHJhbnNpdGlvbnwgIHwgfCA8YSBuYW1lPVxcXCIyMzdcXFwiPjIzNzwvYT58TWlzc2luZyBTaWRlIERlZmluaXRpb25zfCAgfCB8IDxhIG5hbWU9XFxcIjI0MFxcXCI+MjQwPC9hPnxEdXBsaWNhdGUgQ2FsY3VsYXRpb25zIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMjk5XFxcIj4yOTk8L2E+fEludmFsaWQgUmVjaXBlfCAgfCB8IDxhIG5hbWU9XFxcIjMwMFxcXCI+MzAwPC9hPnxNaXNzaW5nIFJlY2lwZXwgIHwgfCA8YSBuYW1lPVxcXCIzMDFcXFwiPjMwMTwvYT58RGVwZW5kZW5jaWVzfCAgfCB8IDxhIG5hbWU9XFxcIjMwNFxcXCI+MzA0PC9hPnxQb3J0Zm9saW8gUHJlcHJvY2VzcyBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjMxMFxcXCI+MzEwPC9hPnxWYWx1YXRpb24gRW5naW5lIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzExXFxcIj4zMTE8L2E+fFRhc2sgRmFjdG9yeSBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjMxMlxcXCI+MzEyPC9hPnxUYXNrIEV2YWx1YXRpb24gRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzMTNcXFwiPjMxMzwvYT58VGFzayBHZW5lcmF0aW9uIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzE0XFxcIj4zMTQ8L2E+fEVuZ2luZSBDb25maWd1cmF0aW9uIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzE1XFxcIj4zMTU8L2E+fE1vZGVsIFNwZWNpZmljYXRpb24gRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzMjBcXFwiPjMyMDwvYT58TWFya2V0IERhdGEgS2V5IEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzIxXFxcIj4zMjE8L2E+fE1hcmtldCBSZXNvbHZlciBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjMyMlxcXCI+MzIyPC9hPnxNYXJrZXQgRGF0YSBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjMzMFxcXCI+MzMwPC9hPnxDdXJ2ZSBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjMzMVxcXCI+MzMxPC9hPnxWb2xhdGlsaXR5IFN1cmZhY2UgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzMzJcXFwiPjMzMjwvYT58Vm9sYXRpbGl0eSBDdWJlIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzUwXFxcIj4zNTA8L2E+fEluc3RydW1lbnQgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzNTFcXFwiPjM1MTwvYT58Q2FzaCBGbG93cyBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjM1MlxcXCI+MzUyPC9hPnxSZWZlcmVuY2UgRGF0YSBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjM2MFxcXCI+MzYwPC9hPnxBZ2dyZWdhdGlvbiBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjM2MVxcXCI+MzYxPC9hPnxBZ2dyZWdhdGlvbiBNZWFzdXJlIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzcwXFxcIj4zNzA8L2E+fFJlc3VsdCBSZXRyaWV2YWwgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzNzFcXFwiPjM3MTwvYT58UmVzdWx0IFByb2Nlc3NpbmcgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzNzJcXFwiPjM3MjwvYT58VmVuZG9yIFJlc3VsdCBQcm9jZXNzaW5nIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzczXFxcIj4zNzM8L2E+fFZlbmRvciBSZXN1bHQgTWFwcGluZyBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjM3NFxcXCI+Mzc0PC9hPnxWZW5kb3IgTGlicmFyeSBVbmF1dGhvcmlzZWR8ICB8IHwgPGEgbmFtZT1cXFwiMzc1XFxcIj4zNzU8L2E+fFZlbmRvciBDb25uZWN0aXZpdHkgRXJyb3J8ICB8IHwgPGEgbmFtZT1cXFwiMzc2XFxcIj4zNzY8L2E+fFZlbmRvciBJbnRlcmZhY2UgRXJyb3J8ICB8IHwgPGEgbmFtZT1cXFwiMzc3XFxcIj4zNzc8L2E+fFZlbmRvciBQcmljaW5nIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzc4XFxcIj4zNzg8L2E+fFZlbmRvciBUcmFuc2xhdGlvbiBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjM3OVxcXCI+Mzc5PC9hPnxWZW5kb3IgS2V5IE1hcHBpbmcgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzODBcXFwiPjM4MDwvYT58VmVuZG9yIFJlZmxlY3Rpb24gRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzODFcXFwiPjM4MTwvYT58VmVuZG9yIFByb2Nlc3MgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzODJcXFwiPjM4MjwvYT58VmVuZG9yIFN5c3RlbSBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjM5MFxcXCI+MzkwPC9hPnxBdHRlbXB0IFRvIFVwc2VydCBEdXBsaWNhdGUgUXVvdGVzfCAgfCB8IDxhIG5hbWU9XFxcIjM5MVxcXCI+MzkxPC9hPnxDb3Jwb3JhdGUgQWN0aW9uIFNvdXJjZSBEb2VzIE5vdCBFeGlzdHwgIHwgfCA8YSBuYW1lPVxcXCIzOTJcXFwiPjM5MjwvYT58Q29ycG9yYXRlIEFjdGlvbiBTb3VyY2UgQWxyZWFkeSBFeGlzdHN8ICB8IHwgPGEgbmFtZT1cXFwiMzkzXFxcIj4zOTM8L2E+fEluc3RydW1lbnQgSWRlbnRpZmllciBBbHJlYWR5IEluIFVzZXwgIHwgfCA8YSBuYW1lPVxcXCIzOTRcXFwiPjM5NDwvYT58UHJvcGVydGllcyBOb3QgRm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMzk1XFxcIj4zOTU8L2E+fEJhdGNoIE9wZXJhdGlvbiBBYm9ydGVkfCAgfCB8IDxhIG5hbWU9XFxcIjQwMFxcXCI+NDAwPC9hPnxJbnZhbGlkIElzbzQyMTcgQ3VycmVuY3kgQ29kZXwgIHwgfCA8YSBuYW1lPVxcXCI0MDFcXFwiPjQwMTwvYT58Q2Fubm90IEFzc2lnbiBJbnN0cnVtZW50IElkZW50aWZpZXIgVG8gQ3VycmVuY3l8ICB8IHwgPGEgbmFtZT1cXFwiNDAyXFxcIj40MDI8L2E+fENhbm5vdCBBc3NpZ24gQ3VycmVuY3kgSWRlbnRpZmllciBUbyBOb24gQ3VycmVuY3l8ICB8IHwgPGEgbmFtZT1cXFwiNDAzXFxcIj40MDM8L2E+fEN1cnJlbmN5IEluc3RydW1lbnQgQ2Fubm90IEJlIERlbGV0ZWR8ICB8IHwgPGEgbmFtZT1cXFwiNDA0XFxcIj40MDQ8L2E+fEN1cnJlbmN5IEluc3RydW1lbnQgQ2Fubm90IEhhdmUgRWNvbm9taWMgRGVmaW5pdGlvbnwgIHwgfCA8YSBuYW1lPVxcXCI0MDVcXFwiPjQwNTwvYT58Q3VycmVuY3kgSW5zdHJ1bWVudCBDYW5ub3QgSGF2ZSBMb29rdGhyb3VnaCBQb3J0Zm9saW98ICB8IHwgPGEgbmFtZT1cXFwiNDA2XFxcIj40MDY8L2E+fENhbm5vdCBDcmVhdGUgQ3VycmVuY3kgSW5zdHJ1bWVudCBXaXRoIE11bHRpcGxlIElkZW50aWZpZXJzfCAgfCB8IDxhIG5hbWU9XFxcIjQwN1xcXCI+NDA3PC9hPnxTcGVjaWZpZWQgQ3VycmVuY3kgSXMgVW5kZWZpbmVkfCAgfCB8IDxhIG5hbWU9XFxcIjQxMFxcXCI+NDEwPC9hPnxJbmRleCBEb2VzIE5vdCBFeGlzdHwgIHwgfCA8YSBuYW1lPVxcXCI0MTFcXFwiPjQxMTwvYT58U29ydCBGaWVsZCBEb2VzIE5vdCBFeGlzdHwgIHwgfCA8YSBuYW1lPVxcXCI0MTNcXFwiPjQxMzwvYT58TmVnYXRpdmUgUGFnaW5hdGlvbiBQYXJhbWV0ZXJzfCAgfCB8IDxhIG5hbWU9XFxcIjQxNFxcXCI+NDE0PC9hPnxJbnZhbGlkIFNlYXJjaCBTeW50YXh8ICB8IHwgPGEgbmFtZT1cXFwiNDE1XFxcIj40MTU8L2E+fEZpbHRlciBFeGVjdXRpb24gVGltZW91dHwgIHwgfCA8YSBuYW1lPVxcXCI0MjBcXFwiPjQyMDwvYT58U2lkZSBEZWZpbml0aW9uIEluY29uc2lzdGVudHwgIHwgfCA8YSBuYW1lPVxcXCI0NTBcXFwiPjQ1MDwvYT58SW52YWxpZCBRdW90ZSBBY2Nlc3MgTWV0YWRhdGEgUnVsZXwgIHwgfCA8YSBuYW1lPVxcXCI0NTFcXFwiPjQ1MTwvYT58QWNjZXNzIE1ldGFkYXRhIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI0NTJcXFwiPjQ1MjwvYT58SW52YWxpZCBBY2Nlc3MgTWV0YWRhdGEgSWRlbnRpZmllcnwgIHwgfCA8YSBuYW1lPVxcXCI0NjBcXFwiPjQ2MDwvYT58U3RhbmRhcmQgUmVzb3VyY2UgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjQ2MVxcXCI+NDYxPC9hPnxTdGFuZGFyZCBSZXNvdXJjZSBDb25mbGljdHwgIHwgfCA8YSBuYW1lPVxcXCI0NjJcXFwiPjQ2MjwvYT58Q2FsZW5kYXIgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjQ2M1xcXCI+NDYzPC9hPnxEYXRlIEluIEEgQ2FsZW5kYXIgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjQ2NFxcXCI+NDY0PC9hPnxJbnZhbGlkIERhdGUgU291cmNlIERhdGF8ICB8IHwgPGEgbmFtZT1cXFwiNDY1XFxcIj40NjU8L2E+fEludmFsaWQgVGltZXpvbmV8ICB8IHwgPGEgbmFtZT1cXFwiNjAxXFxcIj42MDE8L2E+fFBlcnNvbiBJZGVudGlmaWVyIEFscmVhZHkgSW4gVXNlfCAgfCB8IDxhIG5hbWU9XFxcIjYwMlxcXCI+NjAyPC9hPnxQZXJzb24gTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjYwM1xcXCI+NjAzPC9hPnxDYW5ub3QgU2V0IElkZW50aWZpZXJ8ICB8IHwgPGEgbmFtZT1cXFwiNjE3XFxcIj42MTc8L2E+fEludmFsaWQgUmVjaXBlIFNwZWNpZmljYXRpb24gSW4gUmVxdWVzdHwgIHwgfCA8YSBuYW1lPVxcXCI2MThcXFwiPjYxODwvYT58SW5saW5lIFJlY2lwZSBEZXNlcmlhbGlzYXRpb24gRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCI2MTlcXFwiPjYxOTwvYT58SWRlbnRpZmllciBUeXBlcyBOb3QgU2V0IEZvciBFbnRpdHl8ICB8IHwgPGEgbmFtZT1cXFwiNjIwXFxcIj42MjA8L2E+fENhbm5vdCBEZWxldGUgQWxsIENsaWVudCBEZWZpbmVkIElkZW50aWZpZXJzfCAgfCB8IDxhIG5hbWU9XFxcIjY1MFxcXCI+NjUwPC9hPnxUaGUgT3JkZXIgcmVxdWVzdGVkIHdhcyBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjY1NFxcXCI+NjU0PC9hPnxUaGUgQWxsb2NhdGlvbiByZXF1ZXN0ZWQgd2FzIG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiNjU1XFxcIj42NTU8L2E+fENhbm5vdCBidWlsZCB0aGUgZnggZm9yd2FyZCB0YXJnZXQgd2l0aCB0aGUgZ2l2ZW4gaG9sZGluZ3MufCAgfCB8IDxhIG5hbWU9XFxcIjY1NlxcXCI+NjU2PC9hPnxHcm91cCBkb2VzIG5vdCBjb250YWluIGV4cGVjdGVkIGVudGl0aWVzLnwgIHwgfCA8YSBuYW1lPVxcXCI2NjVcXFwiPjY2NTwvYT58RGVzdGluYXRpb24gZGlyZWN0b3J5IG5vdCBmb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI2NjdcXFwiPjY2NzwvYT58UmVsYXRpb24gZGVmaW5pdGlvbiBhbHJlYWR5IGV4aXN0c3wgIHwgfCA8YSBuYW1lPVxcXCI2NzJcXFwiPjY3MjwvYT58Q291bGQgbm90IHJldHJpZXZlIGZpbGUgY29udGVudHN8ICB8IHwgPGEgbmFtZT1cXFwiNjczXFxcIj42NzM8L2E+fE1pc3NpbmcgZW50aXRsZW1lbnRzIGZvciBlbnRpdGllcyBpbiBHcm91cHwgIHwgfCA8YSBuYW1lPVxcXCI2NzRcXFwiPjY3NDwvYT58TmV4dCBCZXN0IEFjdGlvbiBub3QgZm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiNjc2XFxcIj42NzY8L2E+fFJlbGF0aW9uIGRlZmluaXRpb24gbm90IGRlZmluZWR8ICB8IHwgPGEgbmFtZT1cXFwiNjc3XFxcIj42Nzc8L2E+fEludmFsaWQgZW50aXR5IGlkZW50aWZpZXIgZm9yIHJlbGF0aW9ufCAgfCB8IDxhIG5hbWU9XFxcIjY4MVxcXCI+NjgxPC9hPnxTb3J0aW5nIGJ5IHNwZWNpZmllZCBmaWVsZCBub3Qgc3VwcG9ydGVkfE9uZSBvciBtb3JlIG9mIHRoZSBwcm92aWRlZCBmaWVsZHMgdG8gb3JkZXIgYnkgd2VyZSBlaXRoZXIgaW52YWxpZCBvciBub3Qgc3VwcG9ydGVkLiB8IHwgPGEgbmFtZT1cXFwiNjgyXFxcIj42ODI8L2E+fFRvbyBtYW55IGZpZWxkcyB0byBzb3J0IGJ5fFRoZSBudW1iZXIgb2YgZmllbGRzIHRvIHNvcnQgdGhlIGRhdGEgYnkgZXhjZWVkcyB0aGUgbnVtYmVyIGFsbG93ZWQgYnkgdGhlIGVuZHBvaW50IHwgfCA8YSBuYW1lPVxcXCI2ODRcXFwiPjY4NDwvYT58U2VxdWVuY2UgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjY4NVxcXCI+Njg1PC9hPnxTZXF1ZW5jZSBBbHJlYWR5IEV4aXN0c3wgIHwgfCA8YSBuYW1lPVxcXCI2ODZcXFwiPjY4NjwvYT58Tm9uLWN5Y2xpbmcgc2VxdWVuY2UgaGFzIGJlZW4gZXhoYXVzdGVkfCAgfCB8IDxhIG5hbWU9XFxcIjY4N1xcXCI+Njg3PC9hPnxMZWdhbCBFbnRpdHkgSWRlbnRpZmllciBBbHJlYWR5IEluIFVzZXwgIHwgfCA8YSBuYW1lPVxcXCI2ODhcXFwiPjY4ODwvYT58TGVnYWwgRW50aXR5IE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI2ODlcXFwiPjY4OTwvYT58VGhlIHN1cHBsaWVkIHBhZ2luYXRpb24gdG9rZW4gaXMgaW52YWxpZHwgIHwgfCA8YSBuYW1lPVxcXCI2OTBcXFwiPjY5MDwvYT58UHJvcGVydHkgVHlwZSBJcyBOb3QgU3VwcG9ydGVkfCAgfCB8IDxhIG5hbWU9XFxcIjY5MVxcXCI+NjkxPC9hPnxNdWx0aXBsZSBUYXgtbG90cyBGb3IgQ3VycmVuY3kgVHlwZSBJcyBOb3QgU3VwcG9ydGVkfCAgfCB8IDxhIG5hbWU9XFxcIjY5MlxcXCI+NjkyPC9hPnxUaGlzIGVuZHBvaW50IGRvZXMgbm90IHN1cHBvcnQgaW1wZXJzb25hdGlvbnwgIHwgfCA8YSBuYW1lPVxcXCI2OTNcXFwiPjY5MzwvYT58RW50aXR5IHR5cGUgaXMgbm90IHN1cHBvcnRlZCBmb3IgUmVsYXRpb25zaGlwfCAgfCB8IDxhIG5hbWU9XFxcIjY5NFxcXCI+Njk0PC9hPnxSZWxhdGlvbnNoaXAgVmFsaWRhdGlvbiBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjY5NVxcXCI+Njk1PC9hPnxSZWxhdGlvbnNoaXAgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjY5N1xcXCI+Njk3PC9hPnxEZXJpdmVkIFByb3BlcnR5IEZvcm11bGEgTm8gTG9uZ2VyIFZhbGlkfCAgfCB8IDxhIG5hbWU9XFxcIjY5OFxcXCI+Njk4PC9hPnxTdG9yeSBpcyBub3QgYXZhaWxhYmxlfCAgfCB8IDxhIG5hbWU9XFxcIjcwM1xcXCI+NzAzPC9hPnxDb3Jwb3JhdGUgQWN0aW9uIERvZXMgTm90IEV4aXN0fCAgfCB8IDxhIG5hbWU9XFxcIjcyMFxcXCI+NzIwPC9hPnxUaGUgcHJvdmlkZWQgc29ydCBhbmQgZmlsdGVyIGNvbWJpbmF0aW9uIGlzIG5vdCB2YWxpZHwgIHwgfCA8YSBuYW1lPVxcXCI3MjFcXFwiPjcyMTwvYT58QTJCIGdlbmVyYXRpb24gZmFpbGVkfCAgfCB8IDxhIG5hbWU9XFxcIjcyMlxcXCI+NzIyPC9hPnxBZ2dyZWdhdGVkIFJldHVybiBDYWxjdWxhdGlvbiBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjcyM1xcXCI+NzIzPC9hPnxDdXN0b20gRW50aXR5IERlZmluaXRpb24gSWRlbnRpZmllciBBbHJlYWR5IEluIFVzZXwgIHwgfCA8YSBuYW1lPVxcXCI3MjRcXFwiPjcyNDwvYT58Q3VzdG9tIEVudGl0eSBEZWZpbml0aW9uIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI3MjVcXFwiPjcyNTwvYT58VGhlIFBsYWNlbWVudCByZXF1ZXN0ZWQgd2FzIG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiNzI2XFxcIj43MjY8L2E+fFRoZSBFeGVjdXRpb24gcmVxdWVzdGVkIHdhcyBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjcyN1xcXCI+NzI3PC9hPnxUaGUgQmxvY2sgcmVxdWVzdGVkIHdhcyBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjcyOFxcXCI+NzI4PC9hPnxUaGUgUGFydGljaXBhdGlvbiByZXF1ZXN0ZWQgd2FzIG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiNzI5XFxcIj43Mjk8L2E+fFRoZSBQYWNrYWdlIHJlcXVlc3RlZCB3YXMgbm90IGZvdW5kLnwgIHwgfCA8YSBuYW1lPVxcXCI3MzBcXFwiPjczMDwvYT58VGhlIE9yZGVySW5zdHJ1Y3Rpb24gcmVxdWVzdGVkIHdhcyBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjczMlxcXCI+NzMyPC9hPnxDdXN0b20gRW50aXR5IG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiNzMzXFxcIj43MzM8L2E+fEN1c3RvbSBFbnRpdHkgSWRlbnRpZmllciBhbHJlYWR5IGluIHVzZS58ICB8IHwgPGEgbmFtZT1cXFwiNzM1XFxcIj43MzU8L2E+fENhbGN1bGF0aW9uIEZhaWxlZC58ICB8IHwgPGEgbmFtZT1cXFwiNzM2XFxcIj43MzY8L2E+fEFuIGV4cGVjdGVkIGtleSBvbiBIdHRwUmVzcG9uc2UgaXMgbWlzc2luZy58ICB8IHwgPGEgbmFtZT1cXFwiNzM3XFxcIj43Mzc8L2E+fEEgcmVxdWlyZWQgZmVlIGRldGFpbCBpcyBtaXNzaW5nLnwgIHwgfCA8YSBuYW1lPVxcXCI3MzhcXFwiPjczODwvYT58WmVybyByb3dzIHdlcmUgcmV0dXJuZWQgZnJvbSBMdW1pbmVzY2V8ICB8IHwgPGEgbmFtZT1cXFwiNzM5XFxcIj43Mzk8L2E+fFByb3ZpZGVkIFdlZWtlbmQgTWFzayB3YXMgaW52YWxpZHwgIHwgfCA8YSBuYW1lPVxcXCI3NDJcXFwiPjc0MjwvYT58Q3VzdG9tIEVudGl0eSBmaWVsZHMgZG8gbm90IG1hdGNoIHRoZSBkZWZpbml0aW9ufCAgfCB8IDxhIG5hbWU9XFxcIjc0NlxcXCI+NzQ2PC9hPnxUaGUgcHJvdmlkZWQgc2VxdWVuY2UgaXMgbm90IHZhbGlkLnwgIHwgfCA8YSBuYW1lPVxcXCI3NTFcXFwiPjc1MTwvYT58VGhlIHR5cGUgb2YgdGhlIEN1c3RvbSBFbnRpdHkgaXMgZGlmZmVyZW50IHRoYW4gdGhlIHR5cGUgcHJvdmlkZWQgaW4gdGhlIGRlZmluaXRpb24ufCAgfCB8IDxhIG5hbWU9XFxcIjc1MlxcXCI+NzUyPC9hPnxMdW1pbmVzY2UgcHJvY2VzcyByZXR1cm5lZCBhbiBlcnJvci58ICB8IHwgPGEgbmFtZT1cXFwiNzUzXFxcIj43NTM8L2E+fEZpbGUgbmFtZSBvciBjb250ZW50IGluY29tcGF0aWJsZSB3aXRoIG9wZXJhdGlvbi58ICB8IHwgPGEgbmFtZT1cXFwiNzU1XFxcIj43NTU8L2E+fFNjaGVtYSBvZiByZXNwb25zZSBmcm9tIERyaXZlIGlzIG5vdCBhcyBleHBlY3RlZC58ICB8IHwgPGEgbmFtZT1cXFwiNzU3XFxcIj43NTc8L2E+fFNjaGVtYSBvZiByZXNwb25zZSBmcm9tIEx1bWluZXNjZSBpcyBub3QgYXMgZXhwZWN0ZWQufCAgfCB8IDxhIG5hbWU9XFxcIjc1OFxcXCI+NzU4PC9hPnxMdW1pbmVzY2UgdGltZWQgb3V0LnwgIHwgfCA8YSBuYW1lPVxcXCI3NjNcXFwiPjc2MzwvYT58SW52YWxpZCBMdXNpZCBFbnRpdHkgSWRlbnRpZmllciBVbml0fCAgfCB8IDxhIG5hbWU9XFxcIjc2OFxcXCI+NzY4PC9hPnxGZWUgcnVsZSBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjc2OVxcXCI+NzY5PC9hPnxDYW5ub3QgdXBkYXRlIHRoZSBiYXNlIGN1cnJlbmN5IG9mIGEgcG9ydGZvbGlvIHdpdGggdHJhbnNhY3Rpb25zIGxvYWRlZHwgIHwgfCA8YSBuYW1lPVxcXCI3NzFcXFwiPjc3MTwvYT58VHJhbnNhY3Rpb24gY29uZmlndXJhdGlvbiBzb3VyY2Ugbm90IGZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjc3NFxcXCI+Nzc0PC9hPnxDb21wbGlhbmNlIHJ1bGUgbm90IGZvdW5kLnwgIHwgfCA8YSBuYW1lPVxcXCI3NzVcXFwiPjc3NTwvYT58RnVuZCBhY2NvdW50aW5nIGRvY3VtZW50IGNhbm5vdCBiZSBwcm9jZXNzZWQufCAgfCB8IDxhIG5hbWU9XFxcIjc3OFxcXCI+Nzc4PC9hPnxVbmFibGUgdG8gbG9vayB1cCBGWCByYXRlIGZyb20gdHJhZGUgY2N5IHRvIHBvcnRmb2xpbyBjY3kgZm9yIHNvbWUgb2YgdGhlIHRyYWRlcy58ICB8IHwgPGEgbmFtZT1cXFwiNzgyXFxcIj43ODI8L2E+fFRoZSBQcm9wZXJ0eSBkZWZpbml0aW9uIGRhdGFUeXBlIGlzIG5vdCBtYXRjaGluZyB0aGUgZGVyaXZhdGlvbiBmb3JtdWxhIGRhdGFUeXBlfCAgfCB8IDxhIG5hbWU9XFxcIjc4M1xcXCI+NzgzPC9hPnxUaGUgUHJvcGVydHkgZGVmaW5pdGlvbiBkb21haW4gaXMgbm90IHN1cHBvcnRlZCBmb3IgZGVyaXZlZCBwcm9wZXJ0aWVzfCAgfCB8IDxhIG5hbWU9XFxcIjc4OFxcXCI+Nzg4PC9hPnxDb21wbGlhbmNlIHJ1biBub3QgZm91bmQgZmFpbHVyZS58ICB8IHwgPGEgbmFtZT1cXFwiNzkwXFxcIj43OTA8L2E+fEN1c3RvbSBFbnRpdHkgaGFzIG1pc3Npbmcgb3IgaW52YWxpZCBpZGVudGlmaWVyc3wgIHwgfCA8YSBuYW1lPVxcXCI3OTFcXFwiPjc5MTwvYT58Q3VzdG9tIEVudGl0eSBkZWZpbml0aW9uIGFscmVhZHkgZXhpc3RzfCAgfCB8IDxhIG5hbWU9XFxcIjc5MlxcXCI+NzkyPC9hPnxDb21wbGlhbmNlIFByb3BlcnR5S2V5IGlzIG1pc3NpbmcufCAgfCB8IDxhIG5hbWU9XFxcIjc5M1xcXCI+NzkzPC9hPnxDb21wbGlhbmNlIENyaXRlcmlhIFZhbHVlIGZvciBtYXRjaGluZyBpcyBtaXNzaW5nLnwgIHwgfCA8YSBuYW1lPVxcXCI3OTVcXFwiPjc5NTwvYT58Q2Fubm90IGRlbGV0ZSBpZGVudGlmaWVyIGRlZmluaXRpb258ICB8IHwgPGEgbmFtZT1cXFwiNzk2XFxcIj43OTY8L2E+fFRheCBydWxlIHNldCBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjc5N1xcXCI+Nzk3PC9hPnxBIHRheCBydWxlIHNldCB3aXRoIHRoaXMgaWQgYWxyZWFkeSBleGlzdHMufCAgfCB8IDxhIG5hbWU9XFxcIjc5OFxcXCI+Nzk4PC9hPnxNdWx0aXBsZSBydWxlIHNldHMgZm9yIHRoZSBzYW1lIHByb3BlcnR5IGtleSBhcmUgYXBwbGljYWJsZS58ICB8IHwgPGEgbmFtZT1cXFwiNzk5XFxcIj43OTk8L2E+fFRoZSByZXF1ZXN0IG11c3QgY29udGFpbiBhIGRhdGUgb3IgZGlhcnkgZW50cnkufCAgfCB8IDxhIG5hbWU9XFxcIjgwMFxcXCI+ODAwPC9hPnxDYW4gbm90IHVwc2VydCBhbiBpbnN0cnVtZW50IGV2ZW50IG9mIHRoaXMgdHlwZS58ICB8IHwgPGEgbmFtZT1cXFwiODAxXFxcIj44MDE8L2E+fFRoZSBpbnN0cnVtZW50IGV2ZW50IGRvZXMgbm90IGV4aXN0LnwgIHwgfCA8YSBuYW1lPVxcXCI4MDJcXFwiPjgwMjwvYT58VGhlIEluc3RydW1lbnQgZXZlbnQgaXMgbWlzc2luZyBzYWxpZW50IGluZm9ybWF0aW9uLnwgIHwgfCA8YSBuYW1lPVxcXCI4MDNcXFwiPjgwMzwvYT58VGhlIEluc3RydW1lbnQgZXZlbnQgY291bGQgbm90IGJlIHByb2Nlc3NlZC58ICB8IHwgPGEgbmFtZT1cXFwiODA0XFxcIj44MDQ8L2E+fFNvbWUgZGF0YSByZXF1ZXN0ZWQgZG9lcyBub3QgZm9sbG93IHRoZSBvcmRlciBncmFwaCBhc3N1bXB0aW9ucy58ICB8IHwgPGEgbmFtZT1cXFwiODA1XFxcIj44MDU8L2E+fFRoZSBpbnN0cnVtZW50IGV2ZW50IHR5cGUgZG9lcyBub3QgZXhpc3QufCAgfCB8IDxhIG5hbWU9XFxcIjgwNlxcXCI+ODA2PC9hPnxUaGUgdHJhbnNhY3Rpb24gdGVtcGxhdGUgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBleGlzdC58ICB8IHwgPGEgbmFtZT1cXFwiODA3XFxcIj44MDc8L2E+fFRoZSBkZWZhdWx0IHRyYW5zYWN0aW9uIHRlbXBsYXRlIGRvZXMgbm90IGV4aXN0LnwgIHwgfCA8YSBuYW1lPVxcXCI4MDhcXFwiPjgwODwvYT58VGhlIHRyYW5zYWN0aW9uIHRlbXBsYXRlIGRvZXMgbm90IGV4aXN0LnwgIHwgfCA8YSBuYW1lPVxcXCI4MTFcXFwiPjgxMTwvYT58QSBwcmljZSBjb3VsZCBub3QgYmUgZm91bmQgZm9yIGFuIG9yZGVyLnwgIHwgfCA8YSBuYW1lPVxcXCI4MTJcXFwiPjgxMjwvYT58QSBwcmljZSBjb3VsZCBub3QgYmUgZm91bmQgZm9yIGFuIGFsbG9jYXRpb24ufCAgfCB8IDxhIG5hbWU9XFxcIjgxM1xcXCI+ODEzPC9hPnxDaGFydCBvZiBBY2NvdW50cyBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjgxNFxcXCI+ODE0PC9hPnxBY2NvdW50IG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiODE1XFxcIj44MTU8L2E+fEFib3Igbm90IGZvdW5kLnwgIHwgfCA8YSBuYW1lPVxcXCI4MTZcXFwiPjgxNjwvYT58QWJvciBDb25maWd1cmF0aW9uIG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiODE3XFxcIj44MTc8L2E+fFJlY29uY2lsaWF0aW9uIG1hcHBpbmcgbm90IGZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjgxOFxcXCI+ODE4PC9hPnxBdHRyaWJ1dGUgdHlwZSBjb3VsZCBub3QgYmUgZGVsZXRlZCBiZWNhdXNlIGl0IGRvZXNuXFwndCBleGlzdC58ICB8IHwgPGEgbmFtZT1cXFwiODE5XFxcIj44MTk8L2E+fFJlY29uY2lsaWF0aW9uIG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiODIwXFxcIj44MjA8L2E+fEN1c3RvZGlhbiBBY2NvdW50IG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiODIxXFxcIj44MjE8L2E+fEFsbG9jYXRpb24gRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCI4MjJcXFwiPjgyMjwvYT58UmVjb25jaWxpYXRpb24gcnVuIG5vdCBmb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI4MjNcXFwiPjgyMzwvYT58UmVjb25jaWxpYXRpb24gYnJlYWsgbm90IGZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjgyNFxcXCI+ODI0PC9hPnxFbnRpdHkgbGluayB0eXBlIGNvdWxkIG5vdCBiZSBkZWxldGVkIGJlY2F1c2UgaXQgZG9lc25cXCd0IGV4aXN0LnwgIHwgfCA8YSBuYW1lPVxcXCI4MjhcXFwiPjgyODwvYT58QWRkcmVzcyBrZXkgZGVmaW5pdGlvbiBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjgyOVxcXCI+ODI5PC9hPnxDb21wbGlhbmNlIHRlbXBsYXRlIG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiODMwXFxcIj44MzA8L2E+fEFjdGlvbiBub3Qgc3VwcG9ydGVkfCAgfCB8IDxhIG5hbWU9XFxcIjgzMVxcXCI+ODMxPC9hPnxSZWZlcmVuY2UgbGlzdCBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjgzMlxcXCI+ODMyPC9hPnxQb3N0aW5nIE1vZHVsZSBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjgzM1xcXCI+ODMzPC9hPnxUaGUgdHlwZSBvZiBwYXJhbWV0ZXIgcHJvdmlkZWQgZGlkIG5vdCBtYXRjaCB0aGF0IHJlcXVpcmVkIGJ5IHRoZSBjb21wbGlhbmNlIHJ1bGUufCAgfCB8IDxhIG5hbWU9XFxcIjgzNFxcXCI+ODM0PC9hPnxUaGUgcGFyYW1ldGVycyBwcm92aWRlZCBieSBhIHJ1bGUgZGlkIG5vdCBtYXRjaCB0aG9zZSByZXF1aXJlZCBieSBpdHMgdGVtcGxhdGUufCAgfCB8IDxhIG5hbWU9XFxcIjgzNVxcXCI+ODM1PC9hPnxUaGUgZW50aXR5IGhhcyBhIHByb3BlcnR5IGluIGEgZG9tYWluIHRoYXQgaXMgbm90IHN1cHBydGVkIGZvciB0aGF0IGVudGl0eSB0eXBlLnwgIHwgfCA8YSBuYW1lPVxcXCI4MzZcXFwiPjgzNjwvYT58U3RydWN0dXJlZCByZXN1bHQgZGF0YSBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjgzN1xcXCI+ODM3PC9hPnxEaWFyeSBlbnRyeSBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjgzOFxcXCI+ODM4PC9hPnxEaWFyeSBlbnRyeSBjb3VsZCBub3QgYmUgY3JlYXRlZC58ICB8IHwgPGEgbmFtZT1cXFwiODM5XFxcIj44Mzk8L2E+fERpYXJ5IGVudHJ5IGFscmVhZHkgZXhpc3RzLnwgIHwgfCA8YSBuYW1lPVxcXCI4NjFcXFwiPjg2MTwvYT58Q29tcGxpYW5jZSBydW4gc3VtbWFyeSBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjg2OVxcXCI+ODY5PC9hPnxDb25mbGljdGluZyBpbnN0cnVtZW50IHByb3BlcnRpZXMgaW4gYmF0Y2gufCAgfCB8IDxhIG5hbWU9XFxcIjg3MFxcXCI+ODcwPC9hPnxDb21wbGlhbmNlIHJ1biBzdW1tYXJ5IGFscmVhZHkgZXhpc3RzLnwgIHwgfCA8YSBuYW1lPVxcXCI4NzFcXFwiPjg3MTwvYT58VGhlIHNwZWNpZmllZCBpbXBlcnNvbmF0ZWQgdXNlciBkb2VzIG5vdCBleGlzdHwgIHwgfCA8YSBuYW1lPVxcXCI4NzRcXFwiPjg3NDwvYT58UHJvdmlkZWQgUHJvcGVydHkgRG9tYWluIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGVudGl0eSBmaWx0ZXIufCAgfCB8IDxhIG5hbWU9XFxcIjg3NVxcXCI+ODc1PC9hPnxDYW5ub3QgRGVsZXRlIFN5c3RlbSBSZWZlcmVuY2UgTGlzdC58ICB8IHwgPGEgbmFtZT1cXFwiODc2XFxcIj44NzY8L2E+fENsZWFyZG93biBNb2R1bGUgbm90IGZvdW5kLnwgIHwgfCA8YSBuYW1lPVxcXCI4NzlcXFwiPjg3OTwvYT58UG9ydGZvbGlvcyBkbyBub3QgaGF2ZSB0aGUgc2FtZSBiYXNlIGN1cnJlbmN5fCAgfCB8IDxhIG5hbWU9XFxcIjg4MFxcXCI+ODgwPC9hPnxUaGVyZSB3YXMgYSBwcm9ibGVtIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlIGNvbXBsaWFuY2UgZXhwcmVzc2lvbi58ICB8IHwgPGEgbmFtZT1cXFwiODgxXFxcIj44ODE8L2E+fEJsb2NrIG92ZXJwbGFjZWQufCAgfCB8IDxhIG5hbWU9XFxcIjg4MlxcXCI+ODgyPC9hPnxPcmRlciBub3QgYXBwcm92ZWQufCAgfCB8IDxhIG5hbWU9XFxcIjg4M1xcXCI+ODgzPC9hPnxDYW5ub3QgdXBkYXRlIHRoZSBzaGFyZWQgZmllbGRzIG9mIGEgYmxvY2sgd2l0aCBhc3NvY2lhdGVkIG9yZGVycy58ICB8IHwgPGEgbmFtZT1cXFwiODg2XFxcIj44ODY8L2E+fENhbm5vdCBsb2NrIHRoZSBwZXJpb2QufCAgfCB8IDxhIG5hbWU9XFxcIjg4N1xcXCI+ODg3PC9hPnxDYW5ub3QgYXBwbHkgY2xlYXIgZG93biBtb2R1bGUufCAgfCB8IDxhIG5hbWU9XFxcIjg4OFxcXCI+ODg4PC9hPnxDYW5ub3QgdXBzZXJ0IEluc3RydW1lbnQgRXZlbnQgSW5zdHJ1Y3Rpb24ufCAgfCB8IDxhIG5hbWU9XFxcIjg4OVxcXCI+ODg5PC9hPnxDYW5ub3QgcmVhZCBJbnN0cnVtZW50IEV2ZW50IEluc3RydWN0aW9uLnwgIHwgfCA8YSBuYW1lPVxcXCI4OTVcXFwiPjg5NTwvYT58VGhlIENhcGl0YWwgUmF0aW8gQ2FsY3VsYXRpb24gSXMgV3JvbmcufCAgfCB8IDxhIG5hbWU9XFxcIjkxMFxcXCI+OTEwPC9hPnxDYW5ub3QgdXBkYXRlIGEgYmxvY2sgcmVmZXJlbmNlZCBieSBhIHBsYWNlbWVudC58ICB8IHwgPGEgbmFtZT1cXFwiOTExXFxcIj45MTE8L2E+fEEgRnVuZCB0aGF0IHJlZmVyZW5jZXMgdGhpcyBBYm9yIGFscmVhZHkgZXhpc3RzLnwgIHwgfCA8YSBuYW1lPVxcXCI5MTJcXFwiPjkxMjwvYT58Q2Fubm90IGFkZCBkZWNpc2lvbiB0byBTdGFnZWQgTW9kaWZpY2F0aW9uLnwgIHwgfCA8YSBuYW1lPVxcXCI5MTNcXFwiPjkxMzwvYT58VGhlIFN0YWdlZCBNb2RpZmljYXRpb24gY291bGQgbm90IGJlIGFwcGxpZWQufCAgfCB8IDxhIG5hbWU9XFxcIjkxNFxcXCI+OTE0PC9hPnxBY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkLnwgIHwgfCA8YSBuYW1lPVxcXCI5MTVcXFwiPjkxNTwvYT58Q2Fubm90IHVwc2VydCBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBwcm9wZXJ0eSBpbiBvbmUgcmVxdWVzdC58ICB8IHwgPGEgbmFtZT1cXFwiOTE2XFxcIj45MTY8L2E+fFBsYWNlbWVudCBhbmQgZGlyZWN0IGRlc2NlbmRlbnRzIGhhdmUgbW9yZSBleGVjdXRlZCBxdWFudGl0eSB0aGFuIHRvdGFsIHBsYWNlbWVudCBxdWFudGl0eS58ICB8IHwgPGEgbmFtZT1cXFwiOTE3XFxcIj45MTc8L2E+fENhbm5vdCB1cGRhdGUgYSBwbGFjZW1lbnQgd2l0aCB0aGlzIEVudHJ5VHlwZS58ICB8IHwgPGEgbmFtZT1cXFwiOTE4XFxcIj45MTg8L2E+fENhbm5vdCB1cGRhdGUgYSBwbGFjZW1lbnQgaW4gdGhpcyBTdGF0ZS58ICB8IHwgPGEgbmFtZT1cXFwiOTE5XFxcIj45MTk8L2E+fFBsYWNlbWVudCBjb3VsZCBub3QgYmUgY2FuY2VsbGVkLnwgIHwgfCA8YSBuYW1lPVxcXCI5MjBcXFwiPjkyMDwvYT58U2hhcmUgQ2xhc3Mgbm90IGNvbmZpZ3VyZWQgaW4gRnVuZHwgIHwgfCA8YSBuYW1lPVxcXCI5MjFcXFwiPjkyMTwvYT58U2hhcmUgQ2xhc3MgU3ViIEhvbGRpbmcgS2V5IG5vdCBjb25maWd1cmVkIGluIFBvcnRmb2xpb3wgIHwgfCA8YSBuYW1lPVxcXCI5MjJcXFwiPjkyMjwvYT58Q291bGQgbm90IHVwZGF0ZSBhbiBvcmRlci58ICB8IHwgPGEgbmFtZT1cXFwiOTIzXFxcIj45MjM8L2E+fE11bHRpcGxlIHNldHMgb2YgU2hhcmUgQ2xhc3MgU3ViIEhvbGRpbmcgS2V5cyBjb25maWd1cmVkIGFjcm9zcyB0aGUgUG9ydGZvbGlvcyBvZiBhIEZ1bmQufCAgfCB8IDxhIG5hbWU9XFxcIjkyNFxcXCI+OTI0PC9hPnxPbmUgb3IgbW9yZSBtYXRyaXggY2VsbHMgY291bGQgbm90IGJlIGFkZGVkIHRvIHRoZSBtYXRyaXgufCAgfCB8IDxhIG5hbWU9XFxcIjkyNVxcXCI+OTI1PC9hPnxUaGVyZSB3YXMgYSBwcm9ibGVtIHdpdGggdGhlIHByb3ZpZGVkIG1hdHJpeCBkZWZpbml0aW9uLnwgIHwgfCA8YSBuYW1lPVxcXCI5MjZcXFwiPjkyNjwvYT58TWF0cml4IGRlZmluaXRpb24gZG9lcyBub3QgZXhpc3QufCAgfCB8IDxhIG5hbWU9XFxcIjkyN1xcXCI+OTI3PC9hPnxNYXRyaXggZGVmaW5pdGlvbiBjb3VsZCBub3QgYmUgZGVsZXRlZCBiZWNhdXNlIGl0IGRvZXNuXFwndCBleGlzdC58ICB8IHwgPGEgbmFtZT1cXFwiOTI4XFxcIj45Mjg8L2E+fERhdGFUeXBlIHdpdGggSWQgYWxyZWFkeSBleGlzdHMufCAgfCB8IDxhIG5hbWU9XFxcIjkyOVxcXCI+OTI5PC9hPnxTcXVhcmUgbWF0cml4IGlzIGluY29tcGxldGUufCAgfCB8IDxhIG5hbWU9XFxcIjkzMFxcXCI+OTMwPC9hPnxBIGNvbmRpdGlvbmFsIGxpY2Vuc2UgdGVybSBoYXMgYmVlbiBleGNlZWRlZC58ICB8IHwgPGEgbmFtZT1cXFwiOTMxXFxcIj45MzE8L2E+fFRoZSBDdXN0b20gRGF0YSBNb2RlbCByZXF1ZXN0ZWQgaXMgbm90IGludGVuZGVkIGZvciB0aGUgZW50aXR5IHByb3ZpZGVkLnwgIHwgfCA8YSBuYW1lPVxcXCI5MzJcXFwiPjkzMjwvYT58VGhlIGVudGl0eSBwcm92aWRlZCBkb2VzIG5vdCBoYXZlIGEgbWFuZGF0b3J5IHByb3BlcnR5IHNwZWNpZmllZCBieSB0aGUgQ3VzdG9tIERhdGEgTW9kZWwufCAgfCB8IDxhIG5hbWU9XFxcIjkzM1xcXCI+OTMzPC9hPnxUaGUgZW50aXR5IHByb3ZpZGVkIGhhcyBhIHByb3BlcnR5IG5vdCBhbGxvd2VkIGJ5IHRoZSBzcGVjaWZpZWQgQ3VzdG9tIERhdGEgTW9kZWwufCAgfCB8IDxhIG5hbWU9XFxcIjkzNFxcXCI+OTM0PC9hPnxUaGUgZW50aXR5IHByb3ZpZGVkIGRvZXMgbm90IGhhdmUgYSBtYW5kYXRvcnkgaWRlbnRpZmllciBzcGVjaWZpZWQgYnkgdGhlIEN1c3RvbSBEYXRhIE1vZGVsLnwgIHwgfCA8YSBuYW1lPVxcXCI5MzVcXFwiPjkzNTwvYT58VGhlIGVudGl0eSBwcm92aWRlZCBoYXMgYW4gaWRlbnRpZmllciBub3QgYWxsb3dlZCBieSB0aGUgc3BlY2lmaWVkIEN1c3RvbSBEYXRhIE1vZGVsLnwgIHwgfCA8YSBuYW1lPVxcXCI5MzZcXFwiPjkzNjwvYT58VGhlIEN1c3RvbSBEYXRhIE1vZGVsIGluY2x1ZGVkIGFuIGFsaWFzIG9yIHNvcnQtYnkgYXR0cmlidXRlIHRoYXQgd2FzIG5vdCBvbiB0aGUgZGVmaW5pdGlvbi58ICB8IHwgPGEgbmFtZT1cXFwiOTM3XFxcIj45Mzc8L2E+fFRoZSBDbG9zZWRQZXJpb2Qgd2l0aCB0aGUgSWQgYWxyZWFkeSBleGlzdHMgb24gdGhlIFRpbWVsaW5lfCAgfCB8IDxhIG5hbWU9XFxcIjkzOFxcXCI+OTM4PC9hPnxUaGUgbmV3IENsb3NlZCBQZXJpb2Qgd291bGQgY2F1c2UgdGhlIFRpbWVsaW5lIHRvIGhhdmUgbm9uLWNvbnRpZ3VvdXMgQ2xvc2VkIFBlcmlvZHN8ICB8IHwgPGEgbmFtZT1cXFwiOTM5XFxcIj45Mzk8L2E+fEJsb2NrZWQgYnkgYSBOZXR3b3JrIFpvbmV8ICB8IHwgPGEgbmFtZT1cXFwiOTQwXFxcIj45NDA8L2E+fFRoZSBlbnRpdHkgcHJvdmlkZWQgZG9lcyBub3QgbWVldCB0aGUgY29uZGl0aW9ucyBvZiB0aGUgQ3VzdG9tIERhdGEgTW9kZWwufCAgfCB8IDxhIG5hbWU9XFxcIjk0MVxcXCI+OTQxPC9hPnxPcmRlciBub3QgY29tcGxpYW50LnwgIHwgfCA8YSBuYW1lPVxcXCI5NDJcXFwiPjk0MjwvYT58QWN0aW9uIHdvdWxkIGNyZWF0ZSBhIGNpcmN1bGFyIGRlcGVuZGVuY3kufCAgfCB8IDxhIG5hbWU9XFxcIjk0NFxcXCI+OTQ0PC9hPnxEZXJpdmVkIFByb3BlcnR5IGNhbGN1bGF0aW9uIG5vdCBjb21wbGV0ZS58ICB8IHwgPGEgbmFtZT1cXFwiOTQ1XFxcIj45NDU8L2E+fERlcml2ZWQgUHJvcGVydHkgaXMgbm90IGZpbHRlcmFibGUufCAgfCB8IDxhIG5hbWU9XFxcIjk0NlxcXCI+OTQ2PC9hPnxUaGUgY29uZGl0aW9ucyBwcm92aWRlZCBoYXZlIG9uZSBvciBtb3JlIGVycm9ycy58ICB8IHwgPGEgbmFtZT1cXFwiOTQ3XFxcIj45NDc8L2E+fFRoZSBwcm9wZXJ0eS9pZGVudGlmaWVyIGRvbWFpbiBhbmQgZW50aXR5IGRvbWFpbiBkbyBub3QgbWF0Y2gufCAgfCB8IDxhIG5hbWU9XFxcIjk0OFxcXCI+OTQ4PC9hPnxJbnZhbGlkIFRpbWVsaW5lfCAgfCB8IDxhIG5hbWU9XFxcIjk0OVxcXCI+OTQ5PC9hPnxGaWx0ZXJhYmxlIERlcml2ZWQgUHJvcGVydHkgbGltaXQgcmVhY2hlZC58ICB8IHwgPGEgbmFtZT1cXFwiOTUwXFxcIj45NTA8L2E+fEludmVzdG9yIFJlY29yZCBJZGVudGlmaWVyIEFscmVhZHkgSW4gVXNlfCAgfCB8IDxhIG5hbWU9XFxcIjk1MVxcXCI+OTUxPC9hPnxJbnZlc3RvciBSZWNvcmQgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjk1MlxcXCI+OTUyPC9hPnxJbnZlc3RtZW50IEFjY291bnQgSWRlbnRpZmllciBBbHJlYWR5IEluIFVzZXwgIHwgfCA8YSBuYW1lPVxcXCI5NTNcXFwiPjk1MzwvYT58SW52ZXN0bWVudCBBY2NvdW50IE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI5NTRcXFwiPjk1NDwvYT58Q291bGQgTm90IFN3ZWVwIEJsb2NrfCAgfCB8IDxhIG5hbWU9XFxcIjk1NVxcXCI+OTU1PC9hPnxFbnRpdHkgVW5pcXVlIElkIGhhcyB0aGUgd3JvbmcgZm9ybWF0fCAgfCB8IDxhIG5hbWU9XFxcIjk1NlxcXCI+OTU2PC9hPnxQb3N0IENsb3NlIEFjdGl2aXR5IGlzIGludmFsaWR8ICB8IHwgPGEgbmFtZT1cXFwiOTU3XFxcIj45NTc8L2E+fFRoZSBDbG9zZWRQZXJpb2Qgd2l0aCB0aGUgSWQgZG9lcyBub3QgZXhpc3Qgb24gdGhlIFRpbWVsaW5lfCAgfCB8IDxhIG5hbWU9XFxcIjk1OFxcXCI+OTU4PC9hPnxJbnZhbGlkIFNldHRsZW1lbnQgSW5zdHJ1Y3Rpb25zfCAgfCB8IDxhIG5hbWU9XFxcIjk1OVxcXCI+OTU5PC9hPnxPcmRlciByZXF1aXJlcyBxdWFudGl0eS58ICB8IHwgPGEgbmFtZT1cXFwiOTYwXFxcIj45NjA8L2E+fEludmFsaWQgRGF0YVBvaW50IFZhbHVlIEFzc2lnbm1lbnR8ICB8IHwgPGEgbmFtZT1cXFwiOTYxXFxcIj45NjE8L2E+fEludmFsaWQgUmVsYXRpb25hbCBEYXRhc2V0IEZpZWxkIERlZmluaXRpb258ICB8IHwgPGEgbmFtZT1cXFwiOTYyXFxcIj45NjI8L2E+fFJlbGF0aW9uYWwgRGF0YXNldCBEZWZpbml0aW9uIERvZXMgTm90IEV4aXN0fCAgfCB8IDxhIG5hbWU9XFxcIjk2M1xcXCI+OTYzPC9hPnxUaW1lbGluZSBCb29rbWFyayBOb3QgSW4gT3BlbiBQZXJpb2R8ICB8IHwgPGEgbmFtZT1cXFwiOTY0XFxcIj45NjQ8L2E+fFRoZSBDdXN0b20gRGF0YSBNb2RlbCBzcGVjaWZpZWQgaWRlbnRpZmllcnMgYnV0IHRoZSBlbnRpdHkgZG9lcyBub3Qgc3VwcG9ydCBpZGVudGlmaWVyc3wgIHwgfCA8YSBuYW1lPVxcXCI5NjVcXFwiPjk2NTwvYT58VGhlIHNvcnQgYnkgcHJvdmlkZWQgaGFzIG9uZSBvciBtb3JlIGVycm9yc3wgIHwgfCA8YSBuYW1lPVxcXCI5NjZcXFwiPjk2NjwvYT58SW52YWxpZCBDdXN0b20gRGF0YSBNb2RlbCBEZWZpbml0aW9ufCAgfCB8IDxhIG5hbWU9XFxcIjk2N1xcXCI+OTY3PC9hPnxSdWxlIHNldCBkb2VzIG5vdCBleGlzdCBvbiB0aGUgQ2hlY2sgRGVmaW5pdGlvbnwgIHwgfCA8YSBuYW1lPVxcXCI5NjhcXFwiPjk2ODwvYT58VGhlIENsb3NlZCBQZXJpb2QgaXMgaW52YWxpZHwgIHwgfCA8YSBuYW1lPVxcXCI5NjlcXFwiPjk2OTwvYT58Q2Fubm90IHVwZGF0ZSBhIHBsYWNlbWVudCB3aXRoIHRoaXMgU3RvcCBQcmljZS58ICB8IHwgPGEgbmFtZT1cXFwiOTcwXFxcIj45NzA8L2E+fENhbm5vdCB1cGRhdGUgYSBwbGFjZW1lbnQgd2l0aCB0aGlzIExpbWl0IFByaWNlLnwgIHwgfCA8YSBuYW1lPVxcXCI5NzFcXFwiPjk3MTwvYT58Q2Fubm90IHVwZGF0ZSBhIHBsYWNlbWVudCB3aXRoIHRoZSBjdXJyZW50IFR5cGUufCAgfCB8IDxhIG5hbWU9XFxcIjk3NFxcXCI+OTc0PC9hPnxDYW5ub3QgUGxhY2VCbG9ja3MgYWdhaW5zdCBhbiBcXCdVbnNvbGljaXRlZFxcJyBCbG9jayAoYmxvY2sgY29udGFpbmluZyAwIE9yZGVycykufCAgfCB8IDxhIG5hbWU9XFxcIjk3NVxcXCI+OTc1PC9hPnxObyBQb3J0Zm9saW8gR3JvdXAgU2VsZWN0ZWR8ICB8IHwgPGEgbmFtZT1cXFwiOTc2XFxcIj45NzY8L2E+fEFtYmlndW91cyBTY29wZXwgIHwgXG4gKlxuICogQ29udGFjdDogaW5mb0BmaW5ib3VybmUuY29tXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSBPcGVuQVBJIEdlbmVyYXRvciAoaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoKS5cbiAqIGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaFxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG4vKiB0c2xpbnQ6ZGlzYWJsZTpuby11bnVzZWQtdmFyaWFibGUgbWVtYmVyLW9yZGVyaW5nICovXG5cbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSAgICAgICAgICAgICAgICAgICAgICBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zLFxuICAgICAgICAgSHR0cFJlc3BvbnNlLCBIdHRwRXZlbnQsIEh0dHBQYXJhbWV0ZXJDb2RlYywgSHR0cENvbnRleHQgXG4gICAgICAgIH0gICAgICAgZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQ3VzdG9tSHR0cFBhcmFtZXRlckNvZGVjIH0gICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL2VuY29kZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJ3J4anMnO1xuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBCb29rbWFya0VudGl0eSB9IGZyb20gJy4uL21vZGVsL2Jvb2ttYXJrRW50aXR5Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEN1c3RvbUVudGl0eUVudGl0eSB9IGZyb20gJy4uL21vZGVsL2N1c3RvbUVudGl0eUVudGl0eSc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBEYXRhVHlwZUVudGl0eSB9IGZyb20gJy4uL21vZGVsL2RhdGFUeXBlRW50aXR5Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEluc3RydW1lbnRFbnRpdHkgfSBmcm9tICcuLi9tb2RlbC9pbnN0cnVtZW50RW50aXR5Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEx1c2lkUHJvYmxlbURldGFpbHMgfSBmcm9tICcuLi9tb2RlbC9sdXNpZFByb2JsZW1EZXRhaWxzJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEx1c2lkVmFsaWRhdGlvblByb2JsZW1EZXRhaWxzIH0gZnJvbSAnLi4vbW9kZWwvbHVzaWRWYWxpZGF0aW9uUHJvYmxlbURldGFpbHMnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgUG9ydGZvbGlvRW50aXR5IH0gZnJvbSAnLi4vbW9kZWwvcG9ydGZvbGlvRW50aXR5Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFByb3BlcnR5RGVmaW5pdGlvbkVudGl0eSB9IGZyb20gJy4uL21vZGVsL3Byb3BlcnR5RGVmaW5pdGlvbkVudGl0eSc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBSZXNvdXJjZUxpc3RPZkNoYW5nZSB9IGZyb20gJy4uL21vZGVsL3Jlc291cmNlTGlzdE9mQ2hhbmdlJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFJlc291cmNlTGlzdE9mQ2hhbmdlSW50ZXJ2YWwgfSBmcm9tICcuLi9tb2RlbC9yZXNvdXJjZUxpc3RPZkNoYW5nZUludGVydmFsJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFRyYW5zYWN0aW9uRW50aXR5IH0gZnJvbSAnLi4vbW9kZWwvdHJhbnNhY3Rpb25FbnRpdHknO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVmFsdWF0aW9uUG9pbnRFbnRpdHkgfSBmcm9tICcuLi9tb2RlbC92YWx1YXRpb25Qb2ludEVudGl0eSc7XG5cbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEJBU0VfUEFUSCwgQ09MTEVDVElPTl9GT1JNQVRTIH0gICAgICAgICAgICAgICAgICAgICBmcm9tICcuLi92YXJpYWJsZXMnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL2NvbmZpZ3VyYXRpb24nO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0Qm9va21hcmtCeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSB1bml2ZXJzYWxseSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYm9va21hcmsuICovXG4gICAgZW50aXR5VW5pcXVlSWQ6IHN0cmluZztcbiAgICAvKiogVGhlIGFzQXQgZGF0ZXRpbWUgYXQgd2hpY2ggdG8gcmV0cmlldmUgdGhlIGJvb2ttYXJrLiBEZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBib29rbWFyayBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGFzQXQ/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBpZHMgb2YgdGhlIHN0YWdlZCBtb2RpZmljYXRpb25zIHRvIGJlIHByZXZpZXdlZCBpbiB0aGUgcmVzcG9uc2UuICovXG4gICAgcHJldmlld3M/OiBBcnJheTxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldEN1c3RvbUVudGl0eUJ5RW50aXR5VW5pcXVlSWRSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHVuaXZlcnNhbGx5IHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBDdXN0b20gRW50aXR5LiAqL1xuICAgIGVudGl0eVVuaXF1ZUlkOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBlZmZlY3RpdmUgZGF0ZXRpbWUgb3IgY3V0IGxhYmVsIGF0IHdoaWNoIHRvIHJldHJpZXZlIHRoZSBDdXN0b20gRW50aXR5LiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBMVVNJRCBzeXN0ZW0gZGF0ZXRpbWUgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBlZmZlY3RpdmVBdD86IHN0cmluZztcbiAgICAvKiogVGhlIGFzQXQgZGF0ZXRpbWUgYXQgd2hpY2ggdG8gcmV0cmlldmUgdGhlIEN1c3RvbSBFbnRpdHkuIERlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIEN1c3RvbSBFbnRpdHkgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBhc0F0Pzogc3RyaW5nO1xuICAgIC8qKiBUaGUgaWRzIG9mIHRoZSBzdGFnZWQgbW9kaWZpY2F0aW9ucyB0byBiZSBwcmV2aWV3ZWQgaW4gdGhlIHJlc3BvbnNlLiAqL1xuICAgIHByZXZpZXdzPzogQXJyYXk8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXREYXRhVHlwZUJ5RW50aXR5VW5pcXVlSWRSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHVuaXZlcnNhbGx5IHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBEYXRhVHlwZSBkZWZpbml0aW9uLiAqL1xuICAgIGVudGl0eVVuaXF1ZUlkOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBhc0F0IGRhdGV0aW1lIGF0IHdoaWNoIHRvIHJldHJpZXZlIHRoZSBEYXRhVHlwZSBkZWZpbml0aW9uLiBEZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBEYXRhVHlwZSBkZWZpbml0aW9uIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgYXNBdD86IHN0cmluZztcbiAgICAvKiogVGhlIGlkcyBvZiB0aGUgc3RhZ2VkIG1vZGlmaWNhdGlvbnMgdG8gYmUgcHJldmlld2VkIGluIHRoZSByZXNwb25zZS4gKi9cbiAgICBwcmV2aWV3cz86IEFycmF5PHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RW50aXR5SGlzdG9yeVJlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgZW50aXR5IHRvIGxpc3QgdGhlIGNoYW5nZSBoaXN0b3J5IGZvci4gKi9cbiAgICBlbnRpdHlUeXBlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSB1bml2ZXJzYWxseSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZW50aXR5LiAqL1xuICAgIGVudGl0eVVuaXF1ZUlkOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBhc0F0IGRhdGV0aW1lIGF0IHdoaWNoIHRvIGxpc3QgY2hhbmdlIGhpc3RvcnkgaW5mb3JtYXRpb24uIERlZmF1bHRzIHRvIHJldHVybiB0aGUgY2hhbmdlIGhpc3RvcnkgYXQgdGhlIGxhdGVzdCBkYXRldGltZSBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGFzQXQ/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBwYWdpbmF0aW9uIHRva2VuIHRvIHVzZSB0byBjb250aW51ZSBsaXN0aW5nIGNoYW5nZSBoaXN0b3J5IGluZm9ybWF0aW9uIGZyb20gYSBwcmV2aW91cyBjYWxsIHRvIGxpc3QgY2hhbmdlICAgICAgICAgICAgICBoaXN0b3J5IGluZm9ybWF0aW9uLiBUaGlzIHZhbHVlIGlzIHJldHVybmVkIGZyb20gdGhlIHByZXZpb3VzIGNhbGwuIElmIGEgcGFnaW5hdGlvbiB0b2tlbiBpcyBwcm92aWRlZCB0aGUgZmlsdGVyLCBzb3J0QnkgICAgICAgICAgICAgIGFuZCBhc0F0IGZpZWxkcyBtdXN0IG5vdCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIG9yaWdpbmFsIHJlcXVlc3QuICovXG4gICAgcGFnZT86IHN0cmluZztcbiAgICAvKiogV2hlbiBwYWdpbmF0aW5nLCBsaW1pdCB0aGUgbnVtYmVyIG9mIHJldHVybmVkIHJlc3VsdHMgdG8gdGhpcyBtYW55LiBEZWZhdWx0cyB0byAxMDAgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBsaW1pdD86IG51bWJlcjtcbiAgICAvKiogRXhwcmVzc2lvbiB0byBmaWx0ZXIgdGhlIHJlc3VsdCBzZXQuICAgICAgICAgICAgICBSZWFkIG1vcmUgYWJvdXQgZmlsdGVyaW5nIHJlc3VsdHMgZnJvbSBMVVNJRCBoZXJlIGh0dHBzOi8vc3VwcG9ydC5sdXNpZC5jb20vZmlsdGVyaW5nLXJlc3VsdHMtZnJvbS1sdXNpZC4gKi9cbiAgICBmaWx0ZXI/OiBzdHJpbmc7XG4gICAgLyoqIEEgbGlzdCBvZiBmaWVsZCBuYW1lcyBzdWZmaXhlZCBieSBcXCZxdW90OyBBU0NcXCZxdW90OyBvciBcXCZxdW90OyBERVNDXFwmcXVvdDsgKi9cbiAgICBzb3J0Qnk/OiBBcnJheTxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldEluc3RydW1lbnRCeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSB1bml2ZXJzYWxseSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaW5zdHJ1bWVudCBkZWZpbml0aW9uLiAqL1xuICAgIGVudGl0eVVuaXF1ZUlkOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBlZmZlY3RpdmUgZGF0ZXRpbWUgb3IgY3V0IGxhYmVsIGF0IHdoaWNoIHRvIHJldHJpZXZlIHRoZSBJbnN0cnVtZW50IGRlZmluaXRpb24uIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IExVU0lEIHN5c3RlbSBkYXRldGltZSBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGVmZmVjdGl2ZUF0Pzogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXNBdCBkYXRldGltZSBhdCB3aGljaCB0byByZXRyaWV2ZSB0aGUgaW5zdHJ1bWVudCBkZWZpbml0aW9uLiBEZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBpbnN0cnVtZW50IGRlZmluaXRpb24gaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBhc0F0Pzogc3RyaW5nO1xuICAgIC8qKiBUaGUgaWRzIG9mIHRoZSBzdGFnZWQgbW9kaWZpY2F0aW9ucyB0byBiZSBwcmV2aWV3ZWQgaW4gdGhlIHJlc3BvbnNlLiAqL1xuICAgIHByZXZpZXdzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKiogVGhlIG9wdGlvbmFsIHNjb3BlIG9mIGEgQ3VzdG9tIERhdGEgTW9kZWwgdG8gdXNlLiAqL1xuICAgIGRhdGFNb2RlbFNjb3BlPzogc3RyaW5nO1xuICAgIC8qKiBUaGUgb3B0aW9uYWwgY29kZSBvZiBhIEN1c3RvbSBEYXRhIE1vZGVsIHRvIHVzZS4gKi9cbiAgICBkYXRhTW9kZWxDb2RlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldFBvcnRmb2xpb0J5RW50aXR5VW5pcXVlSWRSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHVuaXZlcnNhbGx5IHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwb3J0Zm9saW8gZGVmaW5pdGlvbi4gKi9cbiAgICBlbnRpdHlVbmlxdWVJZDogc3RyaW5nO1xuICAgIC8qKiBUaGUgZWZmZWN0aXZlIGRhdGV0aW1lIG9yIGN1dCBsYWJlbCBhdCB3aGljaCB0byByZXRyaWV2ZSB0aGUgcG9ydGZvbGlvIGRlZmluaXRpb24uIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IExVU0lEIHN5c3RlbSBkYXRldGltZSBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGVmZmVjdGl2ZUF0Pzogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXNBdCBkYXRldGltZSBhdCB3aGljaCB0byByZXRyaWV2ZSB0aGUgcG9ydGZvbGlvIGRlZmluaXRpb24uIERlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHBvcnRmb2xpbyBkZWZpbml0aW9uIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgYXNBdD86IHN0cmluZztcbiAgICAvKiogVGhlIGlkcyBvZiB0aGUgc3RhZ2VkIG1vZGlmaWNhdGlvbnMgdG8gYmUgcHJldmlld2VkIGluIHRoZSByZXNwb25zZS4gKi9cbiAgICBwcmV2aWV3cz86IEFycmF5PHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UG9ydGZvbGlvQ2hhbmdlc1JlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgKi9cbiAgICBzY29wZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgZWZmZWN0aXZlIGRhdGUgb2YgdGhlIG9yaWdpbi4gKi9cbiAgICBlZmZlY3RpdmVBdDogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXMtYXQgZGF0ZSBvZiB0aGUgb3JpZ2luLiAqL1xuICAgIGFzQXQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UHJvcGVydHlEZWZpbml0aW9uQnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgdW5pdmVyc2FsbHkgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHByb3BlcnR5IGRlZmluaXRpb24uICovXG4gICAgZW50aXR5VW5pcXVlSWQ6IHN0cmluZztcbiAgICAvKiogVGhlIGVmZmVjdGl2ZSBkYXRldGltZSBhdCB3aGljaCB0byByZXRyaWV2ZSB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbi4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgTFVTSUQgc3lzdGVtIGRhdGV0aW1lIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgZWZmZWN0aXZlQXQ/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBhc0F0IGRhdGV0aW1lIGF0IHdoaWNoIHRvIHJldHJpZXZlIHRoZSBwcm9wZXJ0eSBkZWZpbml0aW9uLiBEZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgYXNBdD86IHN0cmluZztcbiAgICAvKiogVGhlIGlkcyBvZiB0aGUgc3RhZ2VkIG1vZGlmaWNhdGlvbnMgdG8gYmUgcHJldmlld2VkIGluIHRoZSByZXNwb25zZS4gKi9cbiAgICBwcmV2aWV3cz86IEFycmF5PHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0VHJhbnNhY3Rpb25CeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBlbnRpdHkgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGUgZXhwZWN0ZWQgZm9ybWF0IGlzIFxcJiMzOTt7cG9ydGZvbGlvRW50aXR5VW5pcXVlSWR9X3t0cmFuc2FjdGlvbklkfVxcJiMzOTsuICovXG4gICAgZW50aXR5VW5pcXVlSWQ6IHN0cmluZztcbiAgICAvKiogVGhlIGFzQXQgZGF0ZXRpbWUgYXQgd2hpY2ggdG8gcmV0cmlldmUgdGhlIHRyYW5zYWN0aW9uLiBEZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSB0cmFuc2FjdGlvbiBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGFzQXQ/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBpZHMgb2YgdGhlIHN0YWdlZCBtb2RpZmljYXRpb25zIHRvIGJlIHByZXZpZXdlZCBpbiB0aGUgcmVzcG9uc2UuICovXG4gICAgcHJldmlld3M/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKiBUaGUgb3B0aW9uYWwgc2NvcGUgb2YgYSBDdXN0b20gRGF0YSBNb2RlbCB0byB1c2UuICovXG4gICAgZGF0YU1vZGVsU2NvcGU/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBvcHRpb25hbCBjb2RlIG9mIGEgQ3VzdG9tIERhdGEgTW9kZWwgdG8gdXNlLiAqL1xuICAgIGRhdGFNb2RlbENvZGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0VmFsdWF0aW9uUG9pbnRCeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSB1bml2ZXJzYWxseSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdmFsdWF0aW9uIHBvaW50LiAqL1xuICAgIGVudGl0eVVuaXF1ZUlkOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBhc0F0IGRhdGV0aW1lIGF0IHdoaWNoIHRvIHJldHJpZXZlIHRoZSB2YWx1YXRpb24gcG9pbnQuIERlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHZhbHVhdGlvbiBwb2ludCBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGFzQXQ/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBpZHMgb2YgdGhlIHN0YWdlZCBtb2RpZmljYXRpb25zIHRvIGJlIHByZXZpZXdlZCBpbiB0aGUgcmVzcG9uc2UuICovXG4gICAgcHJldmlld3M/OiBBcnJheTxzdHJpbmc+O1xufVxuXG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEVudGl0aWVzU2VydmljZSB7XG5cbiAgICBwcm90ZWN0ZWQgYmFzZVBhdGggPSAnaHR0cHM6Ly93d3cubHVzaWQuY29tL2FwaSc7XG4gICAgcHVibGljIGRlZmF1bHRIZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XG4gICAgcHVibGljIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbigpO1xuICAgIHB1YmxpYyBlbmNvZGVyOiBIdHRwUGFyYW1ldGVyQ29kZWM7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaHR0cENsaWVudDogSHR0cENsaWVudCwgQE9wdGlvbmFsKClASW5qZWN0KEJBU0VfUEFUSCkgYmFzZVBhdGg6IHN0cmluZ3xzdHJpbmdbXSwgQE9wdGlvbmFsKCkgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbikge1xuICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0QmFzZVBhdGggPSBBcnJheS5pc0FycmF5KGJhc2VQYXRoKSA/IGJhc2VQYXRoWzBdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKGZpcnN0QmFzZVBhdGggIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgYmFzZVBhdGggPSBmaXJzdEJhc2VQYXRoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGJhc2VQYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGJhc2VQYXRoID0gdGhpcy5iYXNlUGF0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aCA9IGJhc2VQYXRoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW5jb2RlciA9IHRoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVyIHx8IG5ldyBDdXN0b21IdHRwUGFyYW1ldGVyQ29kZWMoKTtcbiAgICB9XG5cblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBwcml2YXRlIGFkZFRvSHR0cFBhcmFtcyhodHRwUGFyYW1zOiBIdHRwUGFyYW1zLCB2YWx1ZTogYW55LCBrZXk/OiBzdHJpbmcpOiBIdHRwUGFyYW1zIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBodHRwUGFyYW1zID0gdGhpcy5hZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoaHR0cFBhcmFtcywgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaHR0cFBhcmFtcyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKGh0dHBQYXJhbXMsIHZhbHVlLCBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKGh0dHBQYXJhbXM6IEh0dHBQYXJhbXMsIHZhbHVlPzogYW55LCBrZXk/OiBzdHJpbmcpOiBIdHRwUGFyYW1zIHtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgKHZhbHVlIGFzIGFueVtdKS5mb3JFYWNoKCBlbGVtID0+IGh0dHBQYXJhbXMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtc1JlY3Vyc2l2ZShodHRwUGFyYW1zLCBlbGVtLCBrZXkpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLmFwcGVuZChrZXksICh2YWx1ZSBhcyBEYXRlKS50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLCAxMCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJrZXkgbWF5IG5vdCBiZSBudWxsIGlmIHZhbHVlIGlzIERhdGVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkuZm9yRWFjaCggayA9PiBodHRwUGFyYW1zID0gdGhpcy5hZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoXG4gICAgICAgICAgICAgICAgICAgIGh0dHBQYXJhbXMsIHZhbHVlW2tdLCBrZXkgIT0gbnVsbCA/IGAke2tleX0uJHtrfWAgOiBrKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKFwia2V5IG1heSBub3QgYmUgbnVsbCBpZiB2YWx1ZSBpcyBub3Qgb2JqZWN0IG9yIGFycmF5XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldEJvb2ttYXJrQnlFbnRpdHlVbmlxdWVJZDogR2V0IGJvb2ttYXJrIGJ5IEVudGl0eVVuaXF1ZUlkXG4gICAgICogUmV0cmlldmUgdGhlIGRlZmluaXRpb24gb2YgYSBwYXJ0aWN1bGFyIGJvb2ttYXJrLiAgICBJZiB0aGUgYm9va21hcmsgaXMgZGVsZXRlZCwgdGhpcyB3aWxsIHJldHVybiB0aGUgc3RhdGUgb2YgdGhlIGJvb2ttYXJrIGltbWVkaWF0ZWx5IHByaW9yIHRvIGRlbGV0aW9uLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRCb29rbWFya0J5RW50aXR5VW5pcXVlSWQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRCb29rbWFya0J5RW50aXR5VW5pcXVlSWRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8Qm9va21hcmtFbnRpdHk+O1xuICAgIHB1YmxpYyBnZXRCb29rbWFya0J5RW50aXR5VW5pcXVlSWQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRCb29rbWFya0J5RW50aXR5VW5pcXVlSWRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxCb29rbWFya0VudGl0eT4+O1xuICAgIHB1YmxpYyBnZXRCb29rbWFya0J5RW50aXR5VW5pcXVlSWQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRCb29rbWFya0J5RW50aXR5VW5pcXVlSWRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8Qm9va21hcmtFbnRpdHk+PjtcbiAgICBwdWJsaWMgZ2V0Qm9va21hcmtCeUVudGl0eVVuaXF1ZUlkKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0Qm9va21hcmtCeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBlbnRpdHlVbmlxdWVJZCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5lbnRpdHlVbmlxdWVJZDtcbiAgICAgICAgaWYgKGVudGl0eVVuaXF1ZUlkID09PSBudWxsIHx8IGVudGl0eVVuaXF1ZUlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGVudGl0eVVuaXF1ZUlkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0Qm9va21hcmtCeUVudGl0eVVuaXF1ZUlkLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFzQXQgPSByZXF1ZXN0UGFyYW1ldGVycz8uYXNBdDtcbiAgICAgICAgY29uc3QgcHJldmlld3MgPSByZXF1ZXN0UGFyYW1ldGVycz8ucHJldmlld3M7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAoYXNBdCAhPT0gdW5kZWZpbmVkICYmIGFzQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5hc0F0LCAnYXNBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmV2aWV3cykge1xuICAgICAgICAgICAgcHJldmlld3MuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgICA8YW55PmVsZW1lbnQsICdwcmV2aWV3cycpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2VudGl0aWVzL2Jvb2ttYXJrcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJlbnRpdHlVbmlxdWVJZFwiLCB2YWx1ZTogZW50aXR5VW5pcXVlSWQsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEJvb2ttYXJrRW50aXR5PignZ2V0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0Q3VzdG9tRW50aXR5QnlFbnRpdHlVbmlxdWVJZDogR2V0IGEgQ3VzdG9tIEVudGl0eSBpbnN0YW5jZSBieSBpdHMgRW50aXR5VW5pcXVlSWRcbiAgICAgKiBSZXRyaWV2ZSBhIHBhcnRpY3VsYXIgQ3VzdG9tIEVudGl0eSBpbnN0YW5jZS4gIElmIHRoZSBDdXN0b20gRW50aXR5IGlzIGRlbGV0ZWQsIHRoaXMgd2lsbCByZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSBDdXN0b20gRW50aXR5IGltbWVkaWF0ZWx5IHByaW9yIHRvIGRlbGV0aW9uLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDdXN0b21FbnRpdHlCeUVudGl0eVVuaXF1ZUlkKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0Q3VzdG9tRW50aXR5QnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxDdXN0b21FbnRpdHlFbnRpdHk+O1xuICAgIHB1YmxpYyBnZXRDdXN0b21FbnRpdHlCeUVudGl0eVVuaXF1ZUlkKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0Q3VzdG9tRW50aXR5QnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEN1c3RvbUVudGl0eUVudGl0eT4+O1xuICAgIHB1YmxpYyBnZXRDdXN0b21FbnRpdHlCeUVudGl0eVVuaXF1ZUlkKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0Q3VzdG9tRW50aXR5QnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxDdXN0b21FbnRpdHlFbnRpdHk+PjtcbiAgICBwdWJsaWMgZ2V0Q3VzdG9tRW50aXR5QnlFbnRpdHlVbmlxdWVJZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldEN1c3RvbUVudGl0eUJ5RW50aXR5VW5pcXVlSWRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IGVudGl0eVVuaXF1ZUlkID0gcmVxdWVzdFBhcmFtZXRlcnM/LmVudGl0eVVuaXF1ZUlkO1xuICAgICAgICBpZiAoZW50aXR5VW5pcXVlSWQgPT09IG51bGwgfHwgZW50aXR5VW5pcXVlSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZW50aXR5VW5pcXVlSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRDdXN0b21FbnRpdHlCeUVudGl0eVVuaXF1ZUlkLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZUF0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmVmZmVjdGl2ZUF0O1xuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG4gICAgICAgIGNvbnN0IHByZXZpZXdzID0gcmVxdWVzdFBhcmFtZXRlcnM/LnByZXZpZXdzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKGVmZmVjdGl2ZUF0ICE9PSB1bmRlZmluZWQgJiYgZWZmZWN0aXZlQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5lZmZlY3RpdmVBdCwgJ2VmZmVjdGl2ZUF0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFzQXQgIT09IHVuZGVmaW5lZCAmJiBhc0F0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YXNBdCwgJ2FzQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJldmlld3MpIHtcbiAgICAgICAgICAgIHByZXZpZXdzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgPGFueT5lbGVtZW50LCAncHJldmlld3MnKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9lbnRpdGllcy9jdXN0b21lbnRpdGllcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJlbnRpdHlVbmlxdWVJZFwiLCB2YWx1ZTogZW50aXR5VW5pcXVlSWQsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEN1c3RvbUVudGl0eUVudGl0eT4oJ2dldCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldERhdGFUeXBlQnlFbnRpdHlVbmlxdWVJZDogR2V0IERhdGFUeXBlIGJ5IEVudGl0eVVuaXF1ZUlkXG4gICAgICogUmV0cmlldmUgdGhlIGRlZmluaXRpb24gb2YgYSBwYXJ0aWN1bGFyIERhdGFUeXBlLiAgSWYgdGhlIERhdGFUeXBlIGlzIGRlbGV0ZWQsIHRoaXMgd2lsbCByZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSBEYXRhVHlwZSBpbW1lZGlhdGVseSBwcmlvciB0byBkZWxldGlvbi5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RGF0YVR5cGVCeUVudGl0eVVuaXF1ZUlkKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0RGF0YVR5cGVCeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPERhdGFUeXBlRW50aXR5PjtcbiAgICBwdWJsaWMgZ2V0RGF0YVR5cGVCeUVudGl0eVVuaXF1ZUlkKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0RGF0YVR5cGVCeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8RGF0YVR5cGVFbnRpdHk+PjtcbiAgICBwdWJsaWMgZ2V0RGF0YVR5cGVCeUVudGl0eVVuaXF1ZUlkKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0RGF0YVR5cGVCeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PERhdGFUeXBlRW50aXR5Pj47XG4gICAgcHVibGljIGdldERhdGFUeXBlQnlFbnRpdHlVbmlxdWVJZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldERhdGFUeXBlQnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3QgZW50aXR5VW5pcXVlSWQgPSByZXF1ZXN0UGFyYW1ldGVycz8uZW50aXR5VW5pcXVlSWQ7XG4gICAgICAgIGlmIChlbnRpdHlVbmlxdWVJZCA9PT0gbnVsbCB8fCBlbnRpdHlVbmlxdWVJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBlbnRpdHlVbmlxdWVJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldERhdGFUeXBlQnlFbnRpdHlVbmlxdWVJZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG4gICAgICAgIGNvbnN0IHByZXZpZXdzID0gcmVxdWVzdFBhcmFtZXRlcnM/LnByZXZpZXdzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKGFzQXQgIT09IHVuZGVmaW5lZCAmJiBhc0F0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YXNBdCwgJ2FzQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJldmlld3MpIHtcbiAgICAgICAgICAgIHByZXZpZXdzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgPGFueT5lbGVtZW50LCAncHJldmlld3MnKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9lbnRpdGllcy9kYXRhdHlwZXMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiZW50aXR5VW5pcXVlSWRcIiwgdmFsdWU6IGVudGl0eVVuaXF1ZUlkLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxEYXRhVHlwZUVudGl0eT4oJ2dldCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldEVudGl0eUhpc3Rvcnk6IExpc3QgYW4gZW50aXR5XFwmIzM5O3MgaGlzdG9yeSBpbmZvcm1hdGlvblxuICAgICAqIFJldHJpZXZlIGEgcGFnZSBvZiBhbiBlbnRpdHlcXCYjMzk7cyBjaGFuZ2UgaGlzdG9yeSB1cCB0byBhIHBhcnRpY3VsYXIgcG9pbnQgaW4gQXNBdCB0aW1lLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRFbnRpdHlIaXN0b3J5KHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0RW50aXR5SGlzdG9yeVJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxSZXNvdXJjZUxpc3RPZkNoYW5nZUludGVydmFsPjtcbiAgICBwdWJsaWMgZ2V0RW50aXR5SGlzdG9yeShyZXF1ZXN0UGFyYW1ldGVycz86IEdldEVudGl0eUhpc3RvcnlSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxSZXNvdXJjZUxpc3RPZkNoYW5nZUludGVydmFsPj47XG4gICAgcHVibGljIGdldEVudGl0eUhpc3RvcnkocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRFbnRpdHlIaXN0b3J5UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFJlc291cmNlTGlzdE9mQ2hhbmdlSW50ZXJ2YWw+PjtcbiAgICBwdWJsaWMgZ2V0RW50aXR5SGlzdG9yeShyZXF1ZXN0UGFyYW1ldGVycz86IEdldEVudGl0eUhpc3RvcnlSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IGVudGl0eVR5cGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uZW50aXR5VHlwZTtcbiAgICAgICAgaWYgKGVudGl0eVR5cGUgPT09IG51bGwgfHwgZW50aXR5VHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBlbnRpdHlUeXBlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0RW50aXR5SGlzdG9yeS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbnRpdHlVbmlxdWVJZCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5lbnRpdHlVbmlxdWVJZDtcbiAgICAgICAgaWYgKGVudGl0eVVuaXF1ZUlkID09PSBudWxsIHx8IGVudGl0eVVuaXF1ZUlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGVudGl0eVVuaXF1ZUlkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0RW50aXR5SGlzdG9yeS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSByZXF1ZXN0UGFyYW1ldGVycz8ucGFnZTtcbiAgICAgICAgY29uc3QgbGltaXQgPSByZXF1ZXN0UGFyYW1ldGVycz8ubGltaXQ7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5maWx0ZXI7XG4gICAgICAgIGNvbnN0IHNvcnRCeSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zb3J0Qnk7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAoYXNBdCAhPT0gdW5kZWZpbmVkICYmIGFzQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5hc0F0LCAnYXNBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWdlICE9PSB1bmRlZmluZWQgJiYgcGFnZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnBhZ2UsICdwYWdlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbWl0ICE9PSB1bmRlZmluZWQgJiYgbGltaXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5saW1pdCwgJ2xpbWl0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlciAhPT0gdW5kZWZpbmVkICYmIGZpbHRlciAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmZpbHRlciwgJ2ZpbHRlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3J0QnkpIHtcbiAgICAgICAgICAgIHNvcnRCeS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgIDxhbnk+ZWxlbWVudCwgJ3NvcnRCeScpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2VudGl0aWVzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImVudGl0eVR5cGVcIiwgdmFsdWU6IGVudGl0eVR5cGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImVudGl0eVVuaXF1ZUlkXCIsIHZhbHVlOiBlbnRpdHlVbmlxdWVJZCwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vaGlzdG9yeWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxSZXNvdXJjZUxpc3RPZkNoYW5nZUludGVydmFsPignZ2V0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0SW5zdHJ1bWVudEJ5RW50aXR5VW5pcXVlSWQ6IEdldCBpbnN0cnVtZW50IGJ5IEVudGl0eVVuaXF1ZUlkXG4gICAgICogUmV0cmlldmUgdGhlIGRlZmluaXRpb24gb2YgYSBwYXJ0aWN1bGFyIGluc3RydW1lbnQuICBJZiB0aGUgaW5zdHJ1bWVudCBpcyBkZWxldGVkLCB0aGlzIHdpbGwgcmV0dXJuIHRoZSBzdGF0ZSBvZiB0aGUgaW5zdHJ1bWVudCBpbW1lZGlhdGVseSBwcmlvciB0byBkZWxldGlvbi5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SW5zdHJ1bWVudEJ5RW50aXR5VW5pcXVlSWQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRJbnN0cnVtZW50QnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxJbnN0cnVtZW50RW50aXR5PjtcbiAgICBwdWJsaWMgZ2V0SW5zdHJ1bWVudEJ5RW50aXR5VW5pcXVlSWQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRJbnN0cnVtZW50QnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEluc3RydW1lbnRFbnRpdHk+PjtcbiAgICBwdWJsaWMgZ2V0SW5zdHJ1bWVudEJ5RW50aXR5VW5pcXVlSWQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRJbnN0cnVtZW50QnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxJbnN0cnVtZW50RW50aXR5Pj47XG4gICAgcHVibGljIGdldEluc3RydW1lbnRCeUVudGl0eVVuaXF1ZUlkKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0SW5zdHJ1bWVudEJ5RW50aXR5VW5pcXVlSWRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IGVudGl0eVVuaXF1ZUlkID0gcmVxdWVzdFBhcmFtZXRlcnM/LmVudGl0eVVuaXF1ZUlkO1xuICAgICAgICBpZiAoZW50aXR5VW5pcXVlSWQgPT09IG51bGwgfHwgZW50aXR5VW5pcXVlSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZW50aXR5VW5pcXVlSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRJbnN0cnVtZW50QnlFbnRpdHlVbmlxdWVJZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlZmZlY3RpdmVBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5lZmZlY3RpdmVBdDtcbiAgICAgICAgY29uc3QgYXNBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5hc0F0O1xuICAgICAgICBjb25zdCBwcmV2aWV3cyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wcmV2aWV3cztcbiAgICAgICAgY29uc3QgZGF0YU1vZGVsU2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uZGF0YU1vZGVsU2NvcGU7XG4gICAgICAgIGNvbnN0IGRhdGFNb2RlbENvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uZGF0YU1vZGVsQ29kZTtcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChlZmZlY3RpdmVBdCAhPT0gdW5kZWZpbmVkICYmIGVmZmVjdGl2ZUF0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZWZmZWN0aXZlQXQsICdlZmZlY3RpdmVBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhc0F0ICE9PSB1bmRlZmluZWQgJiYgYXNBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmFzQXQsICdhc0F0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZXZpZXdzKSB7XG4gICAgICAgICAgICBwcmV2aWV3cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgIDxhbnk+ZWxlbWVudCwgJ3ByZXZpZXdzJyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhTW9kZWxTY29wZSAhPT0gdW5kZWZpbmVkICYmIGRhdGFNb2RlbFNjb3BlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZGF0YU1vZGVsU2NvcGUsICdkYXRhTW9kZWxTY29wZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhTW9kZWxDb2RlICE9PSB1bmRlZmluZWQgJiYgZGF0YU1vZGVsQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmRhdGFNb2RlbENvZGUsICdkYXRhTW9kZWxDb2RlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9lbnRpdGllcy9pbnN0cnVtZW50cy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJlbnRpdHlVbmlxdWVJZFwiLCB2YWx1ZTogZW50aXR5VW5pcXVlSWQsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEluc3RydW1lbnRFbnRpdHk+KCdnZXQnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRQb3J0Zm9saW9CeUVudGl0eVVuaXF1ZUlkOiBHZXQgcG9ydGZvbGlvIGJ5IEVudGl0eVVuaXF1ZUlkXG4gICAgICogUmV0cmlldmUgdGhlIGRlZmluaXRpb24gb2YgYSBwYXJ0aWN1bGFyIHBvcnRmb2xpby4gIElmIHRoZSBwb3J0Zm9saW8gaXMgZGVsZXRlZCwgdGhpcyB3aWxsIHJldHVybiB0aGUgc3RhdGUgb2YgdGhlIHBvcnRmb2xpbyBpbW1lZGlhdGVseSBwcmlvciB0byBkZWxldGlvbi5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UG9ydGZvbGlvQnlFbnRpdHlVbmlxdWVJZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldFBvcnRmb2xpb0J5RW50aXR5VW5pcXVlSWRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8UG9ydGZvbGlvRW50aXR5PjtcbiAgICBwdWJsaWMgZ2V0UG9ydGZvbGlvQnlFbnRpdHlVbmlxdWVJZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldFBvcnRmb2xpb0J5RW50aXR5VW5pcXVlSWRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxQb3J0Zm9saW9FbnRpdHk+PjtcbiAgICBwdWJsaWMgZ2V0UG9ydGZvbGlvQnlFbnRpdHlVbmlxdWVJZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldFBvcnRmb2xpb0J5RW50aXR5VW5pcXVlSWRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8UG9ydGZvbGlvRW50aXR5Pj47XG4gICAgcHVibGljIGdldFBvcnRmb2xpb0J5RW50aXR5VW5pcXVlSWQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRQb3J0Zm9saW9CeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBlbnRpdHlVbmlxdWVJZCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5lbnRpdHlVbmlxdWVJZDtcbiAgICAgICAgaWYgKGVudGl0eVVuaXF1ZUlkID09PSBudWxsIHx8IGVudGl0eVVuaXF1ZUlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGVudGl0eVVuaXF1ZUlkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0UG9ydGZvbGlvQnlFbnRpdHlVbmlxdWVJZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlZmZlY3RpdmVBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5lZmZlY3RpdmVBdDtcbiAgICAgICAgY29uc3QgYXNBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5hc0F0O1xuICAgICAgICBjb25zdCBwcmV2aWV3cyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wcmV2aWV3cztcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChlZmZlY3RpdmVBdCAhPT0gdW5kZWZpbmVkICYmIGVmZmVjdGl2ZUF0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZWZmZWN0aXZlQXQsICdlZmZlY3RpdmVBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhc0F0ICE9PSB1bmRlZmluZWQgJiYgYXNBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmFzQXQsICdhc0F0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZXZpZXdzKSB7XG4gICAgICAgICAgICBwcmV2aWV3cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgIDxhbnk+ZWxlbWVudCwgJ3ByZXZpZXdzJyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZW50aXRpZXMvcG9ydGZvbGlvcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJlbnRpdHlVbmlxdWVJZFwiLCB2YWx1ZTogZW50aXR5VW5pcXVlSWQsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFBvcnRmb2xpb0VudGl0eT4oJ2dldCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldFBvcnRmb2xpb0NoYW5nZXM6IEdldCB0aGUgbmV4dCBjaGFuZ2UgdG8gZWFjaCBwb3J0Zm9saW8gaW4gYSBzY29wZS5cbiAgICAgKiBHZXRzIHRoZSB0aW1lIG9mIHRoZSBuZXh0IChlYXJsaWVzdCBlZmZlY3RpdmUgYXQpIG1vZGlmaWNhdGlvbiAoY29ycmVjdGlvbiBhbmQvb3IgYW1lbmRtZW50KSB0byBlYWNoIHBvcnRmb2xpbyBpbiBhIHNjb3BlIHJlbGF0aXZlIHRvIGEgcG9pbnQgaW4gYml0ZW1wb3JhbCB0aW1lLiAgSW5jbHVkZXMgY2hhbmdlcyBmcm9tIHBhcmVudCBwb3J0Zm9saW9zIGluIGRpZmZlcmVudCBzY29wZXMuICBFeGNsdWRlcyBjaGFuZ2VzIGZyb20gc3Vic2NyaXB0aW9ucyAoZS5nIGNvcnBvcmF0ZSBhY3Rpb25zKS5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UG9ydGZvbGlvQ2hhbmdlcyhyZXF1ZXN0UGFyYW1ldGVycz86IEdldFBvcnRmb2xpb0NoYW5nZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8UmVzb3VyY2VMaXN0T2ZDaGFuZ2U+O1xuICAgIHB1YmxpYyBnZXRQb3J0Zm9saW9DaGFuZ2VzKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0UG9ydGZvbGlvQ2hhbmdlc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFJlc291cmNlTGlzdE9mQ2hhbmdlPj47XG4gICAgcHVibGljIGdldFBvcnRmb2xpb0NoYW5nZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRQb3J0Zm9saW9DaGFuZ2VzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFJlc291cmNlTGlzdE9mQ2hhbmdlPj47XG4gICAgcHVibGljIGdldFBvcnRmb2xpb0NoYW5nZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRQb3J0Zm9saW9DaGFuZ2VzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0UG9ydGZvbGlvQ2hhbmdlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlZmZlY3RpdmVBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5lZmZlY3RpdmVBdDtcbiAgICAgICAgaWYgKGVmZmVjdGl2ZUF0ID09PSBudWxsIHx8IGVmZmVjdGl2ZUF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGVmZmVjdGl2ZUF0IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0UG9ydGZvbGlvQ2hhbmdlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAoc2NvcGUgIT09IHVuZGVmaW5lZCAmJiBzY29wZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnNjb3BlLCAnc2NvcGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWZmZWN0aXZlQXQgIT09IHVuZGVmaW5lZCAmJiBlZmZlY3RpdmVBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmVmZmVjdGl2ZUF0LCAnZWZmZWN0aXZlQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXNBdCAhPT0gdW5kZWZpbmVkICYmIGFzQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5hc0F0LCAnYXNBdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZW50aXRpZXMvY2hhbmdlcy9wb3J0Zm9saW9zYDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFJlc291cmNlTGlzdE9mQ2hhbmdlPignZ2V0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0UHJvcGVydHlEZWZpbml0aW9uQnlFbnRpdHlVbmlxdWVJZDogR2V0IHByb3BlcnR5IGRlZmluaXRpb24gYnkgRW50aXR5VW5pcXVlSWRcbiAgICAgKiBSZXRyaWV2ZSBhIHBhcnRpY3VsYXIgcHJvcGVydHkgZGVmaW5pdGlvbi4gIElmIHRoZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGlzIGRlbGV0ZWQsIHRoaXMgd2lsbCByZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGltbWVkaWF0ZWx5IHByaW9yIHRvIGRlbGV0aW9uLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQcm9wZXJ0eURlZmluaXRpb25CeUVudGl0eVVuaXF1ZUlkKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0UHJvcGVydHlEZWZpbml0aW9uQnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxQcm9wZXJ0eURlZmluaXRpb25FbnRpdHk+O1xuICAgIHB1YmxpYyBnZXRQcm9wZXJ0eURlZmluaXRpb25CeUVudGl0eVVuaXF1ZUlkKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0UHJvcGVydHlEZWZpbml0aW9uQnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFByb3BlcnR5RGVmaW5pdGlvbkVudGl0eT4+O1xuICAgIHB1YmxpYyBnZXRQcm9wZXJ0eURlZmluaXRpb25CeUVudGl0eVVuaXF1ZUlkKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0UHJvcGVydHlEZWZpbml0aW9uQnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxQcm9wZXJ0eURlZmluaXRpb25FbnRpdHk+PjtcbiAgICBwdWJsaWMgZ2V0UHJvcGVydHlEZWZpbml0aW9uQnlFbnRpdHlVbmlxdWVJZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldFByb3BlcnR5RGVmaW5pdGlvbkJ5RW50aXR5VW5pcXVlSWRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IGVudGl0eVVuaXF1ZUlkID0gcmVxdWVzdFBhcmFtZXRlcnM/LmVudGl0eVVuaXF1ZUlkO1xuICAgICAgICBpZiAoZW50aXR5VW5pcXVlSWQgPT09IG51bGwgfHwgZW50aXR5VW5pcXVlSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZW50aXR5VW5pcXVlSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRQcm9wZXJ0eURlZmluaXRpb25CeUVudGl0eVVuaXF1ZUlkLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZUF0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmVmZmVjdGl2ZUF0O1xuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG4gICAgICAgIGNvbnN0IHByZXZpZXdzID0gcmVxdWVzdFBhcmFtZXRlcnM/LnByZXZpZXdzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKGVmZmVjdGl2ZUF0ICE9PSB1bmRlZmluZWQgJiYgZWZmZWN0aXZlQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5lZmZlY3RpdmVBdCwgJ2VmZmVjdGl2ZUF0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFzQXQgIT09IHVuZGVmaW5lZCAmJiBhc0F0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YXNBdCwgJ2FzQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJldmlld3MpIHtcbiAgICAgICAgICAgIHByZXZpZXdzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgPGFueT5lbGVtZW50LCAncHJldmlld3MnKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9lbnRpdGllcy9wcm9wZXJ0eWRlZmluaXRpb25zLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImVudGl0eVVuaXF1ZUlkXCIsIHZhbHVlOiBlbnRpdHlVbmlxdWVJZCwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX1gO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8UHJvcGVydHlEZWZpbml0aW9uRW50aXR5PignZ2V0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0VHJhbnNhY3Rpb25CeUVudGl0eVVuaXF1ZUlkOiBHZXQgdHJhbnNhY3Rpb24gYnkgRW50aXR5VW5pcXVlSWRcbiAgICAgKiBSZXRyaWV2ZSBhIHRyYW5zYWN0aW9uIGJ5IGl0cyBlbnRpdHkgdW5pcXVlIGlkZW50aWZpZXIuICAgIElmIHRoZSB0cmFuc2FjdGlvblxcJiMzOTtzIHBvcnRmb2xpbyBpcyBkZWxldGVkLCB0aGlzIHdpbGwgcmV0dXJuIHRoZSBzdGF0ZSBvZiB0aGUgdHJhbnNhY3Rpb24gaW1tZWRpYXRlbHkgcHJpb3IgdG8gcG9ydGZvbGlvIGRlbGV0aW9uLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRUcmFuc2FjdGlvbkJ5RW50aXR5VW5pcXVlSWQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRUcmFuc2FjdGlvbkJ5RW50aXR5VW5pcXVlSWRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8VHJhbnNhY3Rpb25FbnRpdHk+O1xuICAgIHB1YmxpYyBnZXRUcmFuc2FjdGlvbkJ5RW50aXR5VW5pcXVlSWQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRUcmFuc2FjdGlvbkJ5RW50aXR5VW5pcXVlSWRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxUcmFuc2FjdGlvbkVudGl0eT4+O1xuICAgIHB1YmxpYyBnZXRUcmFuc2FjdGlvbkJ5RW50aXR5VW5pcXVlSWQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRUcmFuc2FjdGlvbkJ5RW50aXR5VW5pcXVlSWRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VHJhbnNhY3Rpb25FbnRpdHk+PjtcbiAgICBwdWJsaWMgZ2V0VHJhbnNhY3Rpb25CeUVudGl0eVVuaXF1ZUlkKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0VHJhbnNhY3Rpb25CeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBlbnRpdHlVbmlxdWVJZCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5lbnRpdHlVbmlxdWVJZDtcbiAgICAgICAgaWYgKGVudGl0eVVuaXF1ZUlkID09PSBudWxsIHx8IGVudGl0eVVuaXF1ZUlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGVudGl0eVVuaXF1ZUlkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0VHJhbnNhY3Rpb25CeUVudGl0eVVuaXF1ZUlkLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFzQXQgPSByZXF1ZXN0UGFyYW1ldGVycz8uYXNBdDtcbiAgICAgICAgY29uc3QgcHJldmlld3MgPSByZXF1ZXN0UGFyYW1ldGVycz8ucHJldmlld3M7XG4gICAgICAgIGNvbnN0IGRhdGFNb2RlbFNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmRhdGFNb2RlbFNjb3BlO1xuICAgICAgICBjb25zdCBkYXRhTW9kZWxDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmRhdGFNb2RlbENvZGU7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAoYXNBdCAhPT0gdW5kZWZpbmVkICYmIGFzQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5hc0F0LCAnYXNBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmV2aWV3cykge1xuICAgICAgICAgICAgcHJldmlld3MuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgICA8YW55PmVsZW1lbnQsICdwcmV2aWV3cycpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YU1vZGVsU2NvcGUgIT09IHVuZGVmaW5lZCAmJiBkYXRhTW9kZWxTY29wZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmRhdGFNb2RlbFNjb3BlLCAnZGF0YU1vZGVsU2NvcGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YU1vZGVsQ29kZSAhPT0gdW5kZWZpbmVkICYmIGRhdGFNb2RlbENvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5kYXRhTW9kZWxDb2RlLCAnZGF0YU1vZGVsQ29kZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZW50aXRpZXMvdHJhbnNhY3Rpb25zLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImVudGl0eVVuaXF1ZUlkXCIsIHZhbHVlOiBlbnRpdHlVbmlxdWVJZCwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX1gO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8VHJhbnNhY3Rpb25FbnRpdHk+KCdnZXQnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRWYWx1YXRpb25Qb2ludEJ5RW50aXR5VW5pcXVlSWQ6IEdldCB2YWx1YXRpb24gcG9pbnQgYnkgRW50aXR5VW5pcXVlSWRcbiAgICAgKiBSZXRyaWV2ZSB0aGUgZGVmaW5pdGlvbiBvZiBhIHBhcnRpY3VsYXIgdmFsdWF0aW9uIHBvaW50LiAgICBJZiB0aGUgdmFsdWF0aW9uIHBvaW50IGlzIGRlbGV0ZWQsIHRoaXMgd2lsbCByZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSB2YWx1YXRpb24gcG9pbnQgaW1tZWRpYXRlbHkgcHJpb3IgdG8gZGVsZXRpb24uXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldFZhbHVhdGlvblBvaW50QnlFbnRpdHlVbmlxdWVJZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldFZhbHVhdGlvblBvaW50QnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxWYWx1YXRpb25Qb2ludEVudGl0eT47XG4gICAgcHVibGljIGdldFZhbHVhdGlvblBvaW50QnlFbnRpdHlVbmlxdWVJZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldFZhbHVhdGlvblBvaW50QnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFZhbHVhdGlvblBvaW50RW50aXR5Pj47XG4gICAgcHVibGljIGdldFZhbHVhdGlvblBvaW50QnlFbnRpdHlVbmlxdWVJZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldFZhbHVhdGlvblBvaW50QnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxWYWx1YXRpb25Qb2ludEVudGl0eT4+O1xuICAgIHB1YmxpYyBnZXRWYWx1YXRpb25Qb2ludEJ5RW50aXR5VW5pcXVlSWQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRWYWx1YXRpb25Qb2ludEJ5RW50aXR5VW5pcXVlSWRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IGVudGl0eVVuaXF1ZUlkID0gcmVxdWVzdFBhcmFtZXRlcnM/LmVudGl0eVVuaXF1ZUlkO1xuICAgICAgICBpZiAoZW50aXR5VW5pcXVlSWQgPT09IG51bGwgfHwgZW50aXR5VW5pcXVlSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZW50aXR5VW5pcXVlSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRWYWx1YXRpb25Qb2ludEJ5RW50aXR5VW5pcXVlSWQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXNBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5hc0F0O1xuICAgICAgICBjb25zdCBwcmV2aWV3cyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wcmV2aWV3cztcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChhc0F0ICE9PSB1bmRlZmluZWQgJiYgYXNBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmFzQXQsICdhc0F0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZXZpZXdzKSB7XG4gICAgICAgICAgICBwcmV2aWV3cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgIDxhbnk+ZWxlbWVudCwgJ3ByZXZpZXdzJyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZW50aXRpZXMvdmFsdWF0aW9ucG9pbnRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImVudGl0eVVuaXF1ZUlkXCIsIHZhbHVlOiBlbnRpdHlVbmlxdWVJZCwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX1gO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8VmFsdWF0aW9uUG9pbnRFbnRpdHk+KCdnZXQnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbn1cbiJdfQ==
898
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRpZXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ZpbmJvdXJuZS9sdXNpZC1zZGstYW5ndWxhcjE4L3NyYy9saWIvLmdlbmVyYXRlZC9hcGkvZW50aXRpZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFDSCx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQTJCLGVBQWUsQ0FBQztBQUNsRixPQUFPLEVBQWMsV0FBVyxFQUFFLFVBQVUsRUFDVSxXQUFXLEVBQ3hELE1BQVksc0JBQXNCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQStCLFlBQVksQ0FBQztBQThCL0UsYUFBYTtBQUNiLE9BQU8sRUFBRSxTQUFTLEVBQXNCLE1BQTBCLGNBQWMsQ0FBQztBQUNqRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQTBDLGtCQUFrQixDQUFDOzs7O0FBa0lyRixNQUFNLE9BQU8sZUFBZTtJQU9GO0lBTFosUUFBUSxHQUFHLDJCQUEyQixDQUFDO0lBQzFDLGNBQWMsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ25DLGFBQWEsR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO0lBQ3BDLE9BQU8sQ0FBcUI7SUFFbkMsWUFBc0IsVUFBc0IsRUFBZ0MsUUFBeUIsRUFBYyxhQUE0QjtRQUF6SCxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3hDLElBQUksYUFBYSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDdkMsQ0FBQztRQUNELElBQUksT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNsRCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENB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QWMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUMsQ0FBQyxFQUFFLENBQUM7UUFDOU4sT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBdUIsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsWUFBWSxFQUFFLEVBQ3ZHO1lBQ0ksT0FBTyxFQUFFLG1CQUFtQjtZQUM1QixNQUFNLEVBQUUsdUJBQXVCO1lBQy9CLFlBQVksRUFBTyxhQUFhO1lBQ2hDLGVBQWUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWU7WUFDbkQsT0FBTyxFQUFFLGVBQWU7WUFDeEIsT0FBTyxFQUFFLE9BQU87WUFDaEIsYUFBYSxFQUFFLHFCQUFxQjtZQUNwQyxjQUFjLEVBQUUsY0FBYztTQUNqQyxDQUNKLENBQUM7SUFDTixDQUFDO3VHQTFsQ1EsZUFBZSw0Q0FPeUMsU0FBUzsyR0FQakUsZUFBZSxjQUZkLE1BQU07OzJGQUVQLGVBQWU7a0JBSDNCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFRa0QsUUFBUTs7MEJBQUcsTUFBTTsyQkFBQyxTQUFTOzswQkFBOEIsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTFVTSUQgQVBJXG4gKiAjIEludHJvZHVjdGlvbiAgVGhpcyBwYWdlIGRvY3VtZW50cyB0aGUgW0xVU0lEIEFQSXNdKC4uLy4uLy4uL2FwaS9zd2FnZ2VyKSwgd2hpY2ggYWxsb3dzIGF1dGhvcmlzZWQgY2xpZW50cyB0byBxdWVyeSBhbmQgdXBkYXRlIHRoZWlyIGRhdGEgd2l0aGluIHRoZSBMVVNJRCBwbGF0Zm9ybS4gIFNES3MgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgTFVTSUQgQVBJcyBhcmUgYXZhaWxhYmxlIGluIHRoZSBmb2xsb3dpbmcgbGFuZ3VhZ2VzIGFuZCBmcmFtZXdvcmtzOiAgKiBbQyNdKGh0dHBzOi8vZ2l0aHViLmNvbS9maW5ib3VybmUvbHVzaWQtc2RrLWNzaGFycCkgKiBbSmF2YV0oaHR0cHM6Ly9naXRodWIuY29tL2ZpbmJvdXJuZS9sdXNpZC1zZGstamF2YSkgKiBbSmF2YVNjcmlwdF0oaHR0cHM6Ly9naXRodWIuY29tL2ZpbmJvdXJuZS9sdXNpZC1zZGstanMpICogW1B5dGhvbl0oaHR0cHM6Ly9naXRodWIuY29tL2ZpbmJvdXJuZS9sdXNpZC1zZGstcHl0aG9uKSAqIFtBbmd1bGFyXShodHRwczovL2dpdGh1Yi5jb20vZmluYm91cm5lL2x1c2lkLXNkay1hbmd1bGFyKSAgVGhlIExVU0lEIHBsYXRmb3JtIGlzIG1hZGUgdXAgb2YgYSBudW1iZXIgb2Ygc3ViLWFwcGxpY2F0aW9ucy4gWW91IGNhbiBmaW5kIHRoZSBBUEkgLyBzd2FnZ2VyIGRvY3VtZW50YXRpb24gYnkgZm9sbG93aW5nIHRoZSBsaW5rcyBpbiB0aGUgdGFibGUgYmVsb3cuICAgfCBBcHBsaWNhdGlvbiAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQVBJIC8gU3dhZ2dlciBEb2N1bWVudGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8IExVU0lEICAgICAgICAgfCBPcGVuLCBBUEktZmlyc3QsIGRldmVsb3Blci1mcmllbmRseSBpbnZlc3RtZW50IGRhdGEgcGxhdGZvcm0uICAgICAgICAgICAgICAgICAgICAgfCBbU3dhZ2dlcl0oLi4vLi4vLi4vYXBpL3N3YWdnZXIvaW5kZXguaHRtbCkgICAgICAgICAgIHwgfCBXZWIgYXBwICAgICAgIHwgVXNlci1mYWNpbmcgZnJvbnQgZW5kIGZvciBMVVNJRC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgW1N3YWdnZXJdKC4uLy4uLy4uL2FwcC9zd2FnZ2VyL2luZGV4Lmh0bWwpICAgICAgICAgICB8IHwgU2NoZWR1bGVyICAgICB8IEF1dG9tYXRlZCBqb2Igc2NoZWR1bGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFtTd2FnZ2VyXSguLi8uLi8uLi9zY2hlZHVsZXIyL3N3YWdnZXIvaW5kZXguaHRtbCkgICAgfCB8IEluc2lnaHRzICAgICAgfCBNb25pdG9yaW5nIGFuZCB0cm91Ymxlc2hvb3Rpbmcgc2VydmljZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBbU3dhZ2dlcl0oLi4vLi4vLi4vaW5zaWdodHMvc3dhZ2dlci9pbmRleC5odG1sKSAgICAgIHwgfCBJZGVudGl0eSAgICAgIHwgSWRlbnRpdHkgbWFuYWdlbWVudCBmb3IgTFVTSUQgKGluIGNvbmp1bmN0aW9uIHdpdGggQWNjZXNzKSAgICAgICAgICAgICAgICAgICAgICAgIHwgW1N3YWdnZXJdKC4uLy4uLy4uL2lkZW50aXR5L3N3YWdnZXIvaW5kZXguaHRtbCkgICAgICB8IHwgQWNjZXNzICAgICAgICB8IEFjY2VzcyBjb250cm9sIGZvciBMVVNJRCAoaW4gY29uanVuY3Rpb24gd2l0aCBJZGVudGl0eSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFtTd2FnZ2VyXSguLi8uLi8uLi9hY2Nlc3Mvc3dhZ2dlci9pbmRleC5odG1sKSAgICAgICAgfCB8IERyaXZlICAgICAgICAgfCBTZWN1cmUgZmlsZSByZXBvc2l0b3J5IGFuZCBtYW5hZ2VyIGZvciBjb2xsYWJvcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBbU3dhZ2dlcl0oLi4vLi4vLi4vZHJpdmUvc3dhZ2dlci9pbmRleC5odG1sKSAgICAgICAgIHwgfCBMdW1pbmVzY2UgICAgIHwgRGF0YSB2aXJ0dWFsaXNhdGlvbiBzZXJ2aWNlIChxdWVyeSBkYXRhIGZyb20gbXVsdGlwbGUgcHJvdmlkZXJzLCBpbmNsdWRpbmcgTFVTSUQpIHwgW1N3YWdnZXJdKC4uLy4uLy4uL2hvbmV5Y29tYi9zd2FnZ2VyL2luZGV4Lmh0bWwpICAgICB8IHwgTm90aWZpY2F0aW9uICB8IE5vdGlmaWNhdGlvbiBzZXJ2aWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFtTd2FnZ2VyXSguLi8uLi8uLi9ub3RpZmljYXRpb24vc3dhZ2dlci9pbmRleC5odG1sKSAgfCB8IENvbmZpZ3VyYXRpb24gfCBGaWxlIHN0b3JlIGZvciBzZWNyZXRzIGFuZCBvdGhlciBzZW5zaXRpdmUgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBbU3dhZ2dlcl0oLi4vLi4vLi4vY29uZmlndXJhdGlvbi9zd2FnZ2VyL2luZGV4Lmh0bWwpIHwgfCBXb3JrZmxvdyAgICAgIHwgV29ya2Zsb3cgc2VydmljZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgW1N3YWdnZXJdKC4uLy4uLy4uL3dvcmtmbG93L3N3YWdnZXIvaW5kZXguaHRtbCkgICAgICB8ICAgIyBFcnJvciBDb2RlcyAgfCBDb2RlfE5hbWV8RGVzY3JpcHRpb24gfCB8IC0tLXwtLS18LS0tIHwgfCA8YSBuYW1lPVxcXCItMTBcXFwiPi0xMDwvYT58U2VydmVyIENvbmZpZ3VyYXRpb24gRXJyb3J8ICB8IHwgPGEgbmFtZT1cXFwiLTFcXFwiPi0xPC9hPnxVbmtub3duIGVycm9yfEFuIHVuZXhwZWN0ZWQgZXJyb3Igd2FzIGVuY291bnRlcmVkIG9uIG91ciBzaWRlLiB8IHwgPGEgbmFtZT1cXFwiMTAyXFxcIj4xMDI8L2E+fFZlcnNpb24gTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjEwM1xcXCI+MTAzPC9hPnxBcGkgUmF0ZSBMaW1pdCBWaW9sYXRpb258ICB8IHwgPGEgbmFtZT1cXFwiMTA0XFxcIj4xMDQ8L2E+fEluc3RydW1lbnQgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjEwNVxcXCI+MTA1PC9hPnxQcm9wZXJ0eSBOb3QgRm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMTA2XFxcIj4xMDY8L2E+fFBvcnRmb2xpbyBSZWN1cnNpb24gRGVwdGh8ICB8IHwgPGEgbmFtZT1cXFwiMTA4XFxcIj4xMDg8L2E+fEdyb3VwIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCIxMDlcXFwiPjEwOTwvYT58UG9ydGZvbGlvIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCIxMTBcXFwiPjExMDwvYT58UHJvcGVydHkgU2NoZW1hIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCIxMTFcXFwiPjExMTwvYT58UG9ydGZvbGlvIEFuY2VzdHJ5IE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCIxMTJcXFwiPjExMjwvYT58UG9ydGZvbGlvIFdpdGggSWQgQWxyZWFkeSBFeGlzdHN8ICB8IHwgPGEgbmFtZT1cXFwiMTEzXFxcIj4xMTM8L2E+fE9ycGhhbmVkIFBvcnRmb2xpb3wgIHwgfCA8YSBuYW1lPVxcXCIxMTlcXFwiPjExOTwvYT58TWlzc2luZyBCYXNlIENsYWltc3wgIHwgfCA8YSBuYW1lPVxcXCIxMjFcXFwiPjEyMTwvYT58UHJvcGVydHkgTm90IERlZmluZWR8ICB8IHwgPGEgbmFtZT1cXFwiMTIyXFxcIj4xMjI8L2E+fENhbm5vdCBEZWxldGUgU3lzdGVtIFByb3BlcnR5fCAgfCB8IDxhIG5hbWU9XFxcIjEyM1xcXCI+MTIzPC9hPnxDYW5ub3QgTW9kaWZ5IEltbXV0YWJsZSBQcm9wZXJ0eSBGaWVsZHwgIHwgfCA8YSBuYW1lPVxcXCIxMjRcXFwiPjEyNDwvYT58UHJvcGVydHkgQWxyZWFkeSBFeGlzdHN8ICB8IHwgPGEgbmFtZT1cXFwiMTI1XFxcIj4xMjU8L2E+fEludmFsaWQgUHJvcGVydHkgTGlmZSBUaW1lfCAgfCB8IDxhIG5hbWU9XFxcIjEyNlxcXCI+MTI2PC9hPnxQcm9wZXJ0eSBDb25zdHJhaW50IFN0eWxlIEV4Y2x1ZGVzIFByb3BlcnRpZXN8ICB8IHwgPGEgbmFtZT1cXFwiMTI3XFxcIj4xMjc8L2E+fENhbm5vdCBNb2RpZnkgRGVmYXVsdCBEYXRhIFR5cGV8ICB8IHwgPGEgbmFtZT1cXFwiMTI4XFxcIj4xMjg8L2E+fEdyb3VwIEFscmVhZHkgRXhpc3RzfCAgfCB8IDxhIG5hbWU9XFxcIjEyOVxcXCI+MTI5PC9hPnxObyBTdWNoIERhdGEgVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCIxMzBcXFwiPjEzMDwvYT58VW5kZWZpbmVkIFZhbHVlIEZvciBEYXRhIFR5cGV8ICB8IHwgPGEgbmFtZT1cXFwiMTMxXFxcIj4xMzE8L2E+fFVuc3VwcG9ydGVkIFZhbHVlIFR5cGUgRGVmaW5lZCBPbiBEYXRhIFR5cGV8ICB8IHwgPGEgbmFtZT1cXFwiMTMyXFxcIj4xMzI8L2E+fFZhbGlkYXRpb24gRXJyb3J8ICB8IHwgPGEgbmFtZT1cXFwiMTMzXFxcIj4xMzM8L2E+fExvb3AgRGV0ZWN0ZWQgSW4gR3JvdXAgSGllcmFyY2h5fCAgfCB8IDxhIG5hbWU9XFxcIjEzNFxcXCI+MTM0PC9hPnxVbmRlZmluZWQgQWNjZXB0YWJsZSBWYWx1ZXN8ICB8IHwgPGEgbmFtZT1cXFwiMTM1XFxcIj4xMzU8L2E+fFN1YiBHcm91cCBBbHJlYWR5IEV4aXN0c3wgIHwgfCA8YSBuYW1lPVxcXCIxMzhcXFwiPjEzODwvYT58UHJpY2UgU291cmNlIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCIxMzlcXFwiPjEzOTwvYT58QW5hbHl0aWMgU3RvcmUgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjE0MVxcXCI+MTQxPC9hPnxBbmFseXRpYyBTdG9yZSBBbHJlYWR5IEV4aXN0c3wgIHwgfCA8YSBuYW1lPVxcXCIxNDNcXFwiPjE0MzwvYT58Q2xpZW50IEluc3RydW1lbnQgQWxyZWFkeSBFeGlzdHN8ICB8IHwgPGEgbmFtZT1cXFwiMTQ0XFxcIj4xNDQ8L2E+fER1cGxpY2F0ZSBJbiBQYXJhbWV0ZXIgU2V0fCAgfCB8IDxhIG5hbWU9XFxcIjE0N1xcXCI+MTQ3PC9hPnxSZXN1bHRzIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCIxNDhcXFwiPjE0ODwvYT58T3JkZXIgRmllbGQgTm90IEluIFJlc3VsdCBTZXR8ICB8IHwgPGEgbmFtZT1cXFwiMTQ5XFxcIj4xNDk8L2E+fE9wZXJhdGlvbiBGYWlsZWR8ICB8IHwgPGEgbmFtZT1cXFwiMTUwXFxcIj4xNTA8L2E+fEVsYXN0aWMgU2VhcmNoIEVycm9yfCAgfCB8IDxhIG5hbWU9XFxcIjE1MVxcXCI+MTUxPC9hPnxJbnZhbGlkIFBhcmFtZXRlciBWYWx1ZXwgIHwgfCA8YSBuYW1lPVxcXCIxNTNcXFwiPjE1MzwvYT58Q29tbWFuZCBQcm9jZXNzaW5nIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMTU0XFxcIj4xNTQ8L2E+fEVudGl0eSBTdGF0ZSBDb25zdHJ1Y3Rpb24gRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIxNTVcXFwiPjE1NTwvYT58RW50aXR5IFRpbWVsaW5lIERvZXMgTm90IEV4aXN0fCAgfCB8IDxhIG5hbWU9XFxcIjE1NlxcXCI+MTU2PC9hPnxDb25jdXJyZW5jeSBDb25mbGljdCBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjE1N1xcXCI+MTU3PC9hPnxJbnZhbGlkIFJlcXVlc3R8ICB8IHwgPGEgbmFtZT1cXFwiMTU4XFxcIj4xNTg8L2E+fEV2ZW50IFB1Ymxpc2ggVW5rbm93bnwgIHwgfCA8YSBuYW1lPVxcXCIxNTlcXFwiPjE1OTwvYT58RXZlbnQgUXVlcnkgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIxNjBcXFwiPjE2MDwvYT58QmxvYiBEaWQgTm90IEV4aXN0fCAgfCB8IDxhIG5hbWU9XFxcIjE2MlxcXCI+MTYyPC9hPnxTdWIgU3lzdGVtIFJlcXVlc3QgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIxNjNcXFwiPjE2MzwvYT58U3ViIFN5c3RlbSBDb25maWd1cmF0aW9uIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMTY1XFxcIj4xNjU8L2E+fEZhaWxlZCBUbyBEZWxldGV8ICB8IHwgPGEgbmFtZT1cXFwiMTY2XFxcIj4xNjY8L2E+fFVwc2VydCBDbGllbnQgSW5zdHJ1bWVudCBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjE2N1xcXCI+MTY3PC9hPnxJbGxlZ2FsIEFzIEF0IEludGVydmFsfCAgfCB8IDxhIG5hbWU9XFxcIjE2OFxcXCI+MTY4PC9hPnxJbGxlZ2FsIEJpdGVtcG9yYWwgUXVlcnl8ICB8IHwgPGEgbmFtZT1cXFwiMTY5XFxcIj4xNjk8L2E+fEludmFsaWQgQWx0ZXJuYXRlIElkfCAgfCB8IDxhIG5hbWU9XFxcIjE3MFxcXCI+MTcwPC9hPnxDYW5ub3QgQWRkIE5vbi1Xcml0YWJsZSBQcm9wZXJ0aWVzIFRvIEVudGl0eXwgIHwgfCA8YSBuYW1lPVxcXCIxNzFcXFwiPjE3MTwvYT58RW50aXR5IEFscmVhZHkgRXhpc3RzIEluIEdyb3VwfCAgfCB8IDxhIG5hbWU9XFxcIjE3MlxcXCI+MTcyPC9hPnxFbnRpdHkgV2l0aCBJZCBEb2VzIE5vdCBFeGlzdHwgIHwgfCA8YSBuYW1lPVxcXCIxNzNcXFwiPjE3MzwvYT58RW50aXR5IFdpdGggSWQgQWxyZWFkeSBFeGlzdHN8ICB8IHwgPGEgbmFtZT1cXFwiMTc0XFxcIj4xNzQ8L2E+fERlcml2ZWQgUG9ydGZvbGlvIERldGFpbHMgRG8gTm90IEV4aXN0fCAgfCB8IDxhIG5hbWU9XFxcIjE3NVxcXCI+MTc1PC9hPnxFbnRpdHkgTm90IEluIEdyb3VwfCAgfCB8IDxhIG5hbWU9XFxcIjE3NlxcXCI+MTc2PC9hPnxQb3J0Zm9saW8gV2l0aCBOYW1lIEFscmVhZHkgRXhpc3RzfCAgfCB8IDxhIG5hbWU9XFxcIjE3N1xcXCI+MTc3PC9hPnxJbnZhbGlkIFRyYW5zYWN0aW9uc3wgIHwgfCA8YSBuYW1lPVxcXCIxNzhcXFwiPjE3ODwvYT58UmVmZXJlbmNlIFBvcnRmb2xpbyBOb3QgRm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMTc5XFxcIj4xNzk8L2E+fER1cGxpY2F0ZSBJZHwgIHwgfCA8YSBuYW1lPVxcXCIxODBcXFwiPjE4MDwvYT58Q29tbWFuZCBSZXRyaWV2YWwgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIxODFcXFwiPjE4MTwvYT58RGF0YSBGaWx0ZXIgQXBwbGljYXRpb24gRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIxODJcXFwiPjE4MjwvYT58U2VhcmNoIEZhaWxlZHwgIHwgfCA8YSBuYW1lPVxcXCIxODNcXFwiPjE4MzwvYT58TW92ZW1lbnRzIEVuZ2luZSBDb25maWd1cmF0aW9uIEtleSBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjE4NFxcXCI+MTg0PC9hPnxGeCBSYXRlIFNvdXJjZSBOb3QgRm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMTg1XFxcIj4xODU8L2E+fEFjY3J1YWwgU291cmNlIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCIxODZcXFwiPjE4NjwvYT58QWNjZXNzIERlbmllZHwgIHwgfCA8YSBuYW1lPVxcXCIxODdcXFwiPjE4NzwvYT58SW52YWxpZCBJZGVudGl0eSBUb2tlbnwgIHwgfCA8YSBuYW1lPVxcXCIxODhcXFwiPjE4ODwvYT58SW52YWxpZCBSZXF1ZXN0IEhlYWRlcnN8ICB8IHwgPGEgbmFtZT1cXFwiMTg5XFxcIj4xODk8L2E+fFByaWNlIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCIxOTBcXFwiPjE5MDwvYT58SW52YWxpZCBTdWIgSG9sZGluZyBLZXlzIFByb3ZpZGVkfCAgfCB8IDxhIG5hbWU9XFxcIjE5MVxcXCI+MTkxPC9hPnxEdXBsaWNhdGUgU3ViIEhvbGRpbmcgS2V5cyBQcm92aWRlZHwgIHwgfCA8YSBuYW1lPVxcXCIxOTJcXFwiPjE5MjwvYT58Q3V0IERlZmluaXRpb24gTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjE5M1xcXCI+MTkzPC9hPnxDdXQgRGVmaW5pdGlvbiBJbnZhbGlkfCAgfCB8IDxhIG5hbWU9XFxcIjE5NFxcXCI+MTk0PC9hPnxUaW1lIFZhcmlhbnQgUHJvcGVydHkgRGVsZXRpb24gRGF0ZSBVbnNwZWNpZmllZHwgIHwgfCA8YSBuYW1lPVxcXCIxOTVcXFwiPjE5NTwvYT58UGVycGV0dWFsIFByb3BlcnR5IERlbGV0aW9uIERhdGUgU3BlY2lmaWVkfCAgfCB8IDxhIG5hbWU9XFxcIjE5NlxcXCI+MTk2PC9hPnxUaW1lIFZhcmlhbnQgUHJvcGVydHkgVXBzZXJ0IERhdGUgVW5zcGVjaWZpZWR8ICB8IHwgPGEgbmFtZT1cXFwiMTk3XFxcIj4xOTc8L2E+fFBlcnBldHVhbCBQcm9wZXJ0eSBVcHNlcnQgRGF0ZSBTcGVjaWZpZWR8ICB8IHwgPGEgbmFtZT1cXFwiMjAwXFxcIj4yMDA8L2E+fEludmFsaWQgVW5pdCBGb3IgRGF0YSBUeXBlfCAgfCB8IDxhIG5hbWU9XFxcIjIwMVxcXCI+MjAxPC9hPnxJbnZhbGlkIFR5cGUgRm9yIERhdGEgVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCIyMDJcXFwiPjIwMjwvYT58SW52YWxpZCBWYWx1ZSBGb3IgRGF0YSBUeXBlfCAgfCB8IDxhIG5hbWU9XFxcIjIwM1xcXCI+MjAzPC9hPnxVbml0IE5vdCBEZWZpbmVkIEZvciBEYXRhIFR5cGV8ICB8IHwgPGEgbmFtZT1cXFwiMjA0XFxcIj4yMDQ8L2E+fFVuaXRzIE5vdCBTdXBwb3J0ZWQgT24gRGF0YSBUeXBlfCAgfCB8IDxhIG5hbWU9XFxcIjIwNVxcXCI+MjA1PC9hPnxDYW5ub3QgU3BlY2lmeSBVbml0cyBPbiBEYXRhIFR5cGV8ICB8IHwgPGEgbmFtZT1cXFwiMjA2XFxcIj4yMDY8L2E+fFVuaXQgU2NoZW1hIEluY29uc2lzdGVudCBXaXRoIERhdGEgVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCIyMDdcXFwiPjIwNzwvYT58VW5pdCBEZWZpbml0aW9uIE5vdCBTcGVjaWZpZWR8ICB8IHwgPGEgbmFtZT1cXFwiMjA4XFxcIj4yMDg8L2E+fER1cGxpY2F0ZSBVbml0IERlZmluaXRpb25zIFNwZWNpZmllZHwgIHwgfCA8YSBuYW1lPVxcXCIyMDlcXFwiPjIwOTwvYT58SW52YWxpZCBVbml0cyBEZWZpbml0aW9ufCAgfCB8IDxhIG5hbWU9XFxcIjIxMFxcXCI+MjEwPC9hPnxJbnZhbGlkIEluc3RydW1lbnQgSWRlbnRpZmllciBVbml0fCAgfCB8IDxhIG5hbWU9XFxcIjIxMVxcXCI+MjExPC9hPnxIb2xkaW5ncyBBZGp1c3RtZW50IERvZXMgTm90IEV4aXN0fCAgfCB8IDxhIG5hbWU9XFxcIjIxMlxcXCI+MjEyPC9hPnxDb3VsZCBOb3QgQnVpbGQgRXhjZWwgVXJsfCAgfCB8IDxhIG5hbWU9XFxcIjIxM1xcXCI+MjEzPC9hPnxDb3VsZCBOb3QgR2V0IEV4Y2VsIFZlcnNpb258ICB8IHwgPGEgbmFtZT1cXFwiMjE0XFxcIj4yMTQ8L2E+fEluc3RydW1lbnQgQnkgQ29kZSBOb3QgRm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMjE1XFxcIj4yMTU8L2E+fEVudGl0eSBTY2hlbWEgRG9lcyBOb3QgRXhpc3R8ICB8IHwgPGEgbmFtZT1cXFwiMjE2XFxcIj4yMTY8L2E+fEZlYXR1cmUgTm90IFN1cHBvcnRlZCBPbiBQb3J0Zm9saW8gVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCIyMTdcXFwiPjIxNzwvYT58UXVvdGUgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjIxOFxcXCI+MjE4PC9hPnxJbnZhbGlkIFF1b3RlIElkZW50aWZpZXJ8ICB8IHwgPGEgbmFtZT1cXFwiMjE5XFxcIj4yMTk8L2E+fEludmFsaWQgTWV0cmljIEZvciBEYXRhIFR5cGV8ICB8IHwgPGEgbmFtZT1cXFwiMjIwXFxcIj4yMjA8L2E+fEludmFsaWQgSW5zdHJ1bWVudCBEZWZpbml0aW9ufCAgfCB8IDxhIG5hbWU9XFxcIjIyMVxcXCI+MjIxPC9hPnxJbnN0cnVtZW50IFVwc2VydCBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjIyMlxcXCI+MjIyPC9hPnxSZWZlcmVuY2UgUG9ydGZvbGlvIFJlcXVlc3QgTm90IFN1cHBvcnRlZHwgIHwgfCA8YSBuYW1lPVxcXCIyMjNcXFwiPjIyMzwvYT58VHJhbnNhY3Rpb24gUG9ydGZvbGlvIFJlcXVlc3QgTm90IFN1cHBvcnRlZHwgIHwgfCA8YSBuYW1lPVxcXCIyMjRcXFwiPjIyNDwvYT58SW52YWxpZCBQcm9wZXJ0eSBWYWx1ZSBBc3NpZ25tZW50fCAgfCB8IDxhIG5hbWU9XFxcIjIzMFxcXCI+MjMwPC9hPnxUcmFuc2FjdGlvbiBUeXBlIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCIyMzFcXFwiPjIzMTwvYT58VHJhbnNhY3Rpb24gVHlwZSBEdXBsaWNhdGlvbnwgIHwgfCA8YSBuYW1lPVxcXCIyMzJcXFwiPjIzMjwvYT58UG9ydGZvbGlvIERvZXMgTm90IEV4aXN0IEF0IEdpdmVuIERhdGV8ICB8IHwgPGEgbmFtZT1cXFwiMjMzXFxcIj4yMzM8L2E+fFF1ZXJ5IFBhcnNlciBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjIzNFxcXCI+MjM0PC9hPnxEdXBsaWNhdGUgQ29uc3RpdHVlbnR8ICB8IHwgPGEgbmFtZT1cXFwiMjM1XFxcIj4yMzU8L2E+fFVucmVzb2x2ZWQgSW5zdHJ1bWVudCBDb25zdGl0dWVudHwgIHwgfCA8YSBuYW1lPVxcXCIyMzZcXFwiPjIzNjwvYT58VW5yZXNvbHZlZCBJbnN0cnVtZW50IEluIFRyYW5zaXRpb258ICB8IHwgPGEgbmFtZT1cXFwiMjM3XFxcIj4yMzc8L2E+fE1pc3NpbmcgU2lkZSBEZWZpbml0aW9uc3wgIHwgfCA8YSBuYW1lPVxcXCIyNDBcXFwiPjI0MDwvYT58RHVwbGljYXRlIENhbGN1bGF0aW9ucyBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjI5OVxcXCI+Mjk5PC9hPnxJbnZhbGlkIFJlY2lwZXwgIHwgfCA8YSBuYW1lPVxcXCIzMDBcXFwiPjMwMDwvYT58TWlzc2luZyBSZWNpcGV8ICB8IHwgPGEgbmFtZT1cXFwiMzAxXFxcIj4zMDE8L2E+fERlcGVuZGVuY2llc3wgIHwgfCA8YSBuYW1lPVxcXCIzMDRcXFwiPjMwNDwvYT58UG9ydGZvbGlvIFByZXByb2Nlc3MgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzMTBcXFwiPjMxMDwvYT58VmFsdWF0aW9uIEVuZ2luZSBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjMxMVxcXCI+MzExPC9hPnxUYXNrIEZhY3RvcnkgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzMTJcXFwiPjMxMjwvYT58VGFzayBFdmFsdWF0aW9uIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzEzXFxcIj4zMTM8L2E+fFRhc2sgR2VuZXJhdGlvbiBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjMxNFxcXCI+MzE0PC9hPnxFbmdpbmUgQ29uZmlndXJhdGlvbiBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjMxNVxcXCI+MzE1PC9hPnxNb2RlbCBTcGVjaWZpY2F0aW9uIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzIwXFxcIj4zMjA8L2E+fE1hcmtldCBEYXRhIEtleSBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjMyMVxcXCI+MzIxPC9hPnxNYXJrZXQgUmVzb2x2ZXIgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzMjJcXFwiPjMyMjwvYT58TWFya2V0IERhdGEgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzMzBcXFwiPjMzMDwvYT58Q3VydmUgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzMzFcXFwiPjMzMTwvYT58Vm9sYXRpbGl0eSBTdXJmYWNlIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzMyXFxcIj4zMzI8L2E+fFZvbGF0aWxpdHkgQ3ViZSBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjM1MFxcXCI+MzUwPC9hPnxJbnN0cnVtZW50IEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzUxXFxcIj4zNTE8L2E+fENhc2ggRmxvd3MgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzNTJcXFwiPjM1MjwvYT58UmVmZXJlbmNlIERhdGEgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzNjBcXFwiPjM2MDwvYT58QWdncmVnYXRpb24gRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzNjFcXFwiPjM2MTwvYT58QWdncmVnYXRpb24gTWVhc3VyZSBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjM3MFxcXCI+MzcwPC9hPnxSZXN1bHQgUmV0cmlldmFsIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzcxXFxcIj4zNzE8L2E+fFJlc3VsdCBQcm9jZXNzaW5nIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzcyXFxcIj4zNzI8L2E+fFZlbmRvciBSZXN1bHQgUHJvY2Vzc2luZyBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjM3M1xcXCI+MzczPC9hPnxWZW5kb3IgUmVzdWx0IE1hcHBpbmcgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzNzRcXFwiPjM3NDwvYT58VmVuZG9yIExpYnJhcnkgVW5hdXRob3Jpc2VkfCAgfCB8IDxhIG5hbWU9XFxcIjM3NVxcXCI+Mzc1PC9hPnxWZW5kb3IgQ29ubmVjdGl2aXR5IEVycm9yfCAgfCB8IDxhIG5hbWU9XFxcIjM3NlxcXCI+Mzc2PC9hPnxWZW5kb3IgSW50ZXJmYWNlIEVycm9yfCAgfCB8IDxhIG5hbWU9XFxcIjM3N1xcXCI+Mzc3PC9hPnxWZW5kb3IgUHJpY2luZyBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjM3OFxcXCI+Mzc4PC9hPnxWZW5kb3IgVHJhbnNsYXRpb24gRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzNzlcXFwiPjM3OTwvYT58VmVuZG9yIEtleSBNYXBwaW5nIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzgwXFxcIj4zODA8L2E+fFZlbmRvciBSZWZsZWN0aW9uIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzgxXFxcIj4zODE8L2E+fFZlbmRvciBQcm9jZXNzIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzgyXFxcIj4zODI8L2E+fFZlbmRvciBTeXN0ZW0gRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzOTBcXFwiPjM5MDwvYT58QXR0ZW1wdCBUbyBVcHNlcnQgRHVwbGljYXRlIFF1b3Rlc3wgIHwgfCA8YSBuYW1lPVxcXCIzOTFcXFwiPjM5MTwvYT58Q29ycG9yYXRlIEFjdGlvbiBTb3VyY2UgRG9lcyBOb3QgRXhpc3R8ICB8IHwgPGEgbmFtZT1cXFwiMzkyXFxcIj4zOTI8L2E+fENvcnBvcmF0ZSBBY3Rpb24gU291cmNlIEFscmVhZHkgRXhpc3RzfCAgfCB8IDxhIG5hbWU9XFxcIjM5M1xcXCI+MzkzPC9hPnxJbnN0cnVtZW50IElkZW50aWZpZXIgQWxyZWFkeSBJbiBVc2V8ICB8IHwgPGEgbmFtZT1cXFwiMzk0XFxcIj4zOTQ8L2E+fFByb3BlcnRpZXMgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjM5NVxcXCI+Mzk1PC9hPnxCYXRjaCBPcGVyYXRpb24gQWJvcnRlZHwgIHwgfCA8YSBuYW1lPVxcXCI0MDBcXFwiPjQwMDwvYT58SW52YWxpZCBJc280MjE3IEN1cnJlbmN5IENvZGV8ICB8IHwgPGEgbmFtZT1cXFwiNDAxXFxcIj40MDE8L2E+fENhbm5vdCBBc3NpZ24gSW5zdHJ1bWVudCBJZGVudGlmaWVyIFRvIEN1cnJlbmN5fCAgfCB8IDxhIG5hbWU9XFxcIjQwMlxcXCI+NDAyPC9hPnxDYW5ub3QgQXNzaWduIEN1cnJlbmN5IElkZW50aWZpZXIgVG8gTm9uIEN1cnJlbmN5fCAgfCB8IDxhIG5hbWU9XFxcIjQwM1xcXCI+NDAzPC9hPnxDdXJyZW5jeSBJbnN0cnVtZW50IENhbm5vdCBCZSBEZWxldGVkfCAgfCB8IDxhIG5hbWU9XFxcIjQwNFxcXCI+NDA0PC9hPnxDdXJyZW5jeSBJbnN0cnVtZW50IENhbm5vdCBIYXZlIEVjb25vbWljIERlZmluaXRpb258ICB8IHwgPGEgbmFtZT1cXFwiNDA1XFxcIj40MDU8L2E+fEN1cnJlbmN5IEluc3RydW1lbnQgQ2Fubm90IEhhdmUgTG9va3Rocm91Z2ggUG9ydGZvbGlvfCAgfCB8IDxhIG5hbWU9XFxcIjQwNlxcXCI+NDA2PC9hPnxDYW5ub3QgQ3JlYXRlIEN1cnJlbmN5IEluc3RydW1lbnQgV2l0aCBNdWx0aXBsZSBJZGVudGlmaWVyc3wgIHwgfCA8YSBuYW1lPVxcXCI0MDdcXFwiPjQwNzwvYT58U3BlY2lmaWVkIEN1cnJlbmN5IElzIFVuZGVmaW5lZHwgIHwgfCA8YSBuYW1lPVxcXCI0MTBcXFwiPjQxMDwvYT58SW5kZXggRG9lcyBOb3QgRXhpc3R8ICB8IHwgPGEgbmFtZT1cXFwiNDExXFxcIj40MTE8L2E+fFNvcnQgRmllbGQgRG9lcyBOb3QgRXhpc3R8ICB8IHwgPGEgbmFtZT1cXFwiNDEzXFxcIj40MTM8L2E+fE5lZ2F0aXZlIFBhZ2luYXRpb24gUGFyYW1ldGVyc3wgIHwgfCA8YSBuYW1lPVxcXCI0MTRcXFwiPjQxNDwvYT58SW52YWxpZCBTZWFyY2ggU3ludGF4fCAgfCB8IDxhIG5hbWU9XFxcIjQxNVxcXCI+NDE1PC9hPnxGaWx0ZXIgRXhlY3V0aW9uIFRpbWVvdXR8ICB8IHwgPGEgbmFtZT1cXFwiNDIwXFxcIj40MjA8L2E+fFNpZGUgRGVmaW5pdGlvbiBJbmNvbnNpc3RlbnR8ICB8IHwgPGEgbmFtZT1cXFwiNDUwXFxcIj40NTA8L2E+fEludmFsaWQgUXVvdGUgQWNjZXNzIE1ldGFkYXRhIFJ1bGV8ICB8IHwgPGEgbmFtZT1cXFwiNDUxXFxcIj40NTE8L2E+fEFjY2VzcyBNZXRhZGF0YSBOb3QgRm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiNDUyXFxcIj40NTI8L2E+fEludmFsaWQgQWNjZXNzIE1ldGFkYXRhIElkZW50aWZpZXJ8ICB8IHwgPGEgbmFtZT1cXFwiNDYwXFxcIj40NjA8L2E+fFN0YW5kYXJkIFJlc291cmNlIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI0NjFcXFwiPjQ2MTwvYT58U3RhbmRhcmQgUmVzb3VyY2UgQ29uZmxpY3R8ICB8IHwgPGEgbmFtZT1cXFwiNDYyXFxcIj40NjI8L2E+fENhbGVuZGFyIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI0NjNcXFwiPjQ2MzwvYT58RGF0ZSBJbiBBIENhbGVuZGFyIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI0NjRcXFwiPjQ2NDwvYT58SW52YWxpZCBEYXRlIFNvdXJjZSBEYXRhfCAgfCB8IDxhIG5hbWU9XFxcIjQ2NVxcXCI+NDY1PC9hPnxJbnZhbGlkIFRpbWV6b25lfCAgfCB8IDxhIG5hbWU9XFxcIjYwMVxcXCI+NjAxPC9hPnxQZXJzb24gSWRlbnRpZmllciBBbHJlYWR5IEluIFVzZXwgIHwgfCA8YSBuYW1lPVxcXCI2MDJcXFwiPjYwMjwvYT58UGVyc29uIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI2MDNcXFwiPjYwMzwvYT58Q2Fubm90IFNldCBJZGVudGlmaWVyfCAgfCB8IDxhIG5hbWU9XFxcIjYxN1xcXCI+NjE3PC9hPnxJbnZhbGlkIFJlY2lwZSBTcGVjaWZpY2F0aW9uIEluIFJlcXVlc3R8ICB8IHwgPGEgbmFtZT1cXFwiNjE4XFxcIj42MTg8L2E+fElubGluZSBSZWNpcGUgRGVzZXJpYWxpc2F0aW9uIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiNjE5XFxcIj42MTk8L2E+fElkZW50aWZpZXIgVHlwZXMgTm90IFNldCBGb3IgRW50aXR5fCAgfCB8IDxhIG5hbWU9XFxcIjYyMFxcXCI+NjIwPC9hPnxDYW5ub3QgRGVsZXRlIEFsbCBDbGllbnQgRGVmaW5lZCBJZGVudGlmaWVyc3wgIHwgfCA8YSBuYW1lPVxcXCI2NTBcXFwiPjY1MDwvYT58VGhlIE9yZGVyIHJlcXVlc3RlZCB3YXMgbm90IGZvdW5kLnwgIHwgfCA8YSBuYW1lPVxcXCI2NTRcXFwiPjY1NDwvYT58VGhlIEFsbG9jYXRpb24gcmVxdWVzdGVkIHdhcyBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjY1NVxcXCI+NjU1PC9hPnxDYW5ub3QgYnVpbGQgdGhlIGZ4IGZvcndhcmQgdGFyZ2V0IHdpdGggdGhlIGdpdmVuIGhvbGRpbmdzLnwgIHwgfCA8YSBuYW1lPVxcXCI2NTZcXFwiPjY1NjwvYT58R3JvdXAgZG9lcyBub3QgY29udGFpbiBleHBlY3RlZCBlbnRpdGllcy58ICB8IHwgPGEgbmFtZT1cXFwiNjY1XFxcIj42NjU8L2E+fERlc3RpbmF0aW9uIGRpcmVjdG9yeSBub3QgZm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiNjY3XFxcIj42Njc8L2E+fFJlbGF0aW9uIGRlZmluaXRpb24gYWxyZWFkeSBleGlzdHN8ICB8IHwgPGEgbmFtZT1cXFwiNjcyXFxcIj42NzI8L2E+fENvdWxkIG5vdCByZXRyaWV2ZSBmaWxlIGNvbnRlbnRzfCAgfCB8IDxhIG5hbWU9XFxcIjY3M1xcXCI+NjczPC9hPnxNaXNzaW5nIGVudGl0bGVtZW50cyBmb3IgZW50aXRpZXMgaW4gR3JvdXB8ICB8IHwgPGEgbmFtZT1cXFwiNjc0XFxcIj42NzQ8L2E+fE5leHQgQmVzdCBBY3Rpb24gbm90IGZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjY3NlxcXCI+Njc2PC9hPnxSZWxhdGlvbiBkZWZpbml0aW9uIG5vdCBkZWZpbmVkfCAgfCB8IDxhIG5hbWU9XFxcIjY3N1xcXCI+Njc3PC9hPnxJbnZhbGlkIGVudGl0eSBpZGVudGlmaWVyIGZvciByZWxhdGlvbnwgIHwgfCA8YSBuYW1lPVxcXCI2ODFcXFwiPjY4MTwvYT58U29ydGluZyBieSBzcGVjaWZpZWQgZmllbGQgbm90IHN1cHBvcnRlZHxPbmUgb3IgbW9yZSBvZiB0aGUgcHJvdmlkZWQgZmllbGRzIHRvIG9yZGVyIGJ5IHdlcmUgZWl0aGVyIGludmFsaWQgb3Igbm90IHN1cHBvcnRlZC4gfCB8IDxhIG5hbWU9XFxcIjY4MlxcXCI+NjgyPC9hPnxUb28gbWFueSBmaWVsZHMgdG8gc29ydCBieXxUaGUgbnVtYmVyIG9mIGZpZWxkcyB0byBzb3J0IHRoZSBkYXRhIGJ5IGV4Y2VlZHMgdGhlIG51bWJlciBhbGxvd2VkIGJ5IHRoZSBlbmRwb2ludCB8IHwgPGEgbmFtZT1cXFwiNjg0XFxcIj42ODQ8L2E+fFNlcXVlbmNlIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI2ODVcXFwiPjY4NTwvYT58U2VxdWVuY2UgQWxyZWFkeSBFeGlzdHN8ICB8IHwgPGEgbmFtZT1cXFwiNjg2XFxcIj42ODY8L2E+fE5vbi1jeWNsaW5nIHNlcXVlbmNlIGhhcyBiZWVuIGV4aGF1c3RlZHwgIHwgfCA8YSBuYW1lPVxcXCI2ODdcXFwiPjY4NzwvYT58TGVnYWwgRW50aXR5IElkZW50aWZpZXIgQWxyZWFkeSBJbiBVc2V8ICB8IHwgPGEgbmFtZT1cXFwiNjg4XFxcIj42ODg8L2E+fExlZ2FsIEVudGl0eSBOb3QgRm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiNjg5XFxcIj42ODk8L2E+fFRoZSBzdXBwbGllZCBwYWdpbmF0aW9uIHRva2VuIGlzIGludmFsaWR8ICB8IHwgPGEgbmFtZT1cXFwiNjkwXFxcIj42OTA8L2E+fFByb3BlcnR5IFR5cGUgSXMgTm90IFN1cHBvcnRlZHwgIHwgfCA8YSBuYW1lPVxcXCI2OTFcXFwiPjY5MTwvYT58TXVsdGlwbGUgVGF4LWxvdHMgRm9yIEN1cnJlbmN5IFR5cGUgSXMgTm90IFN1cHBvcnRlZHwgIHwgfCA8YSBuYW1lPVxcXCI2OTJcXFwiPjY5MjwvYT58VGhpcyBlbmRwb2ludCBkb2VzIG5vdCBzdXBwb3J0IGltcGVyc29uYXRpb258ICB8IHwgPGEgbmFtZT1cXFwiNjkzXFxcIj42OTM8L2E+fEVudGl0eSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFJlbGF0aW9uc2hpcHwgIHwgfCA8YSBuYW1lPVxcXCI2OTRcXFwiPjY5NDwvYT58UmVsYXRpb25zaGlwIFZhbGlkYXRpb24gRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCI2OTVcXFwiPjY5NTwvYT58UmVsYXRpb25zaGlwIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI2OTdcXFwiPjY5NzwvYT58RGVyaXZlZCBQcm9wZXJ0eSBGb3JtdWxhIE5vIExvbmdlciBWYWxpZHwgIHwgfCA8YSBuYW1lPVxcXCI2OThcXFwiPjY5ODwvYT58U3RvcnkgaXMgbm90IGF2YWlsYWJsZXwgIHwgfCA8YSBuYW1lPVxcXCI3MDNcXFwiPjcwMzwvYT58Q29ycG9yYXRlIEFjdGlvbiBEb2VzIE5vdCBFeGlzdHwgIHwgfCA8YSBuYW1lPVxcXCI3MjBcXFwiPjcyMDwvYT58VGhlIHByb3ZpZGVkIHNvcnQgYW5kIGZpbHRlciBjb21iaW5hdGlvbiBpcyBub3QgdmFsaWR8ICB8IHwgPGEgbmFtZT1cXFwiNzIxXFxcIj43MjE8L2E+fEEyQiBnZW5lcmF0aW9uIGZhaWxlZHwgIHwgfCA8YSBuYW1lPVxcXCI3MjJcXFwiPjcyMjwvYT58QWdncmVnYXRlZCBSZXR1cm4gQ2FsY3VsYXRpb24gRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCI3MjNcXFwiPjcyMzwvYT58Q3VzdG9tIEVudGl0eSBEZWZpbml0aW9uIElkZW50aWZpZXIgQWxyZWFkeSBJbiBVc2V8ICB8IHwgPGEgbmFtZT1cXFwiNzI0XFxcIj43MjQ8L2E+fEN1c3RvbSBFbnRpdHkgRGVmaW5pdGlvbiBOb3QgRm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiNzI1XFxcIj43MjU8L2E+fFRoZSBQbGFjZW1lbnQgcmVxdWVzdGVkIHdhcyBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjcyNlxcXCI+NzI2PC9hPnxUaGUgRXhlY3V0aW9uIHJlcXVlc3RlZCB3YXMgbm90IGZvdW5kLnwgIHwgfCA8YSBuYW1lPVxcXCI3MjdcXFwiPjcyNzwvYT58VGhlIEJsb2NrIHJlcXVlc3RlZCB3YXMgbm90IGZvdW5kLnwgIHwgfCA8YSBuYW1lPVxcXCI3MjhcXFwiPjcyODwvYT58VGhlIFBhcnRpY2lwYXRpb24gcmVxdWVzdGVkIHdhcyBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjcyOVxcXCI+NzI5PC9hPnxUaGUgUGFja2FnZSByZXF1ZXN0ZWQgd2FzIG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiNzMwXFxcIj43MzA8L2E+fFRoZSBPcmRlckluc3RydWN0aW9uIHJlcXVlc3RlZCB3YXMgbm90IGZvdW5kLnwgIHwgfCA8YSBuYW1lPVxcXCI3MzJcXFwiPjczMjwvYT58Q3VzdG9tIEVudGl0eSBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjczM1xcXCI+NzMzPC9hPnxDdXN0b20gRW50aXR5IElkZW50aWZpZXIgYWxyZWFkeSBpbiB1c2UufCAgfCB8IDxhIG5hbWU9XFxcIjczNVxcXCI+NzM1PC9hPnxDYWxjdWxhdGlvbiBGYWlsZWQufCAgfCB8IDxhIG5hbWU9XFxcIjczNlxcXCI+NzM2PC9hPnxBbiBleHBlY3RlZCBrZXkgb24gSHR0cFJlc3BvbnNlIGlzIG1pc3NpbmcufCAgfCB8IDxhIG5hbWU9XFxcIjczN1xcXCI+NzM3PC9hPnxBIHJlcXVpcmVkIGZlZSBkZXRhaWwgaXMgbWlzc2luZy58ICB8IHwgPGEgbmFtZT1cXFwiNzM4XFxcIj43Mzg8L2E+fFplcm8gcm93cyB3ZXJlIHJldHVybmVkIGZyb20gTHVtaW5lc2NlfCAgfCB8IDxhIG5hbWU9XFxcIjczOVxcXCI+NzM5PC9hPnxQcm92aWRlZCBXZWVrZW5kIE1hc2sgd2FzIGludmFsaWR8ICB8IHwgPGEgbmFtZT1cXFwiNzQyXFxcIj43NDI8L2E+fEN1c3RvbSBFbnRpdHkgZmllbGRzIGRvIG5vdCBtYXRjaCB0aGUgZGVmaW5pdGlvbnwgIHwgfCA8YSBuYW1lPVxcXCI3NDZcXFwiPjc0NjwvYT58VGhlIHByb3ZpZGVkIHNlcXVlbmNlIGlzIG5vdCB2YWxpZC58ICB8IHwgPGEgbmFtZT1cXFwiNzUxXFxcIj43NTE8L2E+fFRoZSB0eXBlIG9mIHRoZSBDdXN0b20gRW50aXR5IGlzIGRpZmZlcmVudCB0aGFuIHRoZSB0eXBlIHByb3ZpZGVkIGluIHRoZSBkZWZpbml0aW9uLnwgIHwgfCA8YSBuYW1lPVxcXCI3NTJcXFwiPjc1MjwvYT58THVtaW5lc2NlIHByb2Nlc3MgcmV0dXJuZWQgYW4gZXJyb3IufCAgfCB8IDxhIG5hbWU9XFxcIjc1M1xcXCI+NzUzPC9hPnxGaWxlIG5hbWUgb3IgY29udGVudCBpbmNvbXBhdGlibGUgd2l0aCBvcGVyYXRpb24ufCAgfCB8IDxhIG5hbWU9XFxcIjc1NVxcXCI+NzU1PC9hPnxTY2hlbWEgb2YgcmVzcG9uc2UgZnJvbSBEcml2ZSBpcyBub3QgYXMgZXhwZWN0ZWQufCAgfCB8IDxhIG5hbWU9XFxcIjc1N1xcXCI+NzU3PC9hPnxTY2hlbWEgb2YgcmVzcG9uc2UgZnJvbSBMdW1pbmVzY2UgaXMgbm90IGFzIGV4cGVjdGVkLnwgIHwgfCA8YSBuYW1lPVxcXCI3NThcXFwiPjc1ODwvYT58THVtaW5lc2NlIHRpbWVkIG91dC58ICB8IHwgPGEgbmFtZT1cXFwiNzYzXFxcIj43NjM8L2E+fEludmFsaWQgTHVzaWQgRW50aXR5IElkZW50aWZpZXIgVW5pdHwgIHwgfCA8YSBuYW1lPVxcXCI3NjhcXFwiPjc2ODwvYT58RmVlIHJ1bGUgbm90IGZvdW5kLnwgIHwgfCA8YSBuYW1lPVxcXCI3NjlcXFwiPjc2OTwvYT58Q2Fubm90IHVwZGF0ZSB0aGUgYmFzZSBjdXJyZW5jeSBvZiBhIHBvcnRmb2xpbyB3aXRoIHRyYW5zYWN0aW9ucyBsb2FkZWR8ICB8IHwgPGEgbmFtZT1cXFwiNzcxXFxcIj43NzE8L2E+fFRyYW5zYWN0aW9uIGNvbmZpZ3VyYXRpb24gc291cmNlIG5vdCBmb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI3NzRcXFwiPjc3NDwvYT58Q29tcGxpYW5jZSBydWxlIG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiNzc1XFxcIj43NzU8L2E+fEZ1bmQgYWNjb3VudGluZyBkb2N1bWVudCBjYW5ub3QgYmUgcHJvY2Vzc2VkLnwgIHwgfCA8YSBuYW1lPVxcXCI3NzhcXFwiPjc3ODwvYT58VW5hYmxlIHRvIGxvb2sgdXAgRlggcmF0ZSBmcm9tIHRyYWRlIGNjeSB0byBwb3J0Zm9saW8gY2N5IGZvciBzb21lIG9mIHRoZSB0cmFkZXMufCAgfCB8IDxhIG5hbWU9XFxcIjc4MlxcXCI+NzgyPC9hPnxUaGUgUHJvcGVydHkgZGVmaW5pdGlvbiBkYXRhVHlwZSBpcyBub3QgbWF0Y2hpbmcgdGhlIGRlcml2YXRpb24gZm9ybXVsYSBkYXRhVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCI3ODNcXFwiPjc4MzwvYT58VGhlIFByb3BlcnR5IGRlZmluaXRpb24gZG9tYWluIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRlcml2ZWQgcHJvcGVydGllc3wgIHwgfCA8YSBuYW1lPVxcXCI3ODhcXFwiPjc4ODwvYT58Q29tcGxpYW5jZSBydW4gbm90IGZvdW5kIGZhaWx1cmUufCAgfCB8IDxhIG5hbWU9XFxcIjc5MFxcXCI+NzkwPC9hPnxDdXN0b20gRW50aXR5IGhhcyBtaXNzaW5nIG9yIGludmFsaWQgaWRlbnRpZmllcnN8ICB8IHwgPGEgbmFtZT1cXFwiNzkxXFxcIj43OTE8L2E+fEN1c3RvbSBFbnRpdHkgZGVmaW5pdGlvbiBhbHJlYWR5IGV4aXN0c3wgIHwgfCA8YSBuYW1lPVxcXCI3OTJcXFwiPjc5MjwvYT58Q29tcGxpYW5jZSBQcm9wZXJ0eUtleSBpcyBtaXNzaW5nLnwgIHwgfCA8YSBuYW1lPVxcXCI3OTNcXFwiPjc5MzwvYT58Q29tcGxpYW5jZSBDcml0ZXJpYSBWYWx1ZSBmb3IgbWF0Y2hpbmcgaXMgbWlzc2luZy58ICB8IHwgPGEgbmFtZT1cXFwiNzk1XFxcIj43OTU8L2E+fENhbm5vdCBkZWxldGUgaWRlbnRpZmllciBkZWZpbml0aW9ufCAgfCB8IDxhIG5hbWU9XFxcIjc5NlxcXCI+Nzk2PC9hPnxUYXggcnVsZSBzZXQgbm90IGZvdW5kLnwgIHwgfCA8YSBuYW1lPVxcXCI3OTdcXFwiPjc5NzwvYT58QSB0YXggcnVsZSBzZXQgd2l0aCB0aGlzIGlkIGFscmVhZHkgZXhpc3RzLnwgIHwgfCA8YSBuYW1lPVxcXCI3OThcXFwiPjc5ODwvYT58TXVsdGlwbGUgcnVsZSBzZXRzIGZvciB0aGUgc2FtZSBwcm9wZXJ0eSBrZXkgYXJlIGFwcGxpY2FibGUufCAgfCB8IDxhIG5hbWU9XFxcIjc5OVxcXCI+Nzk5PC9hPnxUaGUgcmVxdWVzdCBtdXN0IGNvbnRhaW4gYSBkYXRlIG9yIGRpYXJ5IGVudHJ5LnwgIHwgfCA8YSBuYW1lPVxcXCI4MDBcXFwiPjgwMDwvYT58Q2FuIG5vdCB1cHNlcnQgYW4gaW5zdHJ1bWVudCBldmVudCBvZiB0aGlzIHR5cGUufCAgfCB8IDxhIG5hbWU9XFxcIjgwMVxcXCI+ODAxPC9hPnxUaGUgaW5zdHJ1bWVudCBldmVudCBkb2VzIG5vdCBleGlzdC58ICB8IHwgPGEgbmFtZT1cXFwiODAyXFxcIj44MDI8L2E+fFRoZSBJbnN0cnVtZW50IGV2ZW50IGlzIG1pc3Npbmcgc2FsaWVudCBpbmZvcm1hdGlvbi58ICB8IHwgPGEgbmFtZT1cXFwiODAzXFxcIj44MDM8L2E+fFRoZSBJbnN0cnVtZW50IGV2ZW50IGNvdWxkIG5vdCBiZSBwcm9jZXNzZWQufCAgfCB8IDxhIG5hbWU9XFxcIjgwNFxcXCI+ODA0PC9hPnxTb21lIGRhdGEgcmVxdWVzdGVkIGRvZXMgbm90IGZvbGxvdyB0aGUgb3JkZXIgZ3JhcGggYXNzdW1wdGlvbnMufCAgfCB8IDxhIG5hbWU9XFxcIjgwNVxcXCI+ODA1PC9hPnxUaGUgaW5zdHJ1bWVudCBldmVudCB0eXBlIGRvZXMgbm90IGV4aXN0LnwgIHwgfCA8YSBuYW1lPVxcXCI4MDZcXFwiPjgwNjwvYT58VGhlIHRyYW5zYWN0aW9uIHRlbXBsYXRlIHNwZWNpZmljYXRpb24gZG9lcyBub3QgZXhpc3QufCAgfCB8IDxhIG5hbWU9XFxcIjgwN1xcXCI+ODA3PC9hPnxUaGUgZGVmYXVsdCB0cmFuc2FjdGlvbiB0ZW1wbGF0ZSBkb2VzIG5vdCBleGlzdC58ICB8IHwgPGEgbmFtZT1cXFwiODA4XFxcIj44MDg8L2E+fFRoZSB0cmFuc2FjdGlvbiB0ZW1wbGF0ZSBkb2VzIG5vdCBleGlzdC58ICB8IHwgPGEgbmFtZT1cXFwiODExXFxcIj44MTE8L2E+fEEgcHJpY2UgY291bGQgbm90IGJlIGZvdW5kIGZvciBhbiBvcmRlci58ICB8IHwgPGEgbmFtZT1cXFwiODEyXFxcIj44MTI8L2E+fEEgcHJpY2UgY291bGQgbm90IGJlIGZvdW5kIGZvciBhbiBhbGxvY2F0aW9uLnwgIHwgfCA8YSBuYW1lPVxcXCI4MTNcXFwiPjgxMzwvYT58Q2hhcnQgb2YgQWNjb3VudHMgbm90IGZvdW5kLnwgIHwgfCA8YSBuYW1lPVxcXCI4MTRcXFwiPjgxNDwvYT58QWNjb3VudCBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjgxNVxcXCI+ODE1PC9hPnxBYm9yIG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiODE2XFxcIj44MTY8L2E+fEFib3IgQ29uZmlndXJhdGlvbiBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjgxN1xcXCI+ODE3PC9hPnxSZWNvbmNpbGlhdGlvbiBtYXBwaW5nIG5vdCBmb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI4MThcXFwiPjgxODwvYT58QXR0cmlidXRlIHR5cGUgY291bGQgbm90IGJlIGRlbGV0ZWQgYmVjYXVzZSBpdCBkb2VzblxcJ3QgZXhpc3QufCAgfCB8IDxhIG5hbWU9XFxcIjgxOVxcXCI+ODE5PC9hPnxSZWNvbmNpbGlhdGlvbiBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjgyMFxcXCI+ODIwPC9hPnxDdXN0b2RpYW4gQWNjb3VudCBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjgyMVxcXCI+ODIxPC9hPnxBbGxvY2F0aW9uIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiODIyXFxcIj44MjI8L2E+fFJlY29uY2lsaWF0aW9uIHJ1biBub3QgZm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiODIzXFxcIj44MjM8L2E+fFJlY29uY2lsaWF0aW9uIGJyZWFrIG5vdCBmb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI4MjRcXFwiPjgyNDwvYT58RW50aXR5IGxpbmsgdHlwZSBjb3VsZCBub3QgYmUgZGVsZXRlZCBiZWNhdXNlIGl0IGRvZXNuXFwndCBleGlzdC58ICB8IHwgPGEgbmFtZT1cXFwiODI4XFxcIj44Mjg8L2E+fEFkZHJlc3Mga2V5IGRlZmluaXRpb24gbm90IGZvdW5kLnwgIHwgfCA8YSBuYW1lPVxcXCI4MjlcXFwiPjgyOTwvYT58Q29tcGxpYW5jZSB0ZW1wbGF0ZSBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjgzMFxcXCI+ODMwPC9hPnxBY3Rpb24gbm90IHN1cHBvcnRlZHwgIHwgfCA8YSBuYW1lPVxcXCI4MzFcXFwiPjgzMTwvYT58UmVmZXJlbmNlIGxpc3Qgbm90IGZvdW5kLnwgIHwgfCA8YSBuYW1lPVxcXCI4MzJcXFwiPjgzMjwvYT58UG9zdGluZyBNb2R1bGUgbm90IGZvdW5kLnwgIHwgfCA8YSBuYW1lPVxcXCI4MzNcXFwiPjgzMzwvYT58VGhlIHR5cGUgb2YgcGFyYW1ldGVyIHByb3ZpZGVkIGRpZCBub3QgbWF0Y2ggdGhhdCByZXF1aXJlZCBieSB0aGUgY29tcGxpYW5jZSBydWxlLnwgIHwgfCA8YSBuYW1lPVxcXCI4MzRcXFwiPjgzNDwvYT58VGhlIHBhcmFtZXRlcnMgcHJvdmlkZWQgYnkgYSBydWxlIGRpZCBub3QgbWF0Y2ggdGhvc2UgcmVxdWlyZWQgYnkgaXRzIHRlbXBsYXRlLnwgIHwgfCA8YSBuYW1lPVxcXCI4MzVcXFwiPjgzNTwvYT58VGhlIGVudGl0eSBoYXMgYSBwcm9wZXJ0eSBpbiBhIGRvbWFpbiB0aGF0IGlzIG5vdCBzdXBwcnRlZCBmb3IgdGhhdCBlbnRpdHkgdHlwZS58ICB8IHwgPGEgbmFtZT1cXFwiODM2XFxcIj44MzY8L2E+fFN0cnVjdHVyZWQgcmVzdWx0IGRhdGEgbm90IGZvdW5kLnwgIHwgfCA8YSBuYW1lPVxcXCI4MzdcXFwiPjgzNzwvYT58RGlhcnkgZW50cnkgbm90IGZvdW5kLnwgIHwgfCA8YSBuYW1lPVxcXCI4MzhcXFwiPjgzODwvYT58RGlhcnkgZW50cnkgY291bGQgbm90IGJlIGNyZWF0ZWQufCAgfCB8IDxhIG5hbWU9XFxcIjgzOVxcXCI+ODM5PC9hPnxEaWFyeSBlbnRyeSBhbHJlYWR5IGV4aXN0cy58ICB8IHwgPGEgbmFtZT1cXFwiODYxXFxcIj44NjE8L2E+fENvbXBsaWFuY2UgcnVuIHN1bW1hcnkgbm90IGZvdW5kLnwgIHwgfCA8YSBuYW1lPVxcXCI4NjlcXFwiPjg2OTwvYT58Q29uZmxpY3RpbmcgaW5zdHJ1bWVudCBwcm9wZXJ0aWVzIGluIGJhdGNoLnwgIHwgfCA8YSBuYW1lPVxcXCI4NzBcXFwiPjg3MDwvYT58Q29tcGxpYW5jZSBydW4gc3VtbWFyeSBhbHJlYWR5IGV4aXN0cy58ICB8IHwgPGEgbmFtZT1cXFwiODcxXFxcIj44NzE8L2E+fFRoZSBzcGVjaWZpZWQgaW1wZXJzb25hdGVkIHVzZXIgZG9lcyBub3QgZXhpc3R8ICB8IHwgPGEgbmFtZT1cXFwiODc0XFxcIj44NzQ8L2E+fFByb3ZpZGVkIFByb3BlcnR5IERvbWFpbiBpcyBub3Qgc3VwcG9ydGVkIGZvciBlbnRpdHkgZmlsdGVyLnwgIHwgfCA8YSBuYW1lPVxcXCI4NzVcXFwiPjg3NTwvYT58Q2Fubm90IERlbGV0ZSBTeXN0ZW0gUmVmZXJlbmNlIExpc3QufCAgfCB8IDxhIG5hbWU9XFxcIjg3NlxcXCI+ODc2PC9hPnxDbGVhcmRvd24gTW9kdWxlIG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiODc5XFxcIj44Nzk8L2E+fFBvcnRmb2xpb3MgZG8gbm90IGhhdmUgdGhlIHNhbWUgYmFzZSBjdXJyZW5jeXwgIHwgfCA8YSBuYW1lPVxcXCI4ODBcXFwiPjg4MDwvYT58VGhlcmUgd2FzIGEgcHJvYmxlbSB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBjb21wbGlhbmNlIGV4cHJlc3Npb24ufCAgfCB8IDxhIG5hbWU9XFxcIjg4MVxcXCI+ODgxPC9hPnxCbG9jayBvdmVycGxhY2VkLnwgIHwgfCA8YSBuYW1lPVxcXCI4ODJcXFwiPjg4MjwvYT58T3JkZXIgbm90IGFwcHJvdmVkLnwgIHwgfCA8YSBuYW1lPVxcXCI4ODNcXFwiPjg4MzwvYT58Q2Fubm90IHVwZGF0ZSB0aGUgc2hhcmVkIGZpZWxkcyBvZiBhIGJsb2NrIHdpdGggYXNzb2NpYXRlZCBvcmRlcnMufCAgfCB8IDxhIG5hbWU9XFxcIjg4NlxcXCI+ODg2PC9hPnxDYW5ub3QgbG9jayB0aGUgcGVyaW9kLnwgIHwgfCA8YSBuYW1lPVxcXCI4ODdcXFwiPjg4NzwvYT58Q2Fubm90IGFwcGx5IGNsZWFyIGRvd24gbW9kdWxlLnwgIHwgfCA8YSBuYW1lPVxcXCI4ODhcXFwiPjg4ODwvYT58Q2Fubm90IHVwc2VydCBJbnN0cnVtZW50IEV2ZW50IEluc3RydWN0aW9uLnwgIHwgfCA8YSBuYW1lPVxcXCI4ODlcXFwiPjg4OTwvYT58Q2Fubm90IHJlYWQgSW5zdHJ1bWVudCBFdmVudCBJbnN0cnVjdGlvbi58ICB8IHwgPGEgbmFtZT1cXFwiODk1XFxcIj44OTU8L2E+fFRoZSBDYXBpdGFsIFJhdGlvIENhbGN1bGF0aW9uIElzIFdyb25nLnwgIHwgfCA8YSBuYW1lPVxcXCI5MTBcXFwiPjkxMDwvYT58Q2Fubm90IHVwZGF0ZSBhIGJsb2NrIHJlZmVyZW5jZWQgYnkgYSBwbGFjZW1lbnQufCAgfCB8IDxhIG5hbWU9XFxcIjkxMVxcXCI+OTExPC9hPnxBIEZ1bmQgdGhhdCByZWZlcmVuY2VzIHRoaXMgQWJvciBhbHJlYWR5IGV4aXN0cy58ICB8IHwgPGEgbmFtZT1cXFwiOTEyXFxcIj45MTI8L2E+fENhbm5vdCBhZGQgZGVjaXNpb24gdG8gU3RhZ2VkIE1vZGlmaWNhdGlvbi58ICB8IHwgPGEgbmFtZT1cXFwiOTEzXFxcIj45MTM8L2E+fFRoZSBTdGFnZWQgTW9kaWZpY2F0aW9uIGNvdWxkIG5vdCBiZSBhcHBsaWVkLnwgIHwgfCA8YSBuYW1lPVxcXCI5MTRcXFwiPjkxNDwvYT58QWN0aW9uIGNhbm5vdCBiZSBleGVjdXRlZC58ICB8IHwgPGEgbmFtZT1cXFwiOTE1XFxcIj45MTU8L2E+fENhbm5vdCB1cHNlcnQgbXVsdGlwbGUgdmVyc2lvbnMgb2YgdGhlIHNhbWUgcHJvcGVydHkgaW4gb25lIHJlcXVlc3QufCAgfCB8IDxhIG5hbWU9XFxcIjkxNlxcXCI+OTE2PC9hPnxQbGFjZW1lbnQgYW5kIGRpcmVjdCBkZXNjZW5kZW50cyBoYXZlIG1vcmUgZXhlY3V0ZWQgcXVhbnRpdHkgdGhhbiB0b3RhbCBwbGFjZW1lbnQgcXVhbnRpdHkufCAgfCB8IDxhIG5hbWU9XFxcIjkxN1xcXCI+OTE3PC9hPnxDYW5ub3QgdXBkYXRlIGEgcGxhY2VtZW50IHdpdGggdGhpcyBFbnRyeVR5cGUufCAgfCB8IDxhIG5hbWU9XFxcIjkxOFxcXCI+OTE4PC9hPnxDYW5ub3QgdXBkYXRlIGEgcGxhY2VtZW50IGluIHRoaXMgU3RhdGUufCAgfCB8IDxhIG5hbWU9XFxcIjkxOVxcXCI+OTE5PC9hPnxQbGFjZW1lbnQgY291bGQgbm90IGJlIGNhbmNlbGxlZC58ICB8IHwgPGEgbmFtZT1cXFwiOTIwXFxcIj45MjA8L2E+fFNoYXJlIENsYXNzIG5vdCBjb25maWd1cmVkIGluIEZ1bmR8ICB8IHwgPGEgbmFtZT1cXFwiOTIxXFxcIj45MjE8L2E+fFNoYXJlIENsYXNzIFN1YiBIb2xkaW5nIEtleSBub3QgY29uZmlndXJlZCBpbiBQb3J0Zm9saW98ICB8IHwgPGEgbmFtZT1cXFwiOTIyXFxcIj45MjI8L2E+fENvdWxkIG5vdCB1cGRhdGUgYW4gb3JkZXIufCAgfCB8IDxhIG5hbWU9XFxcIjkyM1xcXCI+OTIzPC9hPnxNdWx0aXBsZSBzZXRzIG9mIFNoYXJlIENsYXNzIFN1YiBIb2xkaW5nIEtleXMgY29uZmlndXJlZCBhY3Jvc3MgdGhlIFBvcnRmb2xpb3Mgb2YgYSBGdW5kLnwgIHwgfCA8YSBuYW1lPVxcXCI5MjRcXFwiPjkyNDwvYT58T25lIG9yIG1vcmUgbWF0cml4IGNlbGxzIGNvdWxkIG5vdCBiZSBhZGRlZCB0byB0aGUgbWF0cml4LnwgIHwgfCA8YSBuYW1lPVxcXCI5MjVcXFwiPjkyNTwvYT58VGhlcmUgd2FzIGEgcHJvYmxlbSB3aXRoIHRoZSBwcm92aWRlZCBtYXRyaXggZGVmaW5pdGlvbi58ICB8IHwgPGEgbmFtZT1cXFwiOTI2XFxcIj45MjY8L2E+fE1hdHJpeCBkZWZpbml0aW9uIGRvZXMgbm90IGV4aXN0LnwgIHwgfCA8YSBuYW1lPVxcXCI5MjdcXFwiPjkyNzwvYT58TWF0cml4IGRlZmluaXRpb24gY291bGQgbm90IGJlIGRlbGV0ZWQgYmVjYXVzZSBpdCBkb2VzblxcJ3QgZXhpc3QufCAgfCB8IDxhIG5hbWU9XFxcIjkyOFxcXCI+OTI4PC9hPnxEYXRhVHlwZSB3aXRoIElkIGFscmVhZHkgZXhpc3RzLnwgIHwgfCA8YSBuYW1lPVxcXCI5MjlcXFwiPjkyOTwvYT58U3F1YXJlIG1hdHJpeCBpcyBpbmNvbXBsZXRlLnwgIHwgfCA8YSBuYW1lPVxcXCI5MzBcXFwiPjkzMDwvYT58QSBjb25kaXRpb25hbCBsaWNlbnNlIHRlcm0gaGFzIGJlZW4gZXhjZWVkZWQufCAgfCB8IDxhIG5hbWU9XFxcIjkzMVxcXCI+OTMxPC9hPnxUaGUgQ3VzdG9tIERhdGEgTW9kZWwgcmVxdWVzdGVkIGlzIG5vdCBpbnRlbmRlZCBmb3IgdGhlIGVudGl0eSBwcm92aWRlZC58ICB8IHwgPGEgbmFtZT1cXFwiOTMyXFxcIj45MzI8L2E+fFRoZSBlbnRpdHkgcHJvdmlkZWQgZG9lcyBub3QgaGF2ZSBhIG1hbmRhdG9yeSBwcm9wZXJ0eSBzcGVjaWZpZWQgYnkgdGhlIEN1c3RvbSBEYXRhIE1vZGVsLnwgIHwgfCA8YSBuYW1lPVxcXCI5MzNcXFwiPjkzMzwvYT58VGhlIGVudGl0eSBwcm92aWRlZCBoYXMgYSBwcm9wZXJ0eSBub3QgYWxsb3dlZCBieSB0aGUgc3BlY2lmaWVkIEN1c3RvbSBEYXRhIE1vZGVsLnwgIHwgfCA8YSBuYW1lPVxcXCI5MzRcXFwiPjkzNDwvYT58VGhlIGVudGl0eSBwcm92aWRlZCBkb2VzIG5vdCBoYXZlIGEgbWFuZGF0b3J5IGlkZW50aWZpZXIgc3BlY2lmaWVkIGJ5IHRoZSBDdXN0b20gRGF0YSBNb2RlbC58ICB8IHwgPGEgbmFtZT1cXFwiOTM1XFxcIj45MzU8L2E+fFRoZSBlbnRpdHkgcHJvdmlkZWQgaGFzIGFuIGlkZW50aWZpZXIgbm90IGFsbG93ZWQgYnkgdGhlIHNwZWNpZmllZCBDdXN0b20gRGF0YSBNb2RlbC58ICB8IHwgPGEgbmFtZT1cXFwiOTM2XFxcIj45MzY8L2E+fFRoZSBDdXN0b20gRGF0YSBNb2RlbCBpbmNsdWRlZCBhbiBhbGlhcyBvciBzb3J0LWJ5IGF0dHJpYnV0ZSB0aGF0IHdhcyBub3Qgb24gdGhlIGRlZmluaXRpb24ufCAgfCB8IDxhIG5hbWU9XFxcIjkzN1xcXCI+OTM3PC9hPnxUaGUgQ2xvc2VkUGVyaW9kIHdpdGggdGhlIElkIGFscmVhZHkgZXhpc3RzIG9uIHRoZSBUaW1lbGluZXwgIHwgfCA8YSBuYW1lPVxcXCI5MzhcXFwiPjkzODwvYT58VGhlIG5ldyBDbG9zZWQgUGVyaW9kIHdvdWxkIGNhdXNlIHRoZSBUaW1lbGluZSB0byBoYXZlIG5vbi1jb250aWd1b3VzIENsb3NlZCBQZXJpb2RzfCAgfCB8IDxhIG5hbWU9XFxcIjkzOVxcXCI+OTM5PC9hPnxCbG9ja2VkIGJ5IGEgTmV0d29yayBab25lfCAgfCB8IDxhIG5hbWU9XFxcIjk0MFxcXCI+OTQwPC9hPnxUaGUgZW50aXR5IHByb3ZpZGVkIGRvZXMgbm90IG1lZXQgdGhlIGNvbmRpdGlvbnMgb2YgdGhlIEN1c3RvbSBEYXRhIE1vZGVsLnwgIHwgfCA8YSBuYW1lPVxcXCI5NDFcXFwiPjk0MTwvYT58T3JkZXIgbm90IGNvbXBsaWFudC58ICB8IHwgPGEgbmFtZT1cXFwiOTQyXFxcIj45NDI8L2E+fEFjdGlvbiB3b3VsZCBjcmVhdGUgYSBjaXJjdWxhciBkZXBlbmRlbmN5LnwgIHwgfCA8YSBuYW1lPVxcXCI5NDRcXFwiPjk0NDwvYT58RGVyaXZlZCBQcm9wZXJ0eSBjYWxjdWxhdGlvbiBub3QgY29tcGxldGUufCAgfCB8IDxhIG5hbWU9XFxcIjk0NVxcXCI+OTQ1PC9hPnxEZXJpdmVkIFByb3BlcnR5IGlzIG5vdCBmaWx0ZXJhYmxlLnwgIHwgfCA8YSBuYW1lPVxcXCI5NDZcXFwiPjk0NjwvYT58VGhlIGNvbmRpdGlvbnMgcHJvdmlkZWQgaGF2ZSBvbmUgb3IgbW9yZSBlcnJvcnMufCAgfCB8IDxhIG5hbWU9XFxcIjk0N1xcXCI+OTQ3PC9hPnxUaGUgcHJvcGVydHkvaWRlbnRpZmllciBkb21haW4gYW5kIGVudGl0eSBkb21haW4gZG8gbm90IG1hdGNoLnwgIHwgfCA8YSBuYW1lPVxcXCI5NDhcXFwiPjk0ODwvYT58SW52YWxpZCBUaW1lbGluZXwgIHwgfCA8YSBuYW1lPVxcXCI5NDlcXFwiPjk0OTwvYT58RmlsdGVyYWJsZSBEZXJpdmVkIFByb3BlcnR5IGxpbWl0IHJlYWNoZWQufCAgfCB8IDxhIG5hbWU9XFxcIjk1MFxcXCI+OTUwPC9hPnxJbnZlc3RvciBSZWNvcmQgSWRlbnRpZmllciBBbHJlYWR5IEluIFVzZXwgIHwgfCA8YSBuYW1lPVxcXCI5NTFcXFwiPjk1MTwvYT58SW52ZXN0b3IgUmVjb3JkIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI5NTJcXFwiPjk1MjwvYT58SW52ZXN0bWVudCBBY2NvdW50IElkZW50aWZpZXIgQWxyZWFkeSBJbiBVc2V8ICB8IHwgPGEgbmFtZT1cXFwiOTUzXFxcIj45NTM8L2E+fEludmVzdG1lbnQgQWNjb3VudCBOb3QgRm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiOTU0XFxcIj45NTQ8L2E+fENvdWxkIE5vdCBTd2VlcCBCbG9ja3wgIHwgfCA8YSBuYW1lPVxcXCI5NTVcXFwiPjk1NTwvYT58RW50aXR5IFVuaXF1ZSBJZCBoYXMgdGhlIHdyb25nIGZvcm1hdHwgIHwgfCA8YSBuYW1lPVxcXCI5NTZcXFwiPjk1NjwvYT58UG9zdCBDbG9zZSBBY3Rpdml0eSBpcyBpbnZhbGlkfCAgfCB8IDxhIG5hbWU9XFxcIjk1N1xcXCI+OTU3PC9hPnxUaGUgQ2xvc2VkUGVyaW9kIHdpdGggdGhlIElkIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBUaW1lbGluZXwgIHwgfCA8YSBuYW1lPVxcXCI5NThcXFwiPjk1ODwvYT58SW52YWxpZCBTZXR0bGVtZW50IEluc3RydWN0aW9uc3wgIHwgfCA8YSBuYW1lPVxcXCI5NTlcXFwiPjk1OTwvYT58T3JkZXIgcmVxdWlyZXMgcXVhbnRpdHkufCAgfCB8IDxhIG5hbWU9XFxcIjk2MFxcXCI+OTYwPC9hPnxJbnZhbGlkIERhdGFQb2ludCBWYWx1ZSBBc3NpZ25tZW50fCAgfCB8IDxhIG5hbWU9XFxcIjk2MVxcXCI+OTYxPC9hPnxJbnZhbGlkIFJlbGF0aW9uYWwgRGF0YXNldCBGaWVsZCBEZWZpbml0aW9ufCAgfCB8IDxhIG5hbWU9XFxcIjk2MlxcXCI+OTYyPC9hPnxSZWxhdGlvbmFsIERhdGFzZXQgRGVmaW5pdGlvbiBEb2VzIE5vdCBFeGlzdHwgIHwgfCA8YSBuYW1lPVxcXCI5NjNcXFwiPjk2MzwvYT58VGltZWxpbmUgQm9va21hcmsgTm90IEluIE9wZW4gUGVyaW9kfCAgfCB8IDxhIG5hbWU9XFxcIjk2NFxcXCI+OTY0PC9hPnxUaGUgQ3VzdG9tIERhdGEgTW9kZWwgc3BlY2lmaWVkIGlkZW50aWZpZXJzIGJ1dCB0aGUgZW50aXR5IGRvZXMgbm90IHN1cHBvcnQgaWRlbnRpZmllcnN8ICB8IHwgPGEgbmFtZT1cXFwiOTY1XFxcIj45NjU8L2E+fFRoZSBzb3J0IGJ5IHByb3ZpZGVkIGhhcyBvbmUgb3IgbW9yZSBlcnJvcnN8ICB8IHwgPGEgbmFtZT1cXFwiOTY2XFxcIj45NjY8L2E+fEludmFsaWQgQ3VzdG9tIERhdGEgTW9kZWwgRGVmaW5pdGlvbnwgIHwgfCA8YSBuYW1lPVxcXCI5NjdcXFwiPjk2NzwvYT58UnVsZSBzZXQgZG9lcyBub3QgZXhpc3Qgb24gdGhlIENoZWNrIERlZmluaXRpb258ICB8IHwgPGEgbmFtZT1cXFwiOTY4XFxcIj45Njg8L2E+fFRoZSBDbG9zZWQgUGVyaW9kIGlzIGludmFsaWR8ICB8IHwgPGEgbmFtZT1cXFwiOTY5XFxcIj45Njk8L2E+fENhbm5vdCB1cGRhdGUgYSBwbGFjZW1lbnQgd2l0aCB0aGlzIFN0b3AgUHJpY2UufCAgfCB8IDxhIG5hbWU9XFxcIjk3MFxcXCI+OTcwPC9hPnxDYW5ub3QgdXBkYXRlIGEgcGxhY2VtZW50IHdpdGggdGhpcyBMaW1pdCBQcmljZS58ICB8IHwgPGEgbmFtZT1cXFwiOTcxXFxcIj45NzE8L2E+fENhbm5vdCB1cGRhdGUgYSBwbGFjZW1lbnQgd2l0aCB0aGUgY3VycmVudCBUeXBlLnwgIHwgfCA8YSBuYW1lPVxcXCI5NzRcXFwiPjk3NDwvYT58Q2Fubm90IFBsYWNlQmxvY2tzIGFnYWluc3QgYW4gXFwnVW5zb2xpY2l0ZWRcXCcgQmxvY2sgKGJsb2NrIGNvbnRhaW5pbmcgMCBPcmRlcnMpLnwgIHwgfCA8YSBuYW1lPVxcXCI5NzVcXFwiPjk3NTwvYT58Tm8gUG9ydGZvbGlvIEdyb3VwIFNlbGVjdGVkfCAgfCB8IDxhIG5hbWU9XFxcIjk3NlxcXCI+OTc2PC9hPnxBbWJpZ3VvdXMgU2NvcGV8ICB8IFxuICpcbiAqIENvbnRhY3Q6IGluZm9AZmluYm91cm5lLmNvbVxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuLyogdHNsaW50OmRpc2FibGU6bm8tdW51c2VkLXZhcmlhYmxlIG1lbWJlci1vcmRlcmluZyAqL1xuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gICAgICAgICAgICAgICAgICAgICAgZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcyxcbiAgICAgICAgIEh0dHBSZXNwb25zZSwgSHR0cEV2ZW50LCBIdHRwUGFyYW1ldGVyQ29kZWMsIEh0dHBDb250ZXh0IFxuICAgICAgICB9ICAgICAgIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEN1c3RvbUh0dHBQYXJhbWV0ZXJDb2RlYyB9ICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICcuLi9lbmNvZGVyJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICdyeGpzJztcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgQm9va21hcmtFbnRpdHkgfSBmcm9tICcuLi9tb2RlbC9ib29rbWFya0VudGl0eSc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBDb21wbGlhbmNlUnVsZUVudGl0eSB9IGZyb20gJy4uL21vZGVsL2NvbXBsaWFuY2VSdWxlRW50aXR5Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEN1c3RvbUVudGl0eUVudGl0eSB9IGZyb20gJy4uL21vZGVsL2N1c3RvbUVudGl0eUVudGl0eSc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBEYXRhVHlwZUVudGl0eSB9IGZyb20gJy4uL21vZGVsL2RhdGFUeXBlRW50aXR5Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEluc3RydW1lbnRFbnRpdHkgfSBmcm9tICcuLi9tb2RlbC9pbnN0cnVtZW50RW50aXR5Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEx1c2lkUHJvYmxlbURldGFpbHMgfSBmcm9tICcuLi9tb2RlbC9sdXNpZFByb2JsZW1EZXRhaWxzJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEx1c2lkVmFsaWRhdGlvblByb2JsZW1EZXRhaWxzIH0gZnJvbSAnLi4vbW9kZWwvbHVzaWRWYWxpZGF0aW9uUHJvYmxlbURldGFpbHMnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgUG9ydGZvbGlvRW50aXR5IH0gZnJvbSAnLi4vbW9kZWwvcG9ydGZvbGlvRW50aXR5Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFByb3BlcnR5RGVmaW5pdGlvbkVudGl0eSB9IGZyb20gJy4uL21vZGVsL3Byb3BlcnR5RGVmaW5pdGlvbkVudGl0eSc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBSZXNvdXJjZUxpc3RPZkNoYW5nZSB9IGZyb20gJy4uL21vZGVsL3Jlc291cmNlTGlzdE9mQ2hhbmdlJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFJlc291cmNlTGlzdE9mQ2hhbmdlSW50ZXJ2YWwgfSBmcm9tICcuLi9tb2RlbC9yZXNvdXJjZUxpc3RPZkNoYW5nZUludGVydmFsJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFRyYW5zYWN0aW9uRW50aXR5IH0gZnJvbSAnLi4vbW9kZWwvdHJhbnNhY3Rpb25FbnRpdHknO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVmFsdWF0aW9uUG9pbnRFbnRpdHkgfSBmcm9tICcuLi9tb2RlbC92YWx1YXRpb25Qb2ludEVudGl0eSc7XG5cbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEJBU0VfUEFUSCwgQ09MTEVDVElPTl9GT1JNQVRTIH0gICAgICAgICAgICAgICAgICAgICBmcm9tICcuLi92YXJpYWJsZXMnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL2NvbmZpZ3VyYXRpb24nO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0Qm9va21hcmtCeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSB1bml2ZXJzYWxseSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYm9va21hcmsuICovXG4gICAgZW50aXR5VW5pcXVlSWQ6IHN0cmluZztcbiAgICAvKiogVGhlIGFzQXQgZGF0ZXRpbWUgYXQgd2hpY2ggdG8gcmV0cmlldmUgdGhlIGJvb2ttYXJrLiBEZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBib29rbWFyayBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGFzQXQ/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBpZHMgb2YgdGhlIHN0YWdlZCBtb2RpZmljYXRpb25zIHRvIGJlIHByZXZpZXdlZCBpbiB0aGUgcmVzcG9uc2UuICovXG4gICAgcHJldmlld3M/OiBBcnJheTxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldENvbXBsaWFuY2VSdWxlQnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgdW5pdmVyc2FsbHkgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvbXBsaWFuY2UgcnVsZS4gKi9cbiAgICBlbnRpdHlVbmlxdWVJZDogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXNBdCBkYXRldGltZSBhdCB3aGljaCB0byByZXRyaWV2ZSB0aGUgY29tcGxpYW5jZSBydWxlLiBEZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBjb21wbGlhbmNlIHJ1bGUgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBhc0F0Pzogc3RyaW5nO1xuICAgIC8qKiBUaGUgaWRzIG9mIHRoZSBzdGFnZWQgbW9kaWZpY2F0aW9ucyB0byBiZSBwcmV2aWV3ZWQgaW4gdGhlIHJlc3BvbnNlLiAqL1xuICAgIHByZXZpZXdzPzogQXJyYXk8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRDdXN0b21FbnRpdHlCeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSB1bml2ZXJzYWxseSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgQ3VzdG9tIEVudGl0eS4gKi9cbiAgICBlbnRpdHlVbmlxdWVJZDogc3RyaW5nO1xuICAgIC8qKiBUaGUgZWZmZWN0aXZlIGRhdGV0aW1lIG9yIGN1dCBsYWJlbCBhdCB3aGljaCB0byByZXRyaWV2ZSB0aGUgQ3VzdG9tIEVudGl0eS4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgTFVTSUQgc3lzdGVtIGRhdGV0aW1lIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgZWZmZWN0aXZlQXQ/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBhc0F0IGRhdGV0aW1lIGF0IHdoaWNoIHRvIHJldHJpZXZlIHRoZSBDdXN0b20gRW50aXR5LiBEZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBDdXN0b20gRW50aXR5IGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgYXNBdD86IHN0cmluZztcbiAgICAvKiogVGhlIGlkcyBvZiB0aGUgc3RhZ2VkIG1vZGlmaWNhdGlvbnMgdG8gYmUgcHJldmlld2VkIGluIHRoZSByZXNwb25zZS4gKi9cbiAgICBwcmV2aWV3cz86IEFycmF5PHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RGF0YVR5cGVCeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSB1bml2ZXJzYWxseSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgRGF0YVR5cGUgZGVmaW5pdGlvbi4gKi9cbiAgICBlbnRpdHlVbmlxdWVJZDogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXNBdCBkYXRldGltZSBhdCB3aGljaCB0byByZXRyaWV2ZSB0aGUgRGF0YVR5cGUgZGVmaW5pdGlvbi4gRGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgRGF0YVR5cGUgZGVmaW5pdGlvbiBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGFzQXQ/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBpZHMgb2YgdGhlIHN0YWdlZCBtb2RpZmljYXRpb25zIHRvIGJlIHByZXZpZXdlZCBpbiB0aGUgcmVzcG9uc2UuICovXG4gICAgcHJldmlld3M/OiBBcnJheTxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldEVudGl0eUhpc3RvcnlSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHR5cGUgb2YgdGhlIGVudGl0eSB0byBsaXN0IHRoZSBjaGFuZ2UgaGlzdG9yeSBmb3IuICovXG4gICAgZW50aXR5VHlwZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgdW5pdmVyc2FsbHkgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGVudGl0eS4gKi9cbiAgICBlbnRpdHlVbmlxdWVJZDogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXNBdCBkYXRldGltZSBhdCB3aGljaCB0byBsaXN0IGNoYW5nZSBoaXN0b3J5IGluZm9ybWF0aW9uLiBEZWZhdWx0cyB0byByZXR1cm4gdGhlIGNoYW5nZSBoaXN0b3J5IGF0IHRoZSBsYXRlc3QgZGF0ZXRpbWUgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBhc0F0Pzogc3RyaW5nO1xuICAgIC8qKiBUaGUgcGFnaW5hdGlvbiB0b2tlbiB0byB1c2UgdG8gY29udGludWUgbGlzdGluZyBjaGFuZ2UgaGlzdG9yeSBpbmZvcm1hdGlvbiBmcm9tIGEgcHJldmlvdXMgY2FsbCB0byBsaXN0IGNoYW5nZSAgICAgICAgICAgICAgaGlzdG9yeSBpbmZvcm1hdGlvbi4gVGhpcyB2YWx1ZSBpcyByZXR1cm5lZCBmcm9tIHRoZSBwcmV2aW91cyBjYWxsLiBJZiBhIHBhZ2luYXRpb24gdG9rZW4gaXMgcHJvdmlkZWQgdGhlIGZpbHRlciwgc29ydEJ5ICAgICAgICAgICAgICBhbmQgYXNBdCBmaWVsZHMgbXVzdCBub3QgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBvcmlnaW5hbCByZXF1ZXN0LiAqL1xuICAgIHBhZ2U/OiBzdHJpbmc7XG4gICAgLyoqIFdoZW4gcGFnaW5hdGluZywgbGltaXQgdGhlIG51bWJlciBvZiByZXR1cm5lZCByZXN1bHRzIHRvIHRoaXMgbWFueS4gRGVmYXVsdHMgdG8gMTAwIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgbGltaXQ/OiBudW1iZXI7XG4gICAgLyoqIEV4cHJlc3Npb24gdG8gZmlsdGVyIHRoZSByZXN1bHQgc2V0LiAgICAgICAgICAgICAgUmVhZCBtb3JlIGFib3V0IGZpbHRlcmluZyByZXN1bHRzIGZyb20gTFVTSUQgaGVyZSBodHRwczovL3N1cHBvcnQubHVzaWQuY29tL2ZpbHRlcmluZy1yZXN1bHRzLWZyb20tbHVzaWQuICovXG4gICAgZmlsdGVyPzogc3RyaW5nO1xuICAgIC8qKiBBIGxpc3Qgb2YgZmllbGQgbmFtZXMgc3VmZml4ZWQgYnkgXFwmcXVvdDsgQVNDXFwmcXVvdDsgb3IgXFwmcXVvdDsgREVTQ1xcJnF1b3Q7ICovXG4gICAgc29ydEJ5PzogQXJyYXk8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRJbnN0cnVtZW50QnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgdW5pdmVyc2FsbHkgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RydW1lbnQgZGVmaW5pdGlvbi4gKi9cbiAgICBlbnRpdHlVbmlxdWVJZDogc3RyaW5nO1xuICAgIC8qKiBUaGUgZWZmZWN0aXZlIGRhdGV0aW1lIG9yIGN1dCBsYWJlbCBhdCB3aGljaCB0byByZXRyaWV2ZSB0aGUgSW5zdHJ1bWVudCBkZWZpbml0aW9uLiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBMVVNJRCBzeXN0ZW0gZGF0ZXRpbWUgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBlZmZlY3RpdmVBdD86IHN0cmluZztcbiAgICAvKiogVGhlIGFzQXQgZGF0ZXRpbWUgYXQgd2hpY2ggdG8gcmV0cmlldmUgdGhlIGluc3RydW1lbnQgZGVmaW5pdGlvbi4gRGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgaW5zdHJ1bWVudCBkZWZpbml0aW9uIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgYXNBdD86IHN0cmluZztcbiAgICAvKiogVGhlIGlkcyBvZiB0aGUgc3RhZ2VkIG1vZGlmaWNhdGlvbnMgdG8gYmUgcHJldmlld2VkIGluIHRoZSByZXNwb25zZS4gKi9cbiAgICBwcmV2aWV3cz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqIFRoZSBvcHRpb25hbCBzY29wZSBvZiBhIEN1c3RvbSBEYXRhIE1vZGVsIHRvIHVzZS4gKi9cbiAgICBkYXRhTW9kZWxTY29wZT86IHN0cmluZztcbiAgICAvKiogVGhlIG9wdGlvbmFsIGNvZGUgb2YgYSBDdXN0b20gRGF0YSBNb2RlbCB0byB1c2UuICovXG4gICAgZGF0YU1vZGVsQ29kZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRQb3J0Zm9saW9CeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSB1bml2ZXJzYWxseSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcG9ydGZvbGlvIGRlZmluaXRpb24uICovXG4gICAgZW50aXR5VW5pcXVlSWQ6IHN0cmluZztcbiAgICAvKiogVGhlIGVmZmVjdGl2ZSBkYXRldGltZSBvciBjdXQgbGFiZWwgYXQgd2hpY2ggdG8gcmV0cmlldmUgdGhlIHBvcnRmb2xpbyBkZWZpbml0aW9uLiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBMVVNJRCBzeXN0ZW0gZGF0ZXRpbWUgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBlZmZlY3RpdmVBdD86IHN0cmluZztcbiAgICAvKiogVGhlIGFzQXQgZGF0ZXRpbWUgYXQgd2hpY2ggdG8gcmV0cmlldmUgdGhlIHBvcnRmb2xpbyBkZWZpbml0aW9uLiBEZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBwb3J0Zm9saW8gZGVmaW5pdGlvbiBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGFzQXQ/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBpZHMgb2YgdGhlIHN0YWdlZCBtb2RpZmljYXRpb25zIHRvIGJlIHByZXZpZXdlZCBpbiB0aGUgcmVzcG9uc2UuICovXG4gICAgcHJldmlld3M/OiBBcnJheTxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldFBvcnRmb2xpb0NoYW5nZXNSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGVmZmVjdGl2ZSBkYXRlIG9mIHRoZSBvcmlnaW4uICovXG4gICAgZWZmZWN0aXZlQXQ6IHN0cmluZztcbiAgICAvKiogVGhlIGFzLWF0IGRhdGUgb2YgdGhlIG9yaWdpbi4gKi9cbiAgICBhc0F0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldFByb3BlcnR5RGVmaW5pdGlvbkJ5RW50aXR5VW5pcXVlSWRSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHVuaXZlcnNhbGx5IHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwcm9wZXJ0eSBkZWZpbml0aW9uLiAqL1xuICAgIGVudGl0eVVuaXF1ZUlkOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBlZmZlY3RpdmUgZGF0ZXRpbWUgYXQgd2hpY2ggdG8gcmV0cmlldmUgdGhlIHByb3BlcnR5IGRlZmluaXRpb24uIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IExVU0lEIHN5c3RlbSBkYXRldGltZSBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGVmZmVjdGl2ZUF0Pzogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXNBdCBkYXRldGltZSBhdCB3aGljaCB0byByZXRyaWV2ZSB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbi4gRGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGFzQXQ/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBpZHMgb2YgdGhlIHN0YWdlZCBtb2RpZmljYXRpb25zIHRvIGJlIHByZXZpZXdlZCBpbiB0aGUgcmVzcG9uc2UuICovXG4gICAgcHJldmlld3M/OiBBcnJheTxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldFRyYW5zYWN0aW9uQnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgZW50aXR5IHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhlIGV4cGVjdGVkIGZvcm1hdCBpcyBcXCYjMzk7e3BvcnRmb2xpb0VudGl0eVVuaXF1ZUlkfV97dHJhbnNhY3Rpb25JZH1cXCYjMzk7LiAqL1xuICAgIGVudGl0eVVuaXF1ZUlkOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBhc0F0IGRhdGV0aW1lIGF0IHdoaWNoIHRvIHJldHJpZXZlIHRoZSB0cmFuc2FjdGlvbi4gRGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgdHJhbnNhY3Rpb24gaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBhc0F0Pzogc3RyaW5nO1xuICAgIC8qKiBUaGUgaWRzIG9mIHRoZSBzdGFnZWQgbW9kaWZpY2F0aW9ucyB0byBiZSBwcmV2aWV3ZWQgaW4gdGhlIHJlc3BvbnNlLiAqL1xuICAgIHByZXZpZXdzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKiogVGhlIG9wdGlvbmFsIHNjb3BlIG9mIGEgQ3VzdG9tIERhdGEgTW9kZWwgdG8gdXNlLiAqL1xuICAgIGRhdGFNb2RlbFNjb3BlPzogc3RyaW5nO1xuICAgIC8qKiBUaGUgb3B0aW9uYWwgY29kZSBvZiBhIEN1c3RvbSBEYXRhIE1vZGVsIHRvIHVzZS4gKi9cbiAgICBkYXRhTW9kZWxDb2RlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldFZhbHVhdGlvblBvaW50QnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgdW5pdmVyc2FsbHkgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHZhbHVhdGlvbiBwb2ludC4gKi9cbiAgICBlbnRpdHlVbmlxdWVJZDogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXNBdCBkYXRldGltZSBhdCB3aGljaCB0byByZXRyaWV2ZSB0aGUgdmFsdWF0aW9uIHBvaW50LiBEZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSB2YWx1YXRpb24gcG9pbnQgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBhc0F0Pzogc3RyaW5nO1xuICAgIC8qKiBUaGUgaWRzIG9mIHRoZSBzdGFnZWQgbW9kaWZpY2F0aW9ucyB0byBiZSBwcmV2aWV3ZWQgaW4gdGhlIHJlc3BvbnNlLiAqL1xuICAgIHByZXZpZXdzPzogQXJyYXk8c3RyaW5nPjtcbn1cblxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBFbnRpdGllc1NlcnZpY2Uge1xuXG4gICAgcHJvdGVjdGVkIGJhc2VQYXRoID0gJ2h0dHBzOi8vd3d3Lmx1c2lkLmNvbS9hcGknO1xuICAgIHB1YmxpYyBkZWZhdWx0SGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xuICAgIHB1YmxpYyBjb25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oKTtcbiAgICBwdWJsaWMgZW5jb2RlcjogSHR0cFBhcmFtZXRlckNvZGVjO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsIEBPcHRpb25hbCgpQEluamVjdChCQVNFX1BBVEgpIGJhc2VQYXRoOiBzdHJpbmd8c3RyaW5nW10sIEBPcHRpb25hbCgpIGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdEJhc2VQYXRoID0gQXJyYXkuaXNBcnJheShiYXNlUGF0aCkgPyBiYXNlUGF0aFswXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChmaXJzdEJhc2VQYXRoICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGJhc2VQYXRoID0gZmlyc3RCYXNlUGF0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBiYXNlUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBiYXNlUGF0aCA9IHRoaXMuYmFzZVBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGggPSBiYXNlUGF0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVuY29kZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlciB8fCBuZXcgQ3VzdG9tSHR0cFBhcmFtZXRlckNvZGVjKCk7XG4gICAgfVxuXG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcHJpdmF0ZSBhZGRUb0h0dHBQYXJhbXMoaHR0cFBhcmFtczogSHR0cFBhcmFtcywgdmFsdWU6IGFueSwga2V5Pzogc3RyaW5nKTogSHR0cFBhcmFtcyB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgaW5zdGFuY2VvZiBEYXRlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaHR0cFBhcmFtcyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKGh0dHBQYXJhbXMsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGh0dHBQYXJhbXMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtc1JlY3Vyc2l2ZShodHRwUGFyYW1zLCB2YWx1ZSwga2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHR0cFBhcmFtcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZFRvSHR0cFBhcmFtc1JlY3Vyc2l2ZShodHRwUGFyYW1zOiBIdHRwUGFyYW1zLCB2YWx1ZT86IGFueSwga2V5Pzogc3RyaW5nKTogSHR0cFBhcmFtcyB7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gaHR0cFBhcmFtcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICh2YWx1ZSBhcyBhbnlbXSkuZm9yRWFjaCggZWxlbSA9PiBodHRwUGFyYW1zID0gdGhpcy5hZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoaHR0cFBhcmFtcywgZWxlbSwga2V5KSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBodHRwUGFyYW1zID0gaHR0cFBhcmFtcy5hcHBlbmQoa2V5LCAodmFsdWUgYXMgRGF0ZSkudG9JU09TdHJpbmcoKS5zdWJzdHJpbmcoMCwgMTApKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFwia2V5IG1heSBub3QgYmUgbnVsbCBpZiB2YWx1ZSBpcyBEYXRlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLmZvckVhY2goIGsgPT4gaHR0cFBhcmFtcyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKFxuICAgICAgICAgICAgICAgICAgICBodHRwUGFyYW1zLCB2YWx1ZVtrXSwga2V5ICE9IG51bGwgPyBgJHtrZXl9LiR7a31gIDogaykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGtleSAhPSBudWxsKSB7XG4gICAgICAgICAgICBodHRwUGFyYW1zID0gaHR0cFBhcmFtcy5hcHBlbmQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcImtleSBtYXkgbm90IGJlIG51bGwgaWYgdmFsdWUgaXMgbm90IG9iamVjdCBvciBhcnJheVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHR0cFBhcmFtcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRCb29rbWFya0J5RW50aXR5VW5pcXVlSWQ6IEdldCBib29rbWFyayBieSBFbnRpdHlVbmlxdWVJZFxuICAgICAqIFJldHJpZXZlIHRoZSBkZWZpbml0aW9uIG9mIGEgcGFydGljdWxhciBib29rbWFyay4gICAgSWYgdGhlIGJvb2ttYXJrIGlzIGRlbGV0ZWQsIHRoaXMgd2lsbCByZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSBib29rbWFyayBpbW1lZGlhdGVseSBwcmlvciB0byBkZWxldGlvbi5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Qm9va21hcmtCeUVudGl0eVVuaXF1ZUlkKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0Qm9va21hcmtCeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEJvb2ttYXJrRW50aXR5PjtcbiAgICBwdWJsaWMgZ2V0Qm9va21hcmtCeUVudGl0eVVuaXF1ZUlkKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0Qm9va21hcmtCeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8Qm9va21hcmtFbnRpdHk+PjtcbiAgICBwdWJsaWMgZ2V0Qm9va21hcmtCeUVudGl0eVVuaXF1ZUlkKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0Qm9va21hcmtCeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEJvb2ttYXJrRW50aXR5Pj47XG4gICAgcHVibGljIGdldEJvb2ttYXJrQnlFbnRpdHlVbmlxdWVJZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldEJvb2ttYXJrQnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3QgZW50aXR5VW5pcXVlSWQgPSByZXF1ZXN0UGFyYW1ldGVycz8uZW50aXR5VW5pcXVlSWQ7XG4gICAgICAgIGlmIChlbnRpdHlVbmlxdWVJZCA9PT0gbnVsbCB8fCBlbnRpdHlVbmlxdWVJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBlbnRpdHlVbmlxdWVJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldEJvb2ttYXJrQnlFbnRpdHlVbmlxdWVJZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG4gICAgICAgIGNvbnN0IHByZXZpZXdzID0gcmVxdWVzdFBhcmFtZXRlcnM/LnByZXZpZXdzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKGFzQXQgIT09IHVuZGVmaW5lZCAmJiBhc0F0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YXNBdCwgJ2FzQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJldmlld3MpIHtcbiAgICAgICAgICAgIHByZXZpZXdzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgPGFueT5lbGVtZW50LCAncHJldmlld3MnKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9lbnRpdGllcy9ib29rbWFya3MvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiZW50aXR5VW5pcXVlSWRcIiwgdmFsdWU6IGVudGl0eVVuaXF1ZUlkLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxCb29rbWFya0VudGl0eT4oJ2dldCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIEdldENvbXBsaWFuY2VSdWxlQnlFbnRpdHlVbmlxdWVJZDogR2V0IGNvbXBsaWFuY2UgcnVsZSBieSBFbnRpdHlVbmlxdWVJZFxuICAgICAqIFJldHJpZXZlIHRoZSBkZWZpbml0aW9uIG9mIGEgcGFydGljdWxhciBjb21wbGlhbmNlIHJ1bGUuICAgIElmIHRoZSBjb21wbGlhbmNlIHJ1bGUgaXMgZGVsZXRlZCwgdGhpcyB3aWxsIHJldHVybiB0aGUgc3RhdGUgb2YgdGhlIHJ1bGUgaW1tZWRpYXRlbHkgcHJpb3IgdG8gZGVsZXRpb24uXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldENvbXBsaWFuY2VSdWxlQnlFbnRpdHlVbmlxdWVJZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldENvbXBsaWFuY2VSdWxlQnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxDb21wbGlhbmNlUnVsZUVudGl0eT47XG4gICAgcHVibGljIGdldENvbXBsaWFuY2VSdWxlQnlFbnRpdHlVbmlxdWVJZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldENvbXBsaWFuY2VSdWxlQnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPENvbXBsaWFuY2VSdWxlRW50aXR5Pj47XG4gICAgcHVibGljIGdldENvbXBsaWFuY2VSdWxlQnlFbnRpdHlVbmlxdWVJZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldENvbXBsaWFuY2VSdWxlQnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxDb21wbGlhbmNlUnVsZUVudGl0eT4+O1xuICAgIHB1YmxpYyBnZXRDb21wbGlhbmNlUnVsZUJ5RW50aXR5VW5pcXVlSWQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRDb21wbGlhbmNlUnVsZUJ5RW50aXR5VW5pcXVlSWRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IGVudGl0eVVuaXF1ZUlkID0gcmVxdWVzdFBhcmFtZXRlcnM/LmVudGl0eVVuaXF1ZUlkO1xuICAgICAgICBpZiAoZW50aXR5VW5pcXVlSWQgPT09IG51bGwgfHwgZW50aXR5VW5pcXVlSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZW50aXR5VW5pcXVlSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRDb21wbGlhbmNlUnVsZUJ5RW50aXR5VW5pcXVlSWQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXNBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5hc0F0O1xuICAgICAgICBjb25zdCBwcmV2aWV3cyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wcmV2aWV3cztcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChhc0F0ICE9PSB1bmRlZmluZWQgJiYgYXNBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmFzQXQsICdhc0F0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZXZpZXdzKSB7XG4gICAgICAgICAgICBwcmV2aWV3cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgIDxhbnk+ZWxlbWVudCwgJ3ByZXZpZXdzJyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZW50aXRpZXMvY29tcGxpYW5jZXJ1bGVzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImVudGl0eVVuaXF1ZUlkXCIsIHZhbHVlOiBlbnRpdHlVbmlxdWVJZCwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX1gO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8Q29tcGxpYW5jZVJ1bGVFbnRpdHk+KCdnZXQnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRDdXN0b21FbnRpdHlCeUVudGl0eVVuaXF1ZUlkOiBHZXQgYSBDdXN0b20gRW50aXR5IGluc3RhbmNlIGJ5IGl0cyBFbnRpdHlVbmlxdWVJZFxuICAgICAqIFJldHJpZXZlIGEgcGFydGljdWxhciBDdXN0b20gRW50aXR5IGluc3RhbmNlLiAgSWYgdGhlIEN1c3RvbSBFbnRpdHkgaXMgZGVsZXRlZCwgdGhpcyB3aWxsIHJldHVybiB0aGUgc3RhdGUgb2YgdGhlIEN1c3RvbSBFbnRpdHkgaW1tZWRpYXRlbHkgcHJpb3IgdG8gZGVsZXRpb24uXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldEN1c3RvbUVudGl0eUJ5RW50aXR5VW5pcXVlSWQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRDdXN0b21FbnRpdHlCeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEN1c3RvbUVudGl0eUVudGl0eT47XG4gICAgcHVibGljIGdldEN1c3RvbUVudGl0eUJ5RW50aXR5VW5pcXVlSWQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRDdXN0b21FbnRpdHlCeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8Q3VzdG9tRW50aXR5RW50aXR5Pj47XG4gICAgcHVibGljIGdldEN1c3RvbUVudGl0eUJ5RW50aXR5VW5pcXVlSWQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRDdXN0b21FbnRpdHlCeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEN1c3RvbUVudGl0eUVudGl0eT4+O1xuICAgIHB1YmxpYyBnZXRDdXN0b21FbnRpdHlCeUVudGl0eVVuaXF1ZUlkKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0Q3VzdG9tRW50aXR5QnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3QgZW50aXR5VW5pcXVlSWQgPSByZXF1ZXN0UGFyYW1ldGVycz8uZW50aXR5VW5pcXVlSWQ7XG4gICAgICAgIGlmIChlbnRpdHlVbmlxdWVJZCA9PT0gbnVsbCB8fCBlbnRpdHlVbmlxdWVJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBlbnRpdHlVbmlxdWVJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldEN1c3RvbUVudGl0eUJ5RW50aXR5VW5pcXVlSWQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWZmZWN0aXZlQXQgPSByZXF1ZXN0UGFyYW1ldGVycz8uZWZmZWN0aXZlQXQ7XG4gICAgICAgIGNvbnN0IGFzQXQgPSByZXF1ZXN0UGFyYW1ldGVycz8uYXNBdDtcbiAgICAgICAgY29uc3QgcHJldmlld3MgPSByZXF1ZXN0UGFyYW1ldGVycz8ucHJldmlld3M7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAoZWZmZWN0aXZlQXQgIT09IHVuZGVmaW5lZCAmJiBlZmZlY3RpdmVBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmVmZmVjdGl2ZUF0LCAnZWZmZWN0aXZlQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXNBdCAhPT0gdW5kZWZpbmVkICYmIGFzQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5hc0F0LCAnYXNBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmV2aWV3cykge1xuICAgICAgICAgICAgcHJldmlld3MuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgICA8YW55PmVsZW1lbnQsICdwcmV2aWV3cycpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2VudGl0aWVzL2N1c3RvbWVudGl0aWVzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImVudGl0eVVuaXF1ZUlkXCIsIHZhbHVlOiBlbnRpdHlVbmlxdWVJZCwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX1gO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8Q3VzdG9tRW50aXR5RW50aXR5PignZ2V0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0RGF0YVR5cGVCeUVudGl0eVVuaXF1ZUlkOiBHZXQgRGF0YVR5cGUgYnkgRW50aXR5VW5pcXVlSWRcbiAgICAgKiBSZXRyaWV2ZSB0aGUgZGVmaW5pdGlvbiBvZiBhIHBhcnRpY3VsYXIgRGF0YVR5cGUuICBJZiB0aGUgRGF0YVR5cGUgaXMgZGVsZXRlZCwgdGhpcyB3aWxsIHJldHVybiB0aGUgc3RhdGUgb2YgdGhlIERhdGFUeXBlIGltbWVkaWF0ZWx5IHByaW9yIHRvIGRlbGV0aW9uLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREYXRhVHlwZUJ5RW50aXR5VW5pcXVlSWQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXREYXRhVHlwZUJ5RW50aXR5VW5pcXVlSWRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8RGF0YVR5cGVFbnRpdHk+O1xuICAgIHB1YmxpYyBnZXREYXRhVHlwZUJ5RW50aXR5VW5pcXVlSWQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXREYXRhVHlwZUJ5RW50aXR5VW5pcXVlSWRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxEYXRhVHlwZUVudGl0eT4+O1xuICAgIHB1YmxpYyBnZXREYXRhVHlwZUJ5RW50aXR5VW5pcXVlSWQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXREYXRhVHlwZUJ5RW50aXR5VW5pcXVlSWRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8RGF0YVR5cGVFbnRpdHk+PjtcbiAgICBwdWJsaWMgZ2V0RGF0YVR5cGVCeUVudGl0eVVuaXF1ZUlkKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0RGF0YVR5cGVCeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBlbnRpdHlVbmlxdWVJZCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5lbnRpdHlVbmlxdWVJZDtcbiAgICAgICAgaWYgKGVudGl0eVVuaXF1ZUlkID09PSBudWxsIHx8IGVudGl0eVVuaXF1ZUlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGVudGl0eVVuaXF1ZUlkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0RGF0YVR5cGVCeUVudGl0eVVuaXF1ZUlkLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFzQXQgPSByZXF1ZXN0UGFyYW1ldGVycz8uYXNBdDtcbiAgICAgICAgY29uc3QgcHJldmlld3MgPSByZXF1ZXN0UGFyYW1ldGVycz8ucHJldmlld3M7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAoYXNBdCAhPT0gdW5kZWZpbmVkICYmIGFzQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5hc0F0LCAnYXNBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmV2aWV3cykge1xuICAgICAgICAgICAgcHJldmlld3MuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgICA8YW55PmVsZW1lbnQsICdwcmV2aWV3cycpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2VudGl0aWVzL2RhdGF0eXBlcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJlbnRpdHlVbmlxdWVJZFwiLCB2YWx1ZTogZW50aXR5VW5pcXVlSWQsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PERhdGFUeXBlRW50aXR5PignZ2V0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0RW50aXR5SGlzdG9yeTogTGlzdCBhbiBlbnRpdHlcXCYjMzk7cyBoaXN0b3J5IGluZm9ybWF0aW9uXG4gICAgICogUmV0cmlldmUgYSBwYWdlIG9mIGFuIGVudGl0eVxcJiMzOTtzIGNoYW5nZSBoaXN0b3J5IHVwIHRvIGEgcGFydGljdWxhciBwb2ludCBpbiBBc0F0IHRpbWUuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldEVudGl0eUhpc3RvcnkocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRFbnRpdHlIaXN0b3J5UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPFJlc291cmNlTGlzdE9mQ2hhbmdlSW50ZXJ2YWw+O1xuICAgIHB1YmxpYyBnZXRFbnRpdHlIaXN0b3J5KHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0RW50aXR5SGlzdG9yeVJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFJlc291cmNlTGlzdE9mQ2hhbmdlSW50ZXJ2YWw+PjtcbiAgICBwdWJsaWMgZ2V0RW50aXR5SGlzdG9yeShyZXF1ZXN0UGFyYW1ldGVycz86IEdldEVudGl0eUhpc3RvcnlSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8UmVzb3VyY2VMaXN0T2ZDaGFuZ2VJbnRlcnZhbD4+O1xuICAgIHB1YmxpYyBnZXRFbnRpdHlIaXN0b3J5KHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0RW50aXR5SGlzdG9yeVJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3QgZW50aXR5VHlwZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5lbnRpdHlUeXBlO1xuICAgICAgICBpZiAoZW50aXR5VHlwZSA9PT0gbnVsbCB8fCBlbnRpdHlUeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGVudGl0eVR5cGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRFbnRpdHlIaXN0b3J5LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVudGl0eVVuaXF1ZUlkID0gcmVxdWVzdFBhcmFtZXRlcnM/LmVudGl0eVVuaXF1ZUlkO1xuICAgICAgICBpZiAoZW50aXR5VW5pcXVlSWQgPT09IG51bGwgfHwgZW50aXR5VW5pcXVlSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZW50aXR5VW5pcXVlSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRFbnRpdHlIaXN0b3J5LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFzQXQgPSByZXF1ZXN0UGFyYW1ldGVycz8uYXNBdDtcbiAgICAgICAgY29uc3QgcGFnZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wYWdlO1xuICAgICAgICBjb25zdCBsaW1pdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5saW1pdDtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gcmVxdWVzdFBhcmFtZXRlcnM/LmZpbHRlcjtcbiAgICAgICAgY29uc3Qgc29ydEJ5ID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNvcnRCeTtcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChhc0F0ICE9PSB1bmRlZmluZWQgJiYgYXNBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmFzQXQsICdhc0F0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhZ2UgIT09IHVuZGVmaW5lZCAmJiBwYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+cGFnZSwgJ3BhZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGltaXQgIT09IHVuZGVmaW5lZCAmJiBsaW1pdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmxpbWl0LCAnbGltaXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVyICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZmlsdGVyLCAnZmlsdGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvcnRCeSkge1xuICAgICAgICAgICAgc29ydEJ5LmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgPGFueT5lbGVtZW50LCAnc29ydEJ5Jyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZW50aXRpZXMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiZW50aXR5VHlwZVwiLCB2YWx1ZTogZW50aXR5VHlwZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiZW50aXR5VW5pcXVlSWRcIiwgdmFsdWU6IGVudGl0eVVuaXF1ZUlkLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS9oaXN0b3J5YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFJlc291cmNlTGlzdE9mQ2hhbmdlSW50ZXJ2YWw+KCdnZXQnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRJbnN0cnVtZW50QnlFbnRpdHlVbmlxdWVJZDogR2V0IGluc3RydW1lbnQgYnkgRW50aXR5VW5pcXVlSWRcbiAgICAgKiBSZXRyaWV2ZSB0aGUgZGVmaW5pdGlvbiBvZiBhIHBhcnRpY3VsYXIgaW5zdHJ1bWVudC4gIElmIHRoZSBpbnN0cnVtZW50IGlzIGRlbGV0ZWQsIHRoaXMgd2lsbCByZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSBpbnN0cnVtZW50IGltbWVkaWF0ZWx5IHByaW9yIHRvIGRlbGV0aW9uLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRJbnN0cnVtZW50QnlFbnRpdHlVbmlxdWVJZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldEluc3RydW1lbnRCeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEluc3RydW1lbnRFbnRpdHk+O1xuICAgIHB1YmxpYyBnZXRJbnN0cnVtZW50QnlFbnRpdHlVbmlxdWVJZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldEluc3RydW1lbnRCeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8SW5zdHJ1bWVudEVudGl0eT4+O1xuICAgIHB1YmxpYyBnZXRJbnN0cnVtZW50QnlFbnRpdHlVbmlxdWVJZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldEluc3RydW1lbnRCeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEluc3RydW1lbnRFbnRpdHk+PjtcbiAgICBwdWJsaWMgZ2V0SW5zdHJ1bWVudEJ5RW50aXR5VW5pcXVlSWQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRJbnN0cnVtZW50QnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3QgZW50aXR5VW5pcXVlSWQgPSByZXF1ZXN0UGFyYW1ldGVycz8uZW50aXR5VW5pcXVlSWQ7XG4gICAgICAgIGlmIChlbnRpdHlVbmlxdWVJZCA9PT0gbnVsbCB8fCBlbnRpdHlVbmlxdWVJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBlbnRpdHlVbmlxdWVJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldEluc3RydW1lbnRCeUVudGl0eVVuaXF1ZUlkLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZUF0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmVmZmVjdGl2ZUF0O1xuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG4gICAgICAgIGNvbnN0IHByZXZpZXdzID0gcmVxdWVzdFBhcmFtZXRlcnM/LnByZXZpZXdzO1xuICAgICAgICBjb25zdCBkYXRhTW9kZWxTY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5kYXRhTW9kZWxTY29wZTtcbiAgICAgICAgY29uc3QgZGF0YU1vZGVsQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5kYXRhTW9kZWxDb2RlO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKGVmZmVjdGl2ZUF0ICE9PSB1bmRlZmluZWQgJiYgZWZmZWN0aXZlQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5lZmZlY3RpdmVBdCwgJ2VmZmVjdGl2ZUF0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFzQXQgIT09IHVuZGVmaW5lZCAmJiBhc0F0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YXNBdCwgJ2FzQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJldmlld3MpIHtcbiAgICAgICAgICAgIHByZXZpZXdzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgPGFueT5lbGVtZW50LCAncHJldmlld3MnKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGFNb2RlbFNjb3BlICE9PSB1bmRlZmluZWQgJiYgZGF0YU1vZGVsU2NvcGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5kYXRhTW9kZWxTY29wZSwgJ2RhdGFNb2RlbFNjb3BlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGFNb2RlbENvZGUgIT09IHVuZGVmaW5lZCAmJiBkYXRhTW9kZWxDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZGF0YU1vZGVsQ29kZSwgJ2RhdGFNb2RlbENvZGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2VudGl0aWVzL2luc3RydW1lbnRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImVudGl0eVVuaXF1ZUlkXCIsIHZhbHVlOiBlbnRpdHlVbmlxdWVJZCwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX1gO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8SW5zdHJ1bWVudEVudGl0eT4oJ2dldCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldFBvcnRmb2xpb0J5RW50aXR5VW5pcXVlSWQ6IEdldCBwb3J0Zm9saW8gYnkgRW50aXR5VW5pcXVlSWRcbiAgICAgKiBSZXRyaWV2ZSB0aGUgZGVmaW5pdGlvbiBvZiBhIHBhcnRpY3VsYXIgcG9ydGZvbGlvLiAgSWYgdGhlIHBvcnRmb2xpbyBpcyBkZWxldGVkLCB0aGlzIHdpbGwgcmV0dXJuIHRoZSBzdGF0ZSBvZiB0aGUgcG9ydGZvbGlvIGltbWVkaWF0ZWx5IHByaW9yIHRvIGRlbGV0aW9uLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQb3J0Zm9saW9CeUVudGl0eVVuaXF1ZUlkKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0UG9ydGZvbGlvQnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxQb3J0Zm9saW9FbnRpdHk+O1xuICAgIHB1YmxpYyBnZXRQb3J0Zm9saW9CeUVudGl0eVVuaXF1ZUlkKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0UG9ydGZvbGlvQnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFBvcnRmb2xpb0VudGl0eT4+O1xuICAgIHB1YmxpYyBnZXRQb3J0Zm9saW9CeUVudGl0eVVuaXF1ZUlkKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0UG9ydGZvbGlvQnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxQb3J0Zm9saW9FbnRpdHk+PjtcbiAgICBwdWJsaWMgZ2V0UG9ydGZvbGlvQnlFbnRpdHlVbmlxdWVJZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldFBvcnRmb2xpb0J5RW50aXR5VW5pcXVlSWRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IGVudGl0eVVuaXF1ZUlkID0gcmVxdWVzdFBhcmFtZXRlcnM/LmVudGl0eVVuaXF1ZUlkO1xuICAgICAgICBpZiAoZW50aXR5VW5pcXVlSWQgPT09IG51bGwgfHwgZW50aXR5VW5pcXVlSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZW50aXR5VW5pcXVlSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRQb3J0Zm9saW9CeUVudGl0eVVuaXF1ZUlkLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZUF0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmVmZmVjdGl2ZUF0O1xuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG4gICAgICAgIGNvbnN0IHByZXZpZXdzID0gcmVxdWVzdFBhcmFtZXRlcnM/LnByZXZpZXdzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKGVmZmVjdGl2ZUF0ICE9PSB1bmRlZmluZWQgJiYgZWZmZWN0aXZlQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5lZmZlY3RpdmVBdCwgJ2VmZmVjdGl2ZUF0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFzQXQgIT09IHVuZGVmaW5lZCAmJiBhc0F0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YXNBdCwgJ2FzQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJldmlld3MpIHtcbiAgICAgICAgICAgIHByZXZpZXdzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgPGFueT5lbGVtZW50LCAncHJldmlld3MnKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9lbnRpdGllcy9wb3J0Zm9saW9zLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImVudGl0eVVuaXF1ZUlkXCIsIHZhbHVlOiBlbnRpdHlVbmlxdWVJZCwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX1gO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8UG9ydGZvbGlvRW50aXR5PignZ2V0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0UG9ydGZvbGlvQ2hhbmdlczogR2V0IHRoZSBuZXh0IGNoYW5nZSB0byBlYWNoIHBvcnRmb2xpbyBpbiBhIHNjb3BlLlxuICAgICAqIEdldHMgdGhlIHRpbWUgb2YgdGhlIG5leHQgKGVhcmxpZXN0IGVmZmVjdGl2ZSBhdCkgbW9kaWZpY2F0aW9uIChjb3JyZWN0aW9uIGFuZC9vciBhbWVuZG1lbnQpIHRvIGVhY2ggcG9ydGZvbGlvIGluIGEgc2NvcGUgcmVsYXRpdmUgdG8gYSBwb2ludCBpbiBiaXRlbXBvcmFsIHRpbWUuICBJbmNsdWRlcyBjaGFuZ2VzIGZyb20gcGFyZW50IHBvcnRmb2xpb3MgaW4gZGlmZmVyZW50IHNjb3Blcy4gIEV4Y2x1ZGVzIGNoYW5nZXMgZnJvbSBzdWJzY3JpcHRpb25zIChlLmcgY29ycG9yYXRlIGFjdGlvbnMpLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQb3J0Zm9saW9DaGFuZ2VzKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0UG9ydGZvbGlvQ2hhbmdlc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxSZXNvdXJjZUxpc3RPZkNoYW5nZT47XG4gICAgcHVibGljIGdldFBvcnRmb2xpb0NoYW5nZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRQb3J0Zm9saW9DaGFuZ2VzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8UmVzb3VyY2VMaXN0T2ZDaGFuZ2U+PjtcbiAgICBwdWJsaWMgZ2V0UG9ydGZvbGlvQ2hhbmdlcyhyZXF1ZXN0UGFyYW1ldGVycz86IEdldFBvcnRmb2xpb0NoYW5nZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8UmVzb3VyY2VMaXN0T2ZDaGFuZ2U+PjtcbiAgICBwdWJsaWMgZ2V0UG9ydGZvbGlvQ2hhbmdlcyhyZXF1ZXN0UGFyYW1ldGVycz86IEdldFBvcnRmb2xpb0NoYW5nZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRQb3J0Zm9saW9DaGFuZ2VzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZUF0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmVmZmVjdGl2ZUF0O1xuICAgICAgICBpZiAoZWZmZWN0aXZlQXQgPT09IG51bGwgfHwgZWZmZWN0aXZlQXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZWZmZWN0aXZlQXQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRQb3J0Zm9saW9DaGFuZ2VzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFzQXQgPSByZXF1ZXN0UGFyYW1ldGVycz8uYXNBdDtcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChzY29wZSAhPT0gdW5kZWZpbmVkICYmIHNjb3BlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+c2NvcGUsICdzY29wZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlZmZlY3RpdmVBdCAhPT0gdW5kZWZpbmVkICYmIGVmZmVjdGl2ZUF0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZWZmZWN0aXZlQXQsICdlZmZlY3RpdmVBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhc0F0ICE9PSB1bmRlZmluZWQgJiYgYXNBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmFzQXQsICdhc0F0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9lbnRpdGllcy9jaGFuZ2VzL3BvcnRmb2xpb3NgO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8UmVzb3VyY2VMaXN0T2ZDaGFuZ2U+KCdnZXQnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRQcm9wZXJ0eURlZmluaXRpb25CeUVudGl0eVVuaXF1ZUlkOiBHZXQgcHJvcGVydHkgZGVmaW5pdGlvbiBieSBFbnRpdHlVbmlxdWVJZFxuICAgICAqIFJldHJpZXZlIGEgcGFydGljdWxhciBwcm9wZXJ0eSBkZWZpbml0aW9uLiAgSWYgdGhlIHByb3BlcnR5IGRlZmluaXRpb24gaXMgZGVsZXRlZCwgdGhpcyB3aWxsIHJldHVybiB0aGUgc3RhdGUgb2YgdGhlIHByb3BlcnR5IGRlZmluaXRpb24gaW1tZWRpYXRlbHkgcHJpb3IgdG8gZGVsZXRpb24uXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldFByb3BlcnR5RGVmaW5pdGlvbkJ5RW50aXR5VW5pcXVlSWQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRQcm9wZXJ0eURlZmluaXRpb25CeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPFByb3BlcnR5RGVmaW5pdGlvbkVudGl0eT47XG4gICAgcHVibGljIGdldFByb3BlcnR5RGVmaW5pdGlvbkJ5RW50aXR5VW5pcXVlSWQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRQcm9wZXJ0eURlZmluaXRpb25CeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8UHJvcGVydHlEZWZpbml0aW9uRW50aXR5Pj47XG4gICAgcHVibGljIGdldFByb3BlcnR5RGVmaW5pdGlvbkJ5RW50aXR5VW5pcXVlSWQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRQcm9wZXJ0eURlZmluaXRpb25CeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFByb3BlcnR5RGVmaW5pdGlvbkVudGl0eT4+O1xuICAgIHB1YmxpYyBnZXRQcm9wZXJ0eURlZmluaXRpb25CeUVudGl0eVVuaXF1ZUlkKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0UHJvcGVydHlEZWZpbml0aW9uQnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3QgZW50aXR5VW5pcXVlSWQgPSByZXF1ZXN0UGFyYW1ldGVycz8uZW50aXR5VW5pcXVlSWQ7XG4gICAgICAgIGlmIChlbnRpdHlVbmlxdWVJZCA9PT0gbnVsbCB8fCBlbnRpdHlVbmlxdWVJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBlbnRpdHlVbmlxdWVJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFByb3BlcnR5RGVmaW5pdGlvbkJ5RW50aXR5VW5pcXVlSWQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWZmZWN0aXZlQXQgPSByZXF1ZXN0UGFyYW1ldGVycz8uZWZmZWN0aXZlQXQ7XG4gICAgICAgIGNvbnN0IGFzQXQgPSByZXF1ZXN0UGFyYW1ldGVycz8uYXNBdDtcbiAgICAgICAgY29uc3QgcHJldmlld3MgPSByZXF1ZXN0UGFyYW1ldGVycz8ucHJldmlld3M7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAoZWZmZWN0aXZlQXQgIT09IHVuZGVmaW5lZCAmJiBlZmZlY3RpdmVBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmVmZmVjdGl2ZUF0LCAnZWZmZWN0aXZlQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXNBdCAhPT0gdW5kZWZpbmVkICYmIGFzQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5hc0F0LCAnYXNBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmV2aWV3cykge1xuICAgICAgICAgICAgcHJldmlld3MuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgICA8YW55PmVsZW1lbnQsICdwcmV2aWV3cycpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2VudGl0aWVzL3Byb3BlcnR5ZGVmaW5pdGlvbnMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiZW50aXR5VW5pcXVlSWRcIiwgdmFsdWU6IGVudGl0eVVuaXF1ZUlkLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxQcm9wZXJ0eURlZmluaXRpb25FbnRpdHk+KCdnZXQnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRUcmFuc2FjdGlvbkJ5RW50aXR5VW5pcXVlSWQ6IEdldCB0cmFuc2FjdGlvbiBieSBFbnRpdHlVbmlxdWVJZFxuICAgICAqIFJldHJpZXZlIGEgdHJhbnNhY3Rpb24gYnkgaXRzIGVudGl0eSB1bmlxdWUgaWRlbnRpZmllci4gICAgSWYgdGhlIHRyYW5zYWN0aW9uXFwmIzM5O3MgcG9ydGZvbGlvIGlzIGRlbGV0ZWQsIHRoaXMgd2lsbCByZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSB0cmFuc2FjdGlvbiBpbW1lZGlhdGVseSBwcmlvciB0byBwb3J0Zm9saW8gZGVsZXRpb24uXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldFRyYW5zYWN0aW9uQnlFbnRpdHlVbmlxdWVJZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldFRyYW5zYWN0aW9uQnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxUcmFuc2FjdGlvbkVudGl0eT47XG4gICAgcHVibGljIGdldFRyYW5zYWN0aW9uQnlFbnRpdHlVbmlxdWVJZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldFRyYW5zYWN0aW9uQnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFRyYW5zYWN0aW9uRW50aXR5Pj47XG4gICAgcHVibGljIGdldFRyYW5zYWN0aW9uQnlFbnRpdHlVbmlxdWVJZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldFRyYW5zYWN0aW9uQnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxUcmFuc2FjdGlvbkVudGl0eT4+O1xuICAgIHB1YmxpYyBnZXRUcmFuc2FjdGlvbkJ5RW50aXR5VW5pcXVlSWQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRUcmFuc2FjdGlvbkJ5RW50aXR5VW5pcXVlSWRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IGVudGl0eVVuaXF1ZUlkID0gcmVxdWVzdFBhcmFtZXRlcnM/LmVudGl0eVVuaXF1ZUlkO1xuICAgICAgICBpZiAoZW50aXR5VW5pcXVlSWQgPT09IG51bGwgfHwgZW50aXR5VW5pcXVlSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZW50aXR5VW5pcXVlSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRUcmFuc2FjdGlvbkJ5RW50aXR5VW5pcXVlSWQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXNBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5hc0F0O1xuICAgICAgICBjb25zdCBwcmV2aWV3cyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wcmV2aWV3cztcbiAgICAgICAgY29uc3QgZGF0YU1vZGVsU2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uZGF0YU1vZGVsU2NvcGU7XG4gICAgICAgIGNvbnN0IGRhdGFNb2RlbENvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uZGF0YU1vZGVsQ29kZTtcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChhc0F0ICE9PSB1bmRlZmluZWQgJiYgYXNBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmFzQXQsICdhc0F0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZXZpZXdzKSB7XG4gICAgICAgICAgICBwcmV2aWV3cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgIDxhbnk+ZWxlbWVudCwgJ3ByZXZpZXdzJyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhTW9kZWxTY29wZSAhPT0gdW5kZWZpbmVkICYmIGRhdGFNb2RlbFNjb3BlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZGF0YU1vZGVsU2NvcGUsICdkYXRhTW9kZWxTY29wZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhTW9kZWxDb2RlICE9PSB1bmRlZmluZWQgJiYgZGF0YU1vZGVsQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmRhdGFNb2RlbENvZGUsICdkYXRhTW9kZWxDb2RlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9lbnRpdGllcy90cmFuc2FjdGlvbnMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiZW50aXR5VW5pcXVlSWRcIiwgdmFsdWU6IGVudGl0eVVuaXF1ZUlkLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxUcmFuc2FjdGlvbkVudGl0eT4oJ2dldCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldFZhbHVhdGlvblBvaW50QnlFbnRpdHlVbmlxdWVJZDogR2V0IHZhbHVhdGlvbiBwb2ludCBieSBFbnRpdHlVbmlxdWVJZFxuICAgICAqIFJldHJpZXZlIHRoZSBkZWZpbml0aW9uIG9mIGEgcGFydGljdWxhciB2YWx1YXRpb24gcG9pbnQuICAgIElmIHRoZSB2YWx1YXRpb24gcG9pbnQgaXMgZGVsZXRlZCwgdGhpcyB3aWxsIHJldHVybiB0aGUgc3RhdGUgb2YgdGhlIHZhbHVhdGlvbiBwb2ludCBpbW1lZGlhdGVseSBwcmlvciB0byBkZWxldGlvbi5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VmFsdWF0aW9uUG9pbnRCeUVudGl0eVVuaXF1ZUlkKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0VmFsdWF0aW9uUG9pbnRCeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPFZhbHVhdGlvblBvaW50RW50aXR5PjtcbiAgICBwdWJsaWMgZ2V0VmFsdWF0aW9uUG9pbnRCeUVudGl0eVVuaXF1ZUlkKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0VmFsdWF0aW9uUG9pbnRCeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8VmFsdWF0aW9uUG9pbnRFbnRpdHk+PjtcbiAgICBwdWJsaWMgZ2V0VmFsdWF0aW9uUG9pbnRCeUVudGl0eVVuaXF1ZUlkKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0VmFsdWF0aW9uUG9pbnRCeUVudGl0eVVuaXF1ZUlkUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFZhbHVhdGlvblBvaW50RW50aXR5Pj47XG4gICAgcHVibGljIGdldFZhbHVhdGlvblBvaW50QnlFbnRpdHlVbmlxdWVJZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldFZhbHVhdGlvblBvaW50QnlFbnRpdHlVbmlxdWVJZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3QgZW50aXR5VW5pcXVlSWQgPSByZXF1ZXN0UGFyYW1ldGVycz8uZW50aXR5VW5pcXVlSWQ7XG4gICAgICAgIGlmIChlbnRpdHlVbmlxdWVJZCA9PT0gbnVsbCB8fCBlbnRpdHlVbmlxdWVJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBlbnRpdHlVbmlxdWVJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFZhbHVhdGlvblBvaW50QnlFbnRpdHlVbmlxdWVJZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG4gICAgICAgIGNvbnN0IHByZXZpZXdzID0gcmVxdWVzdFBhcmFtZXRlcnM/LnByZXZpZXdzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKGFzQXQgIT09IHVuZGVmaW5lZCAmJiBhc0F0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YXNBdCwgJ2FzQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJldmlld3MpIHtcbiAgICAgICAgICAgIHByZXZpZXdzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgPGFueT5lbGVtZW50LCAncHJldmlld3MnKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9lbnRpdGllcy92YWx1YXRpb25wb2ludHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiZW50aXR5VW5pcXVlSWRcIiwgdmFsdWU6IGVudGl0eVVuaXF1ZUlkLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxWYWx1YXRpb25Qb2ludEVudGl0eT4oJ2dldCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxufVxuIl19