@ohioepa/oepa-ui-lib 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/esm2022/lib/account-search-input/account-search-input.component.mjs +3 -3
  2. package/esm2022/lib/account-search-modal/account-search-modal.component.mjs +3 -3
  3. package/esm2022/lib/action-btn/action-btn.component.mjs +3 -3
  4. package/esm2022/lib/action-btn-modal/action-btn-modal.component.mjs +3 -3
  5. package/esm2022/lib/address/address.component.mjs +3 -3
  6. package/esm2022/lib/address/oepa-address.service.mjs +3 -3
  7. package/esm2022/lib/blank/blank.component.mjs +3 -3
  8. package/esm2022/lib/checkbox/checkbox.component.mjs +3 -3
  9. package/esm2022/lib/checkbox-input/checkbox-input.component.mjs +3 -3
  10. package/esm2022/lib/comment-modal/comment-modal.component.mjs +3 -3
  11. package/esm2022/lib/common-forms.module.mjs +9 -36
  12. package/esm2022/lib/confirmation-modal/confirmation-modal.component.mjs +3 -3
  13. package/esm2022/lib/contact/contact.component.mjs +3 -3
  14. package/esm2022/lib/date-input/date-input.component.mjs +3 -3
  15. package/esm2022/lib/date-input-modal/date-input-modal.component.mjs +3 -3
  16. package/esm2022/lib/datepicker/datepicker.component.mjs +3 -3
  17. package/esm2022/lib/daterangepicker/daterangepicker.component.mjs +3 -3
  18. package/esm2022/lib/dual-list-box/array.pipes.mjs +6 -6
  19. package/esm2022/lib/dual-list-box/dual-list-box.component.mjs +3 -3
  20. package/esm2022/lib/ebiz-address/ebiz-address.component.mjs +3 -3
  21. package/esm2022/lib/edoc-attachment/edoc-attachment.component.mjs +3 -3
  22. package/esm2022/lib/edoc-attachment/edoc-attachment.service.mjs +3 -3
  23. package/esm2022/lib/entity/entity.service.mjs +3 -3
  24. package/esm2022/lib/entity/organization-create-modal/organization-create-modal.component.mjs +3 -3
  25. package/esm2022/lib/entity/organization-search-input/organization-search-input.component.mjs +3 -3
  26. package/esm2022/lib/entity/organization-search-modal/organization-search-modal.component.mjs +5 -5
  27. package/esm2022/lib/entity/person-create-modal/person-create-modal.component.mjs +3 -3
  28. package/esm2022/lib/entity/person-search-input/person-search-input.component.mjs +3 -3
  29. package/esm2022/lib/entity/person-search-modal/person-search-modal.component.mjs +5 -5
  30. package/esm2022/lib/entity/place-create-modal/place-create-modal.component.mjs +3 -3
  31. package/esm2022/lib/entity/place-search-input/place-search-input.component.mjs +3 -3
  32. package/esm2022/lib/entity/place-search-modal/place-search-modal.component.mjs +5 -5
  33. package/esm2022/lib/file-upload/file-upload.component.mjs +3 -3
  34. package/esm2022/lib/lynx-image-upload/lynx-image-upload.component.mjs +3 -3
  35. package/esm2022/lib/lynx-image-upload/lynx.service.mjs +3 -3
  36. package/esm2022/lib/message/message.component.mjs +3 -3
  37. package/esm2022/lib/message-list/message-list.component.mjs +3 -3
  38. package/esm2022/lib/multi-file-upload/multi-file-upload.component.mjs +3 -3
  39. package/esm2022/lib/notes-modal/notes-modal.component.mjs +3 -3
  40. package/esm2022/lib/numeric-input/numeric-input.component.mjs +3 -3
  41. package/esm2022/lib/numeric-input.directive.mjs +3 -3
  42. package/esm2022/lib/oepa-error-message/oepa-error-message.component.mjs +3 -3
  43. package/esm2022/lib/oepa-forms.service.mjs +3 -3
  44. package/esm2022/lib/oepa-wait-message/oepa-wait-message.component.mjs +3 -3
  45. package/esm2022/lib/parameter/parameter.service.mjs +3 -3
  46. package/esm2022/lib/params-help-button/params-help-button.component.mjs +3 -3
  47. package/esm2022/lib/phone-number/phone-number.component.mjs +3 -3
  48. package/esm2022/lib/pin-modal/oepa-pin.service.mjs +3 -3
  49. package/esm2022/lib/pin-modal/pin-modal.component.mjs +3 -3
  50. package/esm2022/lib/select-input/select-input.component.mjs +3 -3
  51. package/esm2022/lib/server-timeout-modal/server-timeout-modal.component.mjs +3 -3
  52. package/esm2022/lib/shopping-cart/shopping-cart-summary/shopping-cart-summary.component.mjs +3 -3
  53. package/esm2022/lib/shopping-cart/shopping-cart-view/shopping-cart-view.component.mjs +3 -3
  54. package/esm2022/lib/shopping-cart/shopping-cart.service.mjs +3 -3
  55. package/esm2022/lib/start-end-timepicker/start-end-timepicker.component.mjs +3 -3
  56. package/esm2022/lib/table/oepa-table-cell-classname.pipe.mjs +3 -3
  57. package/esm2022/lib/table/oepa-table-cell-colspan.pipe.mjs +3 -3
  58. package/esm2022/lib/table/oepa-table-cell-hidden.pipe.mjs +3 -3
  59. package/esm2022/lib/table/oepa-table-cell-icon-classname.pipe.mjs +3 -3
  60. package/esm2022/lib/table/oepa-table-cell-img-src.pipe.mjs +3 -3
  61. package/esm2022/lib/table/oepa-table-cell-inner-html.pipe.mjs +3 -3
  62. package/esm2022/lib/table/oepa-table-cell-input-component.pipe.mjs +3 -3
  63. package/esm2022/lib/table/oepa-table-cell-not-selectable.pipe.mjs +3 -3
  64. package/esm2022/lib/table/oepa-table-cell-value.pipe.mjs +3 -3
  65. package/esm2022/lib/table/oepa-table-filtering.directive.mjs +3 -3
  66. package/esm2022/lib/table/oepa-table-sorting.directive.mjs +3 -3
  67. package/esm2022/lib/table/p-table/p-table.component.mjs +3 -3
  68. package/esm2022/lib/table/table-data-cell/table-data-cell.component.mjs +3 -3
  69. package/esm2022/lib/table/table-export.service.mjs +3 -3
  70. package/esm2022/lib/table/table-header-cell/table-header-cell.component.mjs +3 -3
  71. package/esm2022/lib/table/table.component.mjs +3 -3
  72. package/esm2022/lib/table/table.service.mjs +3 -3
  73. package/esm2022/lib/template-confirmation-modal/template-confirmation-modal.component.mjs +3 -3
  74. package/esm2022/lib/text-area-input/text-area-input.component.mjs +3 -3
  75. package/esm2022/lib/text-input/text-input.component.mjs +3 -3
  76. package/esm2022/lib/timeout-modal/timeout-modal.component.mjs +3 -3
  77. package/esm2022/lib/timepicker/timepicker.component.mjs +3 -3
  78. package/esm2022/lib/validation/validation.service.mjs +3 -3
  79. package/esm2022/lib/yes-no/yes-no.component.mjs +3 -3
  80. package/esm2022/lib/yes-no-boolean/yes-no.component.mjs +3 -3
  81. package/esm2022/lib/yes-no-other-input/yes-no-other-input.component.mjs +3 -3
  82. package/esm2022/lib/zip-code/zip-code.component.mjs +3 -3
  83. package/esm2022/public-api.mjs +1 -28
  84. package/fesm2022/ohioepa-oepa-ui-lib.mjs +495 -2519
  85. package/fesm2022/ohioepa-oepa-ui-lib.mjs.map +1 -1
  86. package/lib/common-forms.module.d.ts +70 -82
  87. package/ohioepa-oepa-ui-lib-1.2.0.tgz +0 -0
  88. package/package.json +3 -3
  89. package/public-api.d.ts +0 -27
  90. package/esm2022/lib/document/document-editor/document-editor.component.mjs +0 -225
  91. package/esm2022/lib/document/document-event-entity-type.mjs +0 -7
  92. package/esm2022/lib/document/document-event-type.mjs +0 -7
  93. package/esm2022/lib/document/document-event.mjs +0 -2
  94. package/esm2022/lib/document/document-group/document-group.component.mjs +0 -210
  95. package/esm2022/lib/document/document-part/document-part.component.mjs +0 -19
  96. package/esm2022/lib/document/document-part-editor/document-part-editor.component.mjs +0 -296
  97. package/esm2022/lib/document/document-placeholder-modal/document-placeholder-modal.component.mjs +0 -49
  98. package/esm2022/lib/document/document-section/document-section.component.mjs +0 -226
  99. package/esm2022/lib/document/document.service.mjs +0 -325
  100. package/esm2022/lib/document/group-modal/group-modal.component.mjs +0 -46
  101. package/esm2022/lib/document/part-modal/part-modal.component.mjs +0 -48
  102. package/esm2022/lib/document/portal-document-class.mjs +0 -2
  103. package/esm2022/lib/document/portal-document-group.mjs +0 -2
  104. package/esm2022/lib/document/portal-document-part.mjs +0 -2
  105. package/esm2022/lib/document/portal-document-placeholder.mjs +0 -2
  106. package/esm2022/lib/document/portal-document-section.mjs +0 -2
  107. package/esm2022/lib/document/portal-document-text.mjs +0 -2
  108. package/esm2022/lib/document/portal-document-type.mjs +0 -2
  109. package/esm2022/lib/document/portal-document.mjs +0 -2
  110. package/esm2022/lib/document/portal-email-attachment-type.mjs +0 -2
  111. package/esm2022/lib/document/portal-email-attachment.mjs +0 -2
  112. package/esm2022/lib/document/portal-email-filter.mjs +0 -2
  113. package/esm2022/lib/document/portal-email.mjs +0 -2
  114. package/esm2022/lib/document/section-modal/section-modal.component.mjs +0 -46
  115. package/esm2022/lib/esri-map/esri-map.component.mjs +0 -416
  116. package/esm2022/lib/ohio-lat-long/ohio-lat-long.component.mjs +0 -176
  117. package/lib/document/document-editor/document-editor.component.d.ts +0 -34
  118. package/lib/document/document-event-entity-type.d.ts +0 -5
  119. package/lib/document/document-event-type.d.ts +0 -5
  120. package/lib/document/document-event.d.ts +0 -9
  121. package/lib/document/document-group/document-group.component.d.ts +0 -38
  122. package/lib/document/document-part/document-part.component.d.ts +0 -10
  123. package/lib/document/document-part-editor/document-part-editor.component.d.ts +0 -46
  124. package/lib/document/document-placeholder-modal/document-placeholder-modal.component.d.ts +0 -19
  125. package/lib/document/document-section/document-section.component.d.ts +0 -37
  126. package/lib/document/document.service.d.ts +0 -90
  127. package/lib/document/group-modal/group-modal.component.d.ts +0 -20
  128. package/lib/document/part-modal/part-modal.component.d.ts +0 -20
  129. package/lib/document/portal-document-class.d.ts +0 -10
  130. package/lib/document/portal-document-group.d.ts +0 -15
  131. package/lib/document/portal-document-part.d.ts +0 -22
  132. package/lib/document/portal-document-placeholder.d.ts +0 -12
  133. package/lib/document/portal-document-section.d.ts +0 -13
  134. package/lib/document/portal-document-text.d.ts +0 -7
  135. package/lib/document/portal-document-type.d.ts +0 -15
  136. package/lib/document/portal-document.d.ts +0 -27
  137. package/lib/document/portal-email-attachment-type.d.ts +0 -6
  138. package/lib/document/portal-email-attachment.d.ts +0 -12
  139. package/lib/document/portal-email-filter.d.ts +0 -12
  140. package/lib/document/portal-email.d.ts +0 -18
  141. package/lib/document/section-modal/section-modal.component.d.ts +0 -20
  142. package/lib/esri-map/esri-map.component.d.ts +0 -41
  143. package/lib/ohio-lat-long/ohio-lat-long.component.d.ts +0 -63
  144. package/ohioepa-oepa-ui-lib-1.1.0.tgz +0 -0
@@ -1,46 +0,0 @@
1
- import { Component, Input, Output, EventEmitter } from '@angular/core';
2
- import { Validators } from '@angular/forms';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/forms";
5
- import * as i2 from "ngx-bootstrap/modal";
6
- export class SectionModalComponent {
7
- fb;
8
- bsModalRef;
9
- section;
10
- label = '';
11
- onSectionSave = new EventEmitter();
12
- modalForm;
13
- constructor(fb, bsModalRef) {
14
- this.fb = fb;
15
- this.bsModalRef = bsModalRef;
16
- }
17
- ngOnInit() {
18
- this.createForm();
19
- }
20
- createForm() {
21
- this.modalForm = this.fb.group({
22
- name: [this.section.name, [Validators.required]]
23
- });
24
- }
25
- save() {
26
- this.section.name = this.modalForm.get('name')?.value;
27
- this.onSectionSave.emit(this.section);
28
- this.bsModalRef.hide();
29
- }
30
- cancel() {
31
- this.bsModalRef.hide();
32
- }
33
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SectionModalComponent, deps: [{ token: i1.FormBuilder }, { token: i2.BsModalRef }], target: i0.ɵɵFactoryTarget.Component });
34
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SectionModalComponent, selector: "oepa-insert-section-modal", inputs: { section: "section", label: "label" }, outputs: { onSectionSave: "onSectionSave" }, ngImport: i0, template: "<div class=\"modal-header\">\n <h4 class=\"modal-title pull-left\">{{label}}</h4>\n <button type=\"button\" class=\"close pull-right\" aria-label=\"Close\" (click)=\"cancel()\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n </div>\n <div class=\"modal-body\">\n <div [formGroup]=\"modalForm\">\n <div class=\"row\">\n <div class=\"col-sm-12 form-group\">\n <label>Section Name</label>\n <input class=\"form-control\" id=\"partNameInput\" formControlName=\"name\"/>\n </div>\n </div>\n\n </div>\n </div>\n <div class=\"modal-footer\">\n <button type=\"submit\" id=\"saveBtn\" [disabled]=\"modalForm.invalid\" class=\"btn btn-primary mr-1\" (click)=\"save()\">Save</button>\n <button type=\"button\" id=\"cancelBtn\" class=\"btn btn-primary mr-1\" (click)=\"cancel()\">Cancel</button>\n </div>", styles: [""], dependencies: [{ kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] });
35
- }
36
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SectionModalComponent, decorators: [{
37
- type: Component,
38
- args: [{ selector: 'oepa-insert-section-modal', template: "<div class=\"modal-header\">\n <h4 class=\"modal-title pull-left\">{{label}}</h4>\n <button type=\"button\" class=\"close pull-right\" aria-label=\"Close\" (click)=\"cancel()\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n </div>\n <div class=\"modal-body\">\n <div [formGroup]=\"modalForm\">\n <div class=\"row\">\n <div class=\"col-sm-12 form-group\">\n <label>Section Name</label>\n <input class=\"form-control\" id=\"partNameInput\" formControlName=\"name\"/>\n </div>\n </div>\n\n </div>\n </div>\n <div class=\"modal-footer\">\n <button type=\"submit\" id=\"saveBtn\" [disabled]=\"modalForm.invalid\" class=\"btn btn-primary mr-1\" (click)=\"save()\">Save</button>\n <button type=\"button\" id=\"cancelBtn\" class=\"btn btn-primary mr-1\" (click)=\"cancel()\">Cancel</button>\n </div>" }]
39
- }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.BsModalRef }], propDecorators: { section: [{
40
- type: Input
41
- }], label: [{
42
- type: Input
43
- }], onSectionSave: [{
44
- type: Output
45
- }] } });
46
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdGlvbi1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL2RvY3VtZW50L3NlY3Rpb24tbW9kYWwvc2VjdGlvbi1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL2RvY3VtZW50L3NlY3Rpb24tbW9kYWwvc2VjdGlvbi1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9FLE9BQU8sRUFBMEIsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFRcEUsTUFBTSxPQUFPLHFCQUFxQjtJQVFaO0lBQXdCO0lBUG5DLE9BQU8sQ0FBeUI7SUFDaEMsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUVWLGFBQWEsR0FBd0MsSUFBSSxZQUFZLEVBQXlCLENBQUM7SUFFbEcsU0FBUyxDQUFhO0lBRTdCLFlBQW9CLEVBQWUsRUFBUyxVQUFzQjtRQUE5QyxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQVMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtJQUFJLENBQUM7SUFFdkUsUUFBUTtRQUNOLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRU8sVUFBVTtRQUNoQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQzdCLElBQUksRUFBRSxDQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2xELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxDQUFDO1FBQ3RELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN6QixDQUFDO3dHQTVCVSxxQkFBcUI7NEZBQXJCLHFCQUFxQiw4SkNWbEMsMDVCQW9CUTs7NEZEVksscUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLDJCQUEyQjt5R0FLNUIsT0FBTztzQkFBZixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFFSSxhQUFhO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUG9ydGFsRG9jdW1lbnRTZWN0aW9uIH0gZnJvbSAnLi4vcG9ydGFsLWRvY3VtZW50LXNlY3Rpb24nO1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQnVpbGRlciwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJzTW9kYWxSZWYgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnb2VwYS1pbnNlcnQtc2VjdGlvbi1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWN0aW9uLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2VjdGlvbi1tb2RhbC5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgU2VjdGlvbk1vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgc2VjdGlvbiE6IFBvcnRhbERvY3VtZW50U2VjdGlvbjtcbiAgQElucHV0KCkgbGFiZWwgPSAnJztcblxuICBAT3V0cHV0KCkgb25TZWN0aW9uU2F2ZTogRXZlbnRFbWl0dGVyPFBvcnRhbERvY3VtZW50U2VjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPFBvcnRhbERvY3VtZW50U2VjdGlvbj4oKTtcblxuICBwdWJsaWMgbW9kYWxGb3JtITogRm9ybUdyb3VwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLCBwdWJsaWMgYnNNb2RhbFJlZjogQnNNb2RhbFJlZikgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jcmVhdGVGb3JtKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZvcm0oKSB7XG4gICAgdGhpcy5tb2RhbEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIG5hbWU6IFsgdGhpcy5zZWN0aW9uLm5hbWUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV1cbiAgICB9KTtcbiAgfVxuXG4gIHNhdmUoKSB7XG4gICAgdGhpcy5zZWN0aW9uLm5hbWUgPSB0aGlzLm1vZGFsRm9ybS5nZXQoJ25hbWUnKT8udmFsdWU7XG4gICAgdGhpcy5vblNlY3Rpb25TYXZlLmVtaXQodGhpcy5zZWN0aW9uKTtcbiAgICB0aGlzLmJzTW9kYWxSZWYuaGlkZSgpO1xuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMuYnNNb2RhbFJlZi5oaWRlKCk7XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlIHB1bGwtbGVmdFwiPnt7bGFiZWx9fTwvaDQ+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZSBwdWxsLXJpZ2h0XCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cImNhbmNlbCgpXCI+XG4gICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gICAgICA8ZGl2IFtmb3JtR3JvdXBdPVwibW9kYWxGb3JtXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEyIGZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbD5TZWN0aW9uIE5hbWU8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJwYXJ0TmFtZUlucHV0XCIgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGlkPVwic2F2ZUJ0blwiIFtkaXNhYmxlZF09XCJtb2RhbEZvcm0uaW52YWxpZFwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG1yLTFcIiAoY2xpY2spPVwic2F2ZSgpXCI+U2F2ZTwvYnV0dG9uPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwiY2FuY2VsQnRuXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXItMVwiIChjbGljayk9XCJjYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICA8L2Rpdj4iXX0=
@@ -1,416 +0,0 @@
1
- /*
2
- Copyright 2018 Esri
3
- Licensed under the Apache License, Version 2.0 (the "License");
4
- you may not use this file except in compliance with the License.
5
- You may obtain a copy of the License at
6
- http://www.apache.org/licenses/LICENSE-2.0
7
- Unless required by applicable law or agreed to in writing, software
8
- distributed under the License is distributed on an "AS IS" BASIS,
9
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
- See the License for the specific language governing permissions and
11
- limitations under the License.
12
- */
13
- import { Component, ViewChild, Input, Output, EventEmitter } from '@angular/core';
14
- import { loadModules } from 'esri-loader';
15
- import * as i0 from "@angular/core";
16
- import * as i1 from "@angular/common";
17
- export class EsriMapComponent {
18
- mapLoaded = new EventEmitter();
19
- onNewCoordinates = new EventEmitter();
20
- mapViewEl;
21
- latLongSearchEl;
22
- /**
23
- * @private _zoom sets map zoom
24
- * @private _center sets map center
25
- * @private _basemap sets type of map
26
- */
27
- _zoom = 10;
28
- _center = [0.1278, 51.5074];
29
- _basemap = 'streets-vector';
30
- currentMapView;
31
- // private currentGraphic: esri.Graphic = null;
32
- // private selectedPoint: esri.Point = null;
33
- _currentLatLong;
34
- set currentLatLong(currentLatLong) {
35
- this._currentLatLong = currentLatLong;
36
- }
37
- get currentLatLong() {
38
- return this._currentLatLong;
39
- }
40
- set zoom(zoom) {
41
- this._zoom = zoom;
42
- }
43
- get zoom() {
44
- return this._zoom;
45
- }
46
- set center(center) {
47
- this._center = center;
48
- }
49
- get center() {
50
- return this._center;
51
- }
52
- set basemap(basemap) {
53
- this._basemap = basemap;
54
- }
55
- get basemap() {
56
- return this._basemap;
57
- }
58
- showSearch = false;
59
- constructor() { }
60
- async initializeMap() {
61
- // var mapView;
62
- const [EsriMap, EsriMapView, EsriBasemapToggle, locator, Search] = await loadModules([
63
- 'esri/Map',
64
- 'esri/views/MapView',
65
- "esri/widgets/BasemapToggle",
66
- "esri/rest/locator",
67
- "esri/widgets/Search"
68
- ]);
69
- const me = this;
70
- // Set type of map
71
- const mapProperties = {
72
- basemap: this._basemap,
73
- };
74
- const map = new EsriMap(mapProperties);
75
- // Set type of map view
76
- const mapViewProperties = {
77
- container: this.mapViewEl.nativeElement,
78
- center: this._center,
79
- zoom: this._zoom,
80
- map: map,
81
- popup: {
82
- dockEnabled: false,
83
- dockOptions: {
84
- buttonEnabled: false,
85
- breakpoint: false,
86
- }
87
- },
88
- };
89
- var mapView = new EsriMapView(mapViewProperties);
90
- mapView.popup.actionsMenuEnabled = false;
91
- mapView.popup._displayActionTextLimit = 0; // controls whether action button text is shown
92
- this.currentMapView = mapView;
93
- // All resources in the MapView and the map have loaded.
94
- // Now execute additional processes
95
- // this.currentMapView.when(() => {
96
- // this.mapLoaded.emit(true);
97
- // });
98
- // 1 - Create the widget
99
- const toggle = new EsriBasemapToggle({
100
- // 2 - Set properties
101
- view: mapView, // view that provides access to the map's 'topo' basemap
102
- nextBasemap: "hybrid" // allows for toggling to the 'hybrid' basemap
103
- });
104
- // Add widget to the top right corner of the view
105
- mapView.ui.add(toggle, "bottom-right");
106
- var updateLatLongAction = {
107
- title: "Yes",
108
- id: "update-lat-long",
109
- // image: "Measure_Distance16.png",
110
- className: "bi bi-hand-thumbs-up-fill"
111
- };
112
- var cancelUpdateAction = {
113
- title: "No",
114
- id: "cancel-update",
115
- // image: "Measure_Distance16.png",
116
- className: "bi bi-hand-thumbs-down-fill"
117
- };
118
- //this.currentMapView.popup.content = '{facilityName}';
119
- // this.currentMapView.on("click", event => {
120
- // let clickSymbol: esri.SimpleMarkerSymbol = new SimpleMarkerSymbol({
121
- // type: 'simple-marker',
122
- // style: 'diamond',
123
- // color: 'red',
124
- // size: '20pt'
125
- // });
126
- // this.currentMapView.graphics.remove(this.currentGraphic);
127
- // this.currentGraphic = new Graphic({
128
- // geometry : event.mapPoint,
129
- // symbol : clickSymbol
130
- // })
131
- // this.addPoint(String(event.mapPoint.latitude), String(event.mapPoint.longitude));
132
- // });
133
- // var symbol = new SimpleMarkerSymbol(
134
- // SimpleMarkerSymbol.STYLE_CIRCLE,
135
- // 12,
136
- // new SimpleLineSymbol(
137
- // SimpleLineSymbol.STYLE_NULL,
138
- // new Color([247, 34, 101, 0.9]),
139
- // 1
140
- // ),
141
- // new Color([207, 34, 171, 0.5])
142
- // );
143
- // mapView.when(() => {
144
- // this.mapLoaded.emit(true);
145
- // mapView.on("click", function(event) {
146
- // // you must overwrite default click-for-popup
147
- // // behavior to display your own popup
148
- // // me.currentMapView.popup.autoOpenEnabled = false;
149
- // // Get the coordinates of the click on the view
150
- // var lat = Math.round(event.mapPoint.latitude * 1000) / 1000;
151
- // var lon = Math.round(event.mapPoint.longitude * 1000) / 1000;
152
- // var info = lat + ', ' + lon;
153
- // mapView.graphics.clear();
154
- // mapView.graphics.add(new Graphic(event.mapPoint, symbol));
155
- // map.infoWindow.setContent("X: " + event.mapPoint.x.toString() + ", <br>Y: " + event.mapPoint.y.toString());
156
- // mapView.infoWindow.show(event.mapPoint)
157
- // const poptest = new Popup({
158
- // title: "Reverse geocode: [" + lon + ", " + lat + "]",
159
- // location: event.mapPoint, // Set the location of the popup to the clicked location
160
- // content: "This is a point of interest" // content displayed in the popup
161
- // })
162
- // mapView.popup.open({
163
- // // Set the popup's title to the coordinates of the location
164
- // title: "Reverse geocode: [" + lon + ", " + lat + "]",
165
- // location: event.mapPoint, // Set the location of the popup to the clicked location
166
- // content: "This is a point of interest" // content displayed in the popup
167
- // });
168
- // // me.showPopup(info, event);
169
- // });
170
- // // mapView.popup.on("trigger-action", function(evt){
171
- // // if(evt.action.id === "more-details"){
172
- // // // add graphic at view.popup.location
173
- // // }
174
- // // });
175
- // })
176
- /*
177
- * Create the Search Box widget used for address lookup. searchId is the id of the HTML tag (usually a DIV)
178
- * that is the placeholder for the search box.
179
- */
180
- if (this.showSearch) {
181
- var searchWidget = new Search({
182
- view: mapView,
183
- locationEnabled: false,
184
- container: this.latLongSearchEl.nativeElement,
185
- popupEnabled: false
186
- });
187
- }
188
- mapView.when(function () {
189
- if (me._currentLatLong &&
190
- me._currentLatLong.latDecimal && me._currentLatLong.latDecimal !== '' &&
191
- me._currentLatLong.longDecimal && me._currentLatLong.longDecimal !== '') {
192
- me.addPoint(me._currentLatLong.latDecimal, me._currentLatLong.longDecimal, 'xxx');
193
- me.zoomToFacility(me._currentLatLong.latDecimal, me._currentLatLong.longDecimal);
194
- }
195
- });
196
- mapView.when(function () {
197
- mapView.on("mouse-wheel", function (event) {
198
- // prevents zooming with the mouse-wheel event
199
- event.stopPropagation();
200
- });
201
- });
202
- mapView.when(function () {
203
- if (searchWidget) {
204
- searchWidget.on("select-result", function (event) {
205
- showPopup("xxx", event.result.feature.geometry);
206
- // let newLatLong: LatLong = {
207
- // latDecimal: mapView.popup.location.latitude,
208
- // longDecimal: mapView.popup.location.longitude
209
- // }
210
- // me.onNewCoordinates.emit(newLatLong); // this updates lat/long fields as soon as you click selected address
211
- });
212
- }
213
- });
214
- mapView.when(function () {
215
- mapView.popup.autoOpenEnabled = false;
216
- mapView.on("click", function (event) {
217
- searchWidget.clear();
218
- mapView.popup.clear();
219
- // Get the coordinates of the click on the view around the decimals to 3 decimals
220
- // var lat = Math.round(event.mapPoint.latitude * 1000) / 1000;
221
- // var lon = Math.round(event.mapPoint.longitude * 1000) / 1000;
222
- // this.selectedPoint = event.mapPoint;
223
- // mapView.popup.open({ //define
224
- // title: "<div style='font-size: 12px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;'>Update Latitude and Longitude</div>",
225
- // content:
226
- // "<div style='bold'>Address: </div>" + "<div>" + address + "</div>" +
227
- // "<input type='button' value=' Yes' id='" + options.mapId + "updateLatLong'>&nbsp;<input type='button' value='No' id='" + options.mapId + "cancelInfoWindow'>" ,
228
- // location: event.mapPoint,
229
- // actions: [updateLatLongAction, cancelUpdateAction],
230
- // });
231
- // Display the popup
232
- // Execute a reverse geocode using the clicked location
233
- locator.locationToAddress("https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer", { location: event.mapPoint })
234
- .then(function (response) {
235
- // If an address is successfully found, show it in the popup's content
236
- mapView.popup.content = response.address;
237
- var address = response.address;
238
- showPopup(address, event.mapPoint);
239
- })
240
- .catch(function (error) {
241
- // If the promise fails and no result is found, show a generic message
242
- mapView.popup.content = "No address was found for this location";
243
- showPopup("No address found.", event.mapPoint);
244
- });
245
- mapView.popup.visible = true;
246
- });
247
- });
248
- mapView.when(function () {
249
- mapView.popup.on("trigger-action", function (event) {
250
- // Execute the measureThis() function if the measure-this action is clicked
251
- if (event.action.id === "update-lat-long") {
252
- updateLatLong();
253
- }
254
- else if (event.action.id === "cancel-update") {
255
- cancelUpdate();
256
- }
257
- });
258
- });
259
- function showPopup(address, pt) {
260
- mapView.popup.open({
261
- title: "<div style='font-size: 12px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;'>Update Latitude and Longitude?</div>",
262
- content:
263
- // "<div style='bold'>Address: </div>" + "<div>" + address + "</div>" +
264
- "<div style='font-size: 12px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;'><div>Would you like to update the latitude and longitude values as shown below?</div>" +
265
- '<br/>' +
266
- "<div>Latitude: " + Math.round(pt.latitude * 100000) / 100000 + "</div>" +
267
- "<div>Longitude: " + Math.round(pt.longitude * 100000) / 100000 + "</div></div>",
268
- // "<input type='button' value=' Yes' id='" + options.mapId + "updateLatLong'>&nbsp;<input type='button' value='No' id='" + options.mapId + "cancelInfoWindow'>" ,
269
- location: pt,
270
- actions: [updateLatLongAction, cancelUpdateAction],
271
- collapsed: true
272
- });
273
- // mapView.popup._displayActionTextLimit = 3; // controls whether action button text is shown
274
- }
275
- function updateLatLong() {
276
- mapView.graphics.removeAll();
277
- // mapView.graphics.add(new Graphic(event.mapPoint, symbol));
278
- me.addPoint(mapView.popup.location.latitude, mapView.popup.location.longitude, 'xxx');
279
- let newLatLong = {
280
- latDecimal: mapView.popup.location.latitude,
281
- longDecimal: mapView.popup.location.longitude
282
- };
283
- me.onNewCoordinates.emit(newLatLong);
284
- cancelUpdate();
285
- mapView.popup.close();
286
- // console.log("updateLatLong called for lat: " + mapView.popup.location.latitude + ", long: " + mapView.popup.location.longitude);
287
- }
288
- function cancelUpdate() {
289
- mapView.popup.close();
290
- // console.log("cancelUpdate called");
291
- }
292
- //*** Add div element to show coordates ***//
293
- var coordsWidget = document.createElement("div");
294
- coordsWidget.id = "coordsWidget";
295
- coordsWidget.className = "esri-widget esri-component";
296
- coordsWidget.style.padding = "7px 15px 5px";
297
- mapView.ui.add(coordsWidget, "bottom-right");
298
- //*** Update lat, lon, zoom and scale ***//
299
- function showCoordinates(pt) {
300
- var coords = "Lat/Lon " + pt.latitude.toFixed(3) + " " + pt.longitude.toFixed(3) +
301
- " | Scale 1:" + Math.round(mapView.scale * 1) / 1 +
302
- " | Zoom " + mapView.zoom;
303
- coordsWidget.innerHTML = coords;
304
- }
305
- //*** Add event and show center coordinates after the view is finished moving e.g. zoom, pan ***//
306
- mapView.watch(["stationary"], function () {
307
- showCoordinates(mapView.center);
308
- });
309
- //*** Add event to show mouse coordinates on click and move ***//
310
- mapView.on(["pointer-down", "pointer-move"], function (evt) {
311
- showCoordinates(mapView.toMap({ x: evt.x, y: evt.y }));
312
- });
313
- }
314
- async resetMap() {
315
- this.currentMapView.graphics.removeAll();
316
- this.currentMapView.goTo({
317
- target: this._center,
318
- zoom: this._zoom
319
- });
320
- this.zoomToFacility;
321
- }
322
- async zoomToFacility(lat, long) {
323
- const [Point] = await loadModules([
324
- 'esri/geometry/Point'
325
- ]);
326
- let point = new Point({
327
- latitude: lat, //39.957767,
328
- longitude: long //-82.994939
329
- });
330
- this.currentMapView.goTo({
331
- target: point,
332
- zoom: 16
333
- });
334
- }
335
- // async removeSelectedPoint() {
336
- // if (this.currentGraphic) {
337
- // this.currentMapView.map.
338
- // }
339
- // }
340
- /**
341
- * Adds a new point to the current map with the given lat/long values.
342
- * @param lat
343
- * @param long
344
- */
345
- async addPoint(lat, long, name) {
346
- const [Point, Graphic, SimpleMarkerSymbol, ActionButton] = await loadModules([
347
- 'esri/geometry/Point',
348
- 'esri/Graphic',
349
- 'esri/symbols/SimpleMarkerSymbol',
350
- 'esri/support/actions/ActionButton'
351
- ]);
352
- let point = new Point({
353
- latitude: lat, //39.957767,
354
- longitude: long //-82.994939
355
- });
356
- let symbol = new SimpleMarkerSymbol({
357
- // type: 'simple-marker',
358
- style: 'circle',
359
- color: 'blue',
360
- size: '12px'
361
- });
362
- let actionButton = new ActionButton({
363
- active: true,
364
- visible: true,
365
- disabled: false,
366
- id: 'selectFacility',
367
- title: 'Select Facility',
368
- type: 'button'
369
- });
370
- let currentGraphic = new Graphic({
371
- geometry: point,
372
- symbol: symbol,
373
- popupTemplate: {
374
- title: name,
375
- content: name,
376
- },
377
- actions: [actionButton]
378
- });
379
- this.currentMapView.graphics.add(currentGraphic);
380
- this._currentLatLong = {
381
- latDecimal: lat,
382
- longDecimal: long
383
- };
384
- // console.log('Added point: ', lat, long);
385
- }
386
- ngOnInit() {
387
- this.initializeMap();
388
- }
389
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EsriMapComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
390
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: EsriMapComponent, selector: "oepa-esri-map", inputs: { currentLatLong: "currentLatLong", zoom: "zoom", center: "center", basemap: "basemap", showSearch: "showSearch" }, outputs: { mapLoaded: "mapLoaded", onNewCoordinates: "onNewCoordinates" }, viewQueries: [{ propertyName: "mapViewEl", first: true, predicate: ["mapViewNode"], descendants: true, static: true }, { propertyName: "latLongSearchEl", first: true, predicate: ["latLongSearchNode"], descendants: true }], ngImport: i0, template: "<!-- Here's the DIV that we inject the map into -->\n<div *ngIf=\"showSearch\" class=\"row\">\n <div class=\"col-md-12\">\n <div class=\"alert alert-success\">\n <label>Search for Address:</label>\n <div>Type an address in the input box below and select a match from the drop down list or select the\n magnifying glass button to plot the address on the map.</div>\n <div #latLongSearchNode></div>\n </div>\n </div>\n</div>\n<div #mapViewNode></div>", styles: ["@import\"https://js.arcgis.com/4.11/esri/css/main.css\";.esri-view{height:500px}.esri-view-width-less-than-large .esri-popup__action-text{display:block!important}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
391
- }
392
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EsriMapComponent, decorators: [{
393
- type: Component,
394
- args: [{ selector: 'oepa-esri-map', template: "<!-- Here's the DIV that we inject the map into -->\n<div *ngIf=\"showSearch\" class=\"row\">\n <div class=\"col-md-12\">\n <div class=\"alert alert-success\">\n <label>Search for Address:</label>\n <div>Type an address in the input box below and select a match from the drop down list or select the\n magnifying glass button to plot the address on the map.</div>\n <div #latLongSearchNode></div>\n </div>\n </div>\n</div>\n<div #mapViewNode></div>", styles: ["@import\"https://js.arcgis.com/4.11/esri/css/main.css\";.esri-view{height:500px}.esri-view-width-less-than-large .esri-popup__action-text{display:block!important}\n"] }]
395
- }], ctorParameters: () => [], propDecorators: { mapLoaded: [{
396
- type: Output
397
- }], onNewCoordinates: [{
398
- type: Output
399
- }], mapViewEl: [{
400
- type: ViewChild,
401
- args: ['mapViewNode', { static: true }]
402
- }], latLongSearchEl: [{
403
- type: ViewChild,
404
- args: ['latLongSearchNode', { static: false }]
405
- }], currentLatLong: [{
406
- type: Input
407
- }], zoom: [{
408
- type: Input
409
- }], center: [{
410
- type: Input
411
- }], basemap: [{
412
- type: Input
413
- }], showSearch: [{
414
- type: Input
415
- }] } });
416
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNyaS1tYXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb2VwYS11aS1saWIvc3JjL2xpYi9lc3JpLW1hcC9lc3JpLW1hcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL2VzcmktbWFwL2VzcmktbWFwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztFQVdFO0FBRUYsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQWMsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7O0FBUzFDLE1BQU0sT0FBTyxnQkFBZ0I7SUFFakIsU0FBUyxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7SUFDeEMsZ0JBQWdCLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUM7SUFDNUIsU0FBUyxDQUFjO0lBQ3hCLGVBQWUsQ0FBYztJQUVoRjs7OztPQUlHO0lBQ0ssS0FBSyxHQUFXLEVBQUUsQ0FBQztJQUNuQixPQUFPLEdBQWtCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNDLFFBQVEsR0FBVyxnQkFBZ0IsQ0FBQztJQUVwQyxjQUFjLENBQWdCO0lBQ3RDLCtDQUErQztJQUMvQyw0Q0FBNEM7SUFDcEMsZUFBZSxDQUFXO0lBRWxDLElBQ0ksY0FBYyxDQUFDLGNBQXVCO1FBQ3hDLElBQUksQ0FBQyxlQUFlLEdBQUcsY0FBYyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUNJLElBQUksQ0FBQyxJQUFZO1FBQ25CLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLENBQUM7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Q0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRWpELElBQUksQ0FBQyxlQUFlLEdBQUc7WUFDckIsVUFBVSxFQUFFLEdBQUc7WUFDZixXQUFXLEVBQUUsSUFBSTtTQUNsQixDQUFBO1FBQ0QsMkNBQTJDO0lBQzdDLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7d0dBMWJVLGdCQUFnQjs0RkFBaEIsZ0JBQWdCLDJkQ3hCN0IsZ2VBV3dCOzs0RkRhWCxnQkFBZ0I7a0JBTDVCLFNBQVM7K0JBQ0UsZUFBZTt3REFNZixTQUFTO3NCQUFsQixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDNkMsU0FBUztzQkFBNUQsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNTLGVBQWU7c0JBQWpFLFNBQVM7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQWlCN0MsY0FBYztzQkFEakIsS0FBSztnQkFVRixJQUFJO3NCQURQLEtBQUs7Z0JBVUYsTUFBTTtzQkFEVCxLQUFLO2dCQVVGLE9BQU87c0JBRFYsS0FBSztnQkFTRyxVQUFVO3NCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAgQ29weXJpZ2h0IDIwMTggRXNyaVxuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgbG9hZE1vZHVsZXMgfSBmcm9tICdlc3JpLWxvYWRlcic7XG5pbXBvcnQgZXNyaSA9IF9fZXNyaTtcbmltcG9ydCB7IExhdExvbmcgfSBmcm9tICdAb2hpb2VwYS9vZXBhLWViaXotbGliJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnb2VwYS1lc3JpLW1hcCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9lc3JpLW1hcC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2VzcmktbWFwLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBFc3JpTWFwQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBAT3V0cHV0KCkgbWFwTG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgb25OZXdDb29yZGluYXRlczogRXZlbnRFbWl0dGVyPExhdExvbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxMYXRMb25nPigpO1xuICBAVmlld0NoaWxkKCdtYXBWaWV3Tm9kZScsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgbWFwVmlld0VsITogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnbGF0TG9uZ1NlYXJjaE5vZGUnLCB7IHN0YXRpYzogZmFsc2UgfSkgbGF0TG9uZ1NlYXJjaEVsITogRWxlbWVudFJlZjtcblxuICAvKipcbiAgICogQHByaXZhdGUgX3pvb20gc2V0cyBtYXAgem9vbVxuICAgKiBAcHJpdmF0ZSBfY2VudGVyIHNldHMgbWFwIGNlbnRlclxuICAgKiBAcHJpdmF0ZSBfYmFzZW1hcCBzZXRzIHR5cGUgb2YgbWFwXG4gICAqL1xuICBwcml2YXRlIF96b29tOiBudW1iZXIgPSAxMDtcbiAgcHJpdmF0ZSBfY2VudGVyOiBBcnJheTxudW1iZXI+ID0gWzAuMTI3OCwgNTEuNTA3NF07XG4gIHByaXZhdGUgX2Jhc2VtYXA6IHN0cmluZyA9ICdzdHJlZXRzLXZlY3Rvcic7XG5cbiAgcHJpdmF0ZSBjdXJyZW50TWFwVmlldyE6IGVzcmkuTWFwVmlldztcbiAgLy8gcHJpdmF0ZSBjdXJyZW50R3JhcGhpYzogZXNyaS5HcmFwaGljID0gbnVsbDtcbiAgLy8gcHJpdmF0ZSBzZWxlY3RlZFBvaW50OiBlc3JpLlBvaW50ID0gbnVsbDtcbiAgcHJpdmF0ZSBfY3VycmVudExhdExvbmchOiBMYXRMb25nO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBjdXJyZW50TGF0TG9uZyhjdXJyZW50TGF0TG9uZzogTGF0TG9uZykge1xuICAgIHRoaXMuX2N1cnJlbnRMYXRMb25nID0gY3VycmVudExhdExvbmc7XG4gIH1cblxuICBnZXQgY3VycmVudExhdExvbmcoKTogTGF0TG9uZyB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRMYXRMb25nO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHpvb20oem9vbTogbnVtYmVyKSB7XG4gICAgdGhpcy5fem9vbSA9IHpvb207XG4gIH1cblxuICBnZXQgem9vbSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl96b29tO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGNlbnRlcihjZW50ZXI6IEFycmF5PG51bWJlcj4pIHtcbiAgICB0aGlzLl9jZW50ZXIgPSBjZW50ZXI7XG4gIH1cblxuICBnZXQgY2VudGVyKCk6IEFycmF5PG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLl9jZW50ZXI7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgYmFzZW1hcChiYXNlbWFwOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9iYXNlbWFwID0gYmFzZW1hcDtcbiAgfVxuXG4gIGdldCBiYXNlbWFwKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Jhc2VtYXA7XG4gIH1cblxuICBASW5wdXQoKSBzaG93U2VhcmNoID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoKSB7IH1cblxuICBhc3luYyBpbml0aWFsaXplTWFwKCkge1xuICAgIC8vIHZhciBtYXBWaWV3O1xuICAgIGNvbnN0IFtFc3JpTWFwLCBFc3JpTWFwVmlldywgRXNyaUJhc2VtYXBUb2dnbGUsIGxvY2F0b3IgLCBTZWFyY2ggXSA9IGF3YWl0IGxvYWRNb2R1bGVzKFtcbiAgICAgICdlc3JpL01hcCcsXG4gICAgICAnZXNyaS92aWV3cy9NYXBWaWV3JyxcbiAgICAgIFwiZXNyaS93aWRnZXRzL0Jhc2VtYXBUb2dnbGVcIixcbiAgICAgIFwiZXNyaS9yZXN0L2xvY2F0b3JcIixcbiAgICAgIFwiZXNyaS93aWRnZXRzL1NlYXJjaFwiXG4gICAgXSk7XG5cbiAgICBjb25zdCBtZSA9IHRoaXM7XG4gICAgLy8gU2V0IHR5cGUgb2YgbWFwXG4gICAgY29uc3QgbWFwUHJvcGVydGllczogZXNyaS5NYXBQcm9wZXJ0aWVzID0ge1xuICAgICAgYmFzZW1hcDogdGhpcy5fYmFzZW1hcCxcbiAgICB9O1xuXG4gICAgY29uc3QgbWFwOiBlc3JpLk1hcCA9IG5ldyBFc3JpTWFwKG1hcFByb3BlcnRpZXMpO1xuXG4gICAgLy8gU2V0IHR5cGUgb2YgbWFwIHZpZXdcbiAgICBjb25zdCBtYXBWaWV3UHJvcGVydGllczogZXNyaS5NYXBWaWV3UHJvcGVydGllcyA9IHtcbiAgICAgIGNvbnRhaW5lcjogdGhpcy5tYXBWaWV3RWwubmF0aXZlRWxlbWVudCxcbiAgICAgIGNlbnRlcjogdGhpcy5fY2VudGVyLFxuICAgICAgem9vbTogdGhpcy5fem9vbSxcbiAgICAgIG1hcDogbWFwLFxuICAgICAgcG9wdXA6IHtcbiAgICAgICAgZG9ja0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBkb2NrT3B0aW9uczoge1xuICAgICAgICAgIGJ1dHRvbkVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIGJyZWFrcG9pbnQ6IGZhbHNlLFxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG5cbiAgICB2YXIgbWFwVmlldyA9IG5ldyBFc3JpTWFwVmlldyhtYXBWaWV3UHJvcGVydGllcyk7XG4gICAgbWFwVmlldy5wb3B1cC5hY3Rpb25zTWVudUVuYWJsZWQgPSBmYWxzZTtcbiAgICBtYXBWaWV3LnBvcHVwLl9kaXNwbGF5QWN0aW9uVGV4dExpbWl0ID0gMDsgLy8gY29udHJvbHMgd2hldGhlciBhY3Rpb24gYnV0dG9uIHRleHQgaXMgc2hvd25cbiAgICB0aGlzLmN1cnJlbnRNYXBWaWV3ID0gbWFwVmlldztcblxuICAgIC8vIEFsbCByZXNvdXJjZXMgaW4gdGhlIE1hcFZpZXcgYW5kIHRoZSBtYXAgaGF2ZSBsb2FkZWQuXG4gICAgLy8gTm93IGV4ZWN1dGUgYWRkaXRpb25hbCBwcm9jZXNzZXNcbiAgICAvLyB0aGlzLmN1cnJlbnRNYXBWaWV3LndoZW4oKCkgPT4ge1xuICAgIC8vICAgdGhpcy5tYXBMb2FkZWQuZW1pdCh0cnVlKTtcbiAgICAvLyB9KTtcblxuICAgIC8vIDEgLSBDcmVhdGUgdGhlIHdpZGdldFxuICAgIGNvbnN0IHRvZ2dsZTogZXNyaS5CYXNlbWFwVG9nZ2xlID0gbmV3IEVzcmlCYXNlbWFwVG9nZ2xlKHtcbiAgICAgIC8vIDIgLSBTZXQgcHJvcGVydGllc1xuICAgICAgdmlldzogbWFwVmlldywgLy8gdmlldyB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgbWFwJ3MgJ3RvcG8nIGJhc2VtYXBcbiAgICAgIG5leHRCYXNlbWFwOiBcImh5YnJpZFwiIC8vIGFsbG93cyBmb3IgdG9nZ2xpbmcgdG8gdGhlICdoeWJyaWQnIGJhc2VtYXBcbiAgICB9KTtcblxuICAgIC8vIEFkZCB3aWRnZXQgdG8gdGhlIHRvcCByaWdodCBjb3JuZXIgb2YgdGhlIHZpZXdcbiAgICBtYXBWaWV3LnVpLmFkZCh0b2dnbGUsIFwiYm90dG9tLXJpZ2h0XCIpO1xuXG4gICAgdmFyIHVwZGF0ZUxhdExvbmdBY3Rpb24gPSB7XG4gICAgICB0aXRsZTogXCJZZXNcIixcbiAgICAgIGlkOiBcInVwZGF0ZS1sYXQtbG9uZ1wiLFxuICAgICAgLy8gaW1hZ2U6IFwiTWVhc3VyZV9EaXN0YW5jZTE2LnBuZ1wiLFxuICAgICAgY2xhc3NOYW1lOiBcImJpIGJpLWhhbmQtdGh1bWJzLXVwLWZpbGxcIlxuICAgIH07XG5cbiAgICB2YXIgY2FuY2VsVXBkYXRlQWN0aW9uID0ge1xuICAgICAgdGl0bGU6IFwiTm9cIixcbiAgICAgIGlkOiBcImNhbmNlbC11cGRhdGVcIixcbiAgICAgIC8vIGltYWdlOiBcIk1lYXN1cmVfRGlzdGFuY2UxNi5wbmdcIixcbiAgICAgIGNsYXNzTmFtZTogXCJiaSBiaS1oYW5kLXRodW1icy1kb3duLWZpbGxcIlxuICAgIH07XG5cbiAgICAvL3RoaXMuY3VycmVudE1hcFZpZXcucG9wdXAuY29udGVudCA9ICd7ZmFjaWxpdHlOYW1lfSc7XG5cbiAgICAvLyB0aGlzLmN1cnJlbnRNYXBWaWV3Lm9uKFwiY2xpY2tcIiwgZXZlbnQgPT4ge1xuICAgIC8vICAgbGV0IGNsaWNrU3ltYm9sOiBlc3JpLlNpbXBsZU1hcmtlclN5bWJvbCA9IG5ldyBTaW1wbGVNYXJrZXJTeW1ib2woe1xuICAgIC8vICAgICB0eXBlOiAnc2ltcGxlLW1hcmtlcicsXG4gICAgLy8gICAgIHN0eWxlOiAnZGlhbW9uZCcsXG4gICAgLy8gICAgIGNvbG9yOiAncmVkJyxcbiAgICAvLyAgICAgc2l6ZTogJzIwcHQnXG4gICAgLy8gICB9KTtcbiAgICAvLyAgIHRoaXMuY3VycmVudE1hcFZpZXcuZ3JhcGhpY3MucmVtb3ZlKHRoaXMuY3VycmVudEdyYXBoaWMpO1xuICAgIC8vICAgdGhpcy5jdXJyZW50R3JhcGhpYyA9IG5ldyBHcmFwaGljKHtcbiAgICAvLyAgICAgZ2VvbWV0cnkgOiBldmVudC5tYXBQb2ludCxcbiAgICAvLyAgICAgc3ltYm9sIDogY2xpY2tTeW1ib2xcbiAgICAvLyAgIH0pXG5cbiAgICAvLyAgIHRoaXMuYWRkUG9pbnQoU3RyaW5nKGV2ZW50Lm1hcFBvaW50LmxhdGl0dWRlKSwgU3RyaW5nKGV2ZW50Lm1hcFBvaW50LmxvbmdpdHVkZSkpO1xuICAgIC8vIH0pO1xuXG4gICAgLy8gdmFyIHN5bWJvbCA9IG5ldyBTaW1wbGVNYXJrZXJTeW1ib2woXG4gICAgLy8gICBTaW1wbGVNYXJrZXJTeW1ib2wuU1RZTEVfQ0lSQ0xFLFxuICAgIC8vICAgMTIsXG4gICAgLy8gICBuZXcgU2ltcGxlTGluZVN5bWJvbChcbiAgICAvLyAgICAgU2ltcGxlTGluZVN5bWJvbC5TVFlMRV9OVUxMLFxuICAgIC8vICAgICBuZXcgQ29sb3IoWzI0NywgMzQsIDEwMSwgMC45XSksXG4gICAgLy8gICAgIDFcbiAgICAvLyAgICksXG4gICAgLy8gICBuZXcgQ29sb3IoWzIwNywgMzQsIDE3MSwgMC41XSlcbiAgICAvLyApO1xuXG4gICAgLy8gbWFwVmlldy53aGVuKCgpID0+IHtcbiAgICAvLyAgIHRoaXMubWFwTG9hZGVkLmVtaXQodHJ1ZSk7XG4gICAgLy8gICBtYXBWaWV3Lm9uKFwiY2xpY2tcIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAvLyAgICAgLy8geW91IG11c3Qgb3ZlcndyaXRlIGRlZmF1bHQgY2xpY2stZm9yLXBvcHVwXG4gICAgLy8gICAgIC8vIGJlaGF2aW9yIHRvIGRpc3BsYXkgeW91ciBvd24gcG9wdXBcbiAgICAvLyAgICAgLy8gbWUuY3VycmVudE1hcFZpZXcucG9wdXAuYXV0b09wZW5FbmFibGVkID0gZmFsc2U7XG5cbiAgICAvLyAgICAgLy8gR2V0IHRoZSBjb29yZGluYXRlcyBvZiB0aGUgY2xpY2sgb24gdGhlIHZpZXdcbiAgICAvLyAgICAgdmFyIGxhdCA9IE1hdGgucm91bmQoZXZlbnQubWFwUG9pbnQubGF0aXR1ZGUgKiAxMDAwKSAvIDEwMDA7XG4gICAgLy8gICAgIHZhciBsb24gPSBNYXRoLnJvdW5kKGV2ZW50Lm1hcFBvaW50LmxvbmdpdHVkZSAqIDEwMDApIC8gMTAwMDtcbiAgICAvLyAgICAgdmFyIGluZm8gPSBsYXQgKyAnLCAnICsgbG9uO1xuXG4gICAgLy8gICAgIG1hcFZpZXcuZ3JhcGhpY3MuY2xlYXIoKTtcbiAgICAvLyAgICAgbWFwVmlldy5ncmFwaGljcy5hZGQobmV3IEdyYXBoaWMoZXZlbnQubWFwUG9pbnQsIHN5bWJvbCkpO1xuICAgIC8vICAgICBtYXAuaW5mb1dpbmRvdy5zZXRDb250ZW50KFwiWDogXCIgKyBldmVudC5tYXBQb2ludC54LnRvU3RyaW5nKCkgKyBcIiwgPGJyPlk6IFwiICsgZXZlbnQubWFwUG9pbnQueS50b1N0cmluZygpKTtcbiAgICAvLyAgICAgbWFwVmlldy5pbmZvV2luZG93LnNob3coZXZlbnQubWFwUG9pbnQpXG5cbiAgICAvLyAgICAgY29uc3QgcG9wdGVzdCA9IG5ldyBQb3B1cCh7XG4gICAgLy8gICAgICAgdGl0bGU6IFwiUmV2ZXJzZSBnZW9jb2RlOiBbXCIgKyBsb24gKyBcIiwgXCIgKyBsYXQgKyBcIl1cIixcbiAgICAvLyAgICAgICBsb2NhdGlvbjogZXZlbnQubWFwUG9pbnQsIC8vIFNldCB0aGUgbG9jYXRpb24gb2YgdGhlIHBvcHVwIHRvIHRoZSBjbGlja2VkIGxvY2F0aW9uXG4gICAgLy8gICAgICAgY29udGVudDogXCJUaGlzIGlzIGEgcG9pbnQgb2YgaW50ZXJlc3RcIiAgLy8gY29udGVudCBkaXNwbGF5ZWQgaW4gdGhlIHBvcHVwXG4gICAgLy8gICAgIH0pXG4gICAgLy8gICAgIG1hcFZpZXcucG9wdXAub3Blbih7XG4gICAgLy8gICAgICAgLy8gU2V0IHRoZSBwb3B1cCdzIHRpdGxlIHRvIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgbG9jYXRpb25cbiAgICAvLyAgICAgICB0aXRsZTogXCJSZXZlcnNlIGdlb2NvZGU6IFtcIiArIGxvbiArIFwiLCBcIiArIGxhdCArIFwiXVwiLFxuICAgIC8vICAgICAgIGxvY2F0aW9uOiBldmVudC5tYXBQb2ludCwgLy8gU2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgcG9wdXAgdG8gdGhlIGNsaWNrZWQgbG9jYXRpb25cbiAgICAvLyAgICAgICBjb250ZW50OiBcIlRoaXMgaXMgYSBwb2ludCBvZiBpbnRlcmVzdFwiICAvLyBjb250ZW50IGRpc3BsYXllZCBpbiB0aGUgcG9wdXBcbiAgICAvLyAgICAgfSk7XG4gICAgLy8gICAgIC8vIG1lLnNob3dQb3B1cChpbmZvLCBldmVudCk7XG5cbiAgICAvLyAgICB9KTtcblxuICAgIC8vICAgLy8gIG1hcFZpZXcucG9wdXAub24oXCJ0cmlnZ2VyLWFjdGlvblwiLCBmdW5jdGlvbihldnQpe1xuICAgIC8vICAgLy8gICAgaWYoZXZ0LmFjdGlvbi5pZCA9PT0gXCJtb3JlLWRldGFpbHNcIil7XG4gICAgLy8gICAvLyAgICAgIC8vIGFkZCBncmFwaGljIGF0IHZpZXcucG9wdXAubG9jYXRpb25cbiAgICAvLyAgIC8vICAgIH1cbiAgICAvLyAgIC8vICB9KTtcblxuICAgIC8vICAgfSlcblxuICAgIC8qXG4gICAgICogQ3JlYXRlIHRoZSBTZWFyY2ggQm94IHdpZGdldCB1c2VkIGZvciBhZGRyZXNzIGxvb2t1cC4gc2VhcmNoSWQgaXMgdGhlIGlkIG9mIHRoZSBIVE1MIHRhZyAodXN1YWxseSBhIERJVilcbiAgICAgKiB0aGF0IGlzIHRoZSBwbGFjZWhvbGRlciBmb3IgdGhlIHNlYXJjaCBib3guXG4gICAgICovXG4gICAgaWYgKHRoaXMuc2hvd1NlYXJjaCkge1xuICAgICAgdmFyIHNlYXJjaFdpZGdldCA9IG5ldyBTZWFyY2goe1xuICAgICAgICB2aWV3OiBtYXBWaWV3LFxuICAgICAgICBsb2NhdGlvbkVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBjb250YWluZXI6IHRoaXMubGF0TG9uZ1NlYXJjaEVsLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgIHBvcHVwRW5hYmxlZDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG1hcFZpZXcud2hlbihmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAobWUuX2N1cnJlbnRMYXRMb25nICYmXG4gICAgICAgICAgbWUuX2N1cnJlbnRMYXRMb25nLmxhdERlY2ltYWwgJiYgbWUuX2N1cnJlbnRMYXRMb25nLmxhdERlY2ltYWwgIT09ICcnICYmXG4gICAgICAgICAgbWUuX2N1cnJlbnRMYXRMb25nLmxvbmdEZWNpbWFsICYmIG1lLl9jdXJyZW50TGF0TG9uZy5sb25nRGVjaW1hbCAhPT0gJycpIHtcbiAgICAgICAgbWUuYWRkUG9pbnQobWUuX2N1cnJlbnRMYXRMb25nLmxhdERlY2ltYWwsIG1lLl9jdXJyZW50TGF0TG9uZy5sb25nRGVjaW1hbCwgJ3h4eCcpO1xuICAgICAgICBtZS56b29tVG9GYWNpbGl0eShtZS5fY3VycmVudExhdExvbmcubGF0RGVjaW1hbCwgbWUuX2N1cnJlbnRMYXRMb25nLmxvbmdEZWNpbWFsKTtcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgbWFwVmlldy53aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIG1hcFZpZXcub24oXCJtb3VzZS13aGVlbFwiLCBmdW5jdGlvbiAoZXZlbnQ6YW55KSB7XG4gICAgICAgIC8vIHByZXZlbnRzIHpvb21pbmcgd2l0aCB0aGUgbW91c2Utd2hlZWwgZXZlbnRcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9KTtcbiAgICB9KVxuXG4gICAgbWFwVmlldy53aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHNlYXJjaFdpZGdldCkge1xuICAgICAgICBzZWFyY2hXaWRnZXQub24oXCJzZWxlY3QtcmVzdWx0XCIsIGZ1bmN0aW9uIChldmVudDphbnkpIHtcbiAgICAgICAgICBzaG93UG9wdXAoXCJ4eHhcIiwgZXZlbnQucmVzdWx0LmZlYXR1cmUuZ2VvbWV0cnkpO1xuICBcbiAgICAgICAgICAvLyBsZXQgbmV3TGF0TG9uZzogTGF0TG9uZyA9IHtcbiAgICAgICAgICAvLyAgIGxhdERlY2ltYWw6IG1hcFZpZXcucG9wdXAubG9jYXRpb24ubGF0aXR1ZGUsXG4gICAgICAgICAgLy8gICBsb25nRGVjaW1hbDogbWFwVmlldy5wb3B1cC5sb2NhdGlvbi5sb25naXR1ZGVcbiAgICAgICAgICAvLyB9XG4gICAgICAgICAgLy8gbWUub25OZXdDb29yZGluYXRlcy5lbWl0KG5ld0xhdExvbmcpOyAvLyB0aGlzIHVwZGF0ZXMgbGF0L2xvbmcgZmllbGRzIGFzIHNvb24gYXMgeW91IGNsaWNrIHNlbGVjdGVkIGFkZHJlc3NcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSlcblxuICAgIG1hcFZpZXcud2hlbihmdW5jdGlvbiAoKSB7XG4gICAgICBtYXBWaWV3LnBvcHVwLmF1dG9PcGVuRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgbWFwVmlldy5vbihcImNsaWNrXCIsIGZ1bmN0aW9uIChldmVudDphbnkpIHtcbiAgICAgICAgc2VhcmNoV2lkZ2V0LmNsZWFyKCk7XG4gICAgICAgIG1hcFZpZXcucG9wdXAuY2xlYXIoKTtcbiAgICAgICAgLy8gR2V0IHRoZSBjb29yZGluYXRlcyBvZiB0aGUgY2xpY2sgb24gdGhlIHZpZXcgYXJvdW5kIHRoZSBkZWNpbWFscyB0byAzIGRlY2ltYWxzXG4gICAgICAgIC8vIHZhciBsYXQgPSBNYXRoLnJvdW5kKGV2ZW50Lm1hcFBvaW50LmxhdGl0dWRlICogMTAwMCkgLyAxMDAwO1xuICAgICAgICAvLyB2YXIgbG9uID0gTWF0aC5yb3VuZChldmVudC5tYXBQb2ludC5sb25naXR1ZGUgKiAxMDAwKSAvIDEwMDA7XG4gICAgICAgIC8vIHRoaXMuc2VsZWN0ZWRQb2ludCA9IGV2ZW50Lm1hcFBvaW50O1xuXG4gICAgICAgIC8vIG1hcFZpZXcucG9wdXAub3Blbih7ICAgLy9kZWZpbmVcbiAgICAgICAgLy8gICB0aXRsZTogXCI8ZGl2IHN0eWxlPSdmb250LXNpemU6IDEycHg7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBHZW5ldmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Jz5VcGRhdGUgTGF0aXR1ZGUgYW5kIExvbmdpdHVkZTwvZGl2PlwiLFxuICAgICAgICAvLyAgIGNvbnRlbnQ6IFxuICAgICAgICAvLyAgICBcIjxkaXYgc3R5bGU9J2JvbGQnPkFkZHJlc3M6IDwvZGl2PlwiICsgXCI8ZGl2PlwiICsgYWRkcmVzcyArIFwiPC9kaXY+XCIgK1xuICAgICAgICAvLyAgIFwiPGlucHV0IHR5cGU9J2J1dHRvbicgdmFsdWU9JyBZZXMnIGlkPSdcIiArIG9wdGlvbnMubWFwSWQgKyBcInVwZGF0ZUxhdExvbmcnPiZuYnNwOzxpbnB1dCB0eXBlPSdidXR0b24nIHZhbHVlPSdObycgaWQ9J1wiICsgb3B0aW9ucy5tYXBJZCArIFwiY2FuY2VsSW5mb1dpbmRvdyc+XCIgLFxuICAgICAgICAvLyAgIGxvY2F0aW9uOiBldmVudC5tYXBQb2ludCxcbiAgICAgICAgLy8gICBhY3Rpb25zOiBbdXBkYXRlTGF0TG9uZ0FjdGlvbiwgY2FuY2VsVXBkYXRlQWN0aW9uXSxcbiAgICAgICAgLy8gfSk7XG4gICAgICAgIC8vIERpc3BsYXkgdGhlIHBvcHVwXG4gICAgICAgIC8vIEV4ZWN1dGUgYSByZXZlcnNlIGdlb2NvZGUgdXNpbmcgdGhlIGNsaWNrZWQgbG9jYXRpb25cbiAgICAgICAgbG9jYXRvci5sb2NhdGlvblRvQWRkcmVzcyhcImh0dHBzOi8vZ2VvY29kZS5hcmNnaXMuY29tL2FyY2dpcy9yZXN0L3NlcnZpY2VzL1dvcmxkL0dlb2NvZGVTZXJ2ZXJcIiwgeyBsb2NhdGlvbjogZXZlbnQubWFwUG9pbnQgfSlcbiAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2U6YW55KSB7XG4gICAgICAgICAgICAvLyBJZiBhbiBhZGRyZXNzIGlzIHN1Y2Nlc3NmdWxseSBmb3VuZCwgc2hvdyBpdCBpbiB0aGUgcG9wdXAncyBjb250ZW50XG4gICAgICAgICAgICBtYXBWaWV3LnBvcHVwLmNvbnRlbnQgPSByZXNwb25zZS5hZGRyZXNzO1xuICAgICAgICAgICAgdmFyIGFkZHJlc3MgPSByZXNwb25zZS5hZGRyZXNzO1xuICAgICAgICAgICAgc2hvd1BvcHVwKGFkZHJlc3MsIGV2ZW50Lm1hcFBvaW50KTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3I6YW55KSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgcHJvbWlzZSBmYWlscyBhbmQgbm8gcmVzdWx0IGlzIGZvdW5kLCBzaG93IGEgZ2VuZXJpYyBtZXNzYWdlXG4gICAgICAgICAgICBtYXBWaWV3LnBvcHVwLmNvbnRlbnQgPSBcIk5vIGFkZHJlc3Mgd2FzIGZvdW5kIGZvciB0aGlzIGxvY2F0aW9uXCI7XG4gICAgICAgICAgICBzaG93UG9wdXAoXCJObyBhZGRyZXNzIGZvdW5kLlwiLCBldmVudC5tYXBQb2ludCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgbWFwVmlldy5wb3B1cC52aXNpYmxlID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0pXG5cbiAgICBtYXBWaWV3LndoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgbWFwVmlldy5wb3B1cC5vbihcInRyaWdnZXItYWN0aW9uXCIsIGZ1bmN0aW9uIChldmVudDphbnkpIHtcbiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgbWVhc3VyZVRoaXMoKSBmdW5jdGlvbiBpZiB0aGUgbWVhc3VyZS10aGlzIGFjdGlvbiBpcyBjbGlja2VkXG4gICAgICAgIGlmIChldmVudC5hY3Rpb24uaWQgPT09IFwidXBkYXRlLWxhdC1sb25nXCIpIHtcbiAgICAgICAgICB1cGRhdGVMYXRMb25nKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuYWN0aW9uLmlkID09PSBcImNhbmNlbC11cGRhdGVcIikge1xuICAgICAgICAgIGNhbmNlbFVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KVxuXG4gICAgZnVuY3Rpb24gc2hvd1BvcHVwKGFkZHJlc3M6YW55LCBwdDphbnkpIHtcbiAgICAgIG1hcFZpZXcucG9wdXAub3Blbih7XG4gICAgICAgIHRpdGxlOiBcIjxkaXYgc3R5bGU9J2ZvbnQtc2l6ZTogMTJweDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEdlbmV2YSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsnPlVwZGF0ZSBMYXRpdHVkZSBhbmQgTG9uZ2l0dWRlPzwvZGl2PlwiLFxuICAgICAgICBjb250ZW50OlxuICAgICAgICAgIC8vICBcIjxkaXYgc3R5bGU9J2JvbGQnPkFkZHJlc3M6IDwvZGl2PlwiICsgXCI8ZGl2PlwiICsgYWRkcmVzcyArIFwiPC9kaXY+XCIgK1xuICAgICAgICAgIFwiPGRpdiBzdHlsZT0nZm9udC1zaXplOiAxMnB4OyBmb250LWZhbWlseTogVmVyZGFuYSwgR2VuZXZhLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyc+PGRpdj5Xb3VsZCB5b3UgbGlrZSB0byB1cGRhdGUgdGhlIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgdmFsdWVzIGFzIHNob3duIGJlbG93PzwvZGl2PlwiICtcbiAgICAgICAgICAnPGJyLz4nICtcbiAgICAgICAgICBcIjxkaXY+TGF0aXR1ZGU6IFwiICsgTWF0aC5yb3VuZChwdC5sYXRpdHVkZSAqIDEwMDAwMCkgLyAxMDAwMDAgKyBcIjwvZGl2PlwiICtcbiAgICAgICAgICBcIjxkaXY+TG9uZ2l0dWRlOiBcIiArIE1hdGgucm91bmQocHQubG9uZ2l0dWRlICogMTAwMDAwKSAvIDEwMDAwMCArIFwiPC9kaXY+PC9kaXY+XCIsXG4gICAgICAgIC8vIFwiPGlucHV0IHR5cGU9J2J1dHRvbicgdmFsdWU9JyBZZXMnIGlkPSdcIiArIG9wdGlvbnMubWFwSWQgKyBcInVwZGF0ZUxhdExvbmcnPiZuYnNwOzxpbnB1dCB0eXBlPSdidXR0b24nIHZhbHVlPSdObycgaWQ9J1wiICsgb3B0aW9ucy5tYXBJZCArIFwiY2FuY2VsSW5mb1dpbmRvdyc+XCIgLFxuICAgICAgICBsb2NhdGlvbjogcHQsXG4gICAgICAgIGFjdGlvbnM6IFt1cGRhdGVMYXRMb25nQWN0aW9uLCBjYW5jZWxVcGRhdGVBY3Rpb25dLFxuICAgICAgICBjb2xsYXBzZWQ6IHRydWVcbiAgICAgIH0pO1xuICAgICAgLy8gbWFwVmlldy5wb3B1cC5fZGlzcGxheUFjdGlvblRleHRMaW1pdCA9IDM7IC8vIGNvbnRyb2xzIHdoZXRoZXIgYWN0aW9uIGJ1dHRvbiB0ZXh0IGlzIHNob3duXG5cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1cGRhdGVMYXRMb25nKCkge1xuICAgICAgbWFwVmlldy5ncmFwaGljcy5yZW1vdmVBbGwoKTtcbiAgICAgIC8vIG1hcFZpZXcuZ3JhcGhpY3MuYWRkKG5ldyBHcmFwaGljKGV2ZW50Lm1hcFBvaW50LCBzeW1ib2wpKTtcbiAgICAgIG1lLmFkZFBvaW50KG1hcFZpZXcucG9wdXAubG9jYXRpb24ubGF0aXR1ZGUsIG1hcFZpZXcucG9wdXAubG9jYXRpb24ubG9uZ2l0dWRlLCAneHh4Jyk7XG5cbiAgICAgIGxldCBuZXdMYXRMb25nOiBMYXRMb25nID0ge1xuICAgICAgICBsYXREZWNpbWFsOiBtYXBWaWV3LnBvcHVwLmxvY2F0aW9uLmxhdGl0dWRlLFxuICAgICAgICBsb25nRGVjaW1hbDogbWFwVmlldy5wb3B1cC5sb2NhdGlvbi5sb25naXR1ZGVcbiAgICAgIH1cbiAgICAgIG1lLm9uTmV3Q29vcmRpbmF0ZXMuZW1pdChuZXdMYXRMb25nKTtcblxuICAgICAgY2FuY2VsVXBkYXRlKCk7XG4gICAgICBtYXBWaWV3LnBvcHVwLmNsb3NlKCk7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcInVwZGF0ZUxhdExvbmcgY2FsbGVkIGZvciBsYXQ6IFwiICsgbWFwVmlldy5wb3B1cC5sb2NhdGlvbi5sYXRpdHVkZSArIFwiLCBsb25nOiBcIiArIG1hcFZpZXcucG9wdXAubG9jYXRpb24ubG9uZ2l0dWRlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYW5jZWxVcGRhdGUoKSB7XG4gICAgICBtYXBWaWV3LnBvcHVwLmNsb3NlKCk7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcImNhbmNlbFVwZGF0ZSBjYWxsZWRcIik7XG4gICAgfVxuXG4gICAgLy8qKiogQWRkIGRpdiBlbGVtZW50IHRvIHNob3cgY29vcmRhdGVzICoqKi8vXG4gICAgdmFyIGNvb3Jkc1dpZGdldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgY29vcmRzV2lkZ2V0LmlkID0gXCJjb29yZHNXaWRnZXRcIjtcbiAgICBjb29yZHNXaWRnZXQuY2xhc3NOYW1lID0gXCJlc3JpLXdpZGdldCBlc3JpLWNvbXBvbmVudFwiO1xuICAgIGNvb3Jkc1dpZGdldC5zdHlsZS5wYWRkaW5nID0gXCI3cHggMTVweCA1cHhcIjtcbiAgICBtYXBWaWV3LnVpLmFkZChjb29yZHNXaWRnZXQsIFwiYm90dG9tLXJpZ2h0XCIpO1xuXG4gICAgLy8qKiogVXBkYXRlIGxhdCwgbG9uLCB6b29tIGFuZCBzY2FsZSAqKiovL1xuICAgIGZ1bmN0aW9uIHNob3dDb29yZGluYXRlcyhwdDphbnkpIHtcbiAgICAgIHZhciBjb29yZHMgPSBcIkxhdC9Mb24gXCIgKyBwdC5sYXRpdHVkZS50b0ZpeGVkKDMpICsgXCIgXCIgKyBwdC5sb25naXR1ZGUudG9GaXhlZCgzKSArXG4gICAgICAgIFwiIHwgU2NhbGUgMTpcIiArIE1hdGgucm91bmQobWFwVmlldy5zY2FsZSAqIDEpIC8gMSArXG4gICAgICAgIFwiIHwgWm9vbSBcIiArIG1hcFZpZXcuem9vbTtcbiAgICAgIGNvb3Jkc1dpZGdldC5pbm5lckhUTUwgPSBjb29yZHM7XG4gICAgfVxuXG4gICAgLy8qKiogQWRkIGV2ZW50IGFuZCBzaG93IGNlbnRlciBjb29yZGluYXRlcyBhZnRlciB0aGUgdmlldyBpcyBmaW5pc2hlZCBtb3ZpbmcgZS5nLiB6b29tLCBwYW4gKioqLy9cbiAgICBtYXBWaWV3LndhdGNoKFtcInN0YXRpb25hcnlcIl0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3dDb29yZGluYXRlcyhtYXBWaWV3LmNlbnRlcik7XG4gICAgfSk7XG5cbiAgICAvLyoqKiBBZGQgZXZlbnQgdG8gc2hvdyBtb3VzZSBjb29yZGluYXRlcyBvbiBjbGljayBhbmQgbW92ZSAqKiovL1xuICAgIG1hcFZpZXcub24oW1wicG9pbnRlci1kb3duXCIsIFwicG9pbnRlci1tb3ZlXCJdLCBmdW5jdGlvbiAoZXZ0OmFueSkge1xuICAgICAgc2hvd0Nvb3JkaW5hdGVzKG1hcFZpZXcudG9NYXAoeyB4OiBldnQueCwgeTogZXZ0LnkgfSkpO1xuICAgIH0pO1xuXG4gIH1cblxuICBhc3luYyByZXNldE1hcCgpIHtcbiAgICB0aGlzLmN1cnJlbnRNYXBWaWV3LmdyYXBoaWNzLnJlbW92ZUFsbCgpO1xuICAgIHRoaXMuY3VycmVudE1hcFZpZXcuZ29Ubyh7XG4gICAgICB0YXJnZXQ6IHRoaXMuX2NlbnRlcixcbiAgICAgIHpvb206IHRoaXMuX3pvb21cbiAgICB9XG4gICAgKTtcbiAgICB0aGlzLnpvb21Ub0ZhY2lsaXR5XG4gIH1cblxuICBhc3luYyB6b29tVG9GYWNpbGl0eShsYXQ6IHN0cmluZywgbG9uZzogc3RyaW5nKSB7XG4gICAgY29uc3QgW1BvaW50XSA9IGF3YWl0IGxvYWRNb2R1bGVzKFtcbiAgICAgICdlc3JpL2dlb21ldHJ5L1BvaW50J1xuICAgIF0pO1xuICAgIGxldCBwb2ludDogZXNyaS5Qb2ludCA9IG5ldyBQb2ludCh7XG4gICAgICBsYXRpdHVkZTogbGF0LCAvLzM5Ljk1Nzc2NyxcbiAgICAgIGxvbmdpdHVkZTogbG9uZyAvLy04Mi45OTQ5MzlcbiAgICB9KTtcblxuICAgIHRoaXMuY3VycmVudE1hcFZpZXcuZ29Ubyh7XG4gICAgICB0YXJnZXQ6IHBvaW50LFxuICAgICAgem9vbTogMTZcbiAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8vIGFzeW5jIHJlbW92ZVNlbGVjdGVkUG9pbnQoKSB7XG4gIC8vICAgaWYgKHRoaXMuY3VycmVudEdyYXBoaWMpIHtcbiAgLy8gICAgIHRoaXMuY3VycmVudE1hcFZpZXcubWFwLlxuICAvLyAgIH1cbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IHBvaW50IHRvIHRoZSBjdXJyZW50IG1hcCB3aXRoIHRoZSBnaXZlbiBsYXQvbG9uZyB2YWx1ZXMuXG4gICAqIEBwYXJhbSBsYXQgXG4gICAqIEBwYXJhbSBsb25nIFxuICAgKi9cbiAgYXN5bmMgYWRkUG9pbnQobGF0OiBzdHJpbmcsIGxvbmc6IHN0cmluZywgbmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgW1BvaW50LCBHcmFwaGljLCBTaW1wbGVNYXJrZXJTeW1ib2wsIEFjdGlvbkJ1dHRvbl0gPSBhd2FpdCBsb2FkTW9kdWxlcyhbXG4gICAgICAnZXNyaS9nZW9tZXRyeS9Qb2ludCcsXG4gICAgICAnZXNyaS9HcmFwaGljJyxcbiAgICAgICdlc3JpL3N5bWJvbHMvU2ltcGxlTWFya2VyU3ltYm9sJyxcbiAgICAgICdlc3JpL3N1cHBvcnQvYWN0aW9ucy9BY3Rpb25CdXR0b24nXG4gICAgXSk7XG5cbiAgICBsZXQgcG9pbnQ6IGVzcmkuUG9pbnQgPSBuZXcgUG9pbnQoe1xuICAgICAgbGF0aXR1ZGU6IGxhdCwgLy8zOS45NTc3NjcsXG4gICAgICBsb25naXR1ZGU6IGxvbmcgLy8tODIuOTk0OTM5XG4gICAgfSk7XG5cbiAgICBsZXQgc3ltYm9sOiBlc3JpLlNpbXBsZU1hcmtlclN5bWJvbCA9IG5ldyBTaW1wbGVNYXJrZXJTeW1ib2woe1xuICAgICAgLy8gdHlwZTogJ3NpbXBsZS1tYXJrZXInLFxuICAgICAgc3R5bGU6ICdjaXJjbGUnLFxuICAgICAgY29sb3I6ICdibHVlJyxcbiAgICAgIHNpemU6ICcxMnB4J1xuICAgIH0pO1xuXG4gICAgbGV0IGFjdGlvbkJ1dHRvbjogZXNyaS5BY3Rpb25CdXR0b24gPSBuZXcgQWN0aW9uQnV0dG9uKHtcbiAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICBpZDogJ3NlbGVjdEZhY2lsaXR5JyxcbiAgICAgIHRpdGxlOiAnU2VsZWN0IEZhY2lsaXR5JyxcbiAgICAgIHR5cGU6ICdidXR0b24nXG4gICAgfSk7XG5cbiAgICBsZXQgY3VycmVudEdyYXBoaWMgPSBuZXcgR3JhcGhpYyh7XG4gICAgICBnZW9tZXRyeTogcG9pbnQsXG4gICAgICBzeW1ib2w6IHN5bWJvbCxcbiAgICAgIHBvcHVwVGVtcGxhdGU6IHtcbiAgICAgICAgdGl0bGU6IG5hbWUsXG4gICAgICAgIGNvbnRlbnQ6IG5hbWUsXG4gICAgICB9LFxuICAgICAgYWN0aW9uczogW2FjdGlvbkJ1dHRvbl1cbiAgICB9KTtcblxuICAgIHRoaXMuY3VycmVudE1hcFZpZXcuZ3JhcGhpY3MuYWRkKGN1cnJlbnRHcmFwaGljKTtcblxuICAgIHRoaXMuX2N1cnJlbnRMYXRMb25nID0ge1xuICAgICAgbGF0RGVjaW1hbDogbGF0LFxuICAgICAgbG9uZ0RlY2ltYWw6IGxvbmdcbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2coJ0FkZGVkIHBvaW50OiAnLCBsYXQsIGxvbmcpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbml0aWFsaXplTWFwKCk7XG4gIH1cblxufSIsIjwhLS0gSGVyZSdzIHRoZSBESVYgdGhhdCB3ZSBpbmplY3QgdGhlIG1hcCBpbnRvIC0tPlxuPGRpdiAqbmdJZj1cInNob3dTZWFyY2hcIiBjbGFzcz1cInJvd1wiPlxuICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXN1Y2Nlc3NcIj5cbiAgICAgIDxsYWJlbD5TZWFyY2ggZm9yIEFkZHJlc3M6PC9sYWJlbD5cbiAgICAgIDxkaXY+VHlwZSBhbiBhZGRyZXNzIGluIHRoZSBpbnB1dCBib3ggYmVsb3cgYW5kIHNlbGVjdCBhIG1hdGNoIGZyb20gdGhlIGRyb3AgZG93biBsaXN0IG9yIHNlbGVjdCB0aGVcbiAgICAgICAgbWFnbmlmeWluZyBnbGFzcyBidXR0b24gdG8gcGxvdCB0aGUgYWRkcmVzcyBvbiB0aGUgbWFwLjwvZGl2PlxuICAgICAgPGRpdiAjbGF0TG9uZ1NlYXJjaE5vZGU+PC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG48ZGl2ICNtYXBWaWV3Tm9kZT48L2Rpdj4iXX0=