@eqproject/eqp-dynamic-module 1.0.4 → 1.0.5

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 (23) hide show
  1. package/esm2020/lib/components/private/add-form-field/add-form-field.component.mjs +5 -3
  2. package/esm2020/lib/components/private/field-templates/boolean-field-template/boolean-field-template.component.mjs +3 -3
  3. package/esm2020/lib/components/private/field-templates/image-field-template/image-field-template.component.mjs +1 -1
  4. package/esm2020/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.mjs +9 -3
  5. package/esm2020/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.mjs +9 -3
  6. package/esm2020/lib/components/private/field-templates/text-field-template/text-field-template.component.mjs +59 -10
  7. package/esm2020/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.mjs +58 -10
  8. package/esm2020/lib/eqp-dynamic-module.module.mjs +1 -1
  9. package/esm2020/lib/models/baseField.model.mjs +1 -1
  10. package/esm2020/lib/services/utilityHelper.services.mjs +9 -1
  11. package/esm2020/lib/services/voice-recognition.service.mjs +69 -0
  12. package/fesm2015/eqproject-eqp-dynamic-module.mjs +232 -53
  13. package/fesm2015/eqproject-eqp-dynamic-module.mjs.map +1 -1
  14. package/fesm2020/eqproject-eqp-dynamic-module.mjs +232 -53
  15. package/fesm2020/eqproject-eqp-dynamic-module.mjs.map +1 -1
  16. package/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.d.ts +3 -0
  17. package/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.d.ts +3 -0
  18. package/lib/components/private/field-templates/text-field-template/text-field-template.component.d.ts +14 -1
  19. package/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.d.ts +14 -1
  20. package/lib/models/baseField.model.d.ts +2 -0
  21. package/lib/services/utilityHelper.services.d.ts +1 -0
  22. package/lib/services/voice-recognition.service.d.ts +18 -0
  23. package/package.json +1 -1
@@ -26,6 +26,14 @@ export class UtilityHelperService {
26
26
  static isNumeric(n) {
27
27
  return !isNaN(n);
28
28
  }
29
+ static initStyles(stylecss) {
30
+ return stylecss.split(";").reduce((a, b) => {
31
+ const keypar = b.split(":");
32
+ if (keypar.length > 1)
33
+ a[keypar[0].trim()] = keypar[1].trim();
34
+ return a;
35
+ }, {});
36
+ }
29
37
  static GetFieldType(field) {
30
38
  switch (field.FieldType) {
31
39
  case FieldTypeEnum["Campo di testo"]: {
@@ -379,4 +387,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImpor
379
387
  providedIn: 'root'
380
388
  }]
381
389
  }], ctorParameters: function () { return [{ type: i1.UntypedFormBuilder }, { type: i2.HttpClient }, { type: i3.SpinnerService }]; } });
382
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbGl0eUhlbHBlci5zZXJ2aWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL3NlcnZpY2VzL3V0aWxpdHlIZWxwZXIuc2VydmljZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQXVDLGtCQUFrQixFQUFpQyxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwSSxPQUFPLEVBQWEsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2xELE9BQU8sRUFBRSxxQkFBcUIsRUFBb0MsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFLbEosT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRy9GLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7Ozs7QUFNcEYsTUFBTSxPQUFPLG9CQUFvQjtJQUk3QixZQUNZLFdBQStCLEVBQy9CLElBQWdCLEVBQ2hCLGNBQThCO1FBRjlCLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQUMvQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtJQUUxQyxDQUFDO0lBRU0sTUFBTSxDQUFDLG9CQUFvQixDQUFDLE9BQWUsRUFBRSxHQUFXLEVBQUUsR0FBUTtRQUNyRSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFD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YXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFVudHlwZWRGb3JtR3JvdXAsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IEJhc2VGaWVsZCwgQ29sU3BhblNpemVzRW51bSwgRmllbGRUeXBlRW51bSB9IGZyb20gXCIuLi9tb2RlbHMvYmFzZUZpZWxkLm1vZGVsXCI7XHJcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiLi4vbW9kZWxzL2NvbnRleHQubW9kZWxcIjtcclxuaW1wb3J0IHsgRW5kUG9pbnRDb25maWd1cmF0aW9uLCBFbmRQb2ludERhdGEsIEVuZFBvaW50RGF0YVBhcmFtcywgUGFyYW1UeXBlRW51bSwgUmVxdWVzdE1ldGhvZEVudW0gfSBmcm9tIFwiLi4vbW9kZWxzL2VuZFBvaW50Q29uZmlndXJhdGlvbi5tb2RlbFwiO1xyXG5pbXBvcnQgeyBBdHRhY2htZW50RmllbGQgfSBmcm9tIFwiLi4vbW9kZWxzL2ZpZWxkcy9hdHRhY2htZW50RmllbGQubW9kZWxcIjtcclxuaW1wb3J0IHsgSW1hZ2VGaWVsZCB9IGZyb20gXCIuLi9tb2RlbHMvZmllbGRzL2ltYWdlRmllbGQubW9kZWxcIjtcclxuaW1wb3J0IHsgTGlzdFZhbHVlRmllbGQgfSBmcm9tIFwiLi4vbW9kZWxzL2ZpZWxkcy9saXN0VmFsdWVGaWVsZC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBUZXh0YXJlYUZpZWxkIH0gZnJvbSBcIi4uL21vZGVscy9maWVsZHMvdGV4dGFyZWFGaWVsZC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBUZXh0TWFza0VudW0sIFRleHRGaWVsZCwgVXJsUmVnZXgsIFRlbFJlZ2V4IH0gZnJvbSBcIi4uL21vZGVscy9maWVsZHMvdGV4dEZpZWxkLm1vZGVsXCI7XHJcbmltcG9ydCB7IEZvcm0gfSBmcm9tIFwiLi4vbW9kZWxzL2Zvcm0ubW9kZWxcIjtcclxuaW1wb3J0IHsgUmVjb3JkIH0gZnJvbSBcIi4uL21vZGVscy9yZWNvcmQubW9kZWxcIjtcclxuaW1wb3J0IHsgQXJyYXlWYWxpZGF0b3JzIH0gZnJvbSBcIi4vY3VzdG9tLWZvcm0tdmFsaWRhdG9ycy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEVxcER5bmFtaWNNb2R1bGVEaWFsb2dTZXJ2aWNlIH0gZnJvbSBcIi4vZXFwLWR5bmFtaWMtbW9kdWxlLWRpYWxvZy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFNwaW5uZXJTZXJ2aWNlIH0gZnJvbSBcIi4vc3Bpbm5lci5zZXJ2aWNlXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFV0aWxpdHlIZWxwZXJTZXJ2aWNlIHtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGNvbnRleHQ6IENvbnRleHQgPSBuZXcgQ29udGV4dCgpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcclxuICAgICAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICAgICAgcHJpdmF0ZSBzcGlubmVyU2VydmljZTogU3Bpbm5lclNlcnZpY2VcclxuICAgICkge1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgRXZhbHVhdGVGaWVsZEZvcm11bGEoZm9ybXVsYTogc3RyaW5nLCByZWM6IFJlY29yZCwgY3R4OiBhbnkpOiBhbnkge1xyXG4gICAgICAgIGNvbnN0IGV2YWx1YXRlZFZhbHVlID0gZXZhbChmb3JtdWxhKTtcclxuICAgICAgICByZXR1cm4gKGV2YWx1YXRlZFZhbHVlID8gZXZhbHVhdGVkVmFsdWUgOiBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFNldENvbnRleHQoY3R4OiBDb250ZXh0KSB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY3R4O1xyXG4gICAgfVxyXG4gICAgcHVibGljIHN0YXRpYyBpc051bWVyaWMobikge1xyXG4gICAgICAgIHJldHVybiAhaXNOYU4obik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBHZXRGaWVsZFR5cGUoZmllbGQ6IEJhc2VGaWVsZCkge1xyXG4gICAgICAgIHN3aXRjaCAoZmllbGQuRmllbGRUeXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkNhbXBvIGRpIHRlc3RvXCJdOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0OiBUZXh0RmllbGQgPSBPYmplY3QuYXNzaWduKG5ldyBUZXh0RmllbGQsIGZpZWxkKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGVmYXVsdDoge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gcGVyIGltcG9zdGFyZSBpIHZhbG9yaSBkYSBzdWdnZXJpcmUgbmVsbCdhdXRvY29tcGxldGUgcGVyIGkgY2FtcGkgaW4gY3VpIGwndXRlbnRlIGRldmUgc2NyaXZlcmUgY29tYW5kaSBqYXZhc2NyaXB0LlxyXG4gICAgICogSW4gYmFzZSBhbGwndWx0aW1vIGNhcmF0dGVyZSBkaWdpdGF0byB2aWVuZSBpbXBvc3RhdG8gdW4gZWxlbmNvIGRpIG9nZ2V0dGkgbyBwcm9wcmlldMOgIGNoZSBsJ3V0ZW50ZSBoYSBhIGRpc3Bvc2l6aW9uZSBpbiBxdWVsIG1vbWVudG8uXHJcbiAgICAgKiBAcGFyYW0gZmllbGRzIEFycmF5IGRpIEJhc2VGaWVsZCBhZ2dpdW50aSBhbGxhIEZvcm1cclxuICAgICAqIEBwYXJhbSB0eXBlZEZvcm11bGEgU3RyaW5nYSBkaWdpdGF0YSBkYWxsJ3V0ZW50ZVxyXG4gICAgICogQHN1bW1hcnkgSWwgbWV0b2RvIGltcG9zdGEgaSBzdWdnZXJpbWVudGkgYmFzYW5kb3NpIHN1IDMgY2FzaTpcclxuICAgICAqICAxKSBsJ3V0ZW50ZSBub24gaGEgZGlnaXRhdG8gbnVsbGEgbyBsYSBzdHJpbmdhIGRpZ2l0YXRhIGRhbGwndXRlbnRlIGZpbmlzY2UgY29uIHVubyBzcGF6aW8gdnVvdG9cclxuICAgICAqICAyKSBsYSBzdHJpbmdhIGRpZ2l0YXRhIGRhbGwndXRlbnRlIGZpbmlzY2UgY29uIHVuIFwiLlwiXHJcbiAgICAgKiAgMykgbGEgc3RyaW5nYSBkaWdpdGF0YSBkYWxsJ3V0ZW50ZSBub24gY29pbmNpZGUgY29uIG5lc3N1biBhbHRybyBjYXNvIHNvcHJhIChmaW5pc2NlIGNvbiB1biBjYXJhdHRlcmUgcXVhbHVucXVlKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIEdldEF1dG9jb21wbGV0ZU9wdGlvbnMoZmllbGRzOiBBcnJheTxCYXNlRmllbGQ+LCB0eXBlZEZvcm11bGE6IHN0cmluZyk6IEFycmF5PHsgbGFiZWw6IHN0cmluZywgdmFsdWU6IHN0cmluZyB9PiB7XHJcblxyXG4gICAgICAgIGxldCBhdXRvY29tcGxldGVPcHRpb25zOiBBcnJheTx7IGxhYmVsOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfT4gPSBbXTtcclxuXHJcbiAgICAgICAgLy8gUmVjdXBlcm8gaSBub21pIGRpIHR1dHRpIGkgY2FtcGkgY3JlYXRpIGZpbm8gYWQgb3JhIG5lbGxhIGZvcm0uXHJcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlUmVjUHJvcGVydGllczogQXJyYXk8c3RyaW5nPiA9IGZpZWxkcy5tYXAoZiA9PiBmLkxhYmVsLnNwbGl0KCcgJykuam9pbignXycpKTtcclxuXHJcbiAgICAgICAgLy8gTmVsIGNhc2kgaW4gY3VpIGwndXRlbnRlIG5vbiBoYSBpbnNlcml0byBudWxsYSBvcHB1cmUgbGEgc3RyaW5nYSBmaW5pc2NlIGNvbiB1bm8gc3BhemlvIHZ1b3RvIG8gdW4gc2ltYm9sbyBkaXZlcnNvIGRhIFwiLlwiXHJcbiAgICAgICAgLy8gKHVuIGNhcmF0dGVyZSBub24gYWxmYW51bWVyaWNvKSBpbXBvc3RvIGNvbWUgc3VnZ2VyaW1lbnRpIHNvbG8gXCJyZWNcIiBlIFwiY3R4XCIsIG92dmVybyBnbGkgdW5pY2kgZHVlIG9nZ2V0dGkgYSBjdWkgbCd1dGVudGUgaGEgYWNjZXNzby5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICF0eXBlZEZvcm11bGEgfHxcclxuICAgICAgICAgICAgKFxyXG4gICAgICAgICAgICAgICAgIXR5cGVkRm9ybXVsYS5lbmRzV2l0aChcIi5cIilcclxuICAgICAgICAgICAgICAgICYmIG5ldyBSZWdFeHAoXCJbXjAtOWEtekEtWl9dXCIpLnRlc3QodHlwZWRGb3JtdWxhLnN1YnN0cmluZyh0eXBlZEZvcm11bGEubGVuZ3RoIC0gMSwgdHlwZWRGb3JtdWxhLmxlbmd0aCkpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlT3B0aW9ucyA9IFtcclxuICAgICAgICAgICAgICAgIHsgbGFiZWw6IFwicmVjXCIsIHZhbHVlOiAodHlwZWRGb3JtdWxhID8gdHlwZWRGb3JtdWxhIDogJycpICsgXCJyZWNcIiB9LFxyXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogXCJjdHhcIiwgdmFsdWU6ICh0eXBlZEZvcm11bGEgPyB0eXBlZEZvcm11bGEgOiAnJykgKyBcImN0eFwiIH1cclxuICAgICAgICAgICAgXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gU2UgbGEgc3RyaW5nYSBmaW5pc2NlIGNvbiB1biBcIi5cIiB2dW9sIGRpcmUgY2hlIGwndXRlbnRlIHN0YSBjZXJjYW5kbyBkaSBhY2NlZGVyZSBhZCB1bmEgcHJvcHJpZXTDoCBkaSB1biBvZ2dldHRvXHJcbiAgICAgICAgLy8gYSBzdWEgZGlzcG9zaXppb25lLiBSZWN1cGVybyBpbCBub21lIGRlbGwndWx0aW1vIG9nZ2V0dG8gZGlnaXRhdG8gZGFsbCd1dGVudGUgZSBzZSBsJ29nZ2V0dG8gc2NlbHRvIMOoIFwicmVjXCIgbyBcImN0eFwiXHJcbiAgICAgICAgLy8gYWxsb3JhIHN1Z2dlcmlzY28gbGUgcHJvcHJpZXTDoCBjaGUgZXNpc3Rvbm8gYWxsJ2ludGVybm8gZGkgcXVlc3RpIG9nZ2V0dGkgYWx0cmltZW50aSBub24gbW9zdHJvIG51bGxhLlxyXG4gICAgICAgIGVsc2UgaWYgKHR5cGVkRm9ybXVsYS5lbmRzV2l0aChcIi5cIikpIHtcclxuICAgICAgICAgICAgY29uc3QgZm9ybXVsYVBpZWNlczogQXJyYXk8c3RyaW5nPiA9IHR5cGVkRm9ybXVsYS5zcGxpdChcIiBcIilbdHlwZWRGb3JtdWxhLnNwbGl0KFwiIFwiKS5sZW5ndGggLSAxXS5zcGxpdCgnLicpO1xyXG4gICAgICAgICAgICBpZiAoZm9ybXVsYVBpZWNlc1tmb3JtdWxhUGllY2VzLmxlbmd0aCAtIDJdID09PSBcInJlY1wiKSB7XHJcbiAgICAgICAgICAgICAgICBhdXRvY29tcGxldGVPcHRpb25zID0gYXZhaWxhYmxlUmVjUHJvcGVydGllcy5tYXAoZiA9PiB7IHJldHVybiB7IGxhYmVsOiBmLCB2YWx1ZTogdHlwZWRGb3JtdWxhICsgZiB9OyB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtdWxhUGllY2VzW2Zvcm11bGFQaWVjZXMubGVuZ3RoIC0gMl0gPT09IFwiY3R4XCIpIHtcclxuICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnMgPSBPYmplY3Qua2V5cyhVdGlsaXR5SGVscGVyU2VydmljZS5jb250ZXh0KS5tYXAoZiA9PiB7IHJldHVybiB7IGxhYmVsOiBmLCB2YWx1ZTogdHlwZWRGb3JtdWxhICsgZiB9OyB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtdWxhUGllY2VzLmxlbmd0aCA+IDIgJiYgZm9ybXVsYVBpZWNlc1tmb3JtdWxhUGllY2VzLmxlbmd0aCAtIDNdID09PSBcImN0eFwiICYmIGZvcm11bGFQaWVjZXNbZm9ybXVsYVBpZWNlcy5sZW5ndGggLSAyXSA9PT0gXCJVc2VyXCIpIHtcclxuICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnMgPSBPYmplY3Qua2V5cyhVdGlsaXR5SGVscGVyU2VydmljZS5jb250ZXh0LlVzZXIpLm1hcChmID0+IHsgcmV0dXJuIHsgbGFiZWw6IGYsIHZhbHVlOiB0eXBlZEZvcm11bGEgKyBmIH07IH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlT3B0aW9ucyA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEluIHR1dHRpIGdsaSBhbHRyaSBjYXNpLCBvdnZlcm8gcXVhbmRvIGxhIHN0cmluZ2EgZGlnaXRhdGEgZmluaXNjZSBjb24gdW4gY2FyYXR0ZXJlIGRpdmVyc28gZGEgcXVlbGxpXHJcbiAgICAgICAgLy8gY29udHJvbGxhdGkgZmlub3JhLCB2dW9sIGRpcmUgY2hlIGwndXRlbnRlIHN0YSBkaWdpdGFudG8gaWwgbm9tZSBkaSB1biBvZ2dldHRvLCB1bmEgcHJvcHJpZXTDoCBvIHVuYVxyXG4gICAgICAgIC8vIGZ1bnppb25lIGphdmFzY3JpcHQuIENvbnRyb2xsbyBsYSBwYXJvbGEgY2hlIGwndXRlbnRlIHN0YSBkaWdpdGFuZG8gZSBzZSBmYSBwYXJ0ZSBkaSB1bm8gZGVnbGkgb2dnZXR0aSBhIGRpc3Bvc2l6aW9uZVxyXG4gICAgICAgIC8vIG8gdW5hIHByb3ByaWV0w6AgZGkgZXNzaSBhbGxvcmEgc3VnZ2VyaXNjbyBpIHBvc3NpYmlsaSBtYXRjaC5cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgYXZhaWxhYmxlT3B0aW9uczogQXJyYXk8eyBsYWJlbDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIH0+ID0gW107XHJcblxyXG4gICAgICAgICAgICAvLyBQcmVuZG8gdHV0dGkgaSBibG9jY2hpIGRpIGNhcmF0dGVyaSBkaWdpdGF0aSBkYWxsJ3V0ZW50ZVxyXG4gICAgICAgICAgICBjb25zdCBhbGxGb3JtdWxhV29yZHM6IEFycmF5PHN0cmluZz4gPSB0eXBlZEZvcm11bGEuc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgICAgICAvLyBQcmVuZG8gbCd1bHRpbW8gYmxvY2NvIGRpIGNhcmF0dGVyaSBkaWdpdGF0byBkYWxsJ3V0ZW50ZVxyXG4gICAgICAgICAgICBjb25zdCBsYXN0VHlwZWRTdHJpbmc6IHN0cmluZyA9IGFsbEZvcm11bGFXb3Jkc1thbGxGb3JtdWxhV29yZHMubGVuZ3RoIC0gMV07XHJcblxyXG4gICAgICAgICAgICAvLyBTZSBsYSBsJ3VsdGltYSBzdHJpbmdhIGRpZ2l0YXRhIG5vbiBjb250aWVuZSBjYXJhdHRlcmkgc3BlY2lhbGkgYWxsb3JhIHNwbGl0dG8gbGEgc3RyaW5nYVxyXG4gICAgICAgICAgICAvLyBzdWkgXCIuXCIgZSBpbXBvc3RvIGkgc3VnZ2VyaW1lbnRpIGluIGJhc2UgYWwgcGF0aCBkZWxsYSBwcm9ycGlldMOgIGNoZSBzaSBzdGEgZGlnaXRhbmRvLlxyXG4gICAgICAgICAgICBpZiAoIW5ldyBSZWdFeHAoXCJbXjAtOWEtekEtWl8uXVwiKS50ZXN0KGxhc3RUeXBlZFN0cmluZykpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5UGF0aCA9IGxhc3RUeXBlZFN0cmluZy5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0VHlwZWRXb3JrID0gcHJvcGVydHlQYXRoW3Byb3BlcnR5UGF0aC5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvcGVydGllc1RvQ2hlY2s6IEFycmF5PHN0cmluZz4gPSBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlQYXRoLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc1RvQ2hlY2sgPSBbXCJyZWNcIiwgXCJjdHhcIl07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5UGF0aC5sZW5ndGggPiAxICYmIHByb3BlcnR5UGF0aFtwcm9wZXJ0eVBhdGgubGVuZ3RoIC0gMl0gPT09IFwiY3R4XCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzVG9DaGVjayA9IE9iamVjdC5rZXlzKFV0aWxpdHlIZWxwZXJTZXJ2aWNlLmNvbnRleHQpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eVBhdGgubGVuZ3RoID4gMiAmJiBwcm9wZXJ0eVBhdGhbcHJvcGVydHlQYXRoLmxlbmd0aCAtIDNdID09PSBcImN0eFwiICYmIHByb3BlcnR5UGF0aFtwcm9wZXJ0eVBhdGgubGVuZ3RoIC0gMl0gPT09IFwiVXNlclwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc1RvQ2hlY2sgPSBPYmplY3Qua2V5cyhVdGlsaXR5SGVscGVyU2VydmljZS5jb250ZXh0LlVzZXIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eVBhdGgubGVuZ3RoID4gMSAmJiBwcm9wZXJ0eVBhdGhbcHJvcGVydHlQYXRoLmxlbmd0aCAtIDJdID09PSBcInJlY1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc1RvQ2hlY2sgPSBhdmFpbGFibGVSZWNQcm9wZXJ0aWVzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIEVzZWd1byBpbCBjb250cm9sbG8gc3VsbGUgcHJvcHJpZXTDoCByZWN1cGVyYXRlLCBhZ2dpdW5nbyBhaSBzdWdnZXJpbWVudGkgdHV0dGkgaSBub21pIGNoZSBpbml6aWFubyBjb25cclxuICAgICAgICAgICAgICAgIC8vIHF1ZWxsbyBjaGUgc3RhIGRpZ2l0YW5kbyBsJ3V0ZW50ZS5cclxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXNUb0NoZWNrLmZvckVhY2gocHJvcCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3Auc3RhcnRzV2l0aChsYXN0VHlwZWRXb3JrKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVPcHRpb25zLnB1c2goeyBsYWJlbDogcHJvcCwgdmFsdWU6IHR5cGVkRm9ybXVsYSArIHByb3Auc3Vic3RyaW5nKGxhc3RUeXBlZFdvcmsubGVuZ3RoLCBwcm9wLmxlbmd0aCkgfSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlT3B0aW9ucyA9IGF2YWlsYWJsZU9wdGlvbnM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYXV0b2NvbXBsZXRlT3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldG9kbyBpbnZvY2F0byBkYWxsJ2h0bWwgcGVyIGltcG9zdGFyZSBsZSBjbGFzc2kgY3NzIHBlciB2aXN1YWxpenphcmUgaWwgY2FtcG8gYWxsJ2ludGVybm8gZGVsbGEgZm9ybS5cclxuICAgICAqIFNlIHBlciBpbCBmaWVsZCBzb25vIHN0YXRlIHNwZWNpZmljYXRlIGRlbGxlIGNsYXNzaSBhbGxvcmEgdmVuZ29ubyBhcHBsY2F0ZSBxdWVsbGUsIGFsdHJpbWVudGkgdmVuZ29ubyB1c2F0ZVxyXG4gICAgICogZGVsbGUgY2xhc3NpIGRpIGRlZmF1bHQuXHJcbiAgICAgKiBAcGFyYW0gZmllbGQgQmFzZUZpZWxkIGRhIHZpc3VhbGl6emFyZS5cclxuICAgICAqIEByZXR1cm5zIFJlc3RpdHVpc2NlIHVuYSBzdHJpbmdhIGNvbnRlbmVudGUgbGUgY2xhc3NpIGNzcyBkYSBhcHBsaWNhcmUuXHJcbiAgICAgKi9cclxuICAgIGdldEZpZWxkU3lsZUNsYXNzKGZpZWxkOiBCYXNlRmllbGQpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmIChmaWVsZC5Db2xTcGFuU2l6ZXMgJiYgZmllbGQuQ29sU3BhblNpemVzLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgIHJldHVybiBmaWVsZC5Db2xTcGFuU2l6ZXMubWFwKHNpemUgPT4gQ29sU3BhblNpemVzRW51bVtzaXplXS50b1N0cmluZygpKS5qb2luKFwiIFwiKTtcclxuXHJcbiAgICAgICAgc3dpdGNoIChmaWVsZC5GaWVsZFR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiQ2FtcG8gZGkgdGVzdG9cIl06XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTQgY29sLWxnLTRcIjtcclxuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiQXJlYSBkaSB0ZXN0b1wiXTpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcImNvbC1zbS0xMiBjb2wtbWQtMTIgY29sLWxnLTEyXCI7XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkJvb2xlYW5vXCJdOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC00IGNvbC1sZy00IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIjtcclxuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiRGF0YSBlL28gb3JhXCJdOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC00IGNvbC1sZy00XCI7XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkNhbXBvIG51bWVyaWNvXCJdOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC00IGNvbC1sZy00XCI7XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkFsbGVnYXRvXCJdOlxyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIChmaWVsZCBhcyBBdHRhY2htZW50RmllbGQpLklzTXVsdGlBdHRhY2ggfHxcclxuICAgICAgICAgICAgICAgICAgICAoKGZpZWxkIGFzIEF0dGFjaG1lbnRGaWVsZCkuTWV0YWRhdGFGaWVsZHMgJiYgKGZpZWxkIGFzIEF0dGFjaG1lbnRGaWVsZCkuTWV0YWRhdGFGaWVsZHMubGVuZ3RoID4gMClcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcImNvbC1zbS0xMiBjb2wtbWQtMTIgY29sLWxnLTEyXCI7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcImNvbC1zbS0xMiBjb2wtbWQtNCBjb2wtbGctNFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJJbW1hZ2luZVwiXTpcclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAoZmllbGQgYXMgSW1hZ2VGaWVsZCkuQXR0YWNoRGVmaW5pdGlvbi5Jc011bHRpQXR0YWNoIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKChmaWVsZCBhcyBJbWFnZUZpZWxkKS5BdHRhY2hEZWZpbml0aW9uLk1ldGFkYXRhRmllbGRzICYmIChmaWVsZCBhcyBJbWFnZUZpZWxkKS5BdHRhY2hEZWZpbml0aW9uLk1ldGFkYXRhRmllbGRzLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTEyIGNvbC1sZy0xMlwiO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTQgY29sLWxnLTRcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiRWxlbmNvIGdlbmVyaWNvXCJdOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC00IGNvbC1sZy00XCI7XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkxvb2t1cFwiXTpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcImNvbC1zbS0xMiBjb2wtbWQtNCBjb2wtbGctNFwiO1xyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bJ0Zvcm0gZGkgZGV0dGFnbGlvJ106XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTEyIGNvbC1sZy0xMlwiO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldG9kbyBwZXIgY3JlYXJlIGlsIEZvcm1Hcm91cCBjaGUgcmFwcHJlc2VudGEgdW5hIEZvcm0gYSBwYXJ0aXJlIGRhaSBzdW9pIEJhc2VGaWVsZC5cclxuICAgICAqIEBwYXJhbSBmb3JtRmllbGRzIExpc3RhIGRlaSBCYXNlRmllbGQgY2hlIGNvbXBvbmdvbm8gbGEgZm9ybS5cclxuICAgICAqIEBwYXJhbSByZWNvcmQgT2dnZXR0byBkaSB0aXBvIFJlY29yZCBjaGUgY29udGllbmUgaSB2YWxvcmkgZGVpIGNhbXBpLlxyXG4gICAgICogQHBhcmFtIG9ubHlWaWV3IFNlIFRSVUUgZGlzYWJpbGl0YSBsYSBmb3JtIHBlciByZW5kZXJsYSBpbiBzb2xhIGxldHR1cmEuXHJcbiAgICAgKiBAcGFyYW0gaW5jbHVkZUN1cnJlbnRGb3JtSW5GaWVsZCBTZSBUUlVFIHBvcG9sYSBsYSBwcm9wcmlldMOgIEZvcm1Gb3JtR3JvdXAgYWxsJ2ludGVybm8gZGkgb2duaSBCYXNlRmllbGQgY29uIGlsIEZvcm1Hcm91cCBjb3JyZW50ZS5cclxuICAgICAqIEByZXR1cm5zIFJlc3RpdHVpc2NlIHVuIEZvcm1Hcm91cCByYXBwcmVzZW50YXRlIGxhIEZvcm0gYSBjdWkgYXBwYXJ0ZW5nb25vIGkgQmFzZUZpZWxkIHJpY2V2dXRpIGluIGlucHV0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQ3JlYXRlRm9ybUZvcm1Hcm91cChmb3JtRmllbGRzOiBBcnJheTxCYXNlRmllbGQ+LFxyXG4gICAgICAgIHJlY29yZDogUmVjb3JkLFxyXG4gICAgICAgIG9ubHlWaWV3ID0gZmFsc2UsXHJcbiAgICAgICAgaW5jbHVkZUN1cnJlbnRGb3JtSW5GaWVsZCA9IHRydWUpOiBVbnR5cGVkRm9ybUdyb3VwIHtcclxuICAgICAgICBjb25zdCBmb3JtRm9ybTogVW50eXBlZEZvcm1Hcm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoW10pO1xyXG4gICAgICAgIGZvcm1GaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgICAgICAgIGZvcm1Gb3JtLmFkZENvbnRyb2woZmllbGQuTmFtZSwgdGhpcy5jcmVhdGVGaWVsZEZvcm1Db250cm9sKGZpZWxkLCByZWNvcmQpKTtcclxuICAgICAgICAgICAgaWYgKGluY2x1ZGVDdXJyZW50Rm9ybUluRmllbGQpIHtcclxuICAgICAgICAgICAgICAgIGZpZWxkLkZvcm1Gb3JtR3JvdXAgPSBmb3JtRm9ybTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChvbmx5Vmlldykge1xyXG4gICAgICAgICAgICBmb3JtRm9ybS5kaXNhYmxlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZm9ybUZvcm07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGdW56aW9uZSBwZXIgY3JlYXJlIGUgYWdnaXVuZ2VyZSBhbCBGb3JtR3JvdXAgcmFwcHJlc2VudGFudGUgbGEgZm9ybSB1biBudW92byBGb3JtQ29udHJvbCBhIHBhcnRpcmUgZGEgdW4gRmllbGQuXHJcbiAgICAgKiBJbiBudW92byBGb3JtQ29udHJvbCBhdnLDoCBpbCBub21lIGRlbCBjYW1wbyBwYXNzYXRvIGUgdmVycmFubm8gaW1wb3N0YXRpIGkgVmFsaWRhdG9ycyBpbiBiYXNlIGFsIHRpcG8gZGVsIGNhbXBvIHN0ZXNzby5cclxuICAgICAqIEBwYXJhbSBmaWVsZCBCYXNlRmllbGQgcGVyIGN1aSBjcmVhcmUgaWwgRm9ybUNvbnRyb2wgZGEgaW5zZXJpcmUgbmVsIEZvcm1Hcm91cCBkZWxhIGZvcm0uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlRmllbGRGb3JtQ29udHJvbChmaWVsZDogQmFzZUZpZWxkLCByZWNvcmQ6IFJlY29yZCk6IEFic3RyYWN0Q29udHJvbCB7XHJcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yczogQXJyYXk8VmFsaWRhdG9yRm4+ID0gW107XHJcblxyXG4gICAgICAgIGlmIChmaWVsZC5SZXF1aXJlZClcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKGZpZWxkLkZpZWxkVHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJDYW1wbyBkaSB0ZXN0b1wiXTpcclxuICAgICAgICAgICAgICAgIGlmICgoZmllbGQgYXMgVGV4dEZpZWxkKS5NYXhMZW5naHQpIHsgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4TGVuZ3RoKChmaWVsZCBhcyBUZXh0RmllbGQpLk1heExlbmdodCkpOyB9XHJcbiAgICAgICAgICAgICAgICBpZiAoKGZpZWxkIGFzIFRleHRGaWVsZCkuTWluTGVuZ2h0KSB7IHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbkxlbmd0aCgoZmllbGQgYXMgVGV4dEZpZWxkKS5NaW5MZW5naHQpKTsgfVxyXG4gICAgICAgICAgICAgICAgc3dpdGNoICgoZmllbGQgYXMgVGV4dEZpZWxkKS5UZXh0TWFzaykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgVGV4dE1hc2tFbnVtLlVybDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucGF0dGVybihVcmxSZWdleCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFRleHRNYXNrRW51bS5FbWFpbDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMuZW1haWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFRleHRNYXNrRW51bS5UZWxlZm9ubzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucGF0dGVybihUZWxSZWdleCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJBcmVhIGRpIHRlc3RvXCJdOlxyXG4gICAgICAgICAgICAgICAgaWYgKChmaWVsZCBhcyBUZXh0YXJlYUZpZWxkKS5NYXhMZW5naHQpIHsgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4TGVuZ3RoKChmaWVsZCBhcyBUZXh0YXJlYUZpZWxkKS5NYXhMZW5naHQpKTsgfVxyXG4gICAgICAgICAgICAgICAgaWYgKChmaWVsZCBhcyBUZXh0YXJlYUZpZWxkKS5NaW5MZW5naHQpIHsgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWluTGVuZ3RoKChmaWVsZCBhcyBUZXh0YXJlYUZpZWxkKS5NaW5MZW5naHQpKTsgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bS5BbGxlZ2F0bzpcclxuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtLkltbWFnaW5lOlxyXG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLlJlcXVpcmVkKVxyXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChBcnJheVZhbGlkYXRvcnMubWluTGVuZ2h0KDEpKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bJ0VsZW5jbyBnZW5lcmljbyddOlxyXG4gICAgICAgICAgICAgICAgaWYgKChmaWVsZCBhcyBMaXN0VmFsdWVGaWVsZCkuSXNNdWx0aUNob2ljaGUpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLlJlcXVpcmVkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goQXJyYXlWYWxpZGF0b3JzLm1pbkxlbmdodCgxKSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgVW50eXBlZEZvcm1Db250cm9sKHJlY29yZFtmaWVsZC5OYW1lXSwgdmFsaWRhdG9ycyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gcGVyIGNvbmZpZ3VyYXJlIGdsaSBlbmRwb2ludCBkYSB1c2FyZSBkaSBkZWZhdWx0IGEgcGFydGlyZSBkYWxsJ3VybCBiYXNlIGRlbCBzZXJ2ZXJcclxuICAgICAqIGEgY3VpIHNpIGRldmUgY29ubmV0dGVyZSBlIGFsIHRva2VuIGRhIHBhc3NhcmUgcGVyIGF1dGVudGljYXJzaS5cclxuICAgICAqIEBwYXJhbSBiYXNlU2VydmVyVXJsIFN0cmluZ2EgZGVsbCd1cmwgYmFzZSBkZWwgc2VydmVyIChlczogXCJodHRwOi8vbG9jYWxob3N0OjUwMDBcIikuXHJcbiAgICAgKiBAcGFyYW0gdXNlclRva2VuIFRva2VuIGRlbGwndXRlbnRlIGxvZ2dhdG8gZGEgdXNhcmUgcGVyIGF1dGVudGljYXJzaSBzZSBuZWNlc3NhcmlvLlxyXG4gICAgICogQHJldHVybnMgUmVzaXR1aXNjZSBsYSBjb25maWd1cmF6aW9uZSBjb21wbGV0YSBkZWdsaSBlbmRQb2ludCBkYSB1c2FyZSBkaSBkZWZhdWx0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQ29uZmlndXJlRGVmYXVsdEVuZFBvaW50cyhiYXNlU2VydmVyVXJsOiBzdHJpbmcsIHVzZXJUb2tlbjogc3RyaW5nKTogRW5kUG9pbnRDb25maWd1cmF0aW9uIHtcclxuICAgICAgICBsZXQgZW5kUG9pbnRDb25maWd1cmF0aW9uOiBFbmRQb2ludENvbmZpZ3VyYXRpb24gPSBuZXcgRW5kUG9pbnRDb25maWd1cmF0aW9uKCk7XHJcbiAgICAgICAgZW5kUG9pbnRDb25maWd1cmF0aW9uID0gbmV3IEVuZFBvaW50Q29uZmlndXJhdGlvbigpO1xyXG4gICAgICAgIGVuZFBvaW50Q29uZmlndXJhdGlvbi5SZWNvcmRzID0ge1xyXG4gICAgICAgICAgICBHZXRCeUZvcm1JREVuZFBvaW50OiB7XHJcbiAgICAgICAgICAgICAgICBVcmw6IGJhc2VTZXJ2ZXJVcmwgKyBcIi9hcGkvdjEvZ2V0YWxsXCIsXHJcbiAgICAgICAgICAgICAgICBUb2tlbjogdXNlclRva2VuLFxyXG4gICAgICAgICAgICAgICAgUmVxdWVzdE1ldGhvZDogUmVxdWVzdE1ldGhvZEVudW0uR0VULFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBHZXRCeUlERW5kUG9pbnQ6IHtcclxuICAgICAgICAgICAgICAgIFVybDogYmFzZVNlcnZlclVybCArIFwiL2FwaS92MS9nZXRCeUlEXCIsXHJcbiAgICAgICAgICAgICAgICBUb2tlbjogdXNlclRva2VuLFxyXG4gICAgICAgICAgICAgICAgUmVxdWVzdE1ldGhvZDogUmVxdWVzdE1ldGhvZEVudW0uR0VULFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBTYXZlRW5kUG9pbnQ6IHtcclxuICAgICAgICAgICAgICAgIFVybDogYmFzZVNlcnZlclVybCArIFwiL2FwaS92MS9zYXZlXCIsXHJcbiAgICAgICAgICAgICAgICBUb2tlbjogdXNlclRva2VuLFxyXG4gICAgICAgICAgICAgICAgUmVxdWVzdE1ldGhvZDogUmVxdWVzdE1ldGhvZEVudW0uUE9TVCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgRHVwbGljYXRlRW5kUG9pbnQ6IHtcclxuICAgICAgICAgICAgICAgIFVybDogYmFzZVNlcnZlclVybCArIFwiL2FwaS92MS9kdXBsaWNhdGVcIixcclxuICAgICAgICAgICAgICAgIFRva2VuOiB1c2VyVG9rZW4sXHJcbiAgICAgICAgICAgICAgICBSZXF1ZXN0TWV0aG9kOiBSZXF1ZXN0TWV0aG9kRW51bS5QT1NULFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBEZWxldGVFbmRQb2ludDoge1xyXG4gICAgICAgICAgICAgICAgVXJsOiBiYXNlU2VydmVyVXJsICsgXCIvYXBpL3YxL2RlbGV0ZVwiLFxyXG4gICAgICAgICAgICAgICAgVG9rZW46IHVzZXJUb2tlbixcclxuICAgICAgICAgICAgICAgIFJlcXVlc3RNZXRob2Q6IFJlcXVlc3RNZXRob2RFbnVtLkRFTEVURSxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbmRQb2ludENvbmZpZ3VyYXRpb24uRm9ybXMgPSB7XHJcbiAgICAgICAgICAgIEdldEJ5SURFbmRQb2ludDoge1xyXG4gICAgICAgICAgICAgICAgVXJsOiBiYXNlU2VydmVyVXJsICsgXCIvYXBpL2NvbmYvZm9ybVwiLFxyXG4gICAgICAgICAgICAgICAgVG9rZW46IHVzZXJUb2tlbixcclxuICAgICAgICAgICAgICAgIFJlcXVlc3RNZXRob2Q6IFJlcXVlc3RNZXRob2RFbnVtLkdFVCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgU2F2ZUVuZFBvaW50OiB7XHJcbiAgICAgICAgICAgICAgICBVcmw6IGJhc2VTZXJ2ZXJVcmwgKyBcIi9hcGkvY29uZi9mb3JtXCIsXHJcbiAgICAgICAgICAgICAgICBUb2tlbjogdXNlclRva2VuLFxyXG4gICAgICAgICAgICAgICAgUmVxdWVzdE1ldGhvZDogUmVxdWVzdE1ldGhvZEVudW0uUE9TVCxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZW5kUG9pbnRDb25maWd1cmF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0b2RvIGNoZSBkYXRhIGxhIGNvbmZpZ3VyYXppb25lIGRpIHVuIGVuZHBvaW50IGNvc3RydWlzY2UgbCd1cmwgZGEgY2hpYW1hcmUsIGdsaSBldmVudHVhbGkgcGFyYW1ldHJpXHJcbiAgICAgKiBkYSBwYXNzYXJlIChuZWwgYm9keSBvIG5lbGxhIHJvdHRhKSBlZCBlZmZldHR1YSBsYSBjaGlhbWF0YS4gQWwgdGVybWluZSBkZWxsYSBjaGlhbWF0YSBlc2VndWUgbGUgZXZlbnR1YWxpXHJcbiAgICAgKiBmdW56aW9uaSBkaSBjYWxsYmFjayAoc2lhIGluIGNhc28gZGkgc3VjY2Vzc28gY2hlIGluIGNhc28gZGkgZXJyb3JlKSBwYXNzYXRlIGluIGlucHV0LlxyXG4gICAgICogQHBhcmFtIGVuZFBvaW50RGF0YSBDb2ZpZ3VyYXppb25lIGRlbGwnZW5kcG9pbnQgZGEgY2hpYW1hcmUuXHJcbiAgICAgKiBAcGFyYW0gZHluYW1pY01vZHVsZVBhcmFtcyBBcnJheSBkZWkgcGFyYW1ldHJpIGFnZ2l1bnRpIGRhbCBtb2R1bG8gZGluYW1pY28gYSBxdWVsbGkgZ2nDoCBjb25maWd1cmF0aVxyXG4gICAgICogKGFkIGVzZW1waW8gaWwgcmVjb3JkIG8gbGEgZm9ybSBkYSBzYWx2YXJlIG9wcHVyZSBsJ0lEIHBlciByZWN1cGVyYXJlIHVuYSBwYXJ0aWNvbGFyZSBlbnRpdMOgKS5cclxuICAgICAqIEBwYXJhbSBjYWxsYmFjayBNZXRvZG8gZGEgZXNlZ3VpcmUgaW4gY2FzbyBkaSBzdWNjZXNzbyBkb3BvIGxhIGNoaWFtYXRhIGh0dHAuXHJcbiAgICAgKiBOT1RBOiBpbiBpbnB1dCB2aWVuZSBwYXNzYXRhIGxhIHJpc3Bvc3RhIGRlbGxhIGNoaWFtYXRhIHN0ZXNzYS5cclxuICAgICAqIEBwYXJhbSBlcnJvckNhbGxCYWNrIE1ldG9kbyBkYSBlc2VndWlyZSBpbiBjYXNvIGRpIGVycm9yZSBkb3BvIGxhIGNoaWFtYXRhIGh0dHAuXHJcbiAgICAgKiBOT1RBOiBpbiBpbnB1dCB2aWVuZSBwYXNzYXRvIGwnZXJyb3JlIGdlbmVyYXRvIGRlbGxhIGNoaWFtYXRhIHN0ZXNzYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIFJ1bkVuZFBvaW50Q2FsbChcclxuICAgICAgICBlbmRQb2ludERhdGE6IEVuZFBvaW50RGF0YSxcclxuICAgICAgICBkeW5hbWljTW9kdWxlUGFyYW1zOiBBcnJheTxFbmRQb2ludERhdGFQYXJhbXM+ID0gbnVsbCxcclxuICAgICAgICBjYWxsYmFjazogKGU6IEZvcm0gfCBSZWNvcmQgfCBBcnJheTxSZWNvcmQ+KSA9PiB2b2lkID0gbnVsbCxcclxuICAgICAgICBlcnJvckNhbGxCYWNrOiAoZXJyOiB1bmtub3duKSA9PiB2b2lkID0gbnVsbFxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5hZGRSZXF1ZXN0Q291bnRlcigpO1xyXG5cclxuICAgICAgICBsZXQgdXJsID0gYCR7ZW5kUG9pbnREYXRhLlVybH1gO1xyXG4gICAgICAgIGxldCBxdWVyeVBhcmFtczogc3RyaW5nID0gbnVsbDtcclxuICAgICAgICBjb25zdCBib2R5UGFyYW1zID0ge1xyXG4gICAgICAgICAgICBBZGRpdGlvbmFsUGFyYW1zOiB7fVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vIFNlIG5lbGxhIGNvbmZpZ3VyYXppb25lIHNvbm8gc3RhdGkgZGVmaW5pdGkgcGFyYW1ldHJpIGRhIGFnZ2l1bmdlcmUgYWxsYSBjaGlhbWF0YSBxdWVzdGkgdmVuZ29ubyBjaWNsYXRpXHJcbiAgICAgICAgLy8gZSBhZ2dpdW50aSBuZWwgcHVudG8gaW4gY3VpIGRldm9ubyBlc3NlcmUgdXNhdGkuXHJcbiAgICAgICAgaWYgKGVuZFBvaW50RGF0YS5QYXJhbXMpIHtcclxuICAgICAgICAgICAgZW5kUG9pbnREYXRhLlBhcmFtcy5mb3JFYWNoKHAgPT4ge1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChwLlBhcmFtVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUGFyYW1UeXBlRW51bVsnUXVlcnkgcGFyYW0nXToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmdQYXJhbTogc3RyaW5nID0gcC5QYXJhbU5hbWUgKyBcIj1cIiArIHAuUGFyYW1WYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXMgPSAocXVlcnlQYXJhbXMgPT0gbnVsbCA/IFwiXCIgOiBxdWVyeVBhcmFtcyArIFwiJlwiKSArIHN0cmluZ1BhcmFtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBQYXJhbVR5cGVFbnVtWydJbiByb3V0ZSddOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHVybCArICh1cmwuZW5kc1dpdGgoXCIvXCIpID8gXCJcIiA6IFwiL1wiKSArIHAuUGFyYW1WYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUGFyYW1UeXBlRW51bVsnSW4gQm9keSddOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlQYXJhbXMuQWRkaXRpb25hbFBhcmFtc1twLlBhcmFtTmFtZV0gPSBwLlBhcmFtVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTZSBzb25vIHN0YXRpIHBhc3NhdGkgcGFyYW1ldHJpIGRhIGFnZ2l1bmdlcmUgYWxsYSBjaGlhbWF0YSBkZWZpbml0aSBhbGwnaW50ZXJubyBkZWwgbW9kdWxvIGRpbmFtaWNvXHJcbiAgICAgICAgLy8gdmVuZ29ubyBjaWNsYXRpIGUgYWdnaXVudGkgbmVsIHB1bnRvIGluIGN1aSBkZXZvbm8gZXNzZXJlIHVzYXRpIGRvcG8gcXVlbGxpIGRlZmluaXRpIG5lbGxhIGNvbmZpZ3VyYXppb25lLlxyXG4gICAgICAgIGlmIChkeW5hbWljTW9kdWxlUGFyYW1zKSB7XHJcbiAgICAgICAgICAgIGR5bmFtaWNNb2R1bGVQYXJhbXMuZm9yRWFjaChwID0+IHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAocC5QYXJhbVR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFBhcmFtVHlwZUVudW1bJ1F1ZXJ5IHBhcmFtJ106IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nUGFyYW06IHN0cmluZyA9IHAuUGFyYW1OYW1lICsgXCI9XCIgKyBwLlBhcmFtVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zID0gKHF1ZXJ5UGFyYW1zID09IG51bGwgPyBcIlwiIDogcXVlcnlQYXJhbXMgKyBcIiZcIikgKyBzdHJpbmdQYXJhbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUGFyYW1UeXBlRW51bVsnSW4gcm91dGUnXToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSB1cmwgKyAodXJsLmVuZHNXaXRoKFwiL1wiKSA/IFwiXCIgOiBcIi9cIikgKyBwLlBhcmFtVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFBhcmFtVHlwZUVudW1bJ0luIEJvZHknXToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5UGFyYW1zW3AuUGFyYW1OYW1lXSA9IHAuUGFyYW1WYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHF1ZXJ5UGFyYW1zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdXJsID0gKHVybC5lbmRzV2l0aChcIi9cIikgPyB1cmwuc3Vic3RyaW5nKDAsIHVybC5sZW5ndGggLSAxKSA6IHVybCkgKyBcIj9cIiArIHF1ZXJ5UGFyYW1zO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5odHRwLnJlcXVlc3QoZW5kUG9pbnREYXRhLlJlcXVlc3RNZXRob2QsIHVybCwge1xyXG4gICAgICAgICAgICBoZWFkZXJzOiBlbmRQb2ludERhdGEuVG9rZW4gPyB7IEF1dGhvcml6YXRpb246IGVuZFBvaW50RGF0YS5Ub2tlbiB9IDogbnVsbCxcclxuICAgICAgICAgICAgYm9keTogIVtSZXF1ZXN0TWV0aG9kRW51bS5ERUxFVEUsIFJlcXVlc3RNZXRob2RFbnVtLkdFVF0uaW5jbHVkZXMoZW5kUG9pbnREYXRhLlJlcXVlc3RNZXRob2QpID8gYm9keVBhcmFtcyA6IG51bGxcclxuICAgICAgICB9KVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICAgICAgKHJlczogRm9ybSB8IFJlY29yZCB8IEFycmF5PFJlY29yZD4pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnJlbW92ZVJlcXVlc3RDb3VudGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UucmVtb3ZlUmVxdWVzdENvdW50ZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JDYWxsQmFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxCYWNrKGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgRXFwRHluYW1pY01vZHVsZURpYWxvZ1NlcnZpY2UuRXJyb3IoZXJyb3IubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgfVxyXG5cclxufVxyXG4iXX0=
390
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbGl0eUhlbHBlci5zZXJ2aWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL3NlcnZpY2VzL3V0aWxpdHlIZWxwZXIuc2VydmljZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQXVDLGtCQUFrQixFQUFpQyxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwSSxPQUFPLEVBQWEsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2xELE9BQU8sRUFBRSxxQkFBcUIsRUFBb0MsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFLbEosT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRy9GLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7Ozs7QUFNcEYsTUFBTSxPQUFPLG9CQUFvQjtJQUk3QixZQUNZLFdBQStCLEVBQy9CLElBQWdCLEVBQ2hCLGNBQThCO1FBRjlCLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQUMvQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtJQUUxQyxDQUFDO0lBRU0sTUFBTSxDQUFDLG9CQUFvQixDQUFDLE9BQWUsRUFBRSxHQUFXLEVBQUUsR0FBUTtRQUNyRSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFD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QUFhLEVBQUU7Z0JBQ2YsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3hCO1lBQ0QsNkJBQTZCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuRCxNQUFNLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQ0osQ0FBQztJQUNWLENBQUM7O0FBbFphLDRCQUFPLEdBQVksSUFBSSxPQUFPLEVBQUcsQ0FBQTtpSEFGdEMsb0JBQW9CO3FIQUFwQixvQkFBb0IsY0FGakIsTUFBTTsyRkFFVCxvQkFBb0I7a0JBSGhDLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtQ29udHJvbCwgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnMgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgQmFzZUZpZWxkLCBDb2xTcGFuU2l6ZXNFbnVtLCBGaWVsZFR5cGVFbnVtIH0gZnJvbSBcIi4uL21vZGVscy9iYXNlRmllbGQubW9kZWxcIjtcclxuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuLi9tb2RlbHMvY29udGV4dC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBFbmRQb2ludENvbmZpZ3VyYXRpb24sIEVuZFBvaW50RGF0YSwgRW5kUG9pbnREYXRhUGFyYW1zLCBQYXJhbVR5cGVFbnVtLCBSZXF1ZXN0TWV0aG9kRW51bSB9IGZyb20gXCIuLi9tb2RlbHMvZW5kUG9pbnRDb25maWd1cmF0aW9uLm1vZGVsXCI7XHJcbmltcG9ydCB7IEF0dGFjaG1lbnRGaWVsZCB9IGZyb20gXCIuLi9tb2RlbHMvZmllbGRzL2F0dGFjaG1lbnRGaWVsZC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBJbWFnZUZpZWxkIH0gZnJvbSBcIi4uL21vZGVscy9maWVsZHMvaW1hZ2VGaWVsZC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBMaXN0VmFsdWVGaWVsZCB9IGZyb20gXCIuLi9tb2RlbHMvZmllbGRzL2xpc3RWYWx1ZUZpZWxkLm1vZGVsXCI7XHJcbmltcG9ydCB7IFRleHRhcmVhRmllbGQgfSBmcm9tIFwiLi4vbW9kZWxzL2ZpZWxkcy90ZXh0YXJlYUZpZWxkLm1vZGVsXCI7XHJcbmltcG9ydCB7IFRleHRNYXNrRW51bSwgVGV4dEZpZWxkLCBVcmxSZWdleCwgVGVsUmVnZXggfSBmcm9tIFwiLi4vbW9kZWxzL2ZpZWxkcy90ZXh0RmllbGQubW9kZWxcIjtcclxuaW1wb3J0IHsgRm9ybSB9IGZyb20gXCIuLi9tb2RlbHMvZm9ybS5tb2RlbFwiO1xyXG5pbXBvcnQgeyBSZWNvcmQgfSBmcm9tIFwiLi4vbW9kZWxzL3JlY29yZC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBBcnJheVZhbGlkYXRvcnMgfSBmcm9tIFwiLi9jdXN0b20tZm9ybS12YWxpZGF0b3JzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgRXFwRHluYW1pY01vZHVsZURpYWxvZ1NlcnZpY2UgfSBmcm9tIFwiLi9lcXAtZHluYW1pYy1tb2R1bGUtZGlhbG9nLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU3Bpbm5lclNlcnZpY2UgfSBmcm9tIFwiLi9zcGlubmVyLnNlcnZpY2VcIjtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVXRpbGl0eUhlbHBlclNlcnZpY2Uge1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgY29udGV4dDogQ29udGV4dCA9IG5ldyBDb250ZXh0KCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyLFxyXG4gICAgICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgICAgICBwcml2YXRlIHNwaW5uZXJTZXJ2aWNlOiBTcGlubmVyU2VydmljZVxyXG4gICAgKSB7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBFdmFsdWF0ZUZpZWxkRm9ybXVsYShmb3JtdWxhOiBzdHJpbmcsIHJlYzogUmVjb3JkLCBjdHg6IGFueSk6IGFueSB7XHJcbiAgICAgICAgY29uc3QgZXZhbHVhdGVkVmFsdWUgPSBldmFsKGZvcm11bGEpO1xyXG4gICAgICAgIHJldHVybiAoZXZhbHVhdGVkVmFsdWUgPyBldmFsdWF0ZWRWYWx1ZSA6IG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgU2V0Q29udGV4dChjdHg6IENvbnRleHQpIHtcclxuICAgICAgICB0aGlzLmNvbnRleHQgPSBjdHg7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc3RhdGljIGlzTnVtZXJpYyhuKSB7XHJcbiAgICAgICAgcmV0dXJuICFpc05hTihuKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGluaXRTdHlsZXMoc3R5bGVjc3MpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHN0eWxlY3NzLnNwbGl0KFwiO1wiKS5yZWR1Y2UoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qga2V5cGFyID0gYi5zcGxpdChcIjpcIilcclxuICAgICAgICAgICAgaWYgKGtleXBhci5sZW5ndGggPiAxKVxyXG4gICAgICAgICAgICAgIGFba2V5cGFyWzBdLnRyaW0oKV0gPSBrZXlwYXJbMV0udHJpbSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gYVxyXG4gICAgICAgICAgfSwge30pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgR2V0RmllbGRUeXBlKGZpZWxkOiBCYXNlRmllbGQpIHtcclxuICAgICAgICBzd2l0Y2ggKGZpZWxkLkZpZWxkVHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJDYW1wbyBkaSB0ZXN0b1wiXToge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdDogVGV4dEZpZWxkID0gT2JqZWN0LmFzc2lnbihuZXcgVGV4dEZpZWxkLCBmaWVsZCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0b2RvIHBlciBpbXBvc3RhcmUgaSB2YWxvcmkgZGEgc3VnZ2VyaXJlIG5lbGwnYXV0b2NvbXBsZXRlIHBlciBpIGNhbXBpIGluIGN1aSBsJ3V0ZW50ZSBkZXZlIHNjcml2ZXJlIGNvbWFuZGkgamF2YXNjcmlwdC5cclxuICAgICAqIEluIGJhc2UgYWxsJ3VsdGltbyBjYXJhdHRlcmUgZGlnaXRhdG8gdmllbmUgaW1wb3N0YXRvIHVuIGVsZW5jbyBkaSBvZ2dldHRpIG8gcHJvcHJpZXTDoCBjaGUgbCd1dGVudGUgaGEgYSBkaXNwb3NpemlvbmUgaW4gcXVlbCBtb21lbnRvLlxyXG4gICAgICogQHBhcmFtIGZpZWxkcyBBcnJheSBkaSBCYXNlRmllbGQgYWdnaXVudGkgYWxsYSBGb3JtXHJcbiAgICAgKiBAcGFyYW0gdHlwZWRGb3JtdWxhIFN0cmluZ2EgZGlnaXRhdGEgZGFsbCd1dGVudGVcclxuICAgICAqIEBzdW1tYXJ5IElsIG1ldG9kbyBpbXBvc3RhIGkgc3VnZ2VyaW1lbnRpIGJhc2FuZG9zaSBzdSAzIGNhc2k6XHJcbiAgICAgKiAgMSkgbCd1dGVudGUgbm9uIGhhIGRpZ2l0YXRvIG51bGxhIG8gbGEgc3RyaW5nYSBkaWdpdGF0YSBkYWxsJ3V0ZW50ZSBmaW5pc2NlIGNvbiB1bm8gc3BhemlvIHZ1b3RvXHJcbiAgICAgKiAgMikgbGEgc3RyaW5nYSBkaWdpdGF0YSBkYWxsJ3V0ZW50ZSBmaW5pc2NlIGNvbiB1biBcIi5cIlxyXG4gICAgICogIDMpIGxhIHN0cmluZ2EgZGlnaXRhdGEgZGFsbCd1dGVudGUgbm9uIGNvaW5jaWRlIGNvbiBuZXNzdW4gYWx0cm8gY2FzbyBzb3ByYSAoZmluaXNjZSBjb24gdW4gY2FyYXR0ZXJlIHF1YWx1bnF1ZSlcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBHZXRBdXRvY29tcGxldGVPcHRpb25zKGZpZWxkczogQXJyYXk8QmFzZUZpZWxkPiwgdHlwZWRGb3JtdWxhOiBzdHJpbmcpOiBBcnJheTx7IGxhYmVsOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfT4ge1xyXG5cclxuICAgICAgICBsZXQgYXV0b2NvbXBsZXRlT3B0aW9uczogQXJyYXk8eyBsYWJlbDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIH0+ID0gW107XHJcblxyXG4gICAgICAgIC8vIFJlY3VwZXJvIGkgbm9taSBkaSB0dXR0aSBpIGNhbXBpIGNyZWF0aSBmaW5vIGFkIG9yYSBuZWxsYSBmb3JtLlxyXG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZVJlY1Byb3BlcnRpZXM6IEFycmF5PHN0cmluZz4gPSBmaWVsZHMubWFwKGYgPT4gZi5MYWJlbC5zcGxpdCgnICcpLmpvaW4oJ18nKSk7XHJcblxyXG4gICAgICAgIC8vIE5lbCBjYXNpIGluIGN1aSBsJ3V0ZW50ZSBub24gaGEgaW5zZXJpdG8gbnVsbGEgb3BwdXJlIGxhIHN0cmluZ2EgZmluaXNjZSBjb24gdW5vIHNwYXppbyB2dW90byBvIHVuIHNpbWJvbG8gZGl2ZXJzbyBkYSBcIi5cIlxyXG4gICAgICAgIC8vICh1biBjYXJhdHRlcmUgbm9uIGFsZmFudW1lcmljbykgaW1wb3N0byBjb21lIHN1Z2dlcmltZW50aSBzb2xvIFwicmVjXCIgZSBcImN0eFwiLCBvdnZlcm8gZ2xpIHVuaWNpIGR1ZSBvZ2dldHRpIGEgY3VpIGwndXRlbnRlIGhhIGFjY2Vzc28uXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAhdHlwZWRGb3JtdWxhIHx8XHJcbiAgICAgICAgICAgIChcclxuICAgICAgICAgICAgICAgICF0eXBlZEZvcm11bGEuZW5kc1dpdGgoXCIuXCIpXHJcbiAgICAgICAgICAgICAgICAmJiBuZXcgUmVnRXhwKFwiW14wLTlhLXpBLVpfXVwiKS50ZXN0KHR5cGVkRm9ybXVsYS5zdWJzdHJpbmcodHlwZWRGb3JtdWxhLmxlbmd0aCAtIDEsIHR5cGVkRm9ybXVsYS5sZW5ndGgpKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnMgPSBbXHJcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiBcInJlY1wiLCB2YWx1ZTogKHR5cGVkRm9ybXVsYSA/IHR5cGVkRm9ybXVsYSA6ICcnKSArIFwicmVjXCIgfSxcclxuICAgICAgICAgICAgICAgIHsgbGFiZWw6IFwiY3R4XCIsIHZhbHVlOiAodHlwZWRGb3JtdWxhID8gdHlwZWRGb3JtdWxhIDogJycpICsgXCJjdHhcIiB9XHJcbiAgICAgICAgICAgIF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFNlIGxhIHN0cmluZ2EgZmluaXNjZSBjb24gdW4gXCIuXCIgdnVvbCBkaXJlIGNoZSBsJ3V0ZW50ZSBzdGEgY2VyY2FuZG8gZGkgYWNjZWRlcmUgYWQgdW5hIHByb3ByaWV0w6AgZGkgdW4gb2dnZXR0b1xyXG4gICAgICAgIC8vIGEgc3VhIGRpc3Bvc2l6aW9uZS4gUmVjdXBlcm8gaWwgbm9tZSBkZWxsJ3VsdGltbyBvZ2dldHRvIGRpZ2l0YXRvIGRhbGwndXRlbnRlIGUgc2UgbCdvZ2dldHRvIHNjZWx0byDDqCBcInJlY1wiIG8gXCJjdHhcIlxyXG4gICAgICAgIC8vIGFsbG9yYSBzdWdnZXJpc2NvIGxlIHByb3ByaWV0w6AgY2hlIGVzaXN0b25vIGFsbCdpbnRlcm5vIGRpIHF1ZXN0aSBvZ2dldHRpIGFsdHJpbWVudGkgbm9uIG1vc3RybyBudWxsYS5cclxuICAgICAgICBlbHNlIGlmICh0eXBlZEZvcm11bGEuZW5kc1dpdGgoXCIuXCIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZvcm11bGFQaWVjZXM6IEFycmF5PHN0cmluZz4gPSB0eXBlZEZvcm11bGEuc3BsaXQoXCIgXCIpW3R5cGVkRm9ybXVsYS5zcGxpdChcIiBcIikubGVuZ3RoIC0gMV0uc3BsaXQoJy4nKTtcclxuICAgICAgICAgICAgaWYgKGZvcm11bGFQaWVjZXNbZm9ybXVsYVBpZWNlcy5sZW5ndGggLSAyXSA9PT0gXCJyZWNcIikge1xyXG4gICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlT3B0aW9ucyA9IGF2YWlsYWJsZVJlY1Byb3BlcnRpZXMubWFwKGYgPT4geyByZXR1cm4geyBsYWJlbDogZiwgdmFsdWU6IHR5cGVkRm9ybXVsYSArIGYgfTsgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybXVsYVBpZWNlc1tmb3JtdWxhUGllY2VzLmxlbmd0aCAtIDJdID09PSBcImN0eFwiKSB7XHJcbiAgICAgICAgICAgICAgICBhdXRvY29tcGxldGVPcHRpb25zID0gT2JqZWN0LmtleXMoVXRpbGl0eUhlbHBlclNlcnZpY2UuY29udGV4dCkubWFwKGYgPT4geyByZXR1cm4geyBsYWJlbDogZiwgdmFsdWU6IHR5cGVkRm9ybXVsYSArIGYgfTsgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybXVsYVBpZWNlcy5sZW5ndGggPiAyICYmIGZvcm11bGFQaWVjZXNbZm9ybXVsYVBpZWNlcy5sZW5ndGggLSAzXSA9PT0gXCJjdHhcIiAmJiBmb3JtdWxhUGllY2VzW2Zvcm11bGFQaWVjZXMubGVuZ3RoIC0gMl0gPT09IFwiVXNlclwiKSB7XHJcbiAgICAgICAgICAgICAgICBhdXRvY29tcGxldGVPcHRpb25zID0gT2JqZWN0LmtleXMoVXRpbGl0eUhlbHBlclNlcnZpY2UuY29udGV4dC5Vc2VyKS5tYXAoZiA9PiB7IHJldHVybiB7IGxhYmVsOiBmLCB2YWx1ZTogdHlwZWRGb3JtdWxhICsgZiB9OyB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnMgPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBJbiB0dXR0aSBnbGkgYWx0cmkgY2FzaSwgb3Z2ZXJvIHF1YW5kbyBsYSBzdHJpbmdhIGRpZ2l0YXRhIGZpbmlzY2UgY29uIHVuIGNhcmF0dGVyZSBkaXZlcnNvIGRhIHF1ZWxsaVxyXG4gICAgICAgIC8vIGNvbnRyb2xsYXRpIGZpbm9yYSwgdnVvbCBkaXJlIGNoZSBsJ3V0ZW50ZSBzdGEgZGlnaXRhbnRvIGlsIG5vbWUgZGkgdW4gb2dnZXR0bywgdW5hIHByb3ByaWV0w6AgbyB1bmFcclxuICAgICAgICAvLyBmdW56aW9uZSBqYXZhc2NyaXB0LiBDb250cm9sbG8gbGEgcGFyb2xhIGNoZSBsJ3V0ZW50ZSBzdGEgZGlnaXRhbmRvIGUgc2UgZmEgcGFydGUgZGkgdW5vIGRlZ2xpIG9nZ2V0dGkgYSBkaXNwb3NpemlvbmVcclxuICAgICAgICAvLyBvIHVuYSBwcm9wcmlldMOgIGRpIGVzc2kgYWxsb3JhIHN1Z2dlcmlzY28gaSBwb3NzaWJpbGkgbWF0Y2guXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZU9wdGlvbnM6IEFycmF5PHsgbGFiZWw6IHN0cmluZywgdmFsdWU6IHN0cmluZyB9PiA9IFtdO1xyXG5cclxuICAgICAgICAgICAgLy8gUHJlbmRvIHR1dHRpIGkgYmxvY2NoaSBkaSBjYXJhdHRlcmkgZGlnaXRhdGkgZGFsbCd1dGVudGVcclxuICAgICAgICAgICAgY29uc3QgYWxsRm9ybXVsYVdvcmRzOiBBcnJheTxzdHJpbmc+ID0gdHlwZWRGb3JtdWxhLnNwbGl0KFwiIFwiKTtcclxuICAgICAgICAgICAgLy8gUHJlbmRvIGwndWx0aW1vIGJsb2NjbyBkaSBjYXJhdHRlcmkgZGlnaXRhdG8gZGFsbCd1dGVudGVcclxuICAgICAgICAgICAgY29uc3QgbGFzdFR5cGVkU3RyaW5nOiBzdHJpbmcgPSBhbGxGb3JtdWxhV29yZHNbYWxsRm9ybXVsYVdvcmRzLmxlbmd0aCAtIDFdO1xyXG5cclxuICAgICAgICAgICAgLy8gU2UgbGEgbCd1bHRpbWEgc3RyaW5nYSBkaWdpdGF0YSBub24gY29udGllbmUgY2FyYXR0ZXJpIHNwZWNpYWxpIGFsbG9yYSBzcGxpdHRvIGxhIHN0cmluZ2FcclxuICAgICAgICAgICAgLy8gc3VpIFwiLlwiIGUgaW1wb3N0byBpIHN1Z2dlcmltZW50aSBpbiBiYXNlIGFsIHBhdGggZGVsbGEgcHJvcnBpZXTDoCBjaGUgc2kgc3RhIGRpZ2l0YW5kby5cclxuICAgICAgICAgICAgaWYgKCFuZXcgUmVnRXhwKFwiW14wLTlhLXpBLVpfLl1cIikudGVzdChsYXN0VHlwZWRTdHJpbmcpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eVBhdGggPSBsYXN0VHlwZWRTdHJpbmcuc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdFR5cGVkV29yayA9IHByb3BlcnR5UGF0aFtwcm9wZXJ0eVBhdGgubGVuZ3RoIC0gMV07XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHByb3BlcnRpZXNUb0NoZWNrOiBBcnJheTxzdHJpbmc+ID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5UGF0aC5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNUb0NoZWNrID0gW1wicmVjXCIsIFwiY3R4XCJdO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eVBhdGgubGVuZ3RoID4gMSAmJiBwcm9wZXJ0eVBhdGhbcHJvcGVydHlQYXRoLmxlbmd0aCAtIDJdID09PSBcImN0eFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc1RvQ2hlY2sgPSBPYmplY3Qua2V5cyhVdGlsaXR5SGVscGVyU2VydmljZS5jb250ZXh0KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlQYXRoLmxlbmd0aCA+IDIgJiYgcHJvcGVydHlQYXRoW3Byb3BlcnR5UGF0aC5sZW5ndGggLSAzXSA9PT0gXCJjdHhcIiAmJiBwcm9wZXJ0eVBhdGhbcHJvcGVydHlQYXRoLmxlbmd0aCAtIDJdID09PSBcIlVzZXJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNUb0NoZWNrID0gT2JqZWN0LmtleXMoVXRpbGl0eUhlbHBlclNlcnZpY2UuY29udGV4dC5Vc2VyKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlQYXRoLmxlbmd0aCA+IDEgJiYgcHJvcGVydHlQYXRoW3Byb3BlcnR5UGF0aC5sZW5ndGggLSAyXSA9PT0gXCJyZWNcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNUb0NoZWNrID0gYXZhaWxhYmxlUmVjUHJvcGVydGllcztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBFc2VndW8gaWwgY29udHJvbGxvIHN1bGxlIHByb3ByaWV0w6AgcmVjdXBlcmF0ZSwgYWdnaXVuZ28gYWkgc3VnZ2VyaW1lbnRpIHR1dHRpIGkgbm9taSBjaGUgaW5pemlhbm8gY29uXHJcbiAgICAgICAgICAgICAgICAvLyBxdWVsbG8gY2hlIHN0YSBkaWdpdGFuZG8gbCd1dGVudGUuXHJcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzVG9DaGVjay5mb3JFYWNoKHByb3AgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wLnN0YXJ0c1dpdGgobGFzdFR5cGVkV29yaykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3B0aW9ucy5wdXNoKHsgbGFiZWw6IHByb3AsIHZhbHVlOiB0eXBlZEZvcm11bGEgKyBwcm9wLnN1YnN0cmluZyhsYXN0VHlwZWRXb3JrLmxlbmd0aCwgcHJvcC5sZW5ndGgpIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnMgPSBhdmFpbGFibGVPcHRpb25zO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGF1dG9jb21wbGV0ZU9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gaW52b2NhdG8gZGFsbCdodG1sIHBlciBpbXBvc3RhcmUgbGUgY2xhc3NpIGNzcyBwZXIgdmlzdWFsaXp6YXJlIGlsIGNhbXBvIGFsbCdpbnRlcm5vIGRlbGxhIGZvcm0uXHJcbiAgICAgKiBTZSBwZXIgaWwgZmllbGQgc29ubyBzdGF0ZSBzcGVjaWZpY2F0ZSBkZWxsZSBjbGFzc2kgYWxsb3JhIHZlbmdvbm8gYXBwbGNhdGUgcXVlbGxlLCBhbHRyaW1lbnRpIHZlbmdvbm8gdXNhdGVcclxuICAgICAqIGRlbGxlIGNsYXNzaSBkaSBkZWZhdWx0LlxyXG4gICAgICogQHBhcmFtIGZpZWxkIEJhc2VGaWVsZCBkYSB2aXN1YWxpenphcmUuXHJcbiAgICAgKiBAcmV0dXJucyBSZXN0aXR1aXNjZSB1bmEgc3RyaW5nYSBjb250ZW5lbnRlIGxlIGNsYXNzaSBjc3MgZGEgYXBwbGljYXJlLlxyXG4gICAgICovXHJcbiAgICBnZXRGaWVsZFN5bGVDbGFzcyhmaWVsZDogQmFzZUZpZWxkKTogc3RyaW5nIHtcclxuICAgICAgICBpZiAoZmllbGQuQ29sU3BhblNpemVzICYmIGZpZWxkLkNvbFNwYW5TaXplcy5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICByZXR1cm4gZmllbGQuQ29sU3BhblNpemVzLm1hcChzaXplID0+IENvbFNwYW5TaXplc0VudW1bc2l6ZV0udG9TdHJpbmcoKSkuam9pbihcIiBcIik7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoZmllbGQuRmllbGRUeXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkNhbXBvIGRpIHRlc3RvXCJdOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC00IGNvbC1sZy00XCI7XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkFyZWEgZGkgdGVzdG9cIl06XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTEyIGNvbC1sZy0xMlwiO1xyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJCb29sZWFub1wiXTpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcImNvbC1zbS0xMiBjb2wtbWQtNCBjb2wtbGctNCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI7XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkRhdGEgZS9vIG9yYVwiXTpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcImNvbC1zbS0xMiBjb2wtbWQtNCBjb2wtbGctNFwiO1xyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJDYW1wbyBudW1lcmljb1wiXTpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcImNvbC1zbS0xMiBjb2wtbWQtNCBjb2wtbGctNFwiO1xyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJBbGxlZ2F0b1wiXTpcclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAoZmllbGQgYXMgQXR0YWNobWVudEZpZWxkKS5Jc011bHRpQXR0YWNoIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKChmaWVsZCBhcyBBdHRhY2htZW50RmllbGQpLk1ldGFkYXRhRmllbGRzICYmIChmaWVsZCBhcyBBdHRhY2htZW50RmllbGQpLk1ldGFkYXRhRmllbGRzLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTEyIGNvbC1sZy0xMlwiO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTQgY29sLWxnLTRcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiSW1tYWdpbmVcIl06XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgKGZpZWxkIGFzIEltYWdlRmllbGQpLkF0dGFjaERlZmluaXRpb24uSXNNdWx0aUF0dGFjaCB8fFxyXG4gICAgICAgICAgICAgICAgICAgICgoZmllbGQgYXMgSW1hZ2VGaWVsZCkuQXR0YWNoRGVmaW5pdGlvbi5NZXRhZGF0YUZpZWxkcyAmJiAoZmllbGQgYXMgSW1hZ2VGaWVsZCkuQXR0YWNoRGVmaW5pdGlvbi5NZXRhZGF0YUZpZWxkcy5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC0xMiBjb2wtbGctMTJcIjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC00IGNvbC1sZy00XCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkVsZW5jbyBnZW5lcmljb1wiXTpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcImNvbC1zbS0xMiBjb2wtbWQtNCBjb2wtbGctNFwiO1xyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJMb29rdXBcIl06XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTQgY29sLWxnLTRcIjtcclxuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtWydGb3JtIGRpIGRldHRhZ2xpbyddOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC0xMiBjb2wtbGctMTJcIjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gcGVyIGNyZWFyZSBpbCBGb3JtR3JvdXAgY2hlIHJhcHByZXNlbnRhIHVuYSBGb3JtIGEgcGFydGlyZSBkYWkgc3VvaSBCYXNlRmllbGQuXHJcbiAgICAgKiBAcGFyYW0gZm9ybUZpZWxkcyBMaXN0YSBkZWkgQmFzZUZpZWxkIGNoZSBjb21wb25nb25vIGxhIGZvcm0uXHJcbiAgICAgKiBAcGFyYW0gcmVjb3JkIE9nZ2V0dG8gZGkgdGlwbyBSZWNvcmQgY2hlIGNvbnRpZW5lIGkgdmFsb3JpIGRlaSBjYW1waS5cclxuICAgICAqIEBwYXJhbSBvbmx5VmlldyBTZSBUUlVFIGRpc2FiaWxpdGEgbGEgZm9ybSBwZXIgcmVuZGVybGEgaW4gc29sYSBsZXR0dXJhLlxyXG4gICAgICogQHBhcmFtIGluY2x1ZGVDdXJyZW50Rm9ybUluRmllbGQgU2UgVFJVRSBwb3BvbGEgbGEgcHJvcHJpZXTDoCBGb3JtRm9ybUdyb3VwIGFsbCdpbnRlcm5vIGRpIG9nbmkgQmFzZUZpZWxkIGNvbiBpbCBGb3JtR3JvdXAgY29ycmVudGUuXHJcbiAgICAgKiBAcmV0dXJucyBSZXN0aXR1aXNjZSB1biBGb3JtR3JvdXAgcmFwcHJlc2VudGF0ZSBsYSBGb3JtIGEgY3VpIGFwcGFydGVuZ29ubyBpIEJhc2VGaWVsZCByaWNldnV0aSBpbiBpbnB1dC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIENyZWF0ZUZvcm1Gb3JtR3JvdXAoZm9ybUZpZWxkczogQXJyYXk8QmFzZUZpZWxkPixcclxuICAgICAgICByZWNvcmQ6IFJlY29yZCxcclxuICAgICAgICBvbmx5VmlldyA9IGZhbHNlLFxyXG4gICAgICAgIGluY2x1ZGVDdXJyZW50Rm9ybUluRmllbGQgPSB0cnVlKTogVW50eXBlZEZvcm1Hcm91cCB7XHJcbiAgICAgICAgY29uc3QgZm9ybUZvcm06IFVudHlwZWRGb3JtR3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKFtdKTtcclxuICAgICAgICBmb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xyXG4gICAgICAgICAgICBmb3JtRm9ybS5hZGRDb250cm9sKGZpZWxkLk5hbWUsIHRoaXMuY3JlYXRlRmllbGRGb3JtQ29udHJvbChmaWVsZCwgcmVjb3JkKSk7XHJcbiAgICAgICAgICAgIGlmIChpbmNsdWRlQ3VycmVudEZvcm1JbkZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICBmaWVsZC5Gb3JtRm9ybUdyb3VwID0gZm9ybUZvcm07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAob25seVZpZXcpIHtcclxuICAgICAgICAgICAgZm9ybUZvcm0uZGlzYWJsZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZvcm1Gb3JtO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRnVuemlvbmUgcGVyIGNyZWFyZSBlIGFnZ2l1bmdlcmUgYWwgRm9ybUdyb3VwIHJhcHByZXNlbnRhbnRlIGxhIGZvcm0gdW4gbnVvdm8gRm9ybUNvbnRyb2wgYSBwYXJ0aXJlIGRhIHVuIEZpZWxkLlxyXG4gICAgICogSW4gbnVvdm8gRm9ybUNvbnRyb2wgYXZyw6AgaWwgbm9tZSBkZWwgY2FtcG8gcGFzc2F0byBlIHZlcnJhbm5vIGltcG9zdGF0aSBpIFZhbGlkYXRvcnMgaW4gYmFzZSBhbCB0aXBvIGRlbCBjYW1wbyBzdGVzc28uXHJcbiAgICAgKiBAcGFyYW0gZmllbGQgQmFzZUZpZWxkIHBlciBjdWkgY3JlYXJlIGlsIEZvcm1Db250cm9sIGRhIGluc2VyaXJlIG5lbCBGb3JtR3JvdXAgZGVsYSBmb3JtLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZUZpZWxkRm9ybUNvbnRyb2woZmllbGQ6IEJhc2VGaWVsZCwgcmVjb3JkOiBSZWNvcmQpOiBBYnN0cmFjdENvbnRyb2wge1xyXG4gICAgICAgIGNvbnN0IHZhbGlkYXRvcnM6IEFycmF5PFZhbGlkYXRvckZuPiA9IFtdO1xyXG5cclxuICAgICAgICBpZiAoZmllbGQuUmVxdWlyZWQpXHJcbiAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuXHJcbiAgICAgICAgc3dpdGNoIChmaWVsZC5GaWVsZFR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiQ2FtcG8gZGkgdGVzdG9cIl06XHJcbiAgICAgICAgICAgICAgICBpZiAoKGZpZWxkIGFzIFRleHRGaWVsZCkuTWF4TGVuZ2h0KSB7IHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1heExlbmd0aCgoZmllbGQgYXMgVGV4dEZpZWxkKS5NYXhMZW5naHQpKTsgfVxyXG4gICAgICAgICAgICAgICAgaWYgKChmaWVsZCBhcyBUZXh0RmllbGQpLk1pbkxlbmdodCkgeyB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgoKGZpZWxkIGFzIFRleHRGaWVsZCkuTWluTGVuZ2h0KSk7IH1cclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoKGZpZWxkIGFzIFRleHRGaWVsZCkuVGV4dE1hc2spIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFRleHRNYXNrRW51bS5Vcmw6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnBhdHRlcm4oVXJsUmVnZXgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBUZXh0TWFza0VudW0uRW1haWw6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLmVtYWlsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBUZXh0TWFza0VudW0uVGVsZWZvbm86XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnBhdHRlcm4oVGVsUmVnZXgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiQXJlYSBkaSB0ZXN0b1wiXTpcclxuICAgICAgICAgICAgICAgIGlmICgoZmllbGQgYXMgVGV4dGFyZWFGaWVsZCkuTWF4TGVuZ2h0KSB7IHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1heExlbmd0aCgoZmllbGQgYXMgVGV4dGFyZWFGaWVsZCkuTWF4TGVuZ2h0KSk7IH1cclxuICAgICAgICAgICAgICAgIGlmICgoZmllbGQgYXMgVGV4dGFyZWFGaWVsZCkuTWluTGVuZ2h0KSB7IHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbkxlbmd0aCgoZmllbGQgYXMgVGV4dGFyZWFGaWVsZCkuTWluTGVuZ2h0KSk7IH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW0uQWxsZWdhdG86XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bS5JbW1hZ2luZTpcclxuICAgICAgICAgICAgICAgIGlmIChmaWVsZC5SZXF1aXJlZClcclxuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goQXJyYXlWYWxpZGF0b3JzLm1pbkxlbmdodCgxKSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtWydFbGVuY28gZ2VuZXJpY28nXTpcclxuICAgICAgICAgICAgICAgIGlmICgoZmllbGQgYXMgTGlzdFZhbHVlRmllbGQpLklzTXVsdGlDaG9pY2hlKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5SZXF1aXJlZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKEFycmF5VmFsaWRhdG9ycy5taW5MZW5naHQoMSkpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbmV3IFVudHlwZWRGb3JtQ29udHJvbChyZWNvcmRbZmllbGQuTmFtZV0sIHZhbGlkYXRvcnMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0b2RvIHBlciBjb25maWd1cmFyZSBnbGkgZW5kcG9pbnQgZGEgdXNhcmUgZGkgZGVmYXVsdCBhIHBhcnRpcmUgZGFsbCd1cmwgYmFzZSBkZWwgc2VydmVyXHJcbiAgICAgKiBhIGN1aSBzaSBkZXZlIGNvbm5ldHRlcmUgZSBhbCB0b2tlbiBkYSBwYXNzYXJlIHBlciBhdXRlbnRpY2Fyc2kuXHJcbiAgICAgKiBAcGFyYW0gYmFzZVNlcnZlclVybCBTdHJpbmdhIGRlbGwndXJsIGJhc2UgZGVsIHNlcnZlciAoZXM6IFwiaHR0cDovL2xvY2FsaG9zdDo1MDAwXCIpLlxyXG4gICAgICogQHBhcmFtIHVzZXJUb2tlbiBUb2tlbiBkZWxsJ3V0ZW50ZSBsb2dnYXRvIGRhIHVzYXJlIHBlciBhdXRlbnRpY2Fyc2kgc2UgbmVjZXNzYXJpby5cclxuICAgICAqIEByZXR1cm5zIFJlc2l0dWlzY2UgbGEgY29uZmlndXJhemlvbmUgY29tcGxldGEgZGVnbGkgZW5kUG9pbnQgZGEgdXNhcmUgZGkgZGVmYXVsdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIENvbmZpZ3VyZURlZmF1bHRFbmRQb2ludHMoYmFzZVNlcnZlclVybDogc3RyaW5nLCB1c2VyVG9rZW46IHN0cmluZyk6IEVuZFBvaW50Q29uZmlndXJhdGlvbiB7XHJcbiAgICAgICAgbGV0IGVuZFBvaW50Q29uZmlndXJhdGlvbjogRW5kUG9pbnRDb25maWd1cmF0aW9uID0gbmV3IEVuZFBvaW50Q29uZmlndXJhdGlvbigpO1xyXG4gICAgICAgIGVuZFBvaW50Q29uZmlndXJhdGlvbiA9IG5ldyBFbmRQb2ludENvbmZpZ3VyYXRpb24oKTtcclxuICAgICAgICBlbmRQb2ludENvbmZpZ3VyYXRpb24uUmVjb3JkcyA9IHtcclxuICAgICAgICAgICAgR2V0QnlGb3JtSURFbmRQb2ludDoge1xyXG4gICAgICAgICAgICAgICAgVXJsOiBiYXNlU2VydmVyVXJsICsgXCIvYXBpL3YxL2dldGFsbFwiLFxyXG4gICAgICAgICAgICAgICAgVG9rZW46IHVzZXJUb2tlbixcclxuICAgICAgICAgICAgICAgIFJlcXVlc3RNZXRob2Q6IFJlcXVlc3RNZXRob2RFbnVtLkdFVCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgR2V0QnlJREVuZFBvaW50OiB7XHJcbiAgICAgICAgICAgICAgICBVcmw6IGJhc2VTZXJ2ZXJVcmwgKyBcIi9hcGkvdjEvZ2V0QnlJRFwiLFxyXG4gICAgICAgICAgICAgICAgVG9rZW46IHVzZXJUb2tlbixcclxuICAgICAgICAgICAgICAgIFJlcXVlc3RNZXRob2Q6IFJlcXVlc3RNZXRob2RFbnVtLkdFVCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgU2F2ZUVuZFBvaW50OiB7XHJcbiAgICAgICAgICAgICAgICBVcmw6IGJhc2VTZXJ2ZXJVcmwgKyBcIi9hcGkvdjEvc2F2ZVwiLFxyXG4gICAgICAgICAgICAgICAgVG9rZW46IHVzZXJUb2tlbixcclxuICAgICAgICAgICAgICAgIFJlcXVlc3RNZXRob2Q6IFJlcXVlc3RNZXRob2RFbnVtLlBPU1QsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIER1cGxpY2F0ZUVuZFBvaW50OiB7XHJcbiAgICAgICAgICAgICAgICBVcmw6IGJhc2VTZXJ2ZXJVcmwgKyBcIi9hcGkvdjEvZHVwbGljYXRlXCIsXHJcbiAgICAgICAgICAgICAgICBUb2tlbjogdXNlclRva2VuLFxyXG4gICAgICAgICAgICAgICAgUmVxdWVzdE1ldGhvZDogUmVxdWVzdE1ldGhvZEVudW0uUE9TVCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgRGVsZXRlRW5kUG9pbnQ6IHtcclxuICAgICAgICAgICAgICAgIFVybDogYmFzZVNlcnZlclVybCArIFwiL2FwaS92MS9kZWxldGVcIixcclxuICAgICAgICAgICAgICAgIFRva2VuOiB1c2VyVG9rZW4sXHJcbiAgICAgICAgICAgICAgICBSZXF1ZXN0TWV0aG9kOiBSZXF1ZXN0TWV0aG9kRW51bS5ERUxFVEUsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZW5kUG9pbnRDb25maWd1cmF0aW9uLkZvcm1zID0ge1xyXG4gICAgICAgICAgICBHZXRCeUlERW5kUG9pbnQ6IHtcclxuICAgICAgICAgICAgICAgIFVybDogYmFzZVNlcnZlclVybCArIFwiL2FwaS9jb25mL2Zvcm1cIixcclxuICAgICAgICAgICAgICAgIFRva2VuOiB1c2VyVG9rZW4sXHJcbiAgICAgICAgICAgICAgICBSZXF1ZXN0TWV0aG9kOiBSZXF1ZXN0TWV0aG9kRW51bS5HRVQsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFNhdmVFbmRQb2ludDoge1xyXG4gICAgICAgICAgICAgICAgVXJsOiBiYXNlU2VydmVyVXJsICsgXCIvYXBpL2NvbmYvZm9ybVwiLFxyXG4gICAgICAgICAgICAgICAgVG9rZW46IHVzZXJUb2tlbixcclxuICAgICAgICAgICAgICAgIFJlcXVlc3RNZXRob2Q6IFJlcXVlc3RNZXRob2RFbnVtLlBPU1QsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGVuZFBvaW50Q29uZmlndXJhdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldG9kbyBjaGUgZGF0YSBsYSBjb25maWd1cmF6aW9uZSBkaSB1biBlbmRwb2ludCBjb3N0cnVpc2NlIGwndXJsIGRhIGNoaWFtYXJlLCBnbGkgZXZlbnR1YWxpIHBhcmFtZXRyaVxyXG4gICAgICogZGEgcGFzc2FyZSAobmVsIGJvZHkgbyBuZWxsYSByb3R0YSkgZWQgZWZmZXR0dWEgbGEgY2hpYW1hdGEuIEFsIHRlcm1pbmUgZGVsbGEgY2hpYW1hdGEgZXNlZ3VlIGxlIGV2ZW50dWFsaVxyXG4gICAgICogZnVuemlvbmkgZGkgY2FsbGJhY2sgKHNpYSBpbiBjYXNvIGRpIHN1Y2Nlc3NvIGNoZSBpbiBjYXNvIGRpIGVycm9yZSkgcGFzc2F0ZSBpbiBpbnB1dC5cclxuICAgICAqIEBwYXJhbSBlbmRQb2ludERhdGEgQ29maWd1cmF6aW9uZSBkZWxsJ2VuZHBvaW50IGRhIGNoaWFtYXJlLlxyXG4gICAgICogQHBhcmFtIGR5bmFtaWNNb2R1bGVQYXJhbXMgQXJyYXkgZGVpIHBhcmFtZXRyaSBhZ2dpdW50aSBkYWwgbW9kdWxvIGRpbmFtaWNvIGEgcXVlbGxpIGdpw6AgY29uZmlndXJhdGlcclxuICAgICAqIChhZCBlc2VtcGlvIGlsIHJlY29yZCBvIGxhIGZvcm0gZGEgc2FsdmFyZSBvcHB1cmUgbCdJRCBwZXIgcmVjdXBlcmFyZSB1bmEgcGFydGljb2xhcmUgZW50aXTDoCkuXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgTWV0b2RvIGRhIGVzZWd1aXJlIGluIGNhc28gZGkgc3VjY2Vzc28gZG9wbyBsYSBjaGlhbWF0YSBodHRwLlxyXG4gICAgICogTk9UQTogaW4gaW5wdXQgdmllbmUgcGFzc2F0YSBsYSByaXNwb3N0YSBkZWxsYSBjaGlhbWF0YSBzdGVzc2EuXHJcbiAgICAgKiBAcGFyYW0gZXJyb3JDYWxsQmFjayBNZXRvZG8gZGEgZXNlZ3VpcmUgaW4gY2FzbyBkaSBlcnJvcmUgZG9wbyBsYSBjaGlhbWF0YSBodHRwLlxyXG4gICAgICogTk9UQTogaW4gaW5wdXQgdmllbmUgcGFzc2F0byBsJ2Vycm9yZSBnZW5lcmF0byBkZWxsYSBjaGlhbWF0YSBzdGVzc2EuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBSdW5FbmRQb2ludENhbGwoXHJcbiAgICAgICAgZW5kUG9pbnREYXRhOiBFbmRQb2ludERhdGEsXHJcbiAgICAgICAgZHluYW1pY01vZHVsZVBhcmFtczogQXJyYXk8RW5kUG9pbnREYXRhUGFyYW1zPiA9IG51bGwsXHJcbiAgICAgICAgY2FsbGJhY2s6IChlOiBGb3JtIHwgUmVjb3JkIHwgQXJyYXk8UmVjb3JkPikgPT4gdm9pZCA9IG51bGwsXHJcbiAgICAgICAgZXJyb3JDYWxsQmFjazogKGVycjogdW5rbm93bikgPT4gdm9pZCA9IG51bGxcclxuICAgICk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuYWRkUmVxdWVzdENvdW50ZXIoKTtcclxuXHJcbiAgICAgICAgbGV0IHVybCA9IGAke2VuZFBvaW50RGF0YS5Vcmx9YDtcclxuICAgICAgICBsZXQgcXVlcnlQYXJhbXM6IHN0cmluZyA9IG51bGw7XHJcbiAgICAgICAgY29uc3QgYm9keVBhcmFtcyA9IHtcclxuICAgICAgICAgICAgQWRkaXRpb25hbFBhcmFtczoge31cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyBTZSBuZWxsYSBjb25maWd1cmF6aW9uZSBzb25vIHN0YXRpIGRlZmluaXRpIHBhcmFtZXRyaSBkYSBhZ2dpdW5nZXJlIGFsbGEgY2hpYW1hdGEgcXVlc3RpIHZlbmdvbm8gY2ljbGF0aVxyXG4gICAgICAgIC8vIGUgYWdnaXVudGkgbmVsIHB1bnRvIGluIGN1aSBkZXZvbm8gZXNzZXJlIHVzYXRpLlxyXG4gICAgICAgIGlmIChlbmRQb2ludERhdGEuUGFyYW1zKSB7XHJcbiAgICAgICAgICAgIGVuZFBvaW50RGF0YS5QYXJhbXMuZm9yRWFjaChwID0+IHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAocC5QYXJhbVR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFBhcmFtVHlwZUVudW1bJ1F1ZXJ5IHBhcmFtJ106IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nUGFyYW06IHN0cmluZyA9IHAuUGFyYW1OYW1lICsgXCI9XCIgKyBwLlBhcmFtVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zID0gKHF1ZXJ5UGFyYW1zID09IG51bGwgPyBcIlwiIDogcXVlcnlQYXJhbXMgKyBcIiZcIikgKyBzdHJpbmdQYXJhbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUGFyYW1UeXBlRW51bVsnSW4gcm91dGUnXToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSB1cmwgKyAodXJsLmVuZHNXaXRoKFwiL1wiKSA/IFwiXCIgOiBcIi9cIikgKyBwLlBhcmFtVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFBhcmFtVHlwZUVudW1bJ0luIEJvZHknXToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5UGFyYW1zLkFkZGl0aW9uYWxQYXJhbXNbcC5QYXJhbU5hbWVdID0gcC5QYXJhbVZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2Ugc29ubyBzdGF0aSBwYXNzYXRpIHBhcmFtZXRyaSBkYSBhZ2dpdW5nZXJlIGFsbGEgY2hpYW1hdGEgZGVmaW5pdGkgYWxsJ2ludGVybm8gZGVsIG1vZHVsbyBkaW5hbWljb1xyXG4gICAgICAgIC8vIHZlbmdvbm8gY2ljbGF0aSBlIGFnZ2l1bnRpIG5lbCBwdW50byBpbiBjdWkgZGV2b25vIGVzc2VyZSB1c2F0aSBkb3BvIHF1ZWxsaSBkZWZpbml0aSBuZWxsYSBjb25maWd1cmF6aW9uZS5cclxuICAgICAgICBpZiAoZHluYW1pY01vZHVsZVBhcmFtcykge1xyXG4gICAgICAgICAgICBkeW5hbWljTW9kdWxlUGFyYW1zLmZvckVhY2gocCA9PiB7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHAuUGFyYW1UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBQYXJhbVR5cGVFbnVtWydRdWVyeSBwYXJhbSddOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZ1BhcmFtOiBzdHJpbmcgPSBwLlBhcmFtTmFtZSArIFwiPVwiICsgcC5QYXJhbVZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtcyA9IChxdWVyeVBhcmFtcyA9PSBudWxsID8gXCJcIiA6IHF1ZXJ5UGFyYW1zICsgXCImXCIpICsgc3RyaW5nUGFyYW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFBhcmFtVHlwZUVudW1bJ0luIHJvdXRlJ106IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gdXJsICsgKHVybC5lbmRzV2l0aChcIi9cIikgPyBcIlwiIDogXCIvXCIpICsgcC5QYXJhbVZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBQYXJhbVR5cGVFbnVtWydJbiBCb2R5J106IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keVBhcmFtc1twLlBhcmFtTmFtZV0gPSBwLlBhcmFtVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChxdWVyeVBhcmFtcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHVybCA9ICh1cmwuZW5kc1dpdGgoXCIvXCIpID8gdXJsLnN1YnN0cmluZygwLCB1cmwubGVuZ3RoIC0gMSkgOiB1cmwpICsgXCI/XCIgKyBxdWVyeVBhcmFtcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaHR0cC5yZXF1ZXN0KGVuZFBvaW50RGF0YS5SZXF1ZXN0TWV0aG9kLCB1cmwsIHtcclxuICAgICAgICAgICAgaGVhZGVyczogZW5kUG9pbnREYXRhLlRva2VuID8geyBBdXRob3JpemF0aW9uOiBlbmRQb2ludERhdGEuVG9rZW4gfSA6IG51bGwsXHJcbiAgICAgICAgICAgIGJvZHk6ICFbUmVxdWVzdE1ldGhvZEVudW0uREVMRVRFLCBSZXF1ZXN0TWV0aG9kRW51bS5HRVRdLmluY2x1ZGVzKGVuZFBvaW50RGF0YS5SZXF1ZXN0TWV0aG9kKSA/IGJvZHlQYXJhbXMgOiBudWxsXHJcbiAgICAgICAgfSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAgICAgICAgIChyZXM6IEZvcm0gfCBSZWNvcmQgfCBBcnJheTxSZWNvcmQ+KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5yZW1vdmVSZXF1ZXN0Q291bnRlcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnJlbW92ZVJlcXVlc3RDb3VudGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yQ2FsbEJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDYWxsQmFjayhlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIEVxcER5bmFtaWNNb2R1bGVEaWFsb2dTZXJ2aWNlLkVycm9yKGVycm9yLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbn1cclxuIl19
@@ -0,0 +1,69 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class VoiceRecognitionService {
4
+ constructor() {
5
+ this.recognition = new webkitSpeechRecognition();
6
+ this.isStoppedSpeechRecog = false;
7
+ this.text = '';
8
+ this.transcript_arr = [];
9
+ this.confidence_arr = [];
10
+ this.isStarted = false; //<< this Flag to check if the user stop the service
11
+ this.isStoppedAutomatically = true; //<< this Flag to check if the service stopped automaticically.
12
+ }
13
+ init() {
14
+ this.recognition.continuous = true;
15
+ this.recognition.interimResults = true;
16
+ this.recognition.lang = 'it-IT';
17
+ this.recognition.addEventListener('result', (e) => {
18
+ const transcript = Array.from(e.results)
19
+ .map((result) => result[0])
20
+ .map((result) => result.transcript)
21
+ .join('');
22
+ this.transcript_arr.push(transcript);
23
+ this.tempWords = transcript;
24
+ const confidence = Array.from(e.results)
25
+ .map((result) => result[0])
26
+ .map((result) => result.confidence)
27
+ .join('');
28
+ this.confidence_arr.push(confidence);
29
+ });
30
+ this.recognition.addEventListener('end', (condition) => {
31
+ this.wordConcat();
32
+ if (this.isStoppedAutomatically) {
33
+ this.recognition.stop();
34
+ this.recognition.start();
35
+ this.isStoppedAutomatically = true;
36
+ }
37
+ });
38
+ }
39
+ start() {
40
+ if (!this.isStarted) {
41
+ this.recognition.start();
42
+ this.isStarted = true;
43
+ }
44
+ return true;
45
+ }
46
+ stop() {
47
+ if (this.isStarted) {
48
+ this.isStoppedAutomatically = false;
49
+ this.wordConcat();
50
+ this.recognition.stop();
51
+ this.isStarted = false;
52
+ this.transcript_arr = [];
53
+ }
54
+ return false;
55
+ }
56
+ wordConcat() {
57
+ this.text = this.text + ' ' + this.tempWords + '.';
58
+ this.tempWords = '';
59
+ }
60
+ }
61
+ VoiceRecognitionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: VoiceRecognitionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
62
+ VoiceRecognitionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: VoiceRecognitionService, providedIn: 'root' });
63
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: VoiceRecognitionService, decorators: [{
64
+ type: Injectable,
65
+ args: [{
66
+ providedIn: 'root',
67
+ }]
68
+ }], ctorParameters: function () { return []; } });
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2UtcmVjb2duaXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL3NlcnZpY2VzL3ZvaWNlLXJlY29nbml0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFNM0MsTUFBTSxPQUFPLHVCQUF1QjtJQVNsQztRQVJBLGdCQUFXLEdBQUcsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1FBQzVDLHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQUN0QixTQUFJLEdBQUcsRUFBRSxDQUFDO1FBRWpCLG1CQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLG1CQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLGNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxvREFBb0Q7UUFDdkUsMkJBQXNCLEdBQUcsSUFBSSxDQUFDLENBQUMsK0RBQStEO0lBQzlFLENBQUM7SUFFakIsSUFBSTtRQUNGLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUNuQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO1FBRWhDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBTSxFQUFFLEVBQUU7WUFDckQsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO2lCQUNyQyxHQUFHLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDL0IsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO2lCQUNsQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDWixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQztZQUU1QixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7aUJBQ3JDLEdBQUcsQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMvQixHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7aUJBQ2xDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNaLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUMxRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEIsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7Z0JBQy9CLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUM7YUFDcEM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztTQUN2QjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELElBQUk7UUFDRixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQztZQUNwQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN2QixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztTQUMxQjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO1FBQ25ELElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLENBQUM7O29IQTlEVSx1QkFBdUI7d0hBQXZCLHVCQUF1QixjQUZ0QixNQUFNOzJGQUVQLHVCQUF1QjtrQkFIbkMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmRlY2xhcmUgdmFyIHdlYmtpdFNwZWVjaFJlY29nbml0aW9uOiBhbnk7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVm9pY2VSZWNvZ25pdGlvblNlcnZpY2Uge1xyXG4gIHJlY29nbml0aW9uID0gbmV3IHdlYmtpdFNwZWVjaFJlY29nbml0aW9uKCk7XHJcbiAgaXNTdG9wcGVkU3BlZWNoUmVjb2cgPSBmYWxzZTtcclxuICBwdWJsaWMgdGV4dCA9ICcnO1xyXG4gIHRlbXBXb3JkczogYW55O1xyXG4gIHRyYW5zY3JpcHRfYXJyID0gW107XHJcbiAgY29uZmlkZW5jZV9hcnIgPSBbXTtcclxuICBpc1N0YXJ0ZWQgPSBmYWxzZTsgLy88PCB0aGlzIEZsYWcgdG8gY2hlY2sgaWYgdGhlIHVzZXIgc3RvcCB0aGUgc2VydmljZVxyXG4gIGlzU3RvcHBlZEF1dG9tYXRpY2FsbHkgPSB0cnVlOyAvLzw8IHRoaXMgRmxhZyB0byBjaGVjayBpZiB0aGUgc2VydmljZSBzdG9wcGVkIGF1dG9tYXRpY2ljYWxseS5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICBpbml0KCkge1xyXG4gICAgdGhpcy5yZWNvZ25pdGlvbi5jb250aW51b3VzID0gdHJ1ZTtcclxuICAgIHRoaXMucmVjb2duaXRpb24uaW50ZXJpbVJlc3VsdHMgPSB0cnVlO1xyXG4gICAgdGhpcy5yZWNvZ25pdGlvbi5sYW5nID0gJ2l0LUlUJztcclxuXHJcbiAgICB0aGlzLnJlY29nbml0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc3VsdCcsIChlOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgdHJhbnNjcmlwdCA9IEFycmF5LmZyb20oZS5yZXN1bHRzKVxyXG4gICAgICAgIC5tYXAoKHJlc3VsdDogYW55KSA9PiByZXN1bHRbMF0pXHJcbiAgICAgICAgLm1hcCgocmVzdWx0KSA9PiByZXN1bHQudHJhbnNjcmlwdClcclxuICAgICAgICAuam9pbignJyk7XHJcbiAgICAgIHRoaXMudHJhbnNjcmlwdF9hcnIucHVzaCh0cmFuc2NyaXB0KTtcclxuICAgICAgdGhpcy50ZW1wV29yZHMgPSB0cmFuc2NyaXB0O1xyXG5cclxuICAgICAgY29uc3QgY29uZmlkZW5jZSA9IEFycmF5LmZyb20oZS5yZXN1bHRzKVxyXG4gICAgICAgIC5tYXAoKHJlc3VsdDogYW55KSA9PiByZXN1bHRbMF0pXHJcbiAgICAgICAgLm1hcCgocmVzdWx0KSA9PiByZXN1bHQuY29uZmlkZW5jZSlcclxuICAgICAgICAuam9pbignJyk7XHJcbiAgICAgIHRoaXMuY29uZmlkZW5jZV9hcnIucHVzaChjb25maWRlbmNlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMucmVjb2duaXRpb24uYWRkRXZlbnRMaXN0ZW5lcignZW5kJywgKGNvbmRpdGlvbjogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMud29yZENvbmNhdCgpO1xyXG4gICAgICBpZiAodGhpcy5pc1N0b3BwZWRBdXRvbWF0aWNhbGx5KSB7XHJcbiAgICAgICAgdGhpcy5yZWNvZ25pdGlvbi5zdG9wKCk7XHJcbiAgICAgICAgdGhpcy5yZWNvZ25pdGlvbi5zdGFydCgpO1xyXG4gICAgICAgIHRoaXMuaXNTdG9wcGVkQXV0b21hdGljYWxseSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc3RhcnQoKSB7XHJcbiAgICBpZiAoIXRoaXMuaXNTdGFydGVkKSB7XHJcbiAgICAgIHRoaXMucmVjb2duaXRpb24uc3RhcnQoKTtcclxuICAgICAgdGhpcy5pc1N0YXJ0ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG4gIHN0b3AoKSB7XHJcbiAgICBpZiAodGhpcy5pc1N0YXJ0ZWQpIHtcclxuICAgICAgdGhpcy5pc1N0b3BwZWRBdXRvbWF0aWNhbGx5ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMud29yZENvbmNhdCgpO1xyXG4gICAgICB0aGlzLnJlY29nbml0aW9uLnN0b3AoKTtcclxuICAgICAgdGhpcy5pc1N0YXJ0ZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy50cmFuc2NyaXB0X2FyciA9IFtdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgd29yZENvbmNhdCgpIHtcclxuICAgIHRoaXMudGV4dCA9IHRoaXMudGV4dCArICcgJyArIHRoaXMudGVtcFdvcmRzICsgJy4nO1xyXG4gICAgdGhpcy50ZW1wV29yZHMgPSAnJztcclxuICB9XHJcbn1cclxuIl19