@rangertechnologies/ngnxt 2.1.252 → 2.1.254

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 (106) hide show
  1. package/esm2022/environments/version.mjs +2 -2
  2. package/esm2022/lib/components/button/nxt-button.component.mjs +4 -4
  3. package/esm2022/lib/components/custom-calendar/custom-calendar.component.mjs +8 -5
  4. package/esm2022/lib/components/custom-dropdown/custom-dropdown.component.mjs +13 -14
  5. package/esm2022/lib/components/custom-model/custom-model.component.mjs +5 -3
  6. package/esm2022/lib/components/custom-radio/custom-radio.component.mjs +11 -12
  7. package/esm2022/lib/components/datatable/datatable.component.mjs +7 -21
  8. package/esm2022/lib/components/file-upload/file-upload.component.mjs +13 -16
  9. package/esm2022/lib/components/icon-selector/icon-selector.component.mjs +5 -3
  10. package/esm2022/lib/components/list-view-filter/list-view-filter.component.mjs +9 -9
  11. package/esm2022/lib/components/nxt-input/nxt-input.component.mjs +24 -12
  12. package/esm2022/lib/components/pagination/pagination.component.mjs +3 -3
  13. package/esm2022/lib/components/pick-location/pick-location.component.mjs +10 -13
  14. package/esm2022/lib/components/search-box/search-box.component.mjs +14 -15
  15. package/esm2022/lib/model/bookletWrapper.mjs +1 -3
  16. package/esm2022/lib/nxt-app.module.mjs +9 -33
  17. package/esm2022/lib/pages/booklet/booklet.component.mjs +33 -100
  18. package/esm2022/lib/pages/builder/element/element.component.mjs +68 -61
  19. package/esm2022/lib/pages/builder/form/form.component.mjs +6 -3
  20. package/esm2022/lib/pages/builder/properties/common-fields.constants.mjs +11 -11
  21. package/esm2022/lib/pages/builder/properties/properties.component.mjs +235 -78
  22. package/esm2022/lib/pages/builder/templates/templates.component.mjs +5 -4
  23. package/esm2022/lib/pages/pdfDesigner/pdf-designer/pdf-designer.component.mjs +5 -46
  24. package/esm2022/lib/pages/pdfDesigner/pdf-properties/pdf-properties.component.mjs +50 -57
  25. package/esm2022/lib/pages/questionbook/questionbook.component.mjs +20 -59
  26. package/esm2022/lib/pages/questionnaire/questionnaire.component.mjs +17 -30
  27. package/esm2022/lib/pipe/custom-translate.pipe.mjs +21 -14
  28. package/esm2022/lib/pipe/svg/svg.pipe.mjs +26 -0
  29. package/esm2022/lib/services/change/change.service.mjs +46 -0
  30. package/esm2022/lib/services/country/country.service.mjs +135 -0
  31. package/esm2022/lib/services/data/data.service.mjs +100 -0
  32. package/esm2022/lib/services/form-builder/form-builder.service.mjs +474 -0
  33. package/esm2022/lib/services/pdf-designer/pdf-designer.service.mjs +395 -0
  34. package/esm2022/lib/services/salesforce/salesforce.service.mjs +41 -0
  35. package/esm2022/lib/services/shared/shared.service.mjs +100 -0
  36. package/esm2022/lib/services/storage/storage.service.mjs +59 -0
  37. package/esm2022/lib/services/template/template.service.mjs +335 -0
  38. package/esm2022/lib/services/translation/translation.service.mjs +121 -0
  39. package/esm2022/public-api.mjs +2 -5
  40. package/fesm2022/rangertechnologies-ngnxt.mjs +1147 -1285
  41. package/fesm2022/rangertechnologies-ngnxt.mjs.map +1 -1
  42. package/lib/components/button/nxt-button.component.d.ts +1 -1
  43. package/lib/components/custom-calendar/custom-calendar.component.d.ts +1 -1
  44. package/lib/components/custom-dropdown/custom-dropdown.component.d.ts +3 -5
  45. package/lib/components/custom-radio/custom-radio.component.d.ts +3 -5
  46. package/lib/components/datatable/datatable.component.d.ts +3 -4
  47. package/lib/components/file-upload/file-upload.component.d.ts +3 -5
  48. package/lib/components/image-cropper/component/image-cropper.component.d.ts +1 -1
  49. package/lib/components/nxt-input/nxt-input.component.d.ts +2 -2
  50. package/lib/components/pick-location/pick-location.component.d.ts +1 -3
  51. package/lib/components/search-box/search-box.component.d.ts +5 -7
  52. package/lib/model/bookletWrapper.d.ts +0 -1
  53. package/lib/nxt-app.module.d.ts +15 -17
  54. package/lib/pages/booklet/booklet.component.d.ts +9 -11
  55. package/lib/pages/builder/element/element.component.d.ts +10 -7
  56. package/lib/pages/builder/form/form.component.d.ts +2 -1
  57. package/lib/pages/builder/properties/properties.component.d.ts +39 -7
  58. package/lib/pages/builder/templates/templates.component.d.ts +1 -1
  59. package/lib/pages/pdfDesigner/pdf-designer/pdf-designer.component.d.ts +1 -4
  60. package/lib/pages/pdfDesigner/pdf-properties/pdf-properties.component.d.ts +19 -2
  61. package/lib/pages/questionbook/questionbook.component.d.ts +7 -12
  62. package/lib/pages/questionnaire/questionnaire.component.d.ts +7 -9
  63. package/lib/pipe/custom-translate.pipe.d.ts +3 -4
  64. package/lib/pipe/svg/svg.pipe.d.ts +10 -0
  65. package/lib/services/{form-builder.service.d.ts → form-builder/form-builder.service.d.ts} +3 -2
  66. package/lib/services/{pdf-designer.service.d.ts → pdf-designer/pdf-designer.service.d.ts} +1 -1
  67. package/lib/services/{storage.service.d.ts → storage/storage.service.d.ts} +2 -2
  68. package/lib/services/{translation.service.d.ts → translation/translation.service.d.ts} +12 -1
  69. package/package.json +1 -1
  70. package/public-api.d.ts +1 -3
  71. package/rangertechnologies-ngnxt-2.1.254.tgz +0 -0
  72. package/esm2022/lib/ar.i18n.mjs +0 -29
  73. package/esm2022/lib/en.i18n.mjs +0 -29
  74. package/esm2022/lib/i18n-config.service.mjs +0 -4
  75. package/esm2022/lib/i18n.component.mjs +0 -45
  76. package/esm2022/lib/i18n.module.mjs +0 -38
  77. package/esm2022/lib/i18n.pipe.mjs +0 -26
  78. package/esm2022/lib/i18n.service.mjs +0 -56
  79. package/esm2022/lib/interfaces/apimeta.mjs +0 -2
  80. package/esm2022/lib/services/change.service.mjs +0 -46
  81. package/esm2022/lib/services/country.service.mjs +0 -135
  82. package/esm2022/lib/services/data.service.mjs +0 -100
  83. package/esm2022/lib/services/form-builder.service.mjs +0 -402
  84. package/esm2022/lib/services/pdf-designer.service.mjs +0 -398
  85. package/esm2022/lib/services/salesforce.service.mjs +0 -41
  86. package/esm2022/lib/services/shared.service.mjs +0 -100
  87. package/esm2022/lib/services/storage.service.mjs +0 -59
  88. package/esm2022/lib/services/template.service.mjs +0 -351
  89. package/esm2022/lib/services/translation.service.mjs +0 -61
  90. package/esm2022/lib/tam.i18n.mjs +0 -29
  91. package/lib/ar.i18n.d.ts +0 -24
  92. package/lib/en.i18n.d.ts +0 -24
  93. package/lib/i18n-config.service.d.ts +0 -2
  94. package/lib/i18n.component.d.ts +0 -11
  95. package/lib/i18n.module.d.ts +0 -9
  96. package/lib/i18n.pipe.d.ts +0 -10
  97. package/lib/i18n.service.d.ts +0 -14
  98. package/lib/interfaces/apimeta.d.ts +0 -15
  99. package/lib/tam.i18n.d.ts +0 -24
  100. package/rangertechnologies-ngnxt-2.1.252.tgz +0 -0
  101. /package/lib/services/{change.service.d.ts → change/change.service.d.ts} +0 -0
  102. /package/lib/services/{country.service.d.ts → country/country.service.d.ts} +0 -0
  103. /package/lib/services/{data.service.d.ts → data/data.service.d.ts} +0 -0
  104. /package/lib/services/{salesforce.service.d.ts → salesforce/salesforce.service.d.ts} +0 -0
  105. /package/lib/services/{shared.service.d.ts → shared/shared.service.d.ts} +0 -0
  106. /package/lib/services/{template.service.d.ts → template/template.service.d.ts} +0 -0
@@ -10,8 +10,9 @@ import { AppTemplatesComponent } from '../../builder/templates/templates.compone
10
10
  import { NxtInput } from '../../../components/nxt-input/nxt-input.component';
11
11
  import { ImageCropperComponent } from '../../../components/image-cropper/component/image-cropper.component';
12
12
  import _ from 'lodash'; // Ensure lodash is installed
13
+ import { NxtCustomTranslatePipe } from '../../../pipe/custom-translate.pipe';
13
14
  import * as i0 from "@angular/core";
14
- import * as i1 from "../../../services/pdf-designer.service";
15
+ import * as i1 from "../../../services/pdf-designer/pdf-designer.service";
15
16
  import * as i2 from "@angular/common";
16
17
  import * as i3 from "@angular/material/tooltip";
17
18
  import * as i4 from "@angular/forms";
@@ -317,43 +318,6 @@ export class PdfDesignerComponent {
317
318
  toggleBoolean(field) {
318
319
  field.boolean = !field.boolean;
319
320
  }
320
- getFontStyles(field) {
321
- const margin = field.margin || [0, 0, 0, 0]; // [left, top, right, bottom]
322
- const fontStyles = field.fontStyle || [];
323
- return {
324
- 'font-family': field.font || 'Helvetica Neue',
325
- //'font-weight': field.fontWeight || '400',
326
- 'font-size': field.fontSize ? `${field.fontSize}px` : '14px',
327
- 'width': field.width ? `${field.width}%` : '100%',
328
- //'text-align': field.textAlign || 'left',
329
- 'align-items': field.alignItems || '',
330
- 'border-radius': '5px',
331
- 'border-width': field.lineWidth ? `${field.lineWidth}px` : '1px',
332
- 'color': field.fontColor || '#000000',
333
- 'font-style': fontStyles.includes('italic') ? 'italic' : 'normal',
334
- 'font-weight': fontStyles.includes('bold') ? 'bold' : (field.fontWeight || '400'),
335
- 'margin': `${margin[0]}px ${margin[1]}px ${margin[2]}px ${margin[3]}px`,
336
- 'padding-top': field.paddingTop ? `${field.paddingTop}px` : '0px',
337
- 'padding-bottom': field.paddingBottom ? `${field.paddingBottom}px` : '10px',
338
- };
339
- }
340
- getLineStyles(field) {
341
- const styles = {
342
- 'font-family': field.font || 'Helvetica Neue',
343
- 'font-weight': field.fontWeight || '400',
344
- 'font-size': field.fontSize || '14px',
345
- 'width': field.width ? `${field.width}%` : '100%',
346
- 'text-align': field.textAlign || 'left',
347
- 'border-radius': '5px',
348
- 'border-width': field.lineWidth ? `${field.lineWidth}px` : '1px',
349
- 'border-style': field.lineStyle?.toLowerCase() || 'solid',
350
- 'color': field.fontColor || '#000000',
351
- //'border-color': field.color || '#EFF8FF',
352
- 'margin-top': field.paddingTop ? `${field.paddingTop}px` : '0px',
353
- 'margin-bottom': field.paddingBottom ? `${field.paddingBottom}px` : '10px'
354
- };
355
- return styles;
356
- }
357
321
  // SKS13MAR25 table popup conformation based element add
358
322
  onClose() {
359
323
  this.isSelectTablePopup = false;
@@ -639,11 +603,6 @@ export class PdfDesignerComponent {
639
603
  updateContent() {
640
604
  this.pdfDesignerService.elementUpdate(this.selectedColumn, 'valueChange');
641
605
  }
642
- getMarginStyle(margin) {
643
- if (!margin || margin.length !== 4)
644
- return '0';
645
- return `${margin[1]}px ${margin[2]}px ${margin[3]}px ${margin[0]}px`;
646
- }
647
606
  pdfSaveHandler(event) {
648
607
  if (event === 'preview') {
649
608
  this.pdfSaveHandlerEmit.emit({ "action": 'preview', "pdf": this.pdfDesignerService.downloadElement() });
@@ -656,11 +615,11 @@ export class PdfDesignerComponent {
656
615
  }
657
616
  }
658
617
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PdfDesignerComponent, deps: [{ token: i1.PdfDesignerService }], target: i0.ɵɵFactoryTarget.Component });
659
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PdfDesignerComponent, isStandalone: true, selector: "app-pdf-designer", inputs: { pdfJSON: "pdfJSON", bookletId: "bookletId", isPreview: "isPreview" }, outputs: { pdfSaveHandlerEmit: "pdfSaveHandlerEmit", templateMode: "templateMode", pdfPreviewEmit: "pdfPreviewEmit" }, viewQueries: [{ propertyName: "textareas", predicate: ["autoTextarea"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- AP 22JAN25 - form preview and All form elements -->\n<!-- AP 25FEB25 - All elements update -->\n<div class=\"form-container\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"center-frame\" [ngClass]=\"{'isPreview': isPreview}\">\n <!-- Form Builder Section All Elements -->\n <div *ngIf=\"!isPreview\" class=\"form-builder\">\n\n <ng-container *ngFor=\"let element of elementsList\">\n <div class=\"element\" [class.disabled]=\"isElementDisabled(element.type)\"\n (click)=\"!isElementDisabled(element.type) && addElement(element.type)\"\n [draggable]=\"!isElementDisabled(element.type)\"\n [matTooltip]=\"isElementDisabled(element.type) ? 'This element is not supported when a ' + (selectedElement?.type || 'certain element') + ' is present' : null\">\n <img src=\"../assets/icons/{{ element.img }}.svg\" class=\"element-icon\">\n <div class=\"hover-label\">{{ element.label }}</div>\n <div class=\"drag-dots\">\n <div class=\"dot\" *ngFor=\"let dot of dots\"></div>\n </div>\n </div>\n </ng-container>\n<!-- \n <div class=\"template-section\">\n <app-templates (templateSelected)=\"onTemplateSelected($event)\"></app-templates>\n </div> -->\n\n <!-- SKS10MAR25 footer version show -->\n <div class=\"sticky-footer-version\">\n {{version}}\n </div>\n </div>\n <!-- AP-27MAR25 Remove CDK drag and drop replace draggable function -->\n <div class=\"form-preview\">\n <!-- AP-10MAR25 Heading -->\n <div class=\"field-container\"\n style=\"width: 100%;background-color: #EFF8FF; border: 1px solid #E6F3FF;margin-bottom:10px\"\n (click)=\"selectHeading('Header')\">\n <div class=\"label-container\" style=\"padding: 10px; display: flex;justify-content: space-between;\">\n <div *ngIf=\"pdf\">\n <div *ngIf=\"pdf.title == ''\" style=\"color:#3f4a525c\">Heading</div>\n <div *ngIf=\"pdf.title !== ''\">{{pdf.title}}</div>\n </div>\n <div class=\"action-buttons\">\n <button class=\"action-btn\" (click)=\"pdfSaveHandler('preview')\">PREVIEW</button>\n <button class=\"action-btn\" (click)=\"pdfSaveHandler('download')\">DOWNLOAD</button>\n </div>\n </div>\n </div>\n\n <ng-container *ngFor=\"let field of pdfElements; let i = index\" getProperties().elementProps>\n\n <!-- AP-19MAR25 Line Element -->\n <div *ngIf=\"field?.type === 'Line'\" class=\"line-field\" [ngClass]=\"{'isPreview': isPreview}\"\n (click)=\"selectElement(i)\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div *ngIf=\"!isPreview\" class=\"line-element\">\n <div></div>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n <hr class=\"custom-line\" style=\"display: inline-flex\" [ngStyle]=\"getLineStyles(field)\" />\n </div>\n\n <!--SKS25MAR25 Image Upload Element -->\n <div *ngIf=\"field?.type === 'image'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [class.highlight]=\"selectedFieldIndex === i && !isPreview\" draggable=\"true && !isPreview\"\n (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\"\n [ngStyle]=\"getFontStyles(field)\" (mouseenter)=\"isImageHover = true;\"\n (mouseleave)=\"isImageHover = false;\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <div>\n <div *ngIf=\"isImageHover\" style=\"display: flex; justify-content: end;\">\n <svg *ngIf=\"isPreview\" (click)=\"onImageEdit(field)\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.1067 6.07174L9.92833 4.8934L2.16667 12.6551V13.8334H3.345L11.1067 6.07174ZM12.285 4.8934L13.4633 3.71507L12.285 2.53674L11.1067 3.71507L12.285 4.8934ZM4.035 15.5001H0.5V11.9642L11.6958 0.768403C11.8521 0.612177 12.064 0.524414 12.285 0.524414C12.506 0.524414 12.7179 0.612177 12.8742 0.768403L15.2317 3.1259C15.3879 3.28218 15.4757 3.4941 15.4757 3.71507C15.4757 3.93604 15.3879 4.14796 15.2317 4.30424L4.03583 15.5001H4.035Z\"\n fill=\"#6C757D\" />\n </svg>\n <svg *ngIf=\"isPreview\" (click)=\"onImageDelete(field)\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14 3.98726C11.78 3.76726 9.54667 3.65393 7.32 3.65393C6 3.65393 4.68 3.7206 3.36 3.85393L2 3.98726\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M5.6665 3.31362L5.81317 2.44028C5.91984 1.80695 5.99984 1.33362 7.1265 1.33362H8.87317C9.99984 1.33362 10.0865 1.83362 10.1865 2.44695L10.3332 3.31362\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M12.5667 6.09375L12.1334 12.8071C12.06 13.8537 12 14.6671 10.14 14.6671H5.86002C4.00002 14.6671 3.94002 13.8537 3.86668 12.8071L3.43335 6.09375\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.88647 11.0004H9.10647\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M6.3335 8.33325H9.66683\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div class=\"logo-container\">\n <div class=\"logo-preview\" *ngIf=\"field.imageData\">\n <img [src]=\"field.imageData\" \n [style.width.px]=\"field.imageSize?.width || 100\"\n [style.height.px]=\"field.imageSize?.height || 100\" />\n </div>\n\n <div *ngIf=\"!field.imageData\" class=\"logo-upload-placeholder\">\n <label for=\"logo-upload-{{i}}\" class=\"logo-upload-label\">\n <img src=\"../assets/icons/Image.svg\" alt=\"Upload\" />\n <span>Upload Image</span>\n </label>\n <input type=\"file\" id=\"logo-upload-{{i}}\" accept=\"image/*\" (change)=\"fileChangeEvent(field, $event)\"\n style=\"display: none;\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Space Element -->\n <div *ngIf=\"field?.type === 'Space'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" style=\"height:93px\" [ngClass]=\"{'isPreview': isPreview}\">\n <div *ngIf=\"!isPreview\" class=\"field-content\">\n <div class=\"label-container\">\n <div class=\"top-right\" style=\"margin: -11px -11px 0 0;\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- TextArea -->\n <div *ngIf=\"field?.type === 'text'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <textarea class=\"custom-textarea\"\n [placeholder]=\"'Enter detailed text here...'\"\n [value]=\"field.value? field.value : ''\"\n (input)=\"onTextAreaInput($event, field)\"\n #autoTextarea\n [style.height.px]=\"isPreview ? 40 : null\"\n (click)=\"openTextSettings(field, $event)\"\n (ngModelChange)=\"updateContent()\" \n [ngStyle]=\"{\n 'font-size': field.style.fontSize\n ? field.style.fontSize + 'px'\n : '14px',\n 'font-weight': field.style.bold ? 'bold' : 'normal',\n 'font-style': field.style.italics ? 'italic' : 'normal',\n 'text-decoration': field.style.decoration ? 'decoration' : 'none',\n 'text-align': field.style.alignment || 'left',\n margin: field.style.margin ? getMarginStyle(field.style.margin) : '0',\n color: field.style.color || '#000',\n }\"></textarea>\n \n </div>\n </div>\n\n <!--AP-05JUN25 Text Settings Toolbar: Allows editing font size, bold/italic styles, alignment, and closing the toolbar for the selected column -->\n <div *ngIf=\"showTextSettings && isPreview && selectedColumn === field\" class=\"text-settings-toolbar\"\n [ngStyle]=\"{\n position: 'absolute',\n background: '#fff',\n border: '1px solid #ccc',\n padding: '6px 10px',\n 'border-radius': '4px',\n 'box-shadow': '0 2px 6px rgba(0, 0, 0, 0.1)',\n 'z-index': '65535',\n display: 'flex',\n 'align-items': 'center',\n gap: '8px'\n }\">\n \n <!-- Font Size -->\n <select [(ngModel)]=\"selectedColumn.style.fontSize\" class=\"toolbar-select\">\n <option [value]=\"12\">12pt</option>\n <option [value]=\"14\">14pt</option>\n <option [value]=\"16\">16pt</option>\n <option [value]=\"18\">18pt</option>\n <option [value]=\"24\">24pt</option>\n </select>\n\n <!-- Text Color -->\n <label title=\"Text Color\" class=\"color-label\">\n <span class=\"color-box\" [style.color]=\"selectedColumn.style.color || '#000'\" (click)=\"textColorInput.click()\">A</span>\n <input #textColorInput type=\"color\" [(ngModel)]=\"selectedColumn.style.color\" (change)=\"updateContent()\" class=\"color-picker-hidden\"/>\n </label>\n\n <!-- Bold -->\n <button (click)=\"toggleStyle('bold')\" [class.active]=\"selectedColumn?.style?.bold\" class=\"toolbar-btn\">B</button>\n \n <!-- Italic -->\n <button (click)=\"toggleStyle('italic')\" [class.active]=\"selectedColumn?.style?.italics\" class=\"toolbar-btn\"><i>I</i></button>\n\n <!-- Underline -->\n <!-- <button (click)=\"toggleStyle('underline')\" [class.active]=\"selectedColumn?.style?.underline\" class=\"toolbar-btn\"><u>U</u></button> -->\n\n \n <!-- Align Left -->\n <button (click)=\"setAlignment('left')\" [class.active]=\"selectedColumn?.style?.alignment === 'left'\" class=\"toolbar-btn\">\n <span class=\"material-icons\">format_align_left</span>\n </button>\n \n <!-- Align Center -->\n <button (click)=\"setAlignment('center')\" [class.active]=\"selectedColumn?.style?.alignment === 'center'\" class=\"toolbar-btn\">\n <span class=\"material-icons\">format_align_center</span>\n </button>\n \n <!-- Align Right -->\n <button (click)=\"setAlignment('right')\" [class.active]=\"selectedColumn?.style?.alignment === 'right'\" class=\"toolbar-btn\">\n <span class=\"material-icons\">format_align_right</span>\n </button>\n \n <!-- Close -->\n <button (click)=\"closeTextSettings()\" class=\"toolbar-btn\" style=\"margin-left: auto;\">\u2715</button>\n </div>\n \n </div>\n\n <!-- Input -->\n <div *ngIf=\"field?.type === 'input'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <!-- AP-04JUN25 - replace app-custom-input -->\n <nxt-input [type]=\"'text'\" [mode]=\"'edit'\" [value]=\"field.value\" [question]=\"\" [labelFont]=\"\"\n [label]=\"field?.questionText\" [labelColor]=\"\" [labelSize]=\"\" [inputValueSize]=\"\" [labelWeight]=\"\"\n [inputWeight]=\"\" [showLabel]=\"\" inputBorder=\"none\" svgHeight=\"20px\" svgWidth=\"20px\"\n [placeholder]=\"field.question ? field.question : 'Enter your input'\" [required]=\"\"\n inputBgColor=\"#F5F5F5\" [inputId]=\"\" [errorMessages]=\"{ required: 'This field is required' }\"\n [inputIconLeftSrc]=\"''\" (inputValue)=\"onQuestionChange($event, field)\">\n </nxt-input>\n </div>\n </div>\n </div>\n\n <!-- Date -->\n <div *ngIf=\"field?.type === 'date'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <!-- AP-04JUN25 - replace custom date picker -->\n <nxt-input [type]=\"'date'\" [mode]=\"'edit'\" [value]=\"field.value\" [question]=\"\" [labelFont]=\"\"\n [label]=\"field?.questionText\" [labelColor]=\"\" [labelSize]=\"\" [inputValueSize]=\"\" [labelWeight]=\"\"\n [inputWeight]=\"\" [showLabel]=\"\" inputBorder=\"none\" svgHeight=\"20px\" svgWidth=\"20px\"\n [placeholder]=\"field.question ? field.question : 'Enter your input'\" [required]=\"\"\n inputBgColor=\"#F5F5F5\" [inputId]=\"\" [errorMessages]=\"{ required: 'This field is required' }\"\n [inputIconLeftSrc]=\"''\" (inputValue)=\"onQuestionChange($event, field)\">\n </nxt-input>\n </div>\n </div>\n </div>\n\n <!-- Pdf -->\n <div *ngIf=\"field?.type === 'Pdf'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <!-- <lib-booklet [bookletJSON]=\"field.pdfReferenceQuestions\"></lib-booklet> -->\n <div *ngIf=\"field?.pdfReferenceQuestions\">\n <ng-container *ngFor=\"let field of field?.pdfReferenceQuestions[field?.pdfReference]; let i = index\">\n <!-- AP-19MAR25 Line Element -->\n <div *ngIf=\"field?.type === 'Line'\" class=\"line-field\">\n <hr class=\"custom-line\" style=\"display: inline-flex\" [ngStyle]=\"getLineStyles(field)\" />\n </div>\n\n <div *ngIf=\"field?.type === 'image'\" class=\"field-container\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div>\n <div class=\"logo-container\">\n <!-- Logo preview area -->\n <div class=\"logo-preview\" *ngIf=\"field.imageData\">\n <img [src]=\"field.imageData\" />\n </div>\n\n <!-- Upload button -->\n <div *ngIf=\"!field.imageData\" class=\"logo-upload-placeholder\">\n <label for=\"logo-upload-{{i}}\" class=\"logo-upload-label\">\n <img src=\"../assets/icons/Image.svg\" alt=\"Upload\" />\n <span>Upload Image</span>\n </label>\n <input type=\"file\" id=\"logo-upload-{{i}}\" accept=\"image/*\"\n (change)=\"fileChangeEvent(field, $event)\" style=\"display: none;\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"field?.type === 'Space'\" class=\"field-container\">\n <div class=\"field-wrapper\" style=\"height:93px\" [ngClass]=\"{'isPreview': isPreview}\">\n </div>\n </div>\n <div *ngIf=\"field?.type === 'text'\" class=\"field-container\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <textarea class=\"custom-textarea\" [placeholder]=\"'Enter detailed text here...'\"\n [style.height.px]=\"isPreview ? 40 : field.size || 100\" [(ngModel)]=\"field.value\"\n (ngModelChange)=\"onQuestionChange($event, field)\"></textarea>\n </div>\n </div>\n </div>\n <!-- AP-14JUN25 Added nxt-input in pdf -->\n <div *ngIf=\"field?.type === 'input'\" class=\"field-container\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\"> \n <nxt-input [type]=\"'text'\" [mode]=\"'edit'\" [(ngModel)]=\"field.value\"\n [placeholder]=\"'Enter your input'\" (ngModelChange)=\"onQuestionChange($event, field)\">\n </nxt-input>\n </div>\n </div>\n </div>\n <!-- AP-06MAR25 -->\n <div *ngIf=\"field?.type === 'Table'\" class=\"field-container\">\n <div class=\"field-wrapper\" style=\"overflow: hidden;\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div class=\"nxt-table-container\">\n <nxt-datatable isButtons [question]=\"field\" from=\"formBuilder\"\n [mode]=\"isPreview ? 'view' : 'edit'\" [apiMeta]=\"field?.subText\"\n [tableConfig]=\"field.tableConfig\" tableId=\"\" direction=\"ltr\" tableWidth=\"auto\"\n (valueChange)=\"onQuestionChange($event, field)\"\n [data]=\"field.value?.data\"\n isEditable=true (columnSelected)=columnSelected($event) (removeColumn)=removeColumn($event)>\n </nxt-datatable>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Table -->\n <!-- AP-06MAR25 -->\n <div *ngIf=\"field?.type === 'Table'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" style=\"overflow: hidden;\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <div class=\"nxt-table-container\">\n <nxt-datatable isButtons [question]=\"field\" from=\"formBuilder\" [mode]=\"isPreview ? 'view' : 'edit'\"\n [apiMeta]=\"field?.subText\" [tableConfig]=\"field.tableConfig\" tableId=\"\" direction=\"ltr\"\n tableWidth=\"auto\" isEditable=true (columnSelected)=columnSelected($event)\n [data]=\"field.value?.data\"\n (valueChange)=\"onQuestionChange($event, field)\"\n (removeColumn)=removeColumn($event)>\n </nxt-datatable>\n </div>\n </div>\n </div>\n </div>\n\n </ng-container>\n </div>\n </div>\n <!-- SKS13MAR25 popup conformation box -->\n <div class=\"dialog-overlay\" *ngIf=\"isSelectTablePopup\">\n <div class=\"dialog-box\">\n <button class=\"close-btn-fb\" (click)=\"onClose()\">\u2715</button>\n <p>These element want to add a table</p>\n <div class=\"button-container-fb\">\n <button class=\"yes-btn-fb\" (click)=\"addOnTable()\">Yes</button>\n <button class=\"no-btn-fb\" (click)=\"onClose()\">No</button>\n </div>\n </div>\n </div>\n <app-pdf-properties *ngIf=\"!isPreview\" (formButtonHandler)=\"pdfSaveHandler($event)\"></app-pdf-properties>\n</div>\n<!--SKS25MAR25 Modal Overlay -->\n<div class=\"modal-overlay\" *ngIf=\"isImageEdit\">\n <div class=\"modal-content\">\n <span class=\"close-button\" (click)=\"closeModal()\">\u00D7</span>\n <!-- Image Editor -->\n <div *ngIf=\"selectedImageElement?.type === 'image'\">\n <image-cropper *ngIf=\"selectedImageElement.imageData\" [imageBase64]=\"selectedImageElement.orgImageData\"\n [disabled]=\"false\" [alignImage]=\"alignImage\" [roundCropper]=\"roundCropper\" [backgroundColor]=\"'white'\"\n imageAltText=\"Alternative image text\" [allowMoveImage]=\"false\" [hideResizeSquares]=\"false\"\n [canvasRotation]=\"canvasRotation\" [aspectRatio]=\"aspectRatio\" [containWithinAspectRatio]=\"false\"\n [maintainAspectRatio]=\"false\" [cropperStaticWidth]=\"cropperStaticWidth\"\n [cropperStaticHeight]=\"cropperStaticHeight\" [cropperMinWidth]=\"cropperMinWidth\"\n [cropperMinHeight]=\"cropperMinHeight\" [cropperMaxWidth]=\"cropperMaxWidth\"\n [cropperMaxHeight]=\"cropperMaxHeight\" [resetCropOnAspectRatioChange]='true' [(cropper)]=\"cropper\"\n [(transform)]=\"transform\" [onlyScaleDown]=\"true\" output=\"blob\" format=\"png\"\n (imageCropped)=\"imageCropped($event)\" (cropperReady)=\"cropperReady($event)\">\n </image-cropper>\n\n <!--AP-20JUN25 - Image size controls: Allow user to manually adjust width and height using range sliders -->\n <div *ngIf=\"selectedImageElement.imageData\" class=\"manual-size-inputs\">\n <label>Width {{ selectedImageElement.imageSize.width }}</label>\n <input type=\"range\" min=\"50\" max=\"300\" step=\"1\"\n [(ngModel)]=\"selectedImageElement.imageSize.width\"\n (input)=\"onImageSizeChange()\" />\n \n <label>Height {{ selectedImageElement.imageSize.height }}</label>\n <input type=\"range\" min=\"50\" max=\"300\" step=\"1\"\n [(ngModel)]=\"selectedImageElement.imageSize.height\"\n (input)=\"onImageSizeChange()\" />\n </div>\n \n\n <!-- Controls -->\n <div *ngIf=\"selectedImageElement.imageData\" class=\"controls\">\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateLeft()\" title=\"Rotate Left\">\u27F2</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateRight()\" title=\"Rotate Right\">\u27F3</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomOut()\" title=\"Zoom Out\">-</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomIn()\" title=\"Zoom In\">+</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveLeft()\" title=\"Move Left\">\u2190</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveRight()\" title=\"Move Right\">\u2192</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveUp()\" title=\"Move Up\">\u2191</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveDown()\" title=\"Move Down\">\u2193</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipHorizontal()\" [class.enabled]=\"transform.flipH\"\n title=\"Flip Horizontally\">\u2194</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipVertical()\" [class.enabled]=\"transform.flipV\"\n title=\"Flip Vertically\">\u2195</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"resetImage()\" title=\"Reset\">\u00D7</div>\n </div>\n </div>\n </div>\n</div>", styles: [".center-frame{display:flex;border-right-width:0}.head-elements{font-size:17px;font-weight:600}.form-builder{width:33.33%;height:calc(100vh - 20px);overflow-y:auto;background-color:#fff;padding:10px;border-right:10px solid #86A8CD;box-shadow:2px 2px 10px #0000001a}.form-builder .element{display:flex;align-items:center;gap:15px;margin-top:10px;padding:10px;border-radius:5px;background:#f8fafc;cursor:pointer;border-left:10px solid #E2F1FF;position:relative;color:#000}.form-builder .element:hover{background:#0250d9;color:#fff;border-left:10px solid #234465}.form-builder .element img{width:20px;height:20px;transition:filter .3s ease}.form-builder .element:hover img{filter:invert(1)}.form-builder .hover-label{font-size:15px;font-weight:400;color:#000;transition:color .3s ease}.form-builder .element:hover .hover-label{color:#fff}.form-builder .section-title{font-weight:700;font-size:16px;margin-top:10px;padding:5px;border-bottom:1px solid #ddd;color:#000;display:flex;justify-content:space-between;align-items:center}.form-builder .section-title:after{content:\"\\25bc\";font-size:12px;color:#555}.form-builder .section{margin-bottom:10px}.toggle-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;padding:10px}.arrow-icon{width:19px;height:23px;transition:transform .3s ease}.toggle-header:hover .arrow-icon{transform:scale(1.1)}.drag-dots{display:grid;grid-template-columns:repeat(2,1fr);grid-template-rows:repeat(3,1fr);gap:3px;position:absolute;right:15px;top:50%;transform:translateY(-50%)}.dot{width:5px;height:5px;border-radius:50%;background-color:#cbd5e1;transition:background-color .3s ease}.form-builder .element:hover .dot{background-color:#ffffffb3}.field-wrapper{background-color:#eff8ff;border:1px solid #E6F3FF;border-radius:5px;padding:10px}.field-wrapper.isPreview{background-color:transparent;border:none;border-radius:0;padding:0}.required:after{content:\"*\";color:red;margin-left:5px}.custom-input{width:100%;padding:8px;border:1px solid #DDDBDA;background-color:#fff;border-radius:5px;outline:none}.custom-input:focus{border-color:#00008b;box-shadow:0 0 5px #0000ff80}.delete-icon{width:19px;height:19px;margin-top:-5px}.field-container{padding-right:5px;padding-left:5px;transition:background .2s}.field-container:hover .top-right,.field-container.highlight .top-right,.label-container:hover .delete-icon{opacity:1;visibility:visible}.form-preview{width:100%;height:calc(100vh - 20px);overflow-y:auto;display:flex;flex-wrap:wrap;align-items:flex-start;padding:10px;height:fit-content;max-height:calc(100vh - 20px)}.field-content{display:flex;flex-direction:column;gap:5px}.label-container{display:flex;justify-content:flex-end;align-items:center}.top-right{display:flex;gap:10px;padding:6px;border:1px solid #d7edff;margin-top:-10px;background-color:#d7edff;margin-right:-10px;opacity:0;visibility:hidden;cursor:grab;transition:opacity .1s ease-in-out,visibility .1s ease-in-out}.drag-dot{height:13px}.custom-input,.custom-textarea,.dropdown,.checkbox-options-container,.radio-options-container{width:100%}.form-builder .element .drag-dots:active{cursor:grabbing}.dropdown{width:100%;padding:8px;border:1px solid #ccc;border-radius:4px;background-color:#fff;font-size:14px;color:#333;outline:none;cursor:pointer}.dropdown:focus{border-color:#007bff;box-shadow:0 0 5px #007bff80}.line-field{width:100%;margin:10px 0;background-color:#eff8ff;border:1px solid #E6F3FF;border-radius:5px;padding:3px}.line-field{background-color:transparent;border:none;border-radius:0;padding:3px}.checkbox-field-container:hover{box-shadow:0 2px 8px #0000001a}.checkbox-options-container{display:flex;flex-direction:column;gap:5px;padding:8px;min-height:38px;border:1px solid #DDDBDA;background-color:#fff;outline:none;border-radius:6px}.checkbox-option,.radio-option{display:flex;align-items:center;gap:8px;padding:8px;background-color:#fff;border-radius:4px;transition:background-color .2s ease}.checkbox-option:hover{background-color:#f1f3f5}.checkbox-input,.radio-input{width:18px;height:18px;accent-color:#4dabf7;cursor:pointer}.checkbox-label,.radio-label{font-size:14px;color:#495057;cursor:pointer;-webkit-user-select:none;user-select:none}.label-container label{font-size:15px;font-weight:400}.required:after{content:\" *\";color:red}.radio-options-container{display:flex;flex-direction:column;gap:5px;padding:8px;min-height:38px;border:1px solid #DDDBDA;background-color:#fff;outline:none;border-radius:6px}.radio-input:checked{border-color:#007bff;background-color:#007bff}.radio-input:checked:after{content:\"\";width:8px;height:8px;background:#fff;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.custom-textarea{width:100%;min-height:100px;border:1px solid #ccc;border-radius:4px;padding:8px;resize:vertical}.highlight{border:2px solid #5592FD!important;background-color:#eff8ff}.table-container label{font-size:14px;font-weight:700;margin-bottom:5px;display:block}.sticky-footer-version{position:fixed;bottom:0;padding:10px;text-align:center}.nxt-table-container{display:flex;justify-content:center;align-items:center;width:100%}nxt-datatable{width:100%!important;table-layout:fixed;max-width:100%}.dialog-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:#00000080;display:flex;justify-content:center;align-items:center;z-index:1000}.dialog-box{background:#fff;padding:20px;border-radius:5px;text-align:center;width:300px;position:relative}.close-btn-fb{position:absolute;top:4px;right:4px;background:#ff4242;color:#fff;border:none;border-radius:50%;width:20px;height:20px;font-size:10px;cursor:pointer}.button-container-fb{display:flex;justify-content:flex-end;gap:10px}.yes-btn-fb{background:green;color:#fff;border:none;padding:0 12px;border-radius:5px;cursor:pointer}.no-btn-fb{background:gray;color:#fff;border:none;padding:8px 15px;border-radius:5px;cursor:pointer}.line-element{width:100%;display:flex;justify-content:space-between;align-items:center}.custom-line{width:100%;border:1px solid #000}.logo-upload-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;width:150px;height:150px;border:2px dashed #ccc;cursor:pointer;inline-size:auto}.logo-upload-label{display:flex;flex-direction:column;align-items:center;cursor:pointer;color:#666}.logo-upload-label img{width:32px;height:32px;margin-bottom:8px}.element.disabled{opacity:.5;cursor:not-allowed}.form-container{display:flex;flex-wrap:wrap;border:10px solid #86A8CD}.form-container.isPreview{border:none}.center-frame{width:74%}.center-frame.isPreview{width:100%}app-pdf-properties{border-left:10px solid #86A8CD;width:25%}:host ::ng-deep .questiondiv1{padding-left:0!important;padding-right:0!important}:host ::ng-deep .form-group.content-box{padding-bottom:0!important}:host ::ng-deep .custom-textarea{min-height:40px!important}.modal-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:100}.modal-content{background:#fff;padding:20px;width:500px;max-width:90%;border-radius:8px;position:relative;text-align:center}.close-button{position:absolute;top:6px;right:6px;font-size:25px;cursor:pointer;z-index:10}.controls{display:flex;gap:5px;justify-content:center;margin-top:10px}.logo-icon{cursor:pointer;padding:5px;border-radius:5px;background:#d3d3d3}.logo-icon:hover{background:#a9a9a9}.enabled{background:#007bff;color:#fff}.text-settings-toolbar{position:absolute;display:flex;flex-wrap:wrap;align-items:center;gap:8px;background:#fff;border:1px solid #d1d5db;padding:8px 10px;border-radius:8px;box-shadow:0 4px 12px #0000001a;z-index:65535;max-width:100%;width:auto;min-width:200px;box-sizing:border-box}.toolbar-select{padding:4px 6px;font-size:13px;border:1px solid #d1d5db;border-radius:6px;background:#fff;cursor:pointer;min-width:60px;width:auto}.toolbar-btn{background:#f3f4f6;border:1px solid #d1d5db;padding:6px 8px;border-radius:6px;cursor:pointer;font-size:13px;min-width:30px;height:30px;display:flex;align-items:center;justify-content:center}.toolbar-btn:hover{background:#e5e7eb;border-color:#9ca3af}.toolbar-btn.active{background:#005aaa;color:#fff;border-color:#005aaa}.color-label{display:flex;align-items:center}.color-box{font-weight:700;width:22px;height:22px;font-size:13px;border:1px solid #ccc;border-radius:4px;text-align:center;line-height:22px;cursor:pointer;padding:0}.color-picker-hidden{position:absolute;opacity:0;pointer-events:none;width:0;height:0}@media (max-width: 600px){.text-settings-toolbar{flex-direction:row;flex-wrap:wrap;gap:6px;padding:6px;justify-content:flex-start}.toolbar-btn,.toolbar-select{font-size:12px;padding:5px}.color-box{width:20px;height:20px;font-size:12px;line-height:20px}}.action-buttons{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.action-btn{display:flex;gap:16px;padding:10px 15px;border-radius:8px;border:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "imageAltText", "options", "cropperFrameAriaLabel", "output", "format", "autoCrop", "cropper", "transform", "maintainAspectRatio", "aspectRatio", "resetCropOnAspectRatioChange", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "allowMoveImage", "checkImageType", "alignImage", "disabled", "hidden"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed", "transformChange", "cropperChange"] }, { kind: "component", type: PdfPropertiesComponent, selector: "app-pdf-properties", inputs: ["selectedElementType", "templateSelected"], outputs: ["formButtonHandler", "templateSaveHandler"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.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: i4.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: NxtDatatable, selector: "nxt-datatable", inputs: ["data", "tableFilterData", "columns", "withCheckBox", "searchBar", "tableSaveButton", "stickyColumn", "tableWidth", "actionColumHeader", "actionButton", "title", "isButtons", "buttonArray", "tableId", "isEditRow", "isDeleteRow", "addInlineRecord", "searchConfigs", "direction", "pagination", "actionButtonArray", "multipleFilter", "isPagination", "isNosIndicator", "isEditable", "from", "question", "rowTextSize", "rowTextColor", "apiMeta", "summaryRows", "summaryColumns", "isLoading", "tableConfig", "tableParams", "listViews", "mode", "languageCode", "selectedColumn", "allIcons"], outputs: ["tableRowClick", "onEditData", "saveButtonData", "onDeleteData", "buttonEmit", "hyperLinkEmit", "sideNavEmit", "actionButtonEmit", "columnSelected", "removeColumn", "valueChange", "selectedValues", "fileEmit", "NxtTableParamsEmit", "NxtTableFilterEmit", "hadleDropDownDependent", "NxtTableEmit"] }, { kind: "component", type: NxtInput, selector: "nxt-input", inputs: ["label", "labelFont", "labelWeight", "inputWeight", "labelSize", "inputValueSize", "labelColor", "showLabel", "svgHeight", "svgWidth", "type", "inputIconRightSrc", "inputIconLeftSrc", "required", "minLength", "pattern", "errorMessages", "maxLength", "placeholder", "inputBgColor", "inputBorder", "placeholderColor", "placeholderFont", "placeholderWeight", "placeholderSize", "inputTextColor", "inputHeight", "inputWidth", "inputId", "inputBorderSize", "inputConfig", "confPassVal", "confPass", "mode", "value", "question", "showSuggestion", "ariaOwns", "ariaHasPopup", "isLoading", "options", "minDate", "maxDate", "rows", "from", "hyperLink", "size"], outputs: ["valueChange", "inputValue", "onBlur", "onFocus", "toggleEmit", "nativeInputRef", "removeValueEmit", "hyperlinkEmit"] }] });
618
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PdfDesignerComponent, isStandalone: true, selector: "app-pdf-designer", inputs: { pdfJSON: "pdfJSON", bookletId: "bookletId", isPreview: "isPreview" }, outputs: { pdfSaveHandlerEmit: "pdfSaveHandlerEmit", templateMode: "templateMode", pdfPreviewEmit: "pdfPreviewEmit" }, viewQueries: [{ propertyName: "textareas", predicate: ["autoTextarea"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- AP 22JAN25 - form preview and All form elements -->\n<!-- AP 25FEB25 - All elements update -->\n<div class=\"form-container\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"center-frame\" [ngClass]=\"{'isPreview': isPreview}\">\n <!-- Form Builder Section All Elements -->\n <div *ngIf=\"!isPreview\" class=\"form-builder\">\n\n <ng-container *ngFor=\"let element of elementsList\">\n <div\n class=\"element\"\n [class.disabled]=\"selectedElement?.type && elementDisabledArray[selectedElement.type]?.includes(element.type)\"\n (click)=\"!(selectedElement?.type && elementDisabledArray[selectedElement.type]?.includes(element.type)) && addElement(element.type)\"\n [draggable]=\"!(selectedElement?.type && elementDisabledArray[selectedElement.type]?.includes(element.type))\"\n [matTooltip]=\"\n selectedElement?.type && elementDisabledArray[selectedElement.type]?.includes(element.type)\n ? ('THIS_ELEMENT_NOT_SUPPORTED' | nxtCustomTranslate : 'This element is not supported when a ') +\n (selectedElement?.type || ('CERTAIN_ELEMENT' | nxtCustomTranslate : 'certain element')) +\n (' IS_PRESENT' | nxtCustomTranslate : ' is present')\n : null\n \"\n >\n <img src=\"../assets/icons/{{ element.img }}.svg\" class=\"element-icon\">\n <div class=\"hover-label\">{{ element.label }}</div> \n <div class=\"drag-dots\">\n <div class=\"dot\" *ngFor=\"let dot of dots\"></div>\n </div>\n </div>\n </ng-container>\n<!-- \n <div class=\"template-section\">\n <app-templates (templateSelected)=\"onTemplateSelected($event)\"></app-templates>\n </div> -->\n\n <!-- SKS10MAR25 footer version show -->\n <div class=\"sticky-footer-version\">\n {{version}}\n </div>\n </div>\n <!-- AP-27MAR25 Remove CDK drag and drop replace draggable function -->\n <div class=\"form-preview\">\n <!-- AP-10MAR25 Heading -->\n <div class=\"field-container\"\n style=\"width: 100%;background-color: #EFF8FF; border: 1px solid #E6F3FF;margin-bottom:10px\"\n (click)=\"selectHeading('Header')\">\n <div class=\"label-container\" style=\"padding: 10px; display: flex;justify-content: space-between;\">\n <div *ngIf=\"pdf\">\n <div *ngIf=\"pdf.title == ''\" style=\"color:#3f4a525c\">{{ 'HEADING' | nxtCustomTranslate : 'Heading' }}</div>\n <div *ngIf=\"pdf.title !== ''\">{{pdf.title}}</div>\n </div>\n <div class=\"action-buttons\">\n <button class=\"action-btn\" (click)=\"pdfSaveHandler('preview')\">{{ 'PREVIEW' | nxtCustomTranslate : 'PREVIEW' }}</button>\n <button class=\"action-btn\" (click)=\"pdfSaveHandler('download')\">{{ 'DOWNLOAD' | nxtCustomTranslate : 'DOWNLOAD' }}</button>\n </div>\n </div>\n </div>\n\n <ng-container *ngFor=\"let field of pdfElements; let i = index\">\n\n <!-- AP-19MAR25 Line Element -->\n <div *ngIf=\"field?.type === 'Line'\" class=\"line-field\" [ngClass]=\"{'isPreview': isPreview}\"\n (click)=\"selectElement(i)\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div *ngIf=\"!isPreview\" class=\"line-element\">\n <div></div>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n <hr class=\"custom-line\" style=\"display: inline-flex\" [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-weight': field.fontWeight || '400',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'text-align': field.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'border-style': (field.lineStyle?.toLowerCase() || 'solid'),\n 'color': field.fontColor || '#000000',\n 'margin-top': (field.paddingTop || 0) + 'px',\n 'margin-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" />\n </div>\n\n <!--SKS25MAR25 Image Upload Element -->\n <div *ngIf=\"field?.type === 'image'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [class.highlight]=\"selectedFieldIndex === i && !isPreview\" draggable=\"true && !isPreview\"\n (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" (mouseenter)=\"isImageHover = true;\"\n (mouseleave)=\"isImageHover = false;\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <div>\n <div *ngIf=\"isImageHover\" style=\"display: flex; justify-content: end;\">\n <svg *ngIf=\"isPreview\" (click)=\"onImageEdit(field)\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.1067 6.07174L9.92833 4.8934L2.16667 12.6551V13.8334H3.345L11.1067 6.07174ZM12.285 4.8934L13.4633 3.71507L12.285 2.53674L11.1067 3.71507L12.285 4.8934ZM4.035 15.5001H0.5V11.9642L11.6958 0.768403C11.8521 0.612177 12.064 0.524414 12.285 0.524414C12.506 0.524414 12.7179 0.612177 12.8742 0.768403L15.2317 3.1259C15.3879 3.28218 15.4757 3.4941 15.4757 3.71507C15.4757 3.93604 15.3879 4.14796 15.2317 4.30424L4.03583 15.5001H4.035Z\"\n fill=\"#6C757D\" />\n </svg>\n <svg *ngIf=\"isPreview\" (click)=\"onImageDelete(field)\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14 3.98726C11.78 3.76726 9.54667 3.65393 7.32 3.65393C6 3.65393 4.68 3.7206 3.36 3.85393L2 3.98726\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M5.6665 3.31362L5.81317 2.44028C5.91984 1.80695 5.99984 1.33362 7.1265 1.33362H8.87317C9.99984 1.33362 10.0865 1.83362 10.1865 2.44695L10.3332 3.31362\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M12.5667 6.09375L12.1334 12.8071C12.06 13.8537 12 14.6671 10.14 14.6671H5.86002C4.00002 14.6671 3.94002 13.8537 3.86668 12.8071L3.43335 6.09375\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.88647 11.0004H9.10647\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M6.3335 8.33325H9.66683\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div class=\"logo-container\">\n <div class=\"logo-preview\" *ngIf=\"field.imageData\">\n <img [src]=\"field.imageData\" \n [style.width.px]=\"field.imageSize?.width || 100\"\n [style.height.px]=\"field.imageSize?.height || 100\" />\n </div>\n\n <div *ngIf=\"!field.imageData\" class=\"logo-upload-placeholder\">\n <label for=\"logo-upload-{{i}}\" class=\"logo-upload-label\">\n <img src=\"../assets/icons/Image.svg\" alt=\"Upload\" />\n <span>{{ 'UPLOAD_IMAGE' | nxtCustomTranslate : 'Upload Image' }}</span>\n </label>\n <input type=\"file\" id=\"logo-upload-{{i}}\" accept=\"image/*\" (change)=\"fileChangeEvent(field, $event)\"\n style=\"display: none;\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Space Element -->\n <div *ngIf=\"field?.type === 'Space'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" style=\"height:93px\" [ngClass]=\"{'isPreview': isPreview}\">\n <div *ngIf=\"!isPreview\" class=\"field-content\">\n <div class=\"label-container\">\n <div class=\"top-right\" style=\"margin: -11px -11px 0 0;\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- TextArea -->\n <div *ngIf=\"field?.type === 'text'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <textarea class=\"custom-textarea\"\n [placeholder]=\"'ENTER_DETAILED_TEXT_HERE' | nxtCustomTranslate : 'Enter detailed text here...'\"\n [value]=\"field.value? field.value : ''\"\n (input)=\"onTextAreaInput($event, field)\"\n #autoTextarea\n [style.height.px]=\"isPreview ? 40 : null\"\n (click)=\"openTextSettings(field, $event)\"\n (ngModelChange)=\"updateContent()\" \n [ngStyle]=\"{\n 'font-size': field.style?.fontSize ? field.style.fontSize + 'px' : '14px',\n 'font-weight': field.style?.bold ? 'bold' : 'normal',\n 'font-style': field.style?.italics ? 'italic' : 'normal',\n 'text-decoration': field.style?.decoration ? 'decoration' : 'none',\n 'text-align': field.style?.alignment || 'left',\n 'margin': field.style?.margin?.length === 4\n ? field.style.margin[1] + 'px ' + field.style.margin[2] + 'px ' +\n field.style.margin[3] + 'px ' + field.style.margin[0] + 'px'\n : '0',\n 'color': field.style?.color || '#000'\n }\"></textarea>\n \n </div>\n </div>\n\n <!--AP-05JUN25 Text Settings Toolbar: Allows editing font size, bold/italic styles, alignment, and closing the toolbar for the selected column -->\n <div *ngIf=\"showTextSettings && isPreview && selectedColumn === field\" class=\"text-settings-toolbar\"\n [ngStyle]=\"{\n position: 'absolute',\n background: '#fff',\n border: '1px solid #ccc',\n padding: '6px 10px',\n 'border-radius': '4px',\n 'box-shadow': '0 2px 6px rgba(0, 0, 0, 0.1)',\n 'z-index': '65535',\n display: 'flex',\n 'align-items': 'center',\n gap: '8px'\n }\">\n \n <!-- Font Size -->\n <select [(ngModel)]=\"selectedColumn.style.fontSize\" class=\"toolbar-select\">\n <option [value]=\"12\">12pt</option>\n <option [value]=\"14\">14pt</option>\n <option [value]=\"16\">16pt</option>\n <option [value]=\"18\">18pt</option>\n <option [value]=\"24\">24pt</option>\n </select>\n\n <!-- Text Color -->\n <label title=\"Text Color\" class=\"color-label\">\n <span class=\"color-box\" [style.color]=\"selectedColumn.style.color || '#000'\" (click)=\"textColorInput.click()\">A</span>\n <input #textColorInput type=\"color\" [(ngModel)]=\"selectedColumn.style.color\" (change)=\"updateContent()\" class=\"color-picker-hidden\"/>\n </label>\n\n <!-- Bold -->\n <button (click)=\"toggleStyle('bold')\" [class.active]=\"selectedColumn?.style?.bold\" class=\"toolbar-btn\">{{ 'BOLD' | nxtCustomTranslate : 'B' }}</button>\n \n <!-- Italic -->\n <button (click)=\"toggleStyle('italic')\" [class.active]=\"selectedColumn?.style?.italics\" class=\"toolbar-btn\"><i>{{ 'ITALIC' | nxtCustomTranslate : 'I' }}</i></button>\n\n <!-- Underline -->\n <!-- <button (click)=\"toggleStyle('underline')\" [class.active]=\"selectedColumn?.style?.underline\" class=\"toolbar-btn\"><u>U</u></button> -->\n\n \n <!-- Align Left -->\n <button (click)=\"setAlignment('left')\" [class.active]=\"selectedColumn?.style?.alignment === 'left'\" class=\"toolbar-btn\">\n <span class=\"material-icons\">{{ 'FORMAT_ALIGN_LEFT' | nxtCustomTranslate : 'format_align_left' }}</span>\n </button>\n \n <!-- Align Center -->\n <button (click)=\"setAlignment('center')\" [class.active]=\"selectedColumn?.style?.alignment === 'center'\" class=\"toolbar-btn\">\n <span class=\"material-icons\">{{ 'FORMAT_ALIGN_CENTER' | nxtCustomTranslate : 'format_align_center' }}</span>\n </button>\n \n <!-- Align Right -->\n <button (click)=\"setAlignment('right')\" [class.active]=\"selectedColumn?.style?.alignment === 'right'\" class=\"toolbar-btn\">\n <span class=\"material-icons\">{{ 'FORMAT_ALIGN_RIGHT' | nxtCustomTranslate : 'format_align_right' }}</span>\n </button>\n \n <!-- Close -->\n <button (click)=\"closeTextSettings()\" class=\"toolbar-btn\" style=\"margin-left: auto;\">\u2715</button>\n </div>\n \n </div>\n\n <!-- Input -->\n <div *ngIf=\"field?.type === 'input'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <!-- AP-04JUN25 - replace app-custom-input -->\n <nxt-input [type]=\"'text'\" [mode]=\"'edit'\" [value]=\"field.value\" [question]=\"\" [labelFont]=\"\"\n [label]=\"field?.questionText\" [labelColor]=\"\" [labelSize]=\"\" [inputValueSize]=\"\" [labelWeight]=\"\"\n [inputWeight]=\"\" [showLabel]=\"\" inputBorder=\"none\" svgHeight=\"20px\" svgWidth=\"20px\"\n [placeholder]=\"field.question ? field.question : 'ENTER_YOUR_INPUT' | nxtCustomTranslate : 'Enter your input'\" [required]=\"\"\n inputBgColor=\"#F5F5F5\" [inputId]=\"\" [errorMessages]=\"{ required: 'This field is required' }\"\n [inputIconLeftSrc]=\"''\" (inputValue)=\"onQuestionChange($event, field)\">\n </nxt-input>\n </div>\n </div>\n </div>\n\n <!-- Date -->\n <div *ngIf=\"field?.type === 'date'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <!-- AP-04JUN25 - replace custom date picker -->\n <nxt-input [type]=\"'date'\" [mode]=\"'edit'\" [value]=\"field.value\" [question]=\"\" [labelFont]=\"\"\n [label]=\"field?.questionText\" [labelColor]=\"\" [labelSize]=\"\" [inputValueSize]=\"\" [labelWeight]=\"\"\n [inputWeight]=\"\" [showLabel]=\"\" inputBorder=\"none\" svgHeight=\"20px\" svgWidth=\"20px\"\n [placeholder]=\"field.question ? field.question : 'ENTER_YOUR_INPUT' | nxtCustomTranslate : 'Enter your input'\" [required]=\"\"\n inputBgColor=\"#F5F5F5\" [inputId]=\"\" [errorMessages]=\"{ required: 'This field is required' }\"\n [inputIconLeftSrc]=\"''\" (inputValue)=\"onQuestionChange($event, field)\">\n </nxt-input>\n </div>\n </div>\n </div>\n\n <!-- Pdf -->\n <div *ngIf=\"field?.type === 'Pdf'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <!-- <lib-booklet [bookletJSON]=\"field.pdfReferenceQuestions\"></lib-booklet> -->\n <div *ngIf=\"field?.pdfReferenceQuestions\">\n <ng-container *ngFor=\"let field of field?.pdfReferenceQuestions[field?.pdfReference]; let i = index\">\n <!-- AP-19MAR25 Line Element -->\n <div *ngIf=\"field?.type === 'Line'\" class=\"line-field\">\n <hr class=\"custom-line\" style=\"display: inline-flex\" [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-weight': field.fontWeight || '400',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'text-align': field.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'border-style': (field.lineStyle?.toLowerCase() || 'solid'),\n 'color': field.fontColor || '#000000',\n 'margin-top': (field.paddingTop || 0) + 'px',\n 'margin-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" />\n </div>\n\n <div *ngIf=\"field?.type === 'image'\" class=\"field-container\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div>\n <div class=\"logo-container\">\n <!-- Logo preview area -->\n <div class=\"logo-preview\" *ngIf=\"field.imageData\">\n <img [src]=\"field.imageData\" />\n </div>\n\n <!-- Upload button -->\n <div *ngIf=\"!field.imageData\" class=\"logo-upload-placeholder\">\n <label for=\"logo-upload-{{i}}\" class=\"logo-upload-label\">\n <img src=\"../assets/icons/Image.svg\" alt=\"Upload\" />\n <span>{{ 'UPLOAD_IMAGE' | nxtCustomTranslate : 'Upload Image' }}</span>\n </label>\n <input type=\"file\" id=\"logo-upload-{{i}}\" accept=\"image/*\"\n (change)=\"fileChangeEvent(field, $event)\" style=\"display: none;\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"field?.type === 'Space'\" class=\"field-container\">\n <div class=\"field-wrapper\" style=\"height:93px\" [ngClass]=\"{'isPreview': isPreview}\">\n </div>\n </div>\n <div *ngIf=\"field?.type === 'text'\" class=\"field-container\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <textarea class=\"custom-textarea\" [placeholder]=\"'ENTER_DETAILED_TEXT_HERE' | nxtCustomTranslate : 'Enter detailed text here...'\"\n [style.height.px]=\"isPreview ? 40 : field.size || 100\" [(ngModel)]=\"field.value\"\n (ngModelChange)=\"onQuestionChange($event, field)\"></textarea>\n </div>\n </div>\n </div>\n <!-- AP-14JUN25 Added nxt-input in pdf -->\n <div *ngIf=\"field?.type === 'input'\" class=\"field-container\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\"> \n <nxt-input [type]=\"'text'\" [mode]=\"'edit'\" [(ngModel)]=\"field.value\"\n [placeholder]=\"'ENTER_YOUR_INPUT' | nxtCustomTranslate : 'Enter your input'\" (ngModelChange)=\"onQuestionChange($event, field)\">\n </nxt-input>\n </div>\n </div>\n </div>\n <!-- AP-06MAR25 -->\n <div *ngIf=\"field?.type === 'Table'\" class=\"field-container\">\n <div class=\"field-wrapper\" style=\"overflow: hidden;\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div class=\"nxt-table-container\">\n <nxt-datatable isButtons [question]=\"field\" from=\"formBuilder\"\n [mode]=\"isPreview ? 'view' : 'edit'\" [apiMeta]=\"field?.subText\"\n [tableConfig]=\"field.tableConfig\" tableId=\"\" direction=\"ltr\" tableWidth=\"auto\"\n (valueChange)=\"onQuestionChange($event, field)\"\n [data]=\"field.value?.data\"\n isEditable=true (columnSelected)=columnSelected($event) (removeColumn)=removeColumn($event)>\n </nxt-datatable>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Table -->\n <!-- AP-06MAR25 -->\n <div *ngIf=\"field?.type === 'Table'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" style=\"overflow: hidden;\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <div class=\"nxt-table-container\">\n <nxt-datatable isButtons [question]=\"field\" from=\"formBuilder\" [mode]=\"isPreview ? 'view' : 'edit'\"\n [apiMeta]=\"field?.subText\" [tableConfig]=\"field.tableConfig\" tableId=\"\" direction=\"ltr\"\n tableWidth=\"auto\" isEditable=true (columnSelected)=columnSelected($event)\n [data]=\"field.value?.data\"\n (valueChange)=\"onQuestionChange($event, field)\"\n (removeColumn)=removeColumn($event)>\n </nxt-datatable>\n </div>\n </div>\n </div>\n </div>\n\n </ng-container>\n </div>\n </div>\n <!-- SKS13MAR25 popup conformation box -->\n <div class=\"dialog-overlay\" *ngIf=\"isSelectTablePopup\">\n <div class=\"dialog-box\">\n <button class=\"close-btn-fb\" (click)=\"onClose()\">\u2715</button>\n <p>{{ 'ADD_TABLE_CONFIRMATION' | nxtCustomTranslate : 'These element want to add a table' }}</p>\n <div class=\"button-container-fb\">\n <button class=\"yes-btn-fb\" (click)=\"addOnTable()\">{{ 'YES' | nxtCustomTranslate : 'Yes' }}</button>\n <button class=\"no-btn-fb\" (click)=\"onClose()\">{{ 'NO' | nxtCustomTranslate : 'No' }}</button>\n </div>\n </div>\n </div>\n <app-pdf-properties *ngIf=\"!isPreview\" (formButtonHandler)=\"pdfSaveHandler($event)\"></app-pdf-properties>\n</div>\n<!--SKS25MAR25 Modal Overlay -->\n<div class=\"modal-overlay\" *ngIf=\"isImageEdit\">\n <div class=\"modal-content\">\n <span class=\"close-button\" (click)=\"closeModal()\">\u00D7</span>\n <!-- Image Editor -->\n <div *ngIf=\"selectedImageElement?.type === 'image'\">\n <image-cropper *ngIf=\"selectedImageElement.imageData\" [imageBase64]=\"selectedImageElement.orgImageData\"\n [disabled]=\"false\" [alignImage]=\"alignImage\" [roundCropper]=\"roundCropper\" [backgroundColor]=\"'white'\"\n imageAltText=\"{{ 'ALTERNATIVE_IMAGE_TEXT' | nxtCustomTranslate : 'Alternative image text' }}\" [allowMoveImage]=\"false\" [hideResizeSquares]=\"false\"\n [canvasRotation]=\"canvasRotation\" [aspectRatio]=\"aspectRatio\" [containWithinAspectRatio]=\"false\"\n [maintainAspectRatio]=\"false\" [cropperStaticWidth]=\"cropperStaticWidth\"\n [cropperStaticHeight]=\"cropperStaticHeight\" [cropperMinWidth]=\"cropperMinWidth\"\n [cropperMinHeight]=\"cropperMinHeight\" [cropperMaxWidth]=\"cropperMaxWidth\"\n [cropperMaxHeight]=\"cropperMaxHeight\" [resetCropOnAspectRatioChange]='true' [(cropper)]=\"cropper\"\n [(transform)]=\"transform\" [onlyScaleDown]=\"true\" output=\"blob\" format=\"png\"\n (imageCropped)=\"imageCropped($event)\" (cropperReady)=\"cropperReady($event)\">\n </image-cropper>\n\n <!--AP-20JUN25 - Image size controls: Allow user to manually adjust width and height using range sliders -->\n <div *ngIf=\"selectedImageElement.imageData\" class=\"manual-size-inputs\">\n <label>{{ 'WIDTH' | nxtCustomTranslate : 'Width' }} {{ selectedImageElement.imageSize.width }}</label>\n <input type=\"range\" min=\"50\" max=\"300\" step=\"1\"\n [(ngModel)]=\"selectedImageElement.imageSize.width\"\n (input)=\"onImageSizeChange()\" />\n \n <label>{{ 'HEIGHT' | nxtCustomTranslate : 'Height' }} {{ selectedImageElement.imageSize.height }}</label>\n <input type=\"range\" min=\"50\" max=\"300\" step=\"1\"\n [(ngModel)]=\"selectedImageElement.imageSize.height\"\n (input)=\"onImageSizeChange()\" />\n </div>\n \n\n <!-- Controls -->\n <div *ngIf=\"selectedImageElement.imageData\" class=\"controls\">\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateLeft()\" title=\"{{ 'ROTATE_LEFT' | nxtCustomTranslate : 'Rotate Left' }}\">\u27F2</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateRight()\" title=\"{{ 'ROTATE_RIGHT' | nxtCustomTranslate : 'Rotate Right' }}\">\u27F3</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomOut()\" title=\"{{ 'ZOOM_OUT' | nxtCustomTranslate : 'Zoom Out' }}\">-</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomIn()\" title=\"{{ 'ZOOM_IN' | nxtCustomTranslate : 'Zoom In' }}\">+</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveLeft()\" title=\"{{ 'MOVE_LEFT' | nxtCustomTranslate : 'Move Left' }}\">\u2190</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveRight()\" title=\"{{ 'MOVE_RIGHT' | nxtCustomTranslate : 'Move Right' }}\">\u2192</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveUp()\" title=\"{{ 'MOVE_UP' | nxtCustomTranslate : 'Move Up' }}\">\u2191</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveDown()\" title=\"{{ 'MOVE_DOWN' | nxtCustomTranslate : 'Move Down' }}\">\u2193</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipHorizontal()\" [class.enabled]=\"transform.flipH\"\n title=\"{{ 'FLIP_HORIZONTALLY' | nxtCustomTranslate : 'Flip Horizontally' }}\">\u2194</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipVertical()\" [class.enabled]=\"transform.flipV\"\n title=\"{{ 'FLIP_VERTICALLY' | nxtCustomTranslate : 'Flip Vertically' }}\">\u2195</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"resetImage()\" title=\"{{ 'RESET' | nxtCustomTranslate : 'Reset' }}\">\u00D7</div>\n </div>\n </div>\n </div>\n</div>", styles: [".center-frame{display:flex;border-right-width:0}.head-elements{font-size:17px;font-weight:600}.form-builder{width:33.33%;height:calc(100vh - 20px);overflow-y:auto;background-color:#fff;padding:10px;border-right:10px solid #86A8CD;box-shadow:2px 2px 10px #0000001a}.form-builder .element{display:flex;align-items:center;gap:15px;margin-top:10px;padding:10px;border-radius:5px;background:#f8fafc;cursor:pointer;border-left:10px solid #E2F1FF;position:relative;color:#000}.form-builder .element:hover{background:#0250d9;color:#fff;border-left:10px solid #234465}.form-builder .element img{width:20px;height:20px;transition:filter .3s ease}.form-builder .element:hover img{filter:invert(1)}.form-builder .hover-label{font-size:15px;font-weight:400;color:#000;transition:color .3s ease}.form-builder .element:hover .hover-label{color:#fff}.form-builder .section-title{font-weight:700;font-size:16px;margin-top:10px;padding:5px;border-bottom:1px solid #ddd;color:#000;display:flex;justify-content:space-between;align-items:center}.form-builder .section-title:after{content:\"\\25bc\";font-size:12px;color:#555}.form-builder .section{margin-bottom:10px}.toggle-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;padding:10px}.arrow-icon{width:19px;height:23px;transition:transform .3s ease}.toggle-header:hover .arrow-icon{transform:scale(1.1)}.drag-dots{display:grid;grid-template-columns:repeat(2,1fr);grid-template-rows:repeat(3,1fr);gap:3px;position:absolute;right:15px;top:50%;transform:translateY(-50%)}.dot{width:5px;height:5px;border-radius:50%;background-color:#cbd5e1;transition:background-color .3s ease}.form-builder .element:hover .dot{background-color:#ffffffb3}.field-wrapper{background-color:#eff8ff;border:1px solid #E6F3FF;border-radius:5px;padding:10px}.field-wrapper.isPreview{background-color:transparent;border:none;border-radius:0;padding:0}.required:after{content:\"*\";color:red;margin-left:5px}.custom-input{width:100%;padding:8px;border:1px solid #DDDBDA;background-color:#fff;border-radius:5px;outline:none}.custom-input:focus{border-color:#00008b;box-shadow:0 0 5px #0000ff80}.delete-icon{width:19px;height:19px;margin-top:-5px}.field-container{padding-right:5px;padding-left:5px;transition:background .2s}.field-container:hover .top-right,.field-container.highlight .top-right,.label-container:hover .delete-icon{opacity:1;visibility:visible}.form-preview{width:100%;height:calc(100vh - 20px);overflow-y:auto;display:flex;flex-wrap:wrap;align-items:flex-start;padding:10px;height:fit-content;max-height:calc(100vh - 20px)}.field-content{display:flex;flex-direction:column;gap:5px}.label-container{display:flex;justify-content:flex-end;align-items:center}.top-right{display:flex;gap:10px;padding:6px;border:1px solid #d7edff;margin-top:-10px;background-color:#d7edff;margin-right:-10px;opacity:0;visibility:hidden;cursor:grab;transition:opacity .1s ease-in-out,visibility .1s ease-in-out}.drag-dot{height:13px}.custom-input,.custom-textarea,.dropdown,.checkbox-options-container,.radio-options-container{width:100%}.form-builder .element .drag-dots:active{cursor:grabbing}.dropdown{width:100%;padding:8px;border:1px solid #ccc;border-radius:4px;background-color:#fff;font-size:14px;color:#333;outline:none;cursor:pointer}.dropdown:focus{border-color:#007bff;box-shadow:0 0 5px #007bff80}.line-field{width:100%;margin:10px 0;background-color:#eff8ff;border:1px solid #E6F3FF;border-radius:5px;padding:3px}.line-field{background-color:transparent;border:none;border-radius:0;padding:3px}.checkbox-field-container:hover{box-shadow:0 2px 8px #0000001a}.checkbox-options-container{display:flex;flex-direction:column;gap:5px;padding:8px;min-height:38px;border:1px solid #DDDBDA;background-color:#fff;outline:none;border-radius:6px}.checkbox-option,.radio-option{display:flex;align-items:center;gap:8px;padding:8px;background-color:#fff;border-radius:4px;transition:background-color .2s ease}.checkbox-option:hover{background-color:#f1f3f5}.checkbox-input,.radio-input{width:18px;height:18px;accent-color:#4dabf7;cursor:pointer}.checkbox-label,.radio-label{font-size:14px;color:#495057;cursor:pointer;-webkit-user-select:none;user-select:none}.label-container label{font-size:15px;font-weight:400}.required:after{content:\" *\";color:red}.radio-options-container{display:flex;flex-direction:column;gap:5px;padding:8px;min-height:38px;border:1px solid #DDDBDA;background-color:#fff;outline:none;border-radius:6px}.radio-input:checked{border-color:#007bff;background-color:#007bff}.radio-input:checked:after{content:\"\";width:8px;height:8px;background:#fff;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.custom-textarea{width:100%;min-height:100px;border:1px solid #ccc;border-radius:4px;padding:8px;resize:vertical}.highlight{border:2px solid #5592FD!important;background-color:#eff8ff}.table-container label{font-size:14px;font-weight:700;margin-bottom:5px;display:block}.sticky-footer-version{position:fixed;bottom:0;padding:10px;text-align:center}.nxt-table-container{display:flex;justify-content:center;align-items:center;width:100%}nxt-datatable{width:100%!important;table-layout:fixed;max-width:100%}.dialog-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:#00000080;display:flex;justify-content:center;align-items:center;z-index:1000}.dialog-box{background:#fff;padding:20px;border-radius:5px;text-align:center;width:300px;position:relative}.close-btn-fb{position:absolute;top:4px;right:4px;background:#ff4242;color:#fff;border:none;border-radius:50%;width:20px;height:20px;font-size:10px;cursor:pointer}.button-container-fb{display:flex;justify-content:flex-end;gap:10px}.yes-btn-fb{background:green;color:#fff;border:none;padding:0 12px;border-radius:5px;cursor:pointer}.no-btn-fb{background:gray;color:#fff;border:none;padding:8px 15px;border-radius:5px;cursor:pointer}.line-element{width:100%;display:flex;justify-content:space-between;align-items:center}.custom-line{width:100%;border:1px solid #000}.logo-upload-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;width:150px;height:150px;border:2px dashed #ccc;cursor:pointer;inline-size:auto}.logo-upload-label{display:flex;flex-direction:column;align-items:center;cursor:pointer;color:#666}.logo-upload-label img{width:32px;height:32px;margin-bottom:8px}.element.disabled{opacity:.5;cursor:not-allowed}.form-container{display:flex;flex-wrap:wrap;border:10px solid #86A8CD}.form-container.isPreview{border:none}.center-frame{width:74%}.center-frame.isPreview{width:100%}app-pdf-properties{border-left:10px solid #86A8CD;width:25%}:host ::ng-deep .questiondiv1{padding-left:0!important;padding-right:0!important}:host ::ng-deep .form-group.content-box{padding-bottom:0!important}:host ::ng-deep .custom-textarea{min-height:40px!important}.modal-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:100}.modal-content{background:#fff;padding:20px;width:500px;max-width:90%;border-radius:8px;position:relative;text-align:center}.close-button{position:absolute;top:6px;right:6px;font-size:25px;cursor:pointer;z-index:10}.controls{display:flex;gap:5px;justify-content:center;margin-top:10px}.logo-icon{cursor:pointer;padding:5px;border-radius:5px;background:#d3d3d3}.logo-icon:hover{background:#a9a9a9}.enabled{background:#007bff;color:#fff}.text-settings-toolbar{position:absolute;display:flex;flex-wrap:wrap;align-items:center;gap:8px;background:#fff;border:1px solid #d1d5db;padding:8px 10px;border-radius:8px;box-shadow:0 4px 12px #0000001a;z-index:65535;max-width:100%;width:auto;min-width:200px;box-sizing:border-box}.toolbar-select{padding:4px 6px;font-size:13px;border:1px solid #d1d5db;border-radius:6px;background:#fff;cursor:pointer;min-width:60px;width:auto}.toolbar-btn{background:#f3f4f6;border:1px solid #d1d5db;padding:6px 8px;border-radius:6px;cursor:pointer;font-size:13px;min-width:30px;height:30px;display:flex;align-items:center;justify-content:center}.toolbar-btn:hover{background:#e5e7eb;border-color:#9ca3af}.toolbar-btn.active{background:#005aaa;color:#fff;border-color:#005aaa}.color-label{display:flex;align-items:center}.color-box{font-weight:700;width:22px;height:22px;font-size:13px;border:1px solid #ccc;border-radius:4px;text-align:center;line-height:22px;cursor:pointer;padding:0}.color-picker-hidden{position:absolute;opacity:0;pointer-events:none;width:0;height:0}@media (max-width: 600px){.text-settings-toolbar{flex-direction:row;flex-wrap:wrap;gap:6px;padding:6px;justify-content:flex-start}.toolbar-btn,.toolbar-select{font-size:12px;padding:5px}.color-box{width:20px;height:20px;font-size:12px;line-height:20px}}.action-buttons{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.action-btn{display:flex;gap:16px;padding:10px 15px;border-radius:8px;border:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "imageAltText", "options", "cropperFrameAriaLabel", "output", "format", "autoCrop", "cropper", "transform", "maintainAspectRatio", "aspectRatio", "resetCropOnAspectRatioChange", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "allowMoveImage", "checkImageType", "alignImage", "disabled", "hidden"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed", "transformChange", "cropperChange"] }, { kind: "component", type: PdfPropertiesComponent, selector: "app-pdf-properties", inputs: ["selectedElementType", "templateSelected"], outputs: ["formButtonHandler", "templateSaveHandler"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.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: i4.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: NxtDatatable, selector: "nxt-datatable", inputs: ["data", "tableFilterData", "columns", "withCheckBox", "searchBar", "tableSaveButton", "stickyColumn", "tableWidth", "actionColumHeader", "actionButton", "title", "isButtons", "buttonArray", "tableId", "isEditRow", "isDeleteRow", "addInlineRecord", "searchConfigs", "direction", "pagination", "actionButtonArray", "multipleFilter", "isPagination", "isNosIndicator", "isEditable", "from", "question", "rowTextSize", "rowTextColor", "apiMeta", "summaryRows", "summaryColumns", "isLoading", "tableConfig", "tableParams", "listViews", "mode", "languageCode", "selectedColumn", "allIcons"], outputs: ["tableRowClick", "onEditData", "saveButtonData", "onDeleteData", "buttonEmit", "hyperLinkEmit", "sideNavEmit", "actionButtonEmit", "columnSelected", "removeColumn", "valueChange", "selectedValues", "fileEmit", "NxtTableParamsEmit", "NxtTableFilterEmit", "hadleDropDownDependent", "NxtTableEmit"] }, { kind: "component", type: NxtInput, selector: "nxt-input", inputs: ["label", "labelFont", "labelWeight", "inputWeight", "labelSize", "inputValueSize", "labelColor", "showLabel", "svgHeight", "svgWidth", "type", "inputIconRightSrc", "inputIconLeftSrc", "required", "minLength", "pattern", "errorMessages", "maxLength", "placeholder", "inputBgColor", "inputBorder", "placeholderColor", "placeholderFont", "placeholderWeight", "placeholderSize", "inputTextColor", "inputHeight", "inputWidth", "inputId", "inputBorderSize", "inputConfig", "confPassVal", "confPass", "mode", "value", "question", "showSuggestion", "ariaOwns", "ariaHasPopup", "isLoading", "options", "minDate", "maxDate", "rows", "from", "hyperLink", "size"], outputs: ["valueChange", "inputValue", "onBlur", "onFocus", "toggleEmit", "nativeInputRef", "removeValueEmit", "hyperlinkEmit"] }, { kind: "pipe", type: NxtCustomTranslatePipe, name: "nxtCustomTranslate" }] });
660
619
  }
661
620
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PdfDesignerComponent, decorators: [{
662
621
  type: Component,
663
- args: [{ selector: 'app-pdf-designer', standalone: true, imports: [CommonModule, ImageCropperComponent, PdfPropertiesComponent, MatTooltipModule, FormsModule, NxtDatatable, BookletComponent, AppTemplatesComponent, NxtInput], template: "<!-- AP 22JAN25 - form preview and All form elements -->\n<!-- AP 25FEB25 - All elements update -->\n<div class=\"form-container\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"center-frame\" [ngClass]=\"{'isPreview': isPreview}\">\n <!-- Form Builder Section All Elements -->\n <div *ngIf=\"!isPreview\" class=\"form-builder\">\n\n <ng-container *ngFor=\"let element of elementsList\">\n <div class=\"element\" [class.disabled]=\"isElementDisabled(element.type)\"\n (click)=\"!isElementDisabled(element.type) && addElement(element.type)\"\n [draggable]=\"!isElementDisabled(element.type)\"\n [matTooltip]=\"isElementDisabled(element.type) ? 'This element is not supported when a ' + (selectedElement?.type || 'certain element') + ' is present' : null\">\n <img src=\"../assets/icons/{{ element.img }}.svg\" class=\"element-icon\">\n <div class=\"hover-label\">{{ element.label }}</div>\n <div class=\"drag-dots\">\n <div class=\"dot\" *ngFor=\"let dot of dots\"></div>\n </div>\n </div>\n </ng-container>\n<!-- \n <div class=\"template-section\">\n <app-templates (templateSelected)=\"onTemplateSelected($event)\"></app-templates>\n </div> -->\n\n <!-- SKS10MAR25 footer version show -->\n <div class=\"sticky-footer-version\">\n {{version}}\n </div>\n </div>\n <!-- AP-27MAR25 Remove CDK drag and drop replace draggable function -->\n <div class=\"form-preview\">\n <!-- AP-10MAR25 Heading -->\n <div class=\"field-container\"\n style=\"width: 100%;background-color: #EFF8FF; border: 1px solid #E6F3FF;margin-bottom:10px\"\n (click)=\"selectHeading('Header')\">\n <div class=\"label-container\" style=\"padding: 10px; display: flex;justify-content: space-between;\">\n <div *ngIf=\"pdf\">\n <div *ngIf=\"pdf.title == ''\" style=\"color:#3f4a525c\">Heading</div>\n <div *ngIf=\"pdf.title !== ''\">{{pdf.title}}</div>\n </div>\n <div class=\"action-buttons\">\n <button class=\"action-btn\" (click)=\"pdfSaveHandler('preview')\">PREVIEW</button>\n <button class=\"action-btn\" (click)=\"pdfSaveHandler('download')\">DOWNLOAD</button>\n </div>\n </div>\n </div>\n\n <ng-container *ngFor=\"let field of pdfElements; let i = index\" getProperties().elementProps>\n\n <!-- AP-19MAR25 Line Element -->\n <div *ngIf=\"field?.type === 'Line'\" class=\"line-field\" [ngClass]=\"{'isPreview': isPreview}\"\n (click)=\"selectElement(i)\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div *ngIf=\"!isPreview\" class=\"line-element\">\n <div></div>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n <hr class=\"custom-line\" style=\"display: inline-flex\" [ngStyle]=\"getLineStyles(field)\" />\n </div>\n\n <!--SKS25MAR25 Image Upload Element -->\n <div *ngIf=\"field?.type === 'image'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [class.highlight]=\"selectedFieldIndex === i && !isPreview\" draggable=\"true && !isPreview\"\n (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\"\n [ngStyle]=\"getFontStyles(field)\" (mouseenter)=\"isImageHover = true;\"\n (mouseleave)=\"isImageHover = false;\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <div>\n <div *ngIf=\"isImageHover\" style=\"display: flex; justify-content: end;\">\n <svg *ngIf=\"isPreview\" (click)=\"onImageEdit(field)\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.1067 6.07174L9.92833 4.8934L2.16667 12.6551V13.8334H3.345L11.1067 6.07174ZM12.285 4.8934L13.4633 3.71507L12.285 2.53674L11.1067 3.71507L12.285 4.8934ZM4.035 15.5001H0.5V11.9642L11.6958 0.768403C11.8521 0.612177 12.064 0.524414 12.285 0.524414C12.506 0.524414 12.7179 0.612177 12.8742 0.768403L15.2317 3.1259C15.3879 3.28218 15.4757 3.4941 15.4757 3.71507C15.4757 3.93604 15.3879 4.14796 15.2317 4.30424L4.03583 15.5001H4.035Z\"\n fill=\"#6C757D\" />\n </svg>\n <svg *ngIf=\"isPreview\" (click)=\"onImageDelete(field)\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14 3.98726C11.78 3.76726 9.54667 3.65393 7.32 3.65393C6 3.65393 4.68 3.7206 3.36 3.85393L2 3.98726\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M5.6665 3.31362L5.81317 2.44028C5.91984 1.80695 5.99984 1.33362 7.1265 1.33362H8.87317C9.99984 1.33362 10.0865 1.83362 10.1865 2.44695L10.3332 3.31362\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M12.5667 6.09375L12.1334 12.8071C12.06 13.8537 12 14.6671 10.14 14.6671H5.86002C4.00002 14.6671 3.94002 13.8537 3.86668 12.8071L3.43335 6.09375\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.88647 11.0004H9.10647\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M6.3335 8.33325H9.66683\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div class=\"logo-container\">\n <div class=\"logo-preview\" *ngIf=\"field.imageData\">\n <img [src]=\"field.imageData\" \n [style.width.px]=\"field.imageSize?.width || 100\"\n [style.height.px]=\"field.imageSize?.height || 100\" />\n </div>\n\n <div *ngIf=\"!field.imageData\" class=\"logo-upload-placeholder\">\n <label for=\"logo-upload-{{i}}\" class=\"logo-upload-label\">\n <img src=\"../assets/icons/Image.svg\" alt=\"Upload\" />\n <span>Upload Image</span>\n </label>\n <input type=\"file\" id=\"logo-upload-{{i}}\" accept=\"image/*\" (change)=\"fileChangeEvent(field, $event)\"\n style=\"display: none;\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Space Element -->\n <div *ngIf=\"field?.type === 'Space'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" style=\"height:93px\" [ngClass]=\"{'isPreview': isPreview}\">\n <div *ngIf=\"!isPreview\" class=\"field-content\">\n <div class=\"label-container\">\n <div class=\"top-right\" style=\"margin: -11px -11px 0 0;\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- TextArea -->\n <div *ngIf=\"field?.type === 'text'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <textarea class=\"custom-textarea\"\n [placeholder]=\"'Enter detailed text here...'\"\n [value]=\"field.value? field.value : ''\"\n (input)=\"onTextAreaInput($event, field)\"\n #autoTextarea\n [style.height.px]=\"isPreview ? 40 : null\"\n (click)=\"openTextSettings(field, $event)\"\n (ngModelChange)=\"updateContent()\" \n [ngStyle]=\"{\n 'font-size': field.style.fontSize\n ? field.style.fontSize + 'px'\n : '14px',\n 'font-weight': field.style.bold ? 'bold' : 'normal',\n 'font-style': field.style.italics ? 'italic' : 'normal',\n 'text-decoration': field.style.decoration ? 'decoration' : 'none',\n 'text-align': field.style.alignment || 'left',\n margin: field.style.margin ? getMarginStyle(field.style.margin) : '0',\n color: field.style.color || '#000',\n }\"></textarea>\n \n </div>\n </div>\n\n <!--AP-05JUN25 Text Settings Toolbar: Allows editing font size, bold/italic styles, alignment, and closing the toolbar for the selected column -->\n <div *ngIf=\"showTextSettings && isPreview && selectedColumn === field\" class=\"text-settings-toolbar\"\n [ngStyle]=\"{\n position: 'absolute',\n background: '#fff',\n border: '1px solid #ccc',\n padding: '6px 10px',\n 'border-radius': '4px',\n 'box-shadow': '0 2px 6px rgba(0, 0, 0, 0.1)',\n 'z-index': '65535',\n display: 'flex',\n 'align-items': 'center',\n gap: '8px'\n }\">\n \n <!-- Font Size -->\n <select [(ngModel)]=\"selectedColumn.style.fontSize\" class=\"toolbar-select\">\n <option [value]=\"12\">12pt</option>\n <option [value]=\"14\">14pt</option>\n <option [value]=\"16\">16pt</option>\n <option [value]=\"18\">18pt</option>\n <option [value]=\"24\">24pt</option>\n </select>\n\n <!-- Text Color -->\n <label title=\"Text Color\" class=\"color-label\">\n <span class=\"color-box\" [style.color]=\"selectedColumn.style.color || '#000'\" (click)=\"textColorInput.click()\">A</span>\n <input #textColorInput type=\"color\" [(ngModel)]=\"selectedColumn.style.color\" (change)=\"updateContent()\" class=\"color-picker-hidden\"/>\n </label>\n\n <!-- Bold -->\n <button (click)=\"toggleStyle('bold')\" [class.active]=\"selectedColumn?.style?.bold\" class=\"toolbar-btn\">B</button>\n \n <!-- Italic -->\n <button (click)=\"toggleStyle('italic')\" [class.active]=\"selectedColumn?.style?.italics\" class=\"toolbar-btn\"><i>I</i></button>\n\n <!-- Underline -->\n <!-- <button (click)=\"toggleStyle('underline')\" [class.active]=\"selectedColumn?.style?.underline\" class=\"toolbar-btn\"><u>U</u></button> -->\n\n \n <!-- Align Left -->\n <button (click)=\"setAlignment('left')\" [class.active]=\"selectedColumn?.style?.alignment === 'left'\" class=\"toolbar-btn\">\n <span class=\"material-icons\">format_align_left</span>\n </button>\n \n <!-- Align Center -->\n <button (click)=\"setAlignment('center')\" [class.active]=\"selectedColumn?.style?.alignment === 'center'\" class=\"toolbar-btn\">\n <span class=\"material-icons\">format_align_center</span>\n </button>\n \n <!-- Align Right -->\n <button (click)=\"setAlignment('right')\" [class.active]=\"selectedColumn?.style?.alignment === 'right'\" class=\"toolbar-btn\">\n <span class=\"material-icons\">format_align_right</span>\n </button>\n \n <!-- Close -->\n <button (click)=\"closeTextSettings()\" class=\"toolbar-btn\" style=\"margin-left: auto;\">\u2715</button>\n </div>\n \n </div>\n\n <!-- Input -->\n <div *ngIf=\"field?.type === 'input'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <!-- AP-04JUN25 - replace app-custom-input -->\n <nxt-input [type]=\"'text'\" [mode]=\"'edit'\" [value]=\"field.value\" [question]=\"\" [labelFont]=\"\"\n [label]=\"field?.questionText\" [labelColor]=\"\" [labelSize]=\"\" [inputValueSize]=\"\" [labelWeight]=\"\"\n [inputWeight]=\"\" [showLabel]=\"\" inputBorder=\"none\" svgHeight=\"20px\" svgWidth=\"20px\"\n [placeholder]=\"field.question ? field.question : 'Enter your input'\" [required]=\"\"\n inputBgColor=\"#F5F5F5\" [inputId]=\"\" [errorMessages]=\"{ required: 'This field is required' }\"\n [inputIconLeftSrc]=\"''\" (inputValue)=\"onQuestionChange($event, field)\">\n </nxt-input>\n </div>\n </div>\n </div>\n\n <!-- Date -->\n <div *ngIf=\"field?.type === 'date'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <!-- AP-04JUN25 - replace custom date picker -->\n <nxt-input [type]=\"'date'\" [mode]=\"'edit'\" [value]=\"field.value\" [question]=\"\" [labelFont]=\"\"\n [label]=\"field?.questionText\" [labelColor]=\"\" [labelSize]=\"\" [inputValueSize]=\"\" [labelWeight]=\"\"\n [inputWeight]=\"\" [showLabel]=\"\" inputBorder=\"none\" svgHeight=\"20px\" svgWidth=\"20px\"\n [placeholder]=\"field.question ? field.question : 'Enter your input'\" [required]=\"\"\n inputBgColor=\"#F5F5F5\" [inputId]=\"\" [errorMessages]=\"{ required: 'This field is required' }\"\n [inputIconLeftSrc]=\"''\" (inputValue)=\"onQuestionChange($event, field)\">\n </nxt-input>\n </div>\n </div>\n </div>\n\n <!-- Pdf -->\n <div *ngIf=\"field?.type === 'Pdf'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <!-- <lib-booklet [bookletJSON]=\"field.pdfReferenceQuestions\"></lib-booklet> -->\n <div *ngIf=\"field?.pdfReferenceQuestions\">\n <ng-container *ngFor=\"let field of field?.pdfReferenceQuestions[field?.pdfReference]; let i = index\">\n <!-- AP-19MAR25 Line Element -->\n <div *ngIf=\"field?.type === 'Line'\" class=\"line-field\">\n <hr class=\"custom-line\" style=\"display: inline-flex\" [ngStyle]=\"getLineStyles(field)\" />\n </div>\n\n <div *ngIf=\"field?.type === 'image'\" class=\"field-container\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div>\n <div class=\"logo-container\">\n <!-- Logo preview area -->\n <div class=\"logo-preview\" *ngIf=\"field.imageData\">\n <img [src]=\"field.imageData\" />\n </div>\n\n <!-- Upload button -->\n <div *ngIf=\"!field.imageData\" class=\"logo-upload-placeholder\">\n <label for=\"logo-upload-{{i}}\" class=\"logo-upload-label\">\n <img src=\"../assets/icons/Image.svg\" alt=\"Upload\" />\n <span>Upload Image</span>\n </label>\n <input type=\"file\" id=\"logo-upload-{{i}}\" accept=\"image/*\"\n (change)=\"fileChangeEvent(field, $event)\" style=\"display: none;\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"field?.type === 'Space'\" class=\"field-container\">\n <div class=\"field-wrapper\" style=\"height:93px\" [ngClass]=\"{'isPreview': isPreview}\">\n </div>\n </div>\n <div *ngIf=\"field?.type === 'text'\" class=\"field-container\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <textarea class=\"custom-textarea\" [placeholder]=\"'Enter detailed text here...'\"\n [style.height.px]=\"isPreview ? 40 : field.size || 100\" [(ngModel)]=\"field.value\"\n (ngModelChange)=\"onQuestionChange($event, field)\"></textarea>\n </div>\n </div>\n </div>\n <!-- AP-14JUN25 Added nxt-input in pdf -->\n <div *ngIf=\"field?.type === 'input'\" class=\"field-container\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\"> \n <nxt-input [type]=\"'text'\" [mode]=\"'edit'\" [(ngModel)]=\"field.value\"\n [placeholder]=\"'Enter your input'\" (ngModelChange)=\"onQuestionChange($event, field)\">\n </nxt-input>\n </div>\n </div>\n </div>\n <!-- AP-06MAR25 -->\n <div *ngIf=\"field?.type === 'Table'\" class=\"field-container\">\n <div class=\"field-wrapper\" style=\"overflow: hidden;\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div class=\"nxt-table-container\">\n <nxt-datatable isButtons [question]=\"field\" from=\"formBuilder\"\n [mode]=\"isPreview ? 'view' : 'edit'\" [apiMeta]=\"field?.subText\"\n [tableConfig]=\"field.tableConfig\" tableId=\"\" direction=\"ltr\" tableWidth=\"auto\"\n (valueChange)=\"onQuestionChange($event, field)\"\n [data]=\"field.value?.data\"\n isEditable=true (columnSelected)=columnSelected($event) (removeColumn)=removeColumn($event)>\n </nxt-datatable>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Table -->\n <!-- AP-06MAR25 -->\n <div *ngIf=\"field?.type === 'Table'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" style=\"overflow: hidden;\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <div class=\"nxt-table-container\">\n <nxt-datatable isButtons [question]=\"field\" from=\"formBuilder\" [mode]=\"isPreview ? 'view' : 'edit'\"\n [apiMeta]=\"field?.subText\" [tableConfig]=\"field.tableConfig\" tableId=\"\" direction=\"ltr\"\n tableWidth=\"auto\" isEditable=true (columnSelected)=columnSelected($event)\n [data]=\"field.value?.data\"\n (valueChange)=\"onQuestionChange($event, field)\"\n (removeColumn)=removeColumn($event)>\n </nxt-datatable>\n </div>\n </div>\n </div>\n </div>\n\n </ng-container>\n </div>\n </div>\n <!-- SKS13MAR25 popup conformation box -->\n <div class=\"dialog-overlay\" *ngIf=\"isSelectTablePopup\">\n <div class=\"dialog-box\">\n <button class=\"close-btn-fb\" (click)=\"onClose()\">\u2715</button>\n <p>These element want to add a table</p>\n <div class=\"button-container-fb\">\n <button class=\"yes-btn-fb\" (click)=\"addOnTable()\">Yes</button>\n <button class=\"no-btn-fb\" (click)=\"onClose()\">No</button>\n </div>\n </div>\n </div>\n <app-pdf-properties *ngIf=\"!isPreview\" (formButtonHandler)=\"pdfSaveHandler($event)\"></app-pdf-properties>\n</div>\n<!--SKS25MAR25 Modal Overlay -->\n<div class=\"modal-overlay\" *ngIf=\"isImageEdit\">\n <div class=\"modal-content\">\n <span class=\"close-button\" (click)=\"closeModal()\">\u00D7</span>\n <!-- Image Editor -->\n <div *ngIf=\"selectedImageElement?.type === 'image'\">\n <image-cropper *ngIf=\"selectedImageElement.imageData\" [imageBase64]=\"selectedImageElement.orgImageData\"\n [disabled]=\"false\" [alignImage]=\"alignImage\" [roundCropper]=\"roundCropper\" [backgroundColor]=\"'white'\"\n imageAltText=\"Alternative image text\" [allowMoveImage]=\"false\" [hideResizeSquares]=\"false\"\n [canvasRotation]=\"canvasRotation\" [aspectRatio]=\"aspectRatio\" [containWithinAspectRatio]=\"false\"\n [maintainAspectRatio]=\"false\" [cropperStaticWidth]=\"cropperStaticWidth\"\n [cropperStaticHeight]=\"cropperStaticHeight\" [cropperMinWidth]=\"cropperMinWidth\"\n [cropperMinHeight]=\"cropperMinHeight\" [cropperMaxWidth]=\"cropperMaxWidth\"\n [cropperMaxHeight]=\"cropperMaxHeight\" [resetCropOnAspectRatioChange]='true' [(cropper)]=\"cropper\"\n [(transform)]=\"transform\" [onlyScaleDown]=\"true\" output=\"blob\" format=\"png\"\n (imageCropped)=\"imageCropped($event)\" (cropperReady)=\"cropperReady($event)\">\n </image-cropper>\n\n <!--AP-20JUN25 - Image size controls: Allow user to manually adjust width and height using range sliders -->\n <div *ngIf=\"selectedImageElement.imageData\" class=\"manual-size-inputs\">\n <label>Width {{ selectedImageElement.imageSize.width }}</label>\n <input type=\"range\" min=\"50\" max=\"300\" step=\"1\"\n [(ngModel)]=\"selectedImageElement.imageSize.width\"\n (input)=\"onImageSizeChange()\" />\n \n <label>Height {{ selectedImageElement.imageSize.height }}</label>\n <input type=\"range\" min=\"50\" max=\"300\" step=\"1\"\n [(ngModel)]=\"selectedImageElement.imageSize.height\"\n (input)=\"onImageSizeChange()\" />\n </div>\n \n\n <!-- Controls -->\n <div *ngIf=\"selectedImageElement.imageData\" class=\"controls\">\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateLeft()\" title=\"Rotate Left\">\u27F2</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateRight()\" title=\"Rotate Right\">\u27F3</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomOut()\" title=\"Zoom Out\">-</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomIn()\" title=\"Zoom In\">+</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveLeft()\" title=\"Move Left\">\u2190</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveRight()\" title=\"Move Right\">\u2192</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveUp()\" title=\"Move Up\">\u2191</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveDown()\" title=\"Move Down\">\u2193</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipHorizontal()\" [class.enabled]=\"transform.flipH\"\n title=\"Flip Horizontally\">\u2194</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipVertical()\" [class.enabled]=\"transform.flipV\"\n title=\"Flip Vertically\">\u2195</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"resetImage()\" title=\"Reset\">\u00D7</div>\n </div>\n </div>\n </div>\n</div>", styles: [".center-frame{display:flex;border-right-width:0}.head-elements{font-size:17px;font-weight:600}.form-builder{width:33.33%;height:calc(100vh - 20px);overflow-y:auto;background-color:#fff;padding:10px;border-right:10px solid #86A8CD;box-shadow:2px 2px 10px #0000001a}.form-builder .element{display:flex;align-items:center;gap:15px;margin-top:10px;padding:10px;border-radius:5px;background:#f8fafc;cursor:pointer;border-left:10px solid #E2F1FF;position:relative;color:#000}.form-builder .element:hover{background:#0250d9;color:#fff;border-left:10px solid #234465}.form-builder .element img{width:20px;height:20px;transition:filter .3s ease}.form-builder .element:hover img{filter:invert(1)}.form-builder .hover-label{font-size:15px;font-weight:400;color:#000;transition:color .3s ease}.form-builder .element:hover .hover-label{color:#fff}.form-builder .section-title{font-weight:700;font-size:16px;margin-top:10px;padding:5px;border-bottom:1px solid #ddd;color:#000;display:flex;justify-content:space-between;align-items:center}.form-builder .section-title:after{content:\"\\25bc\";font-size:12px;color:#555}.form-builder .section{margin-bottom:10px}.toggle-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;padding:10px}.arrow-icon{width:19px;height:23px;transition:transform .3s ease}.toggle-header:hover .arrow-icon{transform:scale(1.1)}.drag-dots{display:grid;grid-template-columns:repeat(2,1fr);grid-template-rows:repeat(3,1fr);gap:3px;position:absolute;right:15px;top:50%;transform:translateY(-50%)}.dot{width:5px;height:5px;border-radius:50%;background-color:#cbd5e1;transition:background-color .3s ease}.form-builder .element:hover .dot{background-color:#ffffffb3}.field-wrapper{background-color:#eff8ff;border:1px solid #E6F3FF;border-radius:5px;padding:10px}.field-wrapper.isPreview{background-color:transparent;border:none;border-radius:0;padding:0}.required:after{content:\"*\";color:red;margin-left:5px}.custom-input{width:100%;padding:8px;border:1px solid #DDDBDA;background-color:#fff;border-radius:5px;outline:none}.custom-input:focus{border-color:#00008b;box-shadow:0 0 5px #0000ff80}.delete-icon{width:19px;height:19px;margin-top:-5px}.field-container{padding-right:5px;padding-left:5px;transition:background .2s}.field-container:hover .top-right,.field-container.highlight .top-right,.label-container:hover .delete-icon{opacity:1;visibility:visible}.form-preview{width:100%;height:calc(100vh - 20px);overflow-y:auto;display:flex;flex-wrap:wrap;align-items:flex-start;padding:10px;height:fit-content;max-height:calc(100vh - 20px)}.field-content{display:flex;flex-direction:column;gap:5px}.label-container{display:flex;justify-content:flex-end;align-items:center}.top-right{display:flex;gap:10px;padding:6px;border:1px solid #d7edff;margin-top:-10px;background-color:#d7edff;margin-right:-10px;opacity:0;visibility:hidden;cursor:grab;transition:opacity .1s ease-in-out,visibility .1s ease-in-out}.drag-dot{height:13px}.custom-input,.custom-textarea,.dropdown,.checkbox-options-container,.radio-options-container{width:100%}.form-builder .element .drag-dots:active{cursor:grabbing}.dropdown{width:100%;padding:8px;border:1px solid #ccc;border-radius:4px;background-color:#fff;font-size:14px;color:#333;outline:none;cursor:pointer}.dropdown:focus{border-color:#007bff;box-shadow:0 0 5px #007bff80}.line-field{width:100%;margin:10px 0;background-color:#eff8ff;border:1px solid #E6F3FF;border-radius:5px;padding:3px}.line-field{background-color:transparent;border:none;border-radius:0;padding:3px}.checkbox-field-container:hover{box-shadow:0 2px 8px #0000001a}.checkbox-options-container{display:flex;flex-direction:column;gap:5px;padding:8px;min-height:38px;border:1px solid #DDDBDA;background-color:#fff;outline:none;border-radius:6px}.checkbox-option,.radio-option{display:flex;align-items:center;gap:8px;padding:8px;background-color:#fff;border-radius:4px;transition:background-color .2s ease}.checkbox-option:hover{background-color:#f1f3f5}.checkbox-input,.radio-input{width:18px;height:18px;accent-color:#4dabf7;cursor:pointer}.checkbox-label,.radio-label{font-size:14px;color:#495057;cursor:pointer;-webkit-user-select:none;user-select:none}.label-container label{font-size:15px;font-weight:400}.required:after{content:\" *\";color:red}.radio-options-container{display:flex;flex-direction:column;gap:5px;padding:8px;min-height:38px;border:1px solid #DDDBDA;background-color:#fff;outline:none;border-radius:6px}.radio-input:checked{border-color:#007bff;background-color:#007bff}.radio-input:checked:after{content:\"\";width:8px;height:8px;background:#fff;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.custom-textarea{width:100%;min-height:100px;border:1px solid #ccc;border-radius:4px;padding:8px;resize:vertical}.highlight{border:2px solid #5592FD!important;background-color:#eff8ff}.table-container label{font-size:14px;font-weight:700;margin-bottom:5px;display:block}.sticky-footer-version{position:fixed;bottom:0;padding:10px;text-align:center}.nxt-table-container{display:flex;justify-content:center;align-items:center;width:100%}nxt-datatable{width:100%!important;table-layout:fixed;max-width:100%}.dialog-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:#00000080;display:flex;justify-content:center;align-items:center;z-index:1000}.dialog-box{background:#fff;padding:20px;border-radius:5px;text-align:center;width:300px;position:relative}.close-btn-fb{position:absolute;top:4px;right:4px;background:#ff4242;color:#fff;border:none;border-radius:50%;width:20px;height:20px;font-size:10px;cursor:pointer}.button-container-fb{display:flex;justify-content:flex-end;gap:10px}.yes-btn-fb{background:green;color:#fff;border:none;padding:0 12px;border-radius:5px;cursor:pointer}.no-btn-fb{background:gray;color:#fff;border:none;padding:8px 15px;border-radius:5px;cursor:pointer}.line-element{width:100%;display:flex;justify-content:space-between;align-items:center}.custom-line{width:100%;border:1px solid #000}.logo-upload-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;width:150px;height:150px;border:2px dashed #ccc;cursor:pointer;inline-size:auto}.logo-upload-label{display:flex;flex-direction:column;align-items:center;cursor:pointer;color:#666}.logo-upload-label img{width:32px;height:32px;margin-bottom:8px}.element.disabled{opacity:.5;cursor:not-allowed}.form-container{display:flex;flex-wrap:wrap;border:10px solid #86A8CD}.form-container.isPreview{border:none}.center-frame{width:74%}.center-frame.isPreview{width:100%}app-pdf-properties{border-left:10px solid #86A8CD;width:25%}:host ::ng-deep .questiondiv1{padding-left:0!important;padding-right:0!important}:host ::ng-deep .form-group.content-box{padding-bottom:0!important}:host ::ng-deep .custom-textarea{min-height:40px!important}.modal-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:100}.modal-content{background:#fff;padding:20px;width:500px;max-width:90%;border-radius:8px;position:relative;text-align:center}.close-button{position:absolute;top:6px;right:6px;font-size:25px;cursor:pointer;z-index:10}.controls{display:flex;gap:5px;justify-content:center;margin-top:10px}.logo-icon{cursor:pointer;padding:5px;border-radius:5px;background:#d3d3d3}.logo-icon:hover{background:#a9a9a9}.enabled{background:#007bff;color:#fff}.text-settings-toolbar{position:absolute;display:flex;flex-wrap:wrap;align-items:center;gap:8px;background:#fff;border:1px solid #d1d5db;padding:8px 10px;border-radius:8px;box-shadow:0 4px 12px #0000001a;z-index:65535;max-width:100%;width:auto;min-width:200px;box-sizing:border-box}.toolbar-select{padding:4px 6px;font-size:13px;border:1px solid #d1d5db;border-radius:6px;background:#fff;cursor:pointer;min-width:60px;width:auto}.toolbar-btn{background:#f3f4f6;border:1px solid #d1d5db;padding:6px 8px;border-radius:6px;cursor:pointer;font-size:13px;min-width:30px;height:30px;display:flex;align-items:center;justify-content:center}.toolbar-btn:hover{background:#e5e7eb;border-color:#9ca3af}.toolbar-btn.active{background:#005aaa;color:#fff;border-color:#005aaa}.color-label{display:flex;align-items:center}.color-box{font-weight:700;width:22px;height:22px;font-size:13px;border:1px solid #ccc;border-radius:4px;text-align:center;line-height:22px;cursor:pointer;padding:0}.color-picker-hidden{position:absolute;opacity:0;pointer-events:none;width:0;height:0}@media (max-width: 600px){.text-settings-toolbar{flex-direction:row;flex-wrap:wrap;gap:6px;padding:6px;justify-content:flex-start}.toolbar-btn,.toolbar-select{font-size:12px;padding:5px}.color-box{width:20px;height:20px;font-size:12px;line-height:20px}}.action-buttons{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.action-btn{display:flex;gap:16px;padding:10px 15px;border-radius:8px;border:none}\n"] }]
622
+ args: [{ selector: 'app-pdf-designer', standalone: true, imports: [CommonModule, ImageCropperComponent, PdfPropertiesComponent, MatTooltipModule, FormsModule, NxtDatatable, BookletComponent, AppTemplatesComponent, NxtInput, NxtCustomTranslatePipe], template: "<!-- AP 22JAN25 - form preview and All form elements -->\n<!-- AP 25FEB25 - All elements update -->\n<div class=\"form-container\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"center-frame\" [ngClass]=\"{'isPreview': isPreview}\">\n <!-- Form Builder Section All Elements -->\n <div *ngIf=\"!isPreview\" class=\"form-builder\">\n\n <ng-container *ngFor=\"let element of elementsList\">\n <div\n class=\"element\"\n [class.disabled]=\"selectedElement?.type && elementDisabledArray[selectedElement.type]?.includes(element.type)\"\n (click)=\"!(selectedElement?.type && elementDisabledArray[selectedElement.type]?.includes(element.type)) && addElement(element.type)\"\n [draggable]=\"!(selectedElement?.type && elementDisabledArray[selectedElement.type]?.includes(element.type))\"\n [matTooltip]=\"\n selectedElement?.type && elementDisabledArray[selectedElement.type]?.includes(element.type)\n ? ('THIS_ELEMENT_NOT_SUPPORTED' | nxtCustomTranslate : 'This element is not supported when a ') +\n (selectedElement?.type || ('CERTAIN_ELEMENT' | nxtCustomTranslate : 'certain element')) +\n (' IS_PRESENT' | nxtCustomTranslate : ' is present')\n : null\n \"\n >\n <img src=\"../assets/icons/{{ element.img }}.svg\" class=\"element-icon\">\n <div class=\"hover-label\">{{ element.label }}</div> \n <div class=\"drag-dots\">\n <div class=\"dot\" *ngFor=\"let dot of dots\"></div>\n </div>\n </div>\n </ng-container>\n<!-- \n <div class=\"template-section\">\n <app-templates (templateSelected)=\"onTemplateSelected($event)\"></app-templates>\n </div> -->\n\n <!-- SKS10MAR25 footer version show -->\n <div class=\"sticky-footer-version\">\n {{version}}\n </div>\n </div>\n <!-- AP-27MAR25 Remove CDK drag and drop replace draggable function -->\n <div class=\"form-preview\">\n <!-- AP-10MAR25 Heading -->\n <div class=\"field-container\"\n style=\"width: 100%;background-color: #EFF8FF; border: 1px solid #E6F3FF;margin-bottom:10px\"\n (click)=\"selectHeading('Header')\">\n <div class=\"label-container\" style=\"padding: 10px; display: flex;justify-content: space-between;\">\n <div *ngIf=\"pdf\">\n <div *ngIf=\"pdf.title == ''\" style=\"color:#3f4a525c\">{{ 'HEADING' | nxtCustomTranslate : 'Heading' }}</div>\n <div *ngIf=\"pdf.title !== ''\">{{pdf.title}}</div>\n </div>\n <div class=\"action-buttons\">\n <button class=\"action-btn\" (click)=\"pdfSaveHandler('preview')\">{{ 'PREVIEW' | nxtCustomTranslate : 'PREVIEW' }}</button>\n <button class=\"action-btn\" (click)=\"pdfSaveHandler('download')\">{{ 'DOWNLOAD' | nxtCustomTranslate : 'DOWNLOAD' }}</button>\n </div>\n </div>\n </div>\n\n <ng-container *ngFor=\"let field of pdfElements; let i = index\">\n\n <!-- AP-19MAR25 Line Element -->\n <div *ngIf=\"field?.type === 'Line'\" class=\"line-field\" [ngClass]=\"{'isPreview': isPreview}\"\n (click)=\"selectElement(i)\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div *ngIf=\"!isPreview\" class=\"line-element\">\n <div></div>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n <hr class=\"custom-line\" style=\"display: inline-flex\" [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-weight': field.fontWeight || '400',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'text-align': field.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'border-style': (field.lineStyle?.toLowerCase() || 'solid'),\n 'color': field.fontColor || '#000000',\n 'margin-top': (field.paddingTop || 0) + 'px',\n 'margin-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" />\n </div>\n\n <!--SKS25MAR25 Image Upload Element -->\n <div *ngIf=\"field?.type === 'image'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [class.highlight]=\"selectedFieldIndex === i && !isPreview\" draggable=\"true && !isPreview\"\n (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" (mouseenter)=\"isImageHover = true;\"\n (mouseleave)=\"isImageHover = false;\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <div>\n <div *ngIf=\"isImageHover\" style=\"display: flex; justify-content: end;\">\n <svg *ngIf=\"isPreview\" (click)=\"onImageEdit(field)\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.1067 6.07174L9.92833 4.8934L2.16667 12.6551V13.8334H3.345L11.1067 6.07174ZM12.285 4.8934L13.4633 3.71507L12.285 2.53674L11.1067 3.71507L12.285 4.8934ZM4.035 15.5001H0.5V11.9642L11.6958 0.768403C11.8521 0.612177 12.064 0.524414 12.285 0.524414C12.506 0.524414 12.7179 0.612177 12.8742 0.768403L15.2317 3.1259C15.3879 3.28218 15.4757 3.4941 15.4757 3.71507C15.4757 3.93604 15.3879 4.14796 15.2317 4.30424L4.03583 15.5001H4.035Z\"\n fill=\"#6C757D\" />\n </svg>\n <svg *ngIf=\"isPreview\" (click)=\"onImageDelete(field)\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14 3.98726C11.78 3.76726 9.54667 3.65393 7.32 3.65393C6 3.65393 4.68 3.7206 3.36 3.85393L2 3.98726\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M5.6665 3.31362L5.81317 2.44028C5.91984 1.80695 5.99984 1.33362 7.1265 1.33362H8.87317C9.99984 1.33362 10.0865 1.83362 10.1865 2.44695L10.3332 3.31362\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M12.5667 6.09375L12.1334 12.8071C12.06 13.8537 12 14.6671 10.14 14.6671H5.86002C4.00002 14.6671 3.94002 13.8537 3.86668 12.8071L3.43335 6.09375\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.88647 11.0004H9.10647\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M6.3335 8.33325H9.66683\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div class=\"logo-container\">\n <div class=\"logo-preview\" *ngIf=\"field.imageData\">\n <img [src]=\"field.imageData\" \n [style.width.px]=\"field.imageSize?.width || 100\"\n [style.height.px]=\"field.imageSize?.height || 100\" />\n </div>\n\n <div *ngIf=\"!field.imageData\" class=\"logo-upload-placeholder\">\n <label for=\"logo-upload-{{i}}\" class=\"logo-upload-label\">\n <img src=\"../assets/icons/Image.svg\" alt=\"Upload\" />\n <span>{{ 'UPLOAD_IMAGE' | nxtCustomTranslate : 'Upload Image' }}</span>\n </label>\n <input type=\"file\" id=\"logo-upload-{{i}}\" accept=\"image/*\" (change)=\"fileChangeEvent(field, $event)\"\n style=\"display: none;\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Space Element -->\n <div *ngIf=\"field?.type === 'Space'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" style=\"height:93px\" [ngClass]=\"{'isPreview': isPreview}\">\n <div *ngIf=\"!isPreview\" class=\"field-content\">\n <div class=\"label-container\">\n <div class=\"top-right\" style=\"margin: -11px -11px 0 0;\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- TextArea -->\n <div *ngIf=\"field?.type === 'text'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <textarea class=\"custom-textarea\"\n [placeholder]=\"'ENTER_DETAILED_TEXT_HERE' | nxtCustomTranslate : 'Enter detailed text here...'\"\n [value]=\"field.value? field.value : ''\"\n (input)=\"onTextAreaInput($event, field)\"\n #autoTextarea\n [style.height.px]=\"isPreview ? 40 : null\"\n (click)=\"openTextSettings(field, $event)\"\n (ngModelChange)=\"updateContent()\" \n [ngStyle]=\"{\n 'font-size': field.style?.fontSize ? field.style.fontSize + 'px' : '14px',\n 'font-weight': field.style?.bold ? 'bold' : 'normal',\n 'font-style': field.style?.italics ? 'italic' : 'normal',\n 'text-decoration': field.style?.decoration ? 'decoration' : 'none',\n 'text-align': field.style?.alignment || 'left',\n 'margin': field.style?.margin?.length === 4\n ? field.style.margin[1] + 'px ' + field.style.margin[2] + 'px ' +\n field.style.margin[3] + 'px ' + field.style.margin[0] + 'px'\n : '0',\n 'color': field.style?.color || '#000'\n }\"></textarea>\n \n </div>\n </div>\n\n <!--AP-05JUN25 Text Settings Toolbar: Allows editing font size, bold/italic styles, alignment, and closing the toolbar for the selected column -->\n <div *ngIf=\"showTextSettings && isPreview && selectedColumn === field\" class=\"text-settings-toolbar\"\n [ngStyle]=\"{\n position: 'absolute',\n background: '#fff',\n border: '1px solid #ccc',\n padding: '6px 10px',\n 'border-radius': '4px',\n 'box-shadow': '0 2px 6px rgba(0, 0, 0, 0.1)',\n 'z-index': '65535',\n display: 'flex',\n 'align-items': 'center',\n gap: '8px'\n }\">\n \n <!-- Font Size -->\n <select [(ngModel)]=\"selectedColumn.style.fontSize\" class=\"toolbar-select\">\n <option [value]=\"12\">12pt</option>\n <option [value]=\"14\">14pt</option>\n <option [value]=\"16\">16pt</option>\n <option [value]=\"18\">18pt</option>\n <option [value]=\"24\">24pt</option>\n </select>\n\n <!-- Text Color -->\n <label title=\"Text Color\" class=\"color-label\">\n <span class=\"color-box\" [style.color]=\"selectedColumn.style.color || '#000'\" (click)=\"textColorInput.click()\">A</span>\n <input #textColorInput type=\"color\" [(ngModel)]=\"selectedColumn.style.color\" (change)=\"updateContent()\" class=\"color-picker-hidden\"/>\n </label>\n\n <!-- Bold -->\n <button (click)=\"toggleStyle('bold')\" [class.active]=\"selectedColumn?.style?.bold\" class=\"toolbar-btn\">{{ 'BOLD' | nxtCustomTranslate : 'B' }}</button>\n \n <!-- Italic -->\n <button (click)=\"toggleStyle('italic')\" [class.active]=\"selectedColumn?.style?.italics\" class=\"toolbar-btn\"><i>{{ 'ITALIC' | nxtCustomTranslate : 'I' }}</i></button>\n\n <!-- Underline -->\n <!-- <button (click)=\"toggleStyle('underline')\" [class.active]=\"selectedColumn?.style?.underline\" class=\"toolbar-btn\"><u>U</u></button> -->\n\n \n <!-- Align Left -->\n <button (click)=\"setAlignment('left')\" [class.active]=\"selectedColumn?.style?.alignment === 'left'\" class=\"toolbar-btn\">\n <span class=\"material-icons\">{{ 'FORMAT_ALIGN_LEFT' | nxtCustomTranslate : 'format_align_left' }}</span>\n </button>\n \n <!-- Align Center -->\n <button (click)=\"setAlignment('center')\" [class.active]=\"selectedColumn?.style?.alignment === 'center'\" class=\"toolbar-btn\">\n <span class=\"material-icons\">{{ 'FORMAT_ALIGN_CENTER' | nxtCustomTranslate : 'format_align_center' }}</span>\n </button>\n \n <!-- Align Right -->\n <button (click)=\"setAlignment('right')\" [class.active]=\"selectedColumn?.style?.alignment === 'right'\" class=\"toolbar-btn\">\n <span class=\"material-icons\">{{ 'FORMAT_ALIGN_RIGHT' | nxtCustomTranslate : 'format_align_right' }}</span>\n </button>\n \n <!-- Close -->\n <button (click)=\"closeTextSettings()\" class=\"toolbar-btn\" style=\"margin-left: auto;\">\u2715</button>\n </div>\n \n </div>\n\n <!-- Input -->\n <div *ngIf=\"field?.type === 'input'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <!-- AP-04JUN25 - replace app-custom-input -->\n <nxt-input [type]=\"'text'\" [mode]=\"'edit'\" [value]=\"field.value\" [question]=\"\" [labelFont]=\"\"\n [label]=\"field?.questionText\" [labelColor]=\"\" [labelSize]=\"\" [inputValueSize]=\"\" [labelWeight]=\"\"\n [inputWeight]=\"\" [showLabel]=\"\" inputBorder=\"none\" svgHeight=\"20px\" svgWidth=\"20px\"\n [placeholder]=\"field.question ? field.question : 'ENTER_YOUR_INPUT' | nxtCustomTranslate : 'Enter your input'\" [required]=\"\"\n inputBgColor=\"#F5F5F5\" [inputId]=\"\" [errorMessages]=\"{ required: 'This field is required' }\"\n [inputIconLeftSrc]=\"''\" (inputValue)=\"onQuestionChange($event, field)\">\n </nxt-input>\n </div>\n </div>\n </div>\n\n <!-- Date -->\n <div *ngIf=\"field?.type === 'date'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <!-- AP-04JUN25 - replace custom date picker -->\n <nxt-input [type]=\"'date'\" [mode]=\"'edit'\" [value]=\"field.value\" [question]=\"\" [labelFont]=\"\"\n [label]=\"field?.questionText\" [labelColor]=\"\" [labelSize]=\"\" [inputValueSize]=\"\" [labelWeight]=\"\"\n [inputWeight]=\"\" [showLabel]=\"\" inputBorder=\"none\" svgHeight=\"20px\" svgWidth=\"20px\"\n [placeholder]=\"field.question ? field.question : 'ENTER_YOUR_INPUT' | nxtCustomTranslate : 'Enter your input'\" [required]=\"\"\n inputBgColor=\"#F5F5F5\" [inputId]=\"\" [errorMessages]=\"{ required: 'This field is required' }\"\n [inputIconLeftSrc]=\"''\" (inputValue)=\"onQuestionChange($event, field)\">\n </nxt-input>\n </div>\n </div>\n </div>\n\n <!-- Pdf -->\n <div *ngIf=\"field?.type === 'Pdf'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <!-- <lib-booklet [bookletJSON]=\"field.pdfReferenceQuestions\"></lib-booklet> -->\n <div *ngIf=\"field?.pdfReferenceQuestions\">\n <ng-container *ngFor=\"let field of field?.pdfReferenceQuestions[field?.pdfReference]; let i = index\">\n <!-- AP-19MAR25 Line Element -->\n <div *ngIf=\"field?.type === 'Line'\" class=\"line-field\">\n <hr class=\"custom-line\" style=\"display: inline-flex\" [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-weight': field.fontWeight || '400',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'text-align': field.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'border-style': (field.lineStyle?.toLowerCase() || 'solid'),\n 'color': field.fontColor || '#000000',\n 'margin-top': (field.paddingTop || 0) + 'px',\n 'margin-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" />\n </div>\n\n <div *ngIf=\"field?.type === 'image'\" class=\"field-container\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div>\n <div class=\"logo-container\">\n <!-- Logo preview area -->\n <div class=\"logo-preview\" *ngIf=\"field.imageData\">\n <img [src]=\"field.imageData\" />\n </div>\n\n <!-- Upload button -->\n <div *ngIf=\"!field.imageData\" class=\"logo-upload-placeholder\">\n <label for=\"logo-upload-{{i}}\" class=\"logo-upload-label\">\n <img src=\"../assets/icons/Image.svg\" alt=\"Upload\" />\n <span>{{ 'UPLOAD_IMAGE' | nxtCustomTranslate : 'Upload Image' }}</span>\n </label>\n <input type=\"file\" id=\"logo-upload-{{i}}\" accept=\"image/*\"\n (change)=\"fileChangeEvent(field, $event)\" style=\"display: none;\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"field?.type === 'Space'\" class=\"field-container\">\n <div class=\"field-wrapper\" style=\"height:93px\" [ngClass]=\"{'isPreview': isPreview}\">\n </div>\n </div>\n <div *ngIf=\"field?.type === 'text'\" class=\"field-container\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <textarea class=\"custom-textarea\" [placeholder]=\"'ENTER_DETAILED_TEXT_HERE' | nxtCustomTranslate : 'Enter detailed text here...'\"\n [style.height.px]=\"isPreview ? 40 : field.size || 100\" [(ngModel)]=\"field.value\"\n (ngModelChange)=\"onQuestionChange($event, field)\"></textarea>\n </div>\n </div>\n </div>\n <!-- AP-14JUN25 Added nxt-input in pdf -->\n <div *ngIf=\"field?.type === 'input'\" class=\"field-container\">\n <div class=\"field-wrapper\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\"> \n <nxt-input [type]=\"'text'\" [mode]=\"'edit'\" [(ngModel)]=\"field.value\"\n [placeholder]=\"'ENTER_YOUR_INPUT' | nxtCustomTranslate : 'Enter your input'\" (ngModelChange)=\"onQuestionChange($event, field)\">\n </nxt-input>\n </div>\n </div>\n </div>\n <!-- AP-06MAR25 -->\n <div *ngIf=\"field?.type === 'Table'\" class=\"field-container\">\n <div class=\"field-wrapper\" style=\"overflow: hidden;\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div class=\"nxt-table-container\">\n <nxt-datatable isButtons [question]=\"field\" from=\"formBuilder\"\n [mode]=\"isPreview ? 'view' : 'edit'\" [apiMeta]=\"field?.subText\"\n [tableConfig]=\"field.tableConfig\" tableId=\"\" direction=\"ltr\" tableWidth=\"auto\"\n (valueChange)=\"onQuestionChange($event, field)\"\n [data]=\"field.value?.data\"\n isEditable=true (columnSelected)=columnSelected($event) (removeColumn)=removeColumn($event)>\n </nxt-datatable>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Table -->\n <!-- AP-06MAR25 -->\n <div *ngIf=\"field?.type === 'Table'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"{\n 'font-family': field.font || 'Helvetica Neue',\n 'font-size': (field.fontSize || 14) + 'px',\n 'width': (field.width || 100) + '%',\n 'align-items': field.alignItems || '',\n 'border-radius': '5px',\n 'border-width': (field.lineWidth || 1) + 'px',\n 'color': field.fontColor || '#000000',\n 'font-style': (field.fontStyle || []).includes('italic') ? 'italic' : 'normal',\n 'font-weight': (field.fontStyle || []).includes('bold') ? 'bold' : (field.fontWeight || '400'),\n 'margin': \n (field.margin?.[0] || 0) + 'px ' +\n (field.margin?.[1] || 0) + 'px ' +\n (field.margin?.[2] || 0) + 'px ' +\n (field.margin?.[3] || 0) + 'px',\n 'padding-top': (field.paddingTop || 0) + 'px',\n 'padding-bottom': (field.paddingBottom ?? 10) + 'px'\n }\" [class.highlight]=\"selectedFieldIndex === i && !isPreview\"\n draggable=\"true && !isPreview\" (dragstart)=\"onDragStart($event, i)\" (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" style=\"overflow: hidden;\" [ngClass]=\"{'isPreview': isPreview}\">\n <div class=\"field-content\">\n <div *ngIf=\"!isPreview\" class=\"label-container\">\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <div class=\"nxt-table-container\">\n <nxt-datatable isButtons [question]=\"field\" from=\"formBuilder\" [mode]=\"isPreview ? 'view' : 'edit'\"\n [apiMeta]=\"field?.subText\" [tableConfig]=\"field.tableConfig\" tableId=\"\" direction=\"ltr\"\n tableWidth=\"auto\" isEditable=true (columnSelected)=columnSelected($event)\n [data]=\"field.value?.data\"\n (valueChange)=\"onQuestionChange($event, field)\"\n (removeColumn)=removeColumn($event)>\n </nxt-datatable>\n </div>\n </div>\n </div>\n </div>\n\n </ng-container>\n </div>\n </div>\n <!-- SKS13MAR25 popup conformation box -->\n <div class=\"dialog-overlay\" *ngIf=\"isSelectTablePopup\">\n <div class=\"dialog-box\">\n <button class=\"close-btn-fb\" (click)=\"onClose()\">\u2715</button>\n <p>{{ 'ADD_TABLE_CONFIRMATION' | nxtCustomTranslate : 'These element want to add a table' }}</p>\n <div class=\"button-container-fb\">\n <button class=\"yes-btn-fb\" (click)=\"addOnTable()\">{{ 'YES' | nxtCustomTranslate : 'Yes' }}</button>\n <button class=\"no-btn-fb\" (click)=\"onClose()\">{{ 'NO' | nxtCustomTranslate : 'No' }}</button>\n </div>\n </div>\n </div>\n <app-pdf-properties *ngIf=\"!isPreview\" (formButtonHandler)=\"pdfSaveHandler($event)\"></app-pdf-properties>\n</div>\n<!--SKS25MAR25 Modal Overlay -->\n<div class=\"modal-overlay\" *ngIf=\"isImageEdit\">\n <div class=\"modal-content\">\n <span class=\"close-button\" (click)=\"closeModal()\">\u00D7</span>\n <!-- Image Editor -->\n <div *ngIf=\"selectedImageElement?.type === 'image'\">\n <image-cropper *ngIf=\"selectedImageElement.imageData\" [imageBase64]=\"selectedImageElement.orgImageData\"\n [disabled]=\"false\" [alignImage]=\"alignImage\" [roundCropper]=\"roundCropper\" [backgroundColor]=\"'white'\"\n imageAltText=\"{{ 'ALTERNATIVE_IMAGE_TEXT' | nxtCustomTranslate : 'Alternative image text' }}\" [allowMoveImage]=\"false\" [hideResizeSquares]=\"false\"\n [canvasRotation]=\"canvasRotation\" [aspectRatio]=\"aspectRatio\" [containWithinAspectRatio]=\"false\"\n [maintainAspectRatio]=\"false\" [cropperStaticWidth]=\"cropperStaticWidth\"\n [cropperStaticHeight]=\"cropperStaticHeight\" [cropperMinWidth]=\"cropperMinWidth\"\n [cropperMinHeight]=\"cropperMinHeight\" [cropperMaxWidth]=\"cropperMaxWidth\"\n [cropperMaxHeight]=\"cropperMaxHeight\" [resetCropOnAspectRatioChange]='true' [(cropper)]=\"cropper\"\n [(transform)]=\"transform\" [onlyScaleDown]=\"true\" output=\"blob\" format=\"png\"\n (imageCropped)=\"imageCropped($event)\" (cropperReady)=\"cropperReady($event)\">\n </image-cropper>\n\n <!--AP-20JUN25 - Image size controls: Allow user to manually adjust width and height using range sliders -->\n <div *ngIf=\"selectedImageElement.imageData\" class=\"manual-size-inputs\">\n <label>{{ 'WIDTH' | nxtCustomTranslate : 'Width' }} {{ selectedImageElement.imageSize.width }}</label>\n <input type=\"range\" min=\"50\" max=\"300\" step=\"1\"\n [(ngModel)]=\"selectedImageElement.imageSize.width\"\n (input)=\"onImageSizeChange()\" />\n \n <label>{{ 'HEIGHT' | nxtCustomTranslate : 'Height' }} {{ selectedImageElement.imageSize.height }}</label>\n <input type=\"range\" min=\"50\" max=\"300\" step=\"1\"\n [(ngModel)]=\"selectedImageElement.imageSize.height\"\n (input)=\"onImageSizeChange()\" />\n </div>\n \n\n <!-- Controls -->\n <div *ngIf=\"selectedImageElement.imageData\" class=\"controls\">\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateLeft()\" title=\"{{ 'ROTATE_LEFT' | nxtCustomTranslate : 'Rotate Left' }}\">\u27F2</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateRight()\" title=\"{{ 'ROTATE_RIGHT' | nxtCustomTranslate : 'Rotate Right' }}\">\u27F3</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomOut()\" title=\"{{ 'ZOOM_OUT' | nxtCustomTranslate : 'Zoom Out' }}\">-</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomIn()\" title=\"{{ 'ZOOM_IN' | nxtCustomTranslate : 'Zoom In' }}\">+</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveLeft()\" title=\"{{ 'MOVE_LEFT' | nxtCustomTranslate : 'Move Left' }}\">\u2190</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveRight()\" title=\"{{ 'MOVE_RIGHT' | nxtCustomTranslate : 'Move Right' }}\">\u2192</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveUp()\" title=\"{{ 'MOVE_UP' | nxtCustomTranslate : 'Move Up' }}\">\u2191</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveDown()\" title=\"{{ 'MOVE_DOWN' | nxtCustomTranslate : 'Move Down' }}\">\u2193</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipHorizontal()\" [class.enabled]=\"transform.flipH\"\n title=\"{{ 'FLIP_HORIZONTALLY' | nxtCustomTranslate : 'Flip Horizontally' }}\">\u2194</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipVertical()\" [class.enabled]=\"transform.flipV\"\n title=\"{{ 'FLIP_VERTICALLY' | nxtCustomTranslate : 'Flip Vertically' }}\">\u2195</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"resetImage()\" title=\"{{ 'RESET' | nxtCustomTranslate : 'Reset' }}\">\u00D7</div>\n </div>\n </div>\n </div>\n</div>", styles: [".center-frame{display:flex;border-right-width:0}.head-elements{font-size:17px;font-weight:600}.form-builder{width:33.33%;height:calc(100vh - 20px);overflow-y:auto;background-color:#fff;padding:10px;border-right:10px solid #86A8CD;box-shadow:2px 2px 10px #0000001a}.form-builder .element{display:flex;align-items:center;gap:15px;margin-top:10px;padding:10px;border-radius:5px;background:#f8fafc;cursor:pointer;border-left:10px solid #E2F1FF;position:relative;color:#000}.form-builder .element:hover{background:#0250d9;color:#fff;border-left:10px solid #234465}.form-builder .element img{width:20px;height:20px;transition:filter .3s ease}.form-builder .element:hover img{filter:invert(1)}.form-builder .hover-label{font-size:15px;font-weight:400;color:#000;transition:color .3s ease}.form-builder .element:hover .hover-label{color:#fff}.form-builder .section-title{font-weight:700;font-size:16px;margin-top:10px;padding:5px;border-bottom:1px solid #ddd;color:#000;display:flex;justify-content:space-between;align-items:center}.form-builder .section-title:after{content:\"\\25bc\";font-size:12px;color:#555}.form-builder .section{margin-bottom:10px}.toggle-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;padding:10px}.arrow-icon{width:19px;height:23px;transition:transform .3s ease}.toggle-header:hover .arrow-icon{transform:scale(1.1)}.drag-dots{display:grid;grid-template-columns:repeat(2,1fr);grid-template-rows:repeat(3,1fr);gap:3px;position:absolute;right:15px;top:50%;transform:translateY(-50%)}.dot{width:5px;height:5px;border-radius:50%;background-color:#cbd5e1;transition:background-color .3s ease}.form-builder .element:hover .dot{background-color:#ffffffb3}.field-wrapper{background-color:#eff8ff;border:1px solid #E6F3FF;border-radius:5px;padding:10px}.field-wrapper.isPreview{background-color:transparent;border:none;border-radius:0;padding:0}.required:after{content:\"*\";color:red;margin-left:5px}.custom-input{width:100%;padding:8px;border:1px solid #DDDBDA;background-color:#fff;border-radius:5px;outline:none}.custom-input:focus{border-color:#00008b;box-shadow:0 0 5px #0000ff80}.delete-icon{width:19px;height:19px;margin-top:-5px}.field-container{padding-right:5px;padding-left:5px;transition:background .2s}.field-container:hover .top-right,.field-container.highlight .top-right,.label-container:hover .delete-icon{opacity:1;visibility:visible}.form-preview{width:100%;height:calc(100vh - 20px);overflow-y:auto;display:flex;flex-wrap:wrap;align-items:flex-start;padding:10px;height:fit-content;max-height:calc(100vh - 20px)}.field-content{display:flex;flex-direction:column;gap:5px}.label-container{display:flex;justify-content:flex-end;align-items:center}.top-right{display:flex;gap:10px;padding:6px;border:1px solid #d7edff;margin-top:-10px;background-color:#d7edff;margin-right:-10px;opacity:0;visibility:hidden;cursor:grab;transition:opacity .1s ease-in-out,visibility .1s ease-in-out}.drag-dot{height:13px}.custom-input,.custom-textarea,.dropdown,.checkbox-options-container,.radio-options-container{width:100%}.form-builder .element .drag-dots:active{cursor:grabbing}.dropdown{width:100%;padding:8px;border:1px solid #ccc;border-radius:4px;background-color:#fff;font-size:14px;color:#333;outline:none;cursor:pointer}.dropdown:focus{border-color:#007bff;box-shadow:0 0 5px #007bff80}.line-field{width:100%;margin:10px 0;background-color:#eff8ff;border:1px solid #E6F3FF;border-radius:5px;padding:3px}.line-field{background-color:transparent;border:none;border-radius:0;padding:3px}.checkbox-field-container:hover{box-shadow:0 2px 8px #0000001a}.checkbox-options-container{display:flex;flex-direction:column;gap:5px;padding:8px;min-height:38px;border:1px solid #DDDBDA;background-color:#fff;outline:none;border-radius:6px}.checkbox-option,.radio-option{display:flex;align-items:center;gap:8px;padding:8px;background-color:#fff;border-radius:4px;transition:background-color .2s ease}.checkbox-option:hover{background-color:#f1f3f5}.checkbox-input,.radio-input{width:18px;height:18px;accent-color:#4dabf7;cursor:pointer}.checkbox-label,.radio-label{font-size:14px;color:#495057;cursor:pointer;-webkit-user-select:none;user-select:none}.label-container label{font-size:15px;font-weight:400}.required:after{content:\" *\";color:red}.radio-options-container{display:flex;flex-direction:column;gap:5px;padding:8px;min-height:38px;border:1px solid #DDDBDA;background-color:#fff;outline:none;border-radius:6px}.radio-input:checked{border-color:#007bff;background-color:#007bff}.radio-input:checked:after{content:\"\";width:8px;height:8px;background:#fff;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.custom-textarea{width:100%;min-height:100px;border:1px solid #ccc;border-radius:4px;padding:8px;resize:vertical}.highlight{border:2px solid #5592FD!important;background-color:#eff8ff}.table-container label{font-size:14px;font-weight:700;margin-bottom:5px;display:block}.sticky-footer-version{position:fixed;bottom:0;padding:10px;text-align:center}.nxt-table-container{display:flex;justify-content:center;align-items:center;width:100%}nxt-datatable{width:100%!important;table-layout:fixed;max-width:100%}.dialog-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:#00000080;display:flex;justify-content:center;align-items:center;z-index:1000}.dialog-box{background:#fff;padding:20px;border-radius:5px;text-align:center;width:300px;position:relative}.close-btn-fb{position:absolute;top:4px;right:4px;background:#ff4242;color:#fff;border:none;border-radius:50%;width:20px;height:20px;font-size:10px;cursor:pointer}.button-container-fb{display:flex;justify-content:flex-end;gap:10px}.yes-btn-fb{background:green;color:#fff;border:none;padding:0 12px;border-radius:5px;cursor:pointer}.no-btn-fb{background:gray;color:#fff;border:none;padding:8px 15px;border-radius:5px;cursor:pointer}.line-element{width:100%;display:flex;justify-content:space-between;align-items:center}.custom-line{width:100%;border:1px solid #000}.logo-upload-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;width:150px;height:150px;border:2px dashed #ccc;cursor:pointer;inline-size:auto}.logo-upload-label{display:flex;flex-direction:column;align-items:center;cursor:pointer;color:#666}.logo-upload-label img{width:32px;height:32px;margin-bottom:8px}.element.disabled{opacity:.5;cursor:not-allowed}.form-container{display:flex;flex-wrap:wrap;border:10px solid #86A8CD}.form-container.isPreview{border:none}.center-frame{width:74%}.center-frame.isPreview{width:100%}app-pdf-properties{border-left:10px solid #86A8CD;width:25%}:host ::ng-deep .questiondiv1{padding-left:0!important;padding-right:0!important}:host ::ng-deep .form-group.content-box{padding-bottom:0!important}:host ::ng-deep .custom-textarea{min-height:40px!important}.modal-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:100}.modal-content{background:#fff;padding:20px;width:500px;max-width:90%;border-radius:8px;position:relative;text-align:center}.close-button{position:absolute;top:6px;right:6px;font-size:25px;cursor:pointer;z-index:10}.controls{display:flex;gap:5px;justify-content:center;margin-top:10px}.logo-icon{cursor:pointer;padding:5px;border-radius:5px;background:#d3d3d3}.logo-icon:hover{background:#a9a9a9}.enabled{background:#007bff;color:#fff}.text-settings-toolbar{position:absolute;display:flex;flex-wrap:wrap;align-items:center;gap:8px;background:#fff;border:1px solid #d1d5db;padding:8px 10px;border-radius:8px;box-shadow:0 4px 12px #0000001a;z-index:65535;max-width:100%;width:auto;min-width:200px;box-sizing:border-box}.toolbar-select{padding:4px 6px;font-size:13px;border:1px solid #d1d5db;border-radius:6px;background:#fff;cursor:pointer;min-width:60px;width:auto}.toolbar-btn{background:#f3f4f6;border:1px solid #d1d5db;padding:6px 8px;border-radius:6px;cursor:pointer;font-size:13px;min-width:30px;height:30px;display:flex;align-items:center;justify-content:center}.toolbar-btn:hover{background:#e5e7eb;border-color:#9ca3af}.toolbar-btn.active{background:#005aaa;color:#fff;border-color:#005aaa}.color-label{display:flex;align-items:center}.color-box{font-weight:700;width:22px;height:22px;font-size:13px;border:1px solid #ccc;border-radius:4px;text-align:center;line-height:22px;cursor:pointer;padding:0}.color-picker-hidden{position:absolute;opacity:0;pointer-events:none;width:0;height:0}@media (max-width: 600px){.text-settings-toolbar{flex-direction:row;flex-wrap:wrap;gap:6px;padding:6px;justify-content:flex-start}.toolbar-btn,.toolbar-select{font-size:12px;padding:5px}.color-box{width:20px;height:20px;font-size:12px;line-height:20px}}.action-buttons{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.action-btn{display:flex;gap:16px;padding:10px 15px;border-radius:8px;border:none}\n"] }]
664
623
  }], ctorParameters: () => [{ type: i1.PdfDesignerService }], propDecorators: { textareas: [{
665
624
  type: ViewChildren,
666
625
  args: ['autoTextarea']
@@ -677,4 +636,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
677
636
  }], pdfPreviewEmit: [{
678
637
  type: Output
679
638
  }] } });
680
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLWRlc2lnbmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9wYWdlcy9wZGZEZXNpZ25lci9wZGYtZGVzaWduZXIvcGRmLWRlc2lnbmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9wYWdlcy9wZGZEZXNpZ25lci9wZGYtZGVzaWduZXIvcGRmLWRlc2lnbmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQTRCLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDM0QsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDcEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDakYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDcEYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBSTdFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFFQUFxRSxDQUFDO0FBQzVHLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQyxDQUFDLDZCQUE2Qjs7Ozs7O0FBU3JELE1BQU0sT0FBTyxvQkFB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QUM7d0dBMXFCUSxvQkFBb0I7NEZBQXBCLG9CQUFvQixzWUN4QmpDLHl6NUJBcWRNLCt2UkRqY00sWUFBWSxtYkFBRSxxQkFBcUIsc3pCQUFFLHNCQUFzQiwwS0FBRSxnQkFBZ0IsNFRBQUUsV0FBVyx3cUNBQUUsWUFBWSwrN0JBQTJDLFFBQVE7OzRGQUkxSixvQkFBb0I7a0JBUGhDLFNBQVM7K0JBQ0Usa0JBQWtCLGNBQ2hCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLHFCQUFxQixFQUFFLFFBQVEsQ0FBQzt1RkFNeEksU0FBUztzQkFBdEMsWUFBWTt1QkFBQyxjQUFjO2dCQUNuQixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVJLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgUXVlcnlMaXN0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZFUlNJT04gfSBmcm9tICcuLi8uLi8uLi8uLi9lbnZpcm9ubWVudHMvdmVyc2lvbic7XG5pbXBvcnQgeyBQZGZQcm9wZXJ0aWVzQ29tcG9uZW50IH0gZnJvbSAnLi4vcGRmLXByb3BlcnRpZXMvcGRmLXByb3BlcnRpZXMuY29tcG9uZW50JztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBQZGZEZXNpZ25lclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9wZGYtZGVzaWduZXIuc2VydmljZSc7XG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE54dERhdGF0YWJsZSB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvZGF0YXRhYmxlL2RhdGF0YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQm9va2xldENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2Jvb2tsZXQvYm9va2xldC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQXBwVGVtcGxhdGVzQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYnVpbGRlci90ZW1wbGF0ZXMvdGVtcGxhdGVzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOeHRJbnB1dCB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvbnh0LWlucHV0L254dC1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSW1hZ2VUcmFuc2Zvcm0gfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL2ltYWdlLWNyb3BwZXIvaW50ZXJmYWNlcy9pbWFnZS10cmFuc2Zvcm0uaW50ZXJmYWNlJztcbmltcG9ydCB7IERpbWVuc2lvbnMgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL2ltYWdlLWNyb3BwZXIvaW50ZXJmYWNlcy9kaW1lbnNpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDcm9wcGVyUG9zaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL2ltYWdlLWNyb3BwZXIvaW50ZXJmYWNlcy9jcm9wcGVyLXBvc2l0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJbWFnZUNyb3BwZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL2ltYWdlLWNyb3BwZXIvY29tcG9uZW50L2ltYWdlLWNyb3BwZXIuY29tcG9uZW50JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7IC8vIEVuc3VyZSBsb2Rhc2ggaXMgaW5zdGFsbGVkXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1wZGYtZGVzaWduZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJbWFnZUNyb3BwZXJDb21wb25lbnQsIFBkZlByb3BlcnRpZXNDb21wb25lbnQsIE1hdFRvb2x0aXBNb2R1bGUsIEZvcm1zTW9kdWxlLCBOeHREYXRhdGFibGUsIEJvb2tsZXRDb21wb25lbnQsIEFwcFRlbXBsYXRlc0NvbXBvbmVudCwgTnh0SW5wdXRdLFxuICB0ZW1wbGF0ZVVybDogJy4vcGRmLWRlc2lnbmVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcGRmLWRlc2lnbmVyLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBQZGZEZXNpZ25lckNvbXBvbmVudCB7XG4gIC8vQE91dHB1dCgpIGVsZW1lbnRCdXR0b25DbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBWaWV3Q2hpbGRyZW4oJ2F1dG9UZXh0YXJlYScpIHRleHRhcmVhcyE6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgQElucHV0KCkgcGRmSlNPTjogYW55O1xuICBASW5wdXQoKSBib29rbGV0SWQ6IGFueTtcbiAgQElucHV0KCkgaXNQcmV2aWV3OiBib29sZWFuID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIHBkZlNhdmVIYW5kbGVyRW1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgdGVtcGxhdGVNb2RlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgcGRmUHJldmlld0VtaXQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgZmllbGQ6IGFueTtcbiAgcGRmRWxlbWVudHM6IGFueVtdID0gW107XG4gIGVsZW1lbnRzOiBhbnlbXSA9IFtdO1xuICBib29rSWQ6IHN0cmluZztcbiAgc2VjdGlvbnMgPSB7XG4gICAgYmFzaWM6IHRydWUsXG4gICAgYWR2YW5jZWQ6IHRydWVcbiAgfTtcbiAgZWxlbWVudHNMaXN0OiBhbnlbXSA9IFtdO1xuICBlbGVtZW50RGlzYWJsZWRBcnJheTogYW55O1xuICB2ZXJzaW9uID0gVkVSU0lPTi52ZXJzaW9uO1xuICBwZGY6IGFueTtcbiAgc2VsZWN0ZWRFbGVtZW50OiBhbnkgPSBudWxsO1xuICBpc1NlbGVjdFRhYmxlUG9wdXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY3VycmVudFR5cGU6IHN0cmluZztcbiAgYWRkVGFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBkb3RzID0gQXJyYXkoNik7XG4gIGRyYWdnZWRJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHRlbXBsYXRlU2VsZWN0ZWQgPSBmYWxzZTtcbiAgaXNJbWFnZUVkaXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2VsZWN0ZWRJbWFnZUVsZW1lbnQ6IGFueTtcbiAgdHJhbnNmb3JtOiBJbWFnZVRyYW5zZm9ybSA9IHtcbiAgICB0cmFuc2xhdGVVbml0OiAncHgnLFxuICAgIHNjYWxlOiAxLFxuICAgIHJvdGF0ZTogMCxcbiAgICBmbGlwSDogZmFsc2UsXG4gICAgZmxpcFY6IGZhbHNlLFxuICAgIHRyYW5zbGF0ZUg6IDAsXG4gICAgdHJhbnNsYXRlVjogMFxuICB9O1xuICBsb2FkaW5nID0gZmFsc2U7XG4gIGNhbnZhc1JvdGF0aW9uID0gMDtcbiAgY3JvcHBlcj86IENyb3BwZXJQb3NpdGlvbjtcbiAgY3JvcHBlck1heEhlaWdodCA9IDA7XG4gIGNyb3BwZXJNYXhXaWR0aCA9IDA7XG4gIGNyb3BwZXJNaW5IZWlnaHQgPSAwO1xuICBjcm9wcGVyTWluV2lkdGggPSAwO1xuICBjcm9wcGVyU3RhdGljV2lkdGggPSAwO1xuICBjcm9wcGVyU3RhdGljSGVpZ2h0ID0gMDtcbiAgYXNwZWN0UmF0aW8gPSA0IC8gMztcbiAgcm91bmRDcm9wcGVyID0gZmFsc2U7XG4gIGlzSW1hZ2VIb3ZlciA9IGZhbHNlO1xuICBhbGlnbkltYWdlID0gJ2NlbnRlcicgYXMgY29uc3Q7XG4gIHNob3dUZXh0U2V0dGluZ3MgPSBmYWxzZTtcbiAgc2VsZWN0ZWRDb2x1bW46IGFueSA9IG51bGw7XG4gIFxuXG4gIC8vc3Vic2NyaXB0aW9uOiBhbnk7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcGRmRGVzaWduZXJTZXJ2aWNlOiBQZGZEZXNpZ25lclNlcnZpY2UpIHtcbiAgfVxuICAvL0FQLTE0SlVOMjUgLSBDYWxsZWQgYWZ0ZXIgdmlldyBpbml0aWFsaXphdGlvbiB0byBhdXRvLXJlc2l6ZSBhbGwgdGV4dGFyZWFzXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnJlc2l6ZUFsbFRleHRhcmVhcygpO1xuICB9XG5cbiAgLy9BUC0xNEpVTjI1IC0gQ2FsY3VsYXRlcyBjb250cmFzdCB0ZXh0IGNvbG9yIChibGFjayBvciB3aGl0ZSkgYmFzZWQgb24gYmFja2dyb3VuZCBjb2xvclxuICBnZXRDb250cmFzdENvbG9yKGJnQ29sb3I6IHN0cmluZyA9ICcjMDAwMDAwJyk6IHN0cmluZyB7XG4gICAgLy8gQ29udmVydCBoZXggdG8gUkdCXG4gICAgY29uc3QgY29sb3IgPSBiZ0NvbG9yLnJlcGxhY2UoJyMnLCAnJyk7XG4gICAgY29uc3QgciA9IHBhcnNlSW50KGNvbG9yLnN1YnN0cmluZygwLCAyKSwgMTYpO1xuICAgIGNvbnN0IGcgPSBwYXJzZUludChjb2xvci5zdWJzdHJpbmcoMiwgNCksIDE2KTtcbiAgICBjb25zdCBiID0gcGFyc2VJbnQoY29sb3Iuc3Vic3RyaW5nKDQsIDYpLCAxNik7XG4gICAgY29uc3QgYnJpZ2h0bmVzcyA9IChyICogMjk5ICsgZyAqIDU4NyArIGIgKiAxMTQpIC8gMTAwMDtcbiAgICByZXR1cm4gYnJpZ2h0bmVzcyA+IDEyOCA/ICcjMDAwMDAwJyA6ICcjZmZmZmZmJztcbiAgfVxuXG4gIC8vQVAtMTRKVU4yNSAtIEF1dG9tYXRpY2FsbHkgcmVzaXplcyBhbGwgdGV4dGFyZWFzIGJhc2VkIG9uIHRoZWlyIGNvbnRlbnRcbiAgcmVzaXplQWxsVGV4dGFyZWFzKCk6IHZvaWQge1xuICAgIHRoaXMudGV4dGFyZWFzLmZvckVhY2goKHRleHRhcmVhUmVmOiBFbGVtZW50UmVmKSA9PiB7XG4gICAgICBjb25zdCB0ZXh0YXJlYSA9IHRleHRhcmVhUmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTFRleHRBcmVhRWxlbWVudDtcbiAgICAgIHRleHRhcmVhLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICAgIHRleHRhcmVhLnN0eWxlLmhlaWdodCA9IHRleHRhcmVhLnNjcm9sbEhlaWdodCArICdweCc7XG4gICAgfSk7XG4gIH1cbiAgXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZWxlbWVudHNMaXN0ID0gW1xuICAgICAgeyBcInR5cGVcIjogXCJ0ZXh0XCIsIFwiaW1nXCI6IFwiVGV4dEFyZWFcIiwgXCJsYWJlbFwiOiBcIlRleHRcIiB9LFxuICAgICAgeyBcInR5cGVcIjogXCJpbnB1dFwiLCBcImltZ1wiOiBcIlRleHRcIiwgXCJsYWJlbFwiOiBcIklucHV0XCIgfSxcbiAgICAgIHsgXCJ0eXBlXCI6IFwiZGF0ZVwiLCBcImltZ1wiOiBcIkRhdGVcIiwgXCJsYWJlbFwiOiBcIkRhdGVcIiB9LFxuICAgICAgeyBcInR5cGVcIjogXCJpbWFnZVwiLCBcImltZ1wiOiBcIkltYWdlXCIsIFwibGFiZWxcIjogXCJJbWFnZVwiIH0sXG4gICAgICB7IFwidHlwZVwiOiBcIkxpbmVcIiwgXCJpbWdcIjogXCJsaW5lXCIsIFwibGFiZWxcIjogXCJMaW5lXCIgfSxcbiAgICAgIHsgXCJ0eXBlXCI6IFwiU3BhY2VcIiwgXCJpbWdcIjogXCJzcGFjZVwiLCBcImxhYmVsXCI6IFwiU3BhY2VcIiB9LFxuICAgICAgeyBcInR5cGVcIjogXCJUYWJsZVwiLCBcImltZ1wiOiBcIlRhYmxlXCIsIFwibGFiZWxcIjogXCJUYWJsZVwiIH0sXG4gICAgICB7IFwidHlwZVwiOiBcIlBkZlwiLCBcImltZ1wiOiBcIlNlYXJjaFwiLCBcImxhYmVsXCI6IFwiQm9va1wiIH0sXG4gICAgXTtcbiAgICB0aGlzLmVsZW1lbnREaXNhYmxlZEFycmF5ID0ge1xuICAgICAgVGFibGU6IFtcbiAgICAgICAgJ1BkZicsICdDYWxlbmRhcicsIFwiQm9vbGVhblwiLCAnTGlzdCcsICdUYWJsZScsICdDaGVja2JveCcsICdSYWRpbycsXG4gICAgICAgICdEcm9wZG93bicsICdSaWNoVGV4dEFyZWEnLCAnTnVtYmVyJywgJ0xhYmVsJywgJ2ltYWdlJyxcbiAgICAgICAgJ0VtYWlsJywgJ0RhdGUnLCAnVGltZScsICdEYXRlVGltZScsICdMaW5lJywgJ1NwYWNlJ1xuICAgICAgXVxuICAgIH07XG4gICAgaWYgKCF0aGlzLmlzUHJldmlldykge1xuICAgICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UucGRmRWxlbWVudHMkLnN1YnNjcmliZShlbGVtZW50cyA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucGRmRWxlbWVudHMgPSBlbGVtZW50cy5tYXAoZmllbGQgPT4gKHsgLi4uZmllbGQgfSkpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5wZGZKU09OICYmICh0aGlzLnBkZkpTT04gIT09ICcnKSkge1xuICAgICAgdGhpcy5pbml0aWFsaXplRm9ybSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5uZXdCb29rKClcbiAgICB9XG4gICAgLy8gQVAtMTJNQVIyNSAtIEFkZGVkIHRvIGhhbmRsZSBib29rbGV0SWRcbiAgICBpZiAodGhpcy5ib29rbGV0SWQpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd1bmlxdWVfaWQnLCB0aGlzLmJvb2tsZXRJZCk7XG5cbiAgICB9XG4gICAgdGhpcy5wZGYgPSB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5nZXRCb29rKCk7XG4gICAgaWYgKCF0aGlzLmlzUHJldmlldykge1xuICAgICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2Uuc2VsZWN0ZWRFbGVtZW50JC5zdWJzY3JpYmUoaW5kZXggPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmdldEVsZW1lbnRzKCk7XG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQgPSBlbGVtZW50c1tpbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhpcy5wZGZFbGVtZW50cyA9IFsuLi5lbGVtZW50c11cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5hZGRFbGVtZW50V2l0aElkKCk7XG4gIH1cblxuICBpc1NlY3Rpb25PcGVuKHNlY3Rpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlY3Rpb25zW3NlY3Rpb25dO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzWydwZGZKU09OJ10gJiYgY2hhbmdlc1sncGRmSlNPTiddLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgaWYgKHRoaXMucGRmSlNPTiAmJiAodGhpcy5wZGZKU09OICE9PSAnJykpIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplRm9ybSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UubmV3Qm9vaygpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25UZW1wbGF0ZVNlbGVjdGVkKGV2ZW50OiB7IHNlbGVjdGVkVGVtcGxhdGU6IGFueTsgZWxlbWVudHM6IGFueVtdIH0pIHtcbiAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5jbGVhckVsZW1lbnRzKCk7XG4gICAgZXZlbnQuZWxlbWVudHMuZm9yRWFjaChlbCA9PiB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5hZGRFbGVtZW50KGVsKSk7XG5cbiAgICAvLyBFbWl0IHRlbXBsYXRlIG1vZGUgdG8gcGFyZW50XG4gICAgdGhpcy50ZW1wbGF0ZU1vZGUuZW1pdCh0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUZvcm0oKSB7XG4gICAgaWYgKCF0aGlzLnBkZkpTT04gfHwgIXRoaXMucGRmSlNPTikge1xuICAgICAgY29uc29sZS53YXJuKFwiSW52YWxpZCBwZGZKU09OIHN0cnVjdHVyZVwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wZGZFbGVtZW50cyA9IFtdXG4gICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuY2xlYXJFbGVtZW50cygpO1xuICAgIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmludGlhbGl6ZUJvb2sodGhpcy5wZGZKU09OKTtcbiAgICB0aGlzLnBkZkVsZW1lbnRzID0gdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZ2V0RWxlbWVudHMoKTtcbiAgfVxuXG4gIHNlbGVjdEVsZW1lbnQoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuc2VsZWN0ZWRGaWVsZEluZGV4ID0gaW5kZXg7XG4gICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2Uuc2V0U2VsZWN0ZWRFbGVtZW50KGluZGV4KTtcbiAgICB0aGlzLnBkZiA9IHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmdldEJvb2soKTtcbiAgfVxuXG4gIHNlbGVjdGVkRmllbGRJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHNlbGVjdEhlYWRpbmcoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLnNlbGVjdEhlYWRpbmcoZXZlbnQpO1xuICAgIHRoaXMucGRmID0gdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZ2V0Qm9vaygpO1xuICB9XG4gIC8vIEFQLTE3QVBSMjUgZ2VuZXJhdGVVaUlkIFxuICBnZW5lcmF0ZVVpSWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmFkZEVsZW1lbnRXaXRoSWQoKTtcbiAgfVxuXG4gIGFkZEVsZW1lbnQodHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdW5pcXVlX2lkID0gdGhpcy5nZW5lcmF0ZVVpSWQoKTtcbiAgICB0aGlzLmN1cnJlbnRUeXBlID0gdHlwZVxuICAgIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudD8udHlwZSA9PT0gJ1RhYmxlJyAmJiB0aGlzLmFkZFRhYmxlKSB7XG4gICAgICB0aGlzLmlzU2VsZWN0VGFibGVQb3B1cCA9IHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmV3RWxlbWVudCA9IHtcbiAgICAgICAgaWQ6IHVuaXF1ZV9pZCxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgbWFyZ2luOiBbMCwgMCwgMCwgMF0sXG4gICAgICAgIGZvbnRTaXplOiAxNCxcbiAgICAgICAgZm9udFdlaWdodDogJzQwMCcsXG4gICAgICAgIGZvbnRTdHlsZTogW10sXG4gICAgICAgIGFsaWduSXRlbXM6ICcnLFxuICAgICAgICBueHRUeXBlOiB0eXBlLFxuICAgICAgICByZWZlcmVuY2VGaWVsZDogbnVsbCxcbiAgICAgICAgcXVlc3Rpb246IG51bGwsXG4gICAgICAgIHF1ZXN0aW9uTnVtYmVyOiB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5nZXRFbGVtZW50cygpLmxlbmd0aCArIDEsXG4gICAgICAgIGZpZWxkc01ldGE6IFtdLFxuICAgICAgICBwZGZSZWZlcmVuY2U6IG51bGwsXG4gICAgICAgIHBkZlJlZmVyZW5jZVF1ZXN0aW9uczogbnVsbCxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICBib2xkOiBmYWxzZSxcbiAgICAgICAgICBpdGFsaWM6IGZhbHNlLFxuICAgICAgICAgIGFsaWdubWVudDogJ2xlZnQnLFxuICAgICAgICAgIGZvbnRTaXplOiAxNCwgIFxuICAgICAgICAgIG1hcmdpbjogWzAsIDAsIDAsIDBdLFxuICAgICAgICAgIGNvbG9yOiAnIzAwMDAwMCcsICBcbiAgICAgICAgfSxcbiAgICAgICAgaW1hZ2VEYXRhOiBudWxsLFxuICAgICAgICBpbWFnZVNpemU6IHR5cGUgPT09ICdpbWFnZScgPyB7IHdpZHRoOiAxMDAsIGhlaWdodDogMTAwIH0gOiBudWxsLFxuICAgICAgICB0YWJsZUNvbmZpZzogdHlwZSA9PT0gJ1RhYmxlJyA/IHtcbiAgICAgICAgICBpc05vc0luZGljYXRvcjogZmFsc2UsXG4gICAgICAgICAgYWRkSW5saW5lUmVjb3JkOiB0cnVlLFxuICAgICAgICAgIGlzUGFnaW5hdGlvbjogZmFsc2UsXG4gICAgICAgICAgYWN0aW9uQnV0dG9uOiBmYWxzZSxcbiAgICAgICAgICBpc0RlbGV0ZVJvdzogdHJ1ZSxcbiAgICAgICAgICBpc0VkaXRSb3c6IGZhbHNlLFxuICAgICAgICAgIHNlYXJjaEJhcjogZmFsc2UsXG4gICAgICAgICAgaXNCdXR0b25zOiBmYWxzZSxcbiAgICAgICAgfSA6IG51bGwsXG5cbiAgICAgICAgd2lkdGg6IDEwMCxcbiAgICAgICAgc3R5bGVDbGFzczogdW5pcXVlX2lkLFxuICAgICAgfTtcbiAgICAgIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmFkZEVsZW1lbnQobmV3RWxlbWVudCk7XG4gICAgICB0aGlzLnBkZkVsZW1lbnRzID0gdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZ2V0RWxlbWVudHMoKTtcbiAgICAgIHRoaXMuYWRkVGFibGUgPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgLy9BUC0xNEpVTjI1IC0gSGFuZGxlcyB0ZXh0YXJlYSBpbnB1dDogYXV0by1yZXNpemVzIGFuZCB1cGRhdGVzIHRoZSBmaWVsZCBjb250ZW50XG4gIG9uVGV4dEFyZWFJbnB1dChldmVudDogRXZlbnQsIGZpZWxkOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCB0ZXh0YXJlYSA9IGV2ZW50LnRhcmdldCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50O1xuICBcbiAgICAvLyAxLiBBdXRvLXJlc2l6ZSBsb2dpY1xuICAgIHRleHRhcmVhLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICB0ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSB0ZXh0YXJlYS5zY3JvbGxIZWlnaHQgKyAncHgnO1xuICBcbiAgICAvLyAyLiBUcmlnZ2VyIHZhbHVlIHVwZGF0ZSBhbmQgUERGIHN5bmNcbiAgICB0aGlzLm9uUXVlc3Rpb25DaGFuZ2UodGV4dGFyZWEudmFsdWUsIGZpZWxkKTtcbiAgfVxuXG5vblF1ZXN0aW9uQ2hhbmdlKHZhbHVlOiBzdHJpbmcsIGZpZWxkOiBhbnkpIHtcbiAgbGV0IGVsZW1lbnRJZDogYW55IHwgdW5kZWZpbmVkO1xuXG4gIC8vIFNLUzE5SlVOMjUgQ2xvbmUgdG8gYXZvaWQgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbFxuICBjb25zdCBwZGZFbGVtZW50c0Nsb25lID0gXy5jbG9uZURlZXAodGhpcy5wZGZFbGVtZW50cyk7XG5cbiAgY29uc3QgdXBkYXRlUGRmUXVlc3Rpb24gPSAoZWxlbWVudDogYW55LCB2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ1BkZicpIHtcbiAgICAgIGNvbnN0IHN1YkVsZW1lbnRzID0gZWxlbWVudC5wZGZSZWZlcmVuY2VRdWVzdGlvbnM/LltlbGVtZW50LnBkZlJlZmVyZW5jZV0gfHwgW107XG4gICAgICBmb3IgKGNvbnN0IHN1YkVsZW1lbnQgb2Ygc3ViRWxlbWVudHMpIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSB1cGRhdGVQZGZRdWVzdGlvbihzdWJFbGVtZW50LCB2YWx1ZSk7IC8vIHJlY3Vyc2l2ZSBjYWxsXG4gICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIHRydWU7IC8vIHN0b3Agb25jZSBtYXRjaCBpcyBmb3VuZFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZWxlbWVudC5pZCA9PT0gZmllbGQuaWQpIHtcbiAgICAgICAgZWxlbWVudC52YWx1ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIHBkZkVsZW1lbnRzQ2xvbmUuZm9yRWFjaCgoZWxlbWVudDogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgZm91bmQgPSB1cGRhdGVQZGZRdWVzdGlvbihlbGVtZW50LCB2YWx1ZSk7XG4gICAgaWYgKGZvdW5kICYmIGVsZW1lbnRJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbGVtZW50SWQgPSBpbmRleDtcbiAgICB9XG4gIH0pO1xuXG4gIGlmIChlbGVtZW50SWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHVwZGF0ZWRFbGVtZW50ID0gcGRmRWxlbWVudHNDbG9uZVtlbGVtZW50SWRdO1xuICAgIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmVsZW1lbnRVcGRhdGUodXBkYXRlZEVsZW1lbnQsICd2YWx1ZUNoYW5nZScpO1xuICAgIC8vIFNLUzE5SlVOMjUgT3B0aW9uYWxseSBwcmV2aWV3IG9yIHRlc3QgdXNpbmcgdXBkYXRlZEVsZW1lbnQgKHdpdGhvdXQgdXBkYXRpbmcgb3JpZ2luYWwpXG4gICAgaWYgKHRoaXMuaXNQcmV2aWV3KSB7XG4gICAgICB0aGlzLnBkZlByZXZpZXcodGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZG93bmxvYWRFbGVtZW50KCkpO1xuICAgIH1cbiAgfVxufVxuICBcbnBkZlByZXZpZXcocGRmOmFueSl7XG4gIHRoaXMucGRmUHJldmlld0VtaXQuZW1pdChwZGYpXG59XG4gIG9uRmllbGREYXRlQ2hhbmdlKGV2ZW50OiBhbnkpIHtcbiAgfVxuXG4gIHJlbW92ZUVsZW1lbnQoZmllbGQ6IGFueSwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLnJlbW92ZUVsZW1lbnRDb21wb25lbnQoZmllbGQuaWQpO1xuICAgIHRoaXMucGRmRWxlbWVudHMgPSB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5nZXRFbGVtZW50cygpO1xuICB9XG5cbiAgb25EcmFnU3RhcnQoZXZlbnQ6IERyYWdFdmVudCwgaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuZHJhZ2dlZEluZGV4ID0gaW5kZXg7XG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyPy5zZXREYXRhKCd0ZXh0L3BsYWluJywgaW5kZXgudG9TdHJpbmcoKSk7XG4gIH1cblxuICBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgb25Ecm9wKGV2ZW50OiBEcmFnRXZlbnQsIGRyb3BJbmRleDogbnVtYmVyKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmICh0aGlzLmRyYWdnZWRJbmRleCA9PT0gbnVsbCB8fCB0aGlzLmRyYWdnZWRJbmRleCA9PT0gZHJvcEluZGV4KSByZXR1cm47XG5cbiAgICBjb25zdCBkcmFnZ2VkSXRlbSA9IHRoaXMucGRmRWxlbWVudHNbdGhpcy5kcmFnZ2VkSW5kZXhdO1xuXG4gICAgLy8gUmVtb3ZlIGRyYWdnZWQgaXRlbSBmcm9tIG9sZCBwb3NpdGlvbiBhbmQgaW5zZXJ0IGl0IGluIG5ldyBwb3NpdGlvblxuICAgIHRoaXMucGRmRWxlbWVudHMuc3BsaWNlKHRoaXMuZHJhZ2dlZEluZGV4LCAxKTtcbiAgICB0aGlzLnBkZkVsZW1lbnRzLnNwbGljZShkcm9wSW5kZXgsIDAsIGRyYWdnZWRJdGVtKTtcblxuICAgIC8vQVAtMjhNQVIyNSBVcGRhdGUgcXVlc3Rpb25OdW1iZXIgZHluYW1pY2FsbHkgYmFzZWQgb24gbmV3IG9yZGVyXG4gICAgdGhpcy5wZGZFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgZWxlbWVudC5xdWVzdGlvbk51bWJlciA9IGluZGV4ICsgMTtcbiAgICB9KTtcblxuICAgIC8vIFJlc2V0IGRyYWdnZWQgaW5kZXhcbiAgICB0aGlzLmRyYWdnZWRJbmRleCA9IG51bGw7XG5cbiAgICAvLyBOb3RpZnkgc2VydmljZSBhYm91dCB0aGUgdXBkYXRlXG4gICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UudXBkYXRlRWxlbWVudHNPcmRlcih0aGlzLnBkZkVsZW1lbnRzKTtcbiAgfVxuXG4gIHRvZ2dsZUJvb2xlYW4oZmllbGQ6IGFueSk6IHZvaWQge1xuICAgIGZpZWxkLmJvb2xlYW4gPSAhZmllbGQuYm9vbGVhbjtcbiAgfVxuICBnZXRGb250U3R5bGVzKGZpZWxkOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IG1hcmdpbiA9IGZpZWxkLm1hcmdpbiB8fCBbMCwgMCwgMCwgMF07ICAvLyBbbGVmdCwgdG9wLCByaWdodCwgYm90dG9tXVxuICAgIGNvbnN0IGZvbnRTdHlsZXMgPSBmaWVsZC5mb250U3R5bGUgfHwgW107XG5cbiAgICByZXR1cm4ge1xuICAgICAgJ2ZvbnQtZmFtaWx5JzogZmllbGQuZm9udCB8fCAnSGVsdmV0aWNhIE5ldWUnLFxuICAgICAgLy8nZm9udC13ZWlnaHQnOiBmaWVsZC5mb250V2VpZ2h0IHx8ICc0MDAnLFxuICAgICAgJ2ZvbnQtc2l6ZSc6IGZpZWxkLmZvbnRTaXplID8gYCR7ZmllbGQuZm9udFNpemV9cHhgIDogJzE0cHgnLFxuICAgICAgJ3dpZHRoJzogZmllbGQud2lkdGggPyBgJHtmaWVsZC53aWR0aH0lYCA6ICcxMDAlJyxcbiAgICAgIC8vJ3RleHQtYWxpZ24nOiBmaWVsZC50ZXh0QWxpZ24gfHwgJ2xlZnQnLFxuICAgICAgJ2FsaWduLWl0ZW1zJzogZmllbGQuYWxpZ25JdGVtcyB8fCAnJyxcbiAgICAgICdib3JkZXItcmFkaXVzJzogJzVweCcsXG4gICAgICAnYm9yZGVyLXdpZHRoJzogZmllbGQubGluZVdpZHRoID8gYCR7ZmllbGQubGluZVdpZHRofXB4YCA6ICcxcHgnLFxuICAgICAgJ2NvbG9yJzogZmllbGQuZm9udENvbG9yIHx8ICcjMDAwMDAwJyxcbiAgICAgICdmb250LXN0eWxlJzogZm9udFN0eWxlcy5pbmNsdWRlcygnaXRhbGljJykgPyAnaXRhbGljJyA6ICdub3JtYWwnLFxuICAgICAgJ2ZvbnQtd2VpZ2h0JzogZm9udFN0eWxlcy5pbmNsdWRlcygnYm9sZCcpID8gJ2JvbGQnIDogKGZpZWxkLmZvbnRXZWlnaHQgfHwgJzQwMCcpLFxuICAgICAgJ21hcmdpbic6IGAke21hcmdpblswXX1weCAke21hcmdpblsxXX1weCAke21hcmdpblsyXX1weCAke21hcmdpblszXX1weGAsXG4gICAgICAncGFkZGluZy10b3AnOiBmaWVsZC5wYWRkaW5nVG9wID8gYCR7ZmllbGQucGFkZGluZ1RvcH1weGAgOiAnMHB4JyxcbiAgICAgICdwYWRkaW5nLWJvdHRvbSc6IGZpZWxkLnBhZGRpbmdCb3R0b20gPyBgJHtmaWVsZC5wYWRkaW5nQm90dG9tfXB4YCA6ICcxMHB4JyxcbiAgICB9O1xuICB9XG5cbiAgZ2V0TGluZVN0eWxlcyhmaWVsZDogYW55KTogYW55IHtcbiAgICBjb25zdCBzdHlsZXM6IGFueSA9IHtcbiAgICAgICdmb250LWZhbWlseSc6IGZpZWxkLmZvbnQgfHwgJ0hlbHZldGljYSBOZXVlJyxcbiAgICAgICdmb250LXdlaWdodCc6IGZpZWxkLmZvbnRXZWlnaHQgfHwgJzQwMCcsXG4gICAgICAnZm9udC1zaXplJzogZmllbGQuZm9udFNpemUgfHwgJzE0cHgnLFxuICAgICAgJ3dpZHRoJzogZmllbGQud2lkdGggPyBgJHtmaWVsZC53aWR0aH0lYCA6ICcxMDAlJyxcbiAgICAgICd0ZXh0LWFsaWduJzogZmllbGQudGV4dEFsaWduIHx8ICdsZWZ0JyxcbiAgICAgICdib3JkZXItcmFkaXVzJzogJzVweCcsXG4gICAgICAnYm9yZGVyLXdpZHRoJzogZmllbGQubGluZVdpZHRoID8gYCR7ZmllbGQubGluZVdpZHRofXB4YCA6ICcxcHgnLFxuICAgICAgJ2JvcmRlci1zdHlsZSc6IGZpZWxkLmxpbmVTdHlsZT8udG9Mb3dlckNhc2UoKSB8fCAnc29saWQnLFxuICAgICAgJ2NvbG9yJzogZmllbGQuZm9udENvbG9yIHx8ICcjMDAwMDAwJyxcbiAgICAgIC8vJ2JvcmRlci1jb2xvcic6IGZpZWxkLmNvbG9yIHx8ICcjRUZGOEZGJywgXG4gICAgICAnbWFyZ2luLXRvcCc6IGZpZWxkLnBhZGRpbmdUb3AgPyBgJHtmaWVsZC5wYWRkaW5nVG9wfXB4YCA6ICcwcHgnLFxuICAgICAgJ21hcmdpbi1ib3R0b20nOiBmaWVsZC5wYWRkaW5nQm90dG9tID8gYCR7ZmllbGQucGFkZGluZ0JvdHRvbX1weGAgOiAnMTBweCdcbiAgICB9O1xuICAgIHJldHVybiBzdHlsZXM7XG4gIH1cbiAgLy8gU0tTMTNNQVIyNSB0YWJsZSBwb3B1cCBjb25mb3JtYXRpb24gYmFzZWQgZWxlbWVudCBhZGRcbiAgb25DbG9zZSgpIHtcbiAgICB0aGlzLmlzU2VsZWN0VGFibGVQb3B1cCA9IGZhbHNlXG4gICAgdGhpcy5hZGRUYWJsZSA9IGZhbHNlXG4gICAgdGhpcy5hZGRFbGVtZW50KHRoaXMuY3VycmVudFR5cGUpXG4gIH1cbiAgLy8gU0tTMTNNQVIyNSBjb2x1bW4gZWxlbWVudCBhZGQgaW5zaWRlIGEgdGFibGVcbiAgYWRkT25UYWJsZSgpIHtcbiAgICB0aGlzLmFkZFRhYmxlID0gdHJ1ZVxuICAgIHRoaXMuaXNTZWxlY3RUYWJsZVBvcHVwID0gZmFsc2VcbiAgICBjb25zdCBlbGVtZW50cyA9IFsuLi50aGlzLnBkZkRlc2lnbmVyU2VydmljZS5nZXRFbGVtZW50cygpXTtcblxuICAgIC8vIEZpbmQgdGhlIGVsZW1lbnQgYW5kIHVwZGF0ZSBpdHMgY29sdW1uc1xuICAgIGNvbnN0IGluZGV4ID0gZWxlbWVudHMuZmluZEluZGV4KGVsID0+IGVsLmlkID09PSB0aGlzLnNlbGVjdGVkRWxlbWVudC5pZCk7XG4gICAgY29uc3Qgcm93TnVtID0gdGhpcy5wZGZFbGVtZW50c1tpbmRleF0uY29sdW1ucyA/IHRoaXMucGRmRWxlbWVudHNbaW5kZXhdLmNvbHVtbnM/Lmxlbmd0aCA6IDBcbiAgICBjb25zdCB1bmlxdWVfaWQgPSB0aGlzLmdlbmVyYXRlVWlJZCgpO1xuICAgIGNvbnN0IHRhYmxlRWxlbWVudCA9IHtcbiAgICAgIGxhYmVsOiBgSEVBREVSIExBQkVMICR7cm93TnVtfWAsXG4gICAgICBmaWVsZE5hbWU6IGBGSUVMRCBOQU1FJHtyb3dOdW19YCxcbiAgICAgIHR5cGU6IHRoaXMuY3VycmVudFR5cGUsXG4gICAgICBpZDogdW5pcXVlX2lkXG4gICAgfVxuICAgIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmFkZFRhYmxlRWxlbWVudCh0YWJsZUVsZW1lbnQsIHRoaXMuc2VsZWN0ZWRGaWVsZEluZGV4KTtcbiAgICB0aGlzLnBkZkVsZW1lbnRzID0gdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZ2V0RWxlbWVudHMoKTtcbiAgICAvLyB0aGlzLmFkZFRhYmxlRGF0YSh1bmlxdWVfaWQsIGZpZWxkTmFtZSlcbiAgfVxuICBhZGRUYWJsZURhdGEoZmllbGRJZCwgZmllbGROYW1lKSB7XG4gICAgLy8gdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuYWRkVGFibGVmaWVsZERhdGEodGFibGVFbGVtZW50KTtcbiAgfVxuICBjb2x1bW5TZWxlY3RlZChldmVudDogYW55KSB7XG4gICAgLy8gU0tTMTlNQVIyNSB0YWJsZSBjb2x1bW4gdXBkYXRlXG4gICAgaWYgKCF0aGlzLmlzUHJldmlldykge1xuICAgICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2Uuc2V0U2VsZWN0ZWRUYWJsZUVsZW1lbnQodGhpcy5zZWxlY3RlZEZpZWxkSW5kZXgsIGV2ZW50KTtcbiAgICB9XG4gIH1cbiAgcmVtb3ZlQ29sdW1uKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5yZW1vdmVTZWxlY3RlZFRhYmxlRWxlbWVudCh0aGlzLnNlbGVjdGVkRmllbGRJbmRleCwgZXZlbnQpO1xuICB9XG5cbiAgLy8gU0tTMjVNQVIyNSBpbWFnZSBhZGRcbiAgYXN5bmMgZmlsZUNoYW5nZUV2ZW50KGZpZWxkOiBhbnksIGV2ZW50OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xuICAgIGlmICghZmlsZSkgcmV0dXJuO1xuICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgaW1hZ2VEYXRhID0gYXdhaXQgdGhpcy5yZWFkRmlsZUFzRGF0YVVSTChmaWxlKTtcbiAgICAgIGxldCBlbGVtZW50SWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgXG4gICAgICBjb25zdCB1cGRhdGVQZGZJbWFnZSA9IChlbGVtZW50OiBhbnkpOiBib29sZWFuID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ1BkZicpIHtcbiAgICAgICAgICBjb25zdCBzdWJFbGVtZW50cyA9IGVsZW1lbnQucGRmUmVmZXJlbmNlUXVlc3Rpb25zPy5bZWxlbWVudC5wZGZSZWZlcmVuY2VdIHx8IFtdO1xuICAgICAgICAgIGZvciAoY29uc3Qgc3ViRWxlbWVudCBvZiBzdWJFbGVtZW50cykge1xuICAgICAgICAgICAgY29uc3QgZm91bmQgPSB1cGRhdGVQZGZJbWFnZShzdWJFbGVtZW50KTsgLy8gcmVjdXJzaXZlIGNhbGxcbiAgICAgICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChlbGVtZW50LmlkID09PSBmaWVsZC5pZCkge1xuICAgICAgICAgICAgZWxlbWVudC5pbWFnZURhdGEgPSBpbWFnZURhdGE7XG4gICAgICAgICAgICBlbGVtZW50Lm9yZ0ltYWdlRGF0YSA9IGltYWdlRGF0YTtcbiAgICAgICAgICAgIGlmICghZWxlbWVudC5pbWFnZVNpemUpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5pbWFnZVNpemUgPSB7IHdpZHRoOiAxMDAsIGhlaWdodDogMTAwIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfTtcbiAgXG4gICAgICB0aGlzLnBkZkVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQ6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHVwZGF0ZVBkZkltYWdlKGVsZW1lbnQpO1xuICAgICAgICBpZiAoZm91bmQgJiYgZWxlbWVudElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBlbGVtZW50SWQgPSBpbmRleDsgLy8gcmVtZW1iZXIgdG9wLWxldmVsIG1hdGNoXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICBcbiAgICAgIGlmIChlbGVtZW50SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5lbGVtZW50VXBkYXRlKHRoaXMucGRmRWxlbWVudHNbZWxlbWVudElkXSwgJ3ZhbHVlQ2hhbmdlJyk7XG4gICAgICAgIGlmKHRoaXMuaXNQcmV2aWV3KXtcbiAgICAgICAgICB0aGlzLnBkZlByZXZpZXcodGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZG93bmxvYWRFbGVtZW50KCkpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHJlYWRpbmcgZmlsZTpcIiwgZXJyb3IpO1xuICAgIH1cbiAgfSAgXG4gIFxuICBwcml2YXRlIHJlYWRGaWxlQXNEYXRhVVJMKGZpbGU6IEZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHJlc29sdmUocmVhZGVyLnJlc3VsdCBhcyBzdHJpbmcpO1xuICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoZXJyb3IpID0+IHJlamVjdChlcnJvcik7XG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgICB9KTtcbiAgfVxuICAvLyBTS1MyQVBSMjUgZGlzYWJsZWQgZWxlbWVudFxuICBpc0VsZW1lbnREaXNhYmxlZChlbGVtZW50VHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuZWxlbWVudERpc2FibGVkQXJyYXlbdGhpcy5zZWxlY3RlZEVsZW1lbnQudHlwZV1cbiAgICAgIGlmIChlbGVtZW50cykge1xuICAgICAgICByZXR1cm4gZWxlbWVudHMuaW5jbHVkZXMoZWxlbWVudFR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgYXN5bmMgb25JbWFnZUVkaXQocXVlczogYW55KSB7XG4gICAgdGhpcy5pc0ltYWdlRWRpdCA9IHRydWU7XG4gICAgdGhpcy5zZWxlY3RlZEltYWdlRWxlbWVudCA9IHF1ZXM7XG5cbiAgLy9Bc3NpZ24gaW1hZ2VTaXplIGRlZmF1bHQgdmFsdWVcbiAgaWYgKCF0aGlzLnNlbGVjdGVkSW1hZ2VFbGVtZW50LmltYWdlU2l6ZSkge1xuICAgIHRoaXMuc2VsZWN0ZWRJbWFnZUVsZW1lbnQuaW1hZ2VTaXplID0geyB3aWR0aDogMTAwLCBoZWlnaHQ6IDEwMCB9O1xuICB9XG4gIH1cbiAgYXN5bmMgb25JbWFnZURlbGV0ZShxdWVzOiBhbnkpIHtcbiAgICB0cnkge1xuICAgICAgcXVlcy5pbWFnZURhdGEgPSAnJztcbiAgICAgIHF1ZXMub3JnSW1hZ2VEYXRhID0gJyc7XG4gICAgICAvLyBJbml0aWFsaXplIGxvZ28gc2l6ZSBpZiBub3QgYWxyZWFkeSBzZXRcbiAgICAgIGlmICghcXVlcy5pbWFnZVNpemUpIHtcbiAgICAgICAgcXVlcy5pbWFnZVNpemUgPSB7IHdpZHRoOiAxMDAsIGhlaWdodDogMTAwIH07XG4gICAgICB9XG4gICAgICAvLyBhd2FpdCB0aGlzLmNoaWxkRXZlbnRDYXB0dXJlKHF1ZXMuaW1hZ2VEYXRhLCBxdWVzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHJlYWRpbmcgZmlsZTpcIiwgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNLUzI1TUFSMjUgaW1hZ2UgZWRpdCBmdW5jdGlvbnNcbiAgZmxpcEhvcml6b250YWwoKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7XG4gICAgICAuLi50aGlzLnRyYW5zZm9ybSxcbiAgICAgIGZsaXBIOiAhdGhpcy50cmFuc2Zvcm0uZmxpcEhcbiAgICB9O1xuICB9XG5cbiAgZmxpcFZlcnRpY2FsKCkge1xuICAgIHRoaXMudHJhbnNmb3JtID0ge1xuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXG4gICAgICBmbGlwVjogIXRoaXMudHJhbnNmb3JtLmZsaXBWXG4gICAgfTtcbiAgfVxuXG4gIHJlc2V0SW1hZ2UoKSB7XG4gICAgdGhpcy5jYW52YXNSb3RhdGlvbiA9IDA7XG4gICAgdGhpcy5jcm9wcGVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMudHJhbnNmb3JtID0ge1xuICAgICAgdHJhbnNsYXRlVW5pdDogJ3B4JyxcbiAgICAgIHNjYWxlOiAxLFxuICAgICAgcm90YXRlOiAwLFxuICAgICAgZmxpcEg6IGZhbHNlLFxuICAgICAgZmxpcFY6IGZhbHNlLFxuICAgICAgdHJhbnNsYXRlSDogMCxcbiAgICAgIHRyYW5zbGF0ZVY6IDBcbiAgICB9O1xuICB9XG5cbiAgem9vbU91dCgpIHtcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcbiAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxuICAgICAgc2NhbGU6IHRoaXMudHJhbnNmb3JtLnNjYWxlISAtIC4xXG4gICAgfTtcbiAgfVxuXG4gIHpvb21JbigpIHtcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcbiAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxuICAgICAgc2NhbGU6IHRoaXMudHJhbnNmb3JtLnNjYWxlISArIC4xXG4gICAgfTtcbiAgfVxuICByb3RhdGVMZWZ0KCkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7IC8vIFVzZSB0aW1lb3V0IGJlY2F1c2Ugcm90YXRpbmcgaW1hZ2UgaXMgYSBoZWF2eSBvcGVyYXRpb24gYW5kIHdpbGwgYmxvY2sgdGhlIHVpIHRocmVhZFxuICAgICAgdGhpcy5jYW52YXNSb3RhdGlvbi0tO1xuICAgICAgdGhpcy5mbGlwQWZ0ZXJSb3RhdGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJvdGF0ZVJpZ2h0KCkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNhbnZhc1JvdGF0aW9uKys7XG4gICAgICB0aGlzLmZsaXBBZnRlclJvdGF0ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgbW92ZUxlZnQoKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7XG4gICAgICAuLi50aGlzLnRyYW5zZm9ybSxcbiAgICAgIHRyYW5zbGF0ZUg6IHRoaXMudHJhbnNmb3JtLnRyYW5zbGF0ZUghIC0gMVxuICAgIH07XG4gIH1cblxuICBtb3ZlUmlnaHQoKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7XG4gICAgICAuLi50aGlzLnRyYW5zZm9ybSxcbiAgICAgIHRyYW5zbGF0ZUg6IHRoaXMudHJhbnNmb3JtLnRyYW5zbGF0ZUghICsgMVxuICAgIH07XG4gIH1cblxuICBtb3ZlRG93bigpIHtcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcbiAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxuICAgICAgdHJhbnNsYXRlVjogdGhpcy50cmFuc2Zvcm0udHJhbnNsYXRlViEgKyAxXG4gICAgfTtcbiAgfVxuXG4gIG1vdmVVcCgpIHtcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcbiAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxuICAgICAgdHJhbnNsYXRlVjogdGhpcy50cmFuc2Zvcm0udHJhbnNsYXRlViEgLSAxXG4gICAgfTtcbiAgfVxuICBwcml2YXRlIGZsaXBBZnRlclJvdGF0ZSgpIHtcbiAgICBjb25zdCBmbGlwcGVkSCA9IHRoaXMudHJhbnNmb3JtLmZsaXBIO1xuICAgIGNvbnN0IGZsaXBwZWRWID0gdGhpcy50cmFuc2Zvcm0uZmxpcFY7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7XG4gICAgICAuLi50aGlzLnRyYW5zZm9ybSxcbiAgICAgIGZsaXBIOiBmbGlwcGVkVixcbiAgICAgIGZsaXBWOiBmbGlwcGVkSCxcbiAgICAgIHRyYW5zbGF0ZUg6IDAsXG4gICAgICB0cmFuc2xhdGVWOiAwXG4gICAgfTtcbiAgfVxuLy9BUC0yMEpVTjI1IC0gVXBkYXRlcyB0aGUgaW1hZ2Ugc2l6ZSAod2lkdGggYW5kIGhlaWdodCkgb2YgdGhlIHNlbGVjdGVkIGltYWdlIGVsZW1lbnQgYW5kIHJlZmxlY3RzIHRoZSBjaGFuZ2UgdmlhIHRoZSBzZXJ2aWNlXG5vbkltYWdlU2l6ZUNoYW5nZSgpIHtcbiAgY29uc3QgaW5kZXggPSB0aGlzLnBkZkVsZW1lbnRzLmZpbmRJbmRleCgoZWw6IGFueSkgPT4gZWwuaWQgPT09IHRoaXMuc2VsZWN0ZWRJbWFnZUVsZW1lbnQuaWQpO1xuICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgdGhpcy5wZGZFbGVtZW50c1tpbmRleF0uaW1hZ2VTaXplID0geyBcbiAgICAgIHdpZHRoOiB0aGlzLnNlbGVjdGVkSW1hZ2VFbGVtZW50LmltYWdlU2l6ZS53aWR0aCwgXG4gICAgICBoZWlnaHQ6IHRoaXMuc2VsZWN0ZWRJbWFnZUVsZW1lbnQuaW1hZ2VTaXplLmhlaWdodCBcbiAgICB9O1xuICAgIC8vIFVwZGF0ZSBlbGVtZW50IGluIHNlcnZpY2VcbiAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5lbGVtZW50VXBkYXRlKHRoaXMucGRmRWxlbWVudHNbaW5kZXhdLCAndmFsdWVDaGFuZ2UnKTtcbiAgfVxufVxuICBhc3luYyBpbWFnZUNyb3BwZWQoZXZlbnQ6IGFueSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBiYXNlNjQgPSBhd2FpdCB0aGlzLmNvbnZlcnRCbG9iVG9CYXNlNjQoZXZlbnQub2JqZWN0VXJsKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbWFnZUVsZW1lbnQuaW1hZ2VEYXRhID0gYmFzZTY0O1xuICAgICAgLy8gYXdhaXQgdGhpcy5jaGlsZEV2ZW50Q2FwdHVyZShiYXNlNjQsIHRoaXMuc2VsZWN0ZWRJbWFnZUVsZW1lbnQpO1xuICAgICAgIC8vIHNldCBkZWZhdWx0IGlmIG5vdCBwcmVzZW50XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkSW1hZ2VFbGVtZW50LmltYWdlU2l6ZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZEltYWdlRWxlbWVudC5pbWFnZVNpemUgPSB7IHdpZHRoOiAxMDAsIGhlaWdodDogMTAwIH07XG4gICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgaW4gaW1hZ2VDcm9wcGVkOlwiLCBlcnJvcik7XG4gICAgfVxuICB9XG5cblxuICBjcm9wcGVyUmVhZHkoc291cmNlSW1hZ2VEaW1lbnNpb25zOiBEaW1lbnNpb25zKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gIH1cbiAgLy8gU0tTMjVNQVIyNSBibG9iIHRvIGJhc2UgNjQgY29udmVydGVyXG4gIGNvbnZlcnRCbG9iVG9CYXNlNjQob2JqZWN0VXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBmZXRjaChvYmplY3RVcmwpXG4gICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5ibG9iKCkpXG4gICAgICAudGhlbihibG9iID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuICAgICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSAoKSA9PiByZXNvbHZlKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKTtcbiAgICAgICAgICByZWFkZXIub25lcnJvciA9IGVycm9yID0+IHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cbiAgY2xvc2VNb2RhbCgpIHtcbiAgICB0aGlzLmlzSW1hZ2VFZGl0ID0gZmFsc2U7XG4gIH1cbiAgICAgb3BlblRleHRTZXR0aW5ncyhmaWVsZDogYW55LCBldmVudDogTW91c2VFdmVudCkge1xuICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbiA9IGZpZWxkO1xuICAgICAgdGhpcy5zaG93VGV4dFNldHRpbmdzID0gdHJ1ZTtcbiAgICB9XG4gIFxuICAgIGNsb3NlVGV4dFNldHRpbmdzKCkge1xuICAgICAgdGhpcy5zaG93VGV4dFNldHRpbmdzID0gZmFsc2U7XG4gICAgfVxuICAgXG4gICAgLy9BUC0xNEpVTjI1IC0gVG9nZ2xlcyBib2xkIG9yIGl0YWxpYyBzdHlsZSBmb3IgdGhlIHNlbGVjdGVkIHRleHQgYmxvY2tcbiAgICB0b2dnbGVTdHlsZShzdHlsZTogJ2JvbGQnIHwgJ2l0YWxpYycpIHtcbiAgICAgIGlmICghdGhpcy5zZWxlY3RlZENvbHVtbikgcmV0dXJuO1xuICAgICAgaWYgKHN0eWxlID09PSAnYm9sZCcpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbi5zdHlsZS5ib2xkID0gIXRoaXMuc2VsZWN0ZWRDb2x1bW4uc3R5bGUuYm9sZDtcbiAgICAgIH0gZWxzZSBpZiAoc3R5bGUgPT09ICdpdGFsaWMnKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW4uc3R5bGUuaXRhbGljcyA9ICF0aGlzLnNlbGVjdGVkQ29sdW1uLnN0eWxlLml0YWxpY3M7XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZUNvbnRlbnQoKTtcbiAgICB9XG4gIFxuICAgIC8vQVAtMTRKVU4yNSAtIFNldHMgdGV4dCBhbGlnbm1lbnQgKGxlZnQsIGNlbnRlciwgcmlnaHQpIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBibG9ja1xuICAgIHNldEFsaWdubWVudChhbGlnbm1lbnQ6ICdsZWZ0JyB8ICdjZW50ZXInIHwgJ3JpZ2h0Jykge1xuICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkQ29sdW1uKSByZXR1cm47XG4gICAgICB0aGlzLnNlbGVjdGVkQ29sdW1uLnN0eWxlLmFsaWdubWVudCA9IGFsaWdubWVudDtcbiAgICAgIHRoaXMudXBkYXRlQ29udGVudCgpO1xuICAgIH1cblxuICAgIC8vQVAtMTRKVU4yNSAtIFVwZGF0ZXMgdGhlIGNvbnRlbnQgaW4gdGhlIFBERiBkZXNpZ25lciB3aXRoIHRoZSBzZWxlY3RlZCBzdHlsZSBjaGFuZ2VzXG4gICAgdXBkYXRlQ29udGVudCgpIHtcbiAgICAgIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmVsZW1lbnRVcGRhdGUodGhpcy5zZWxlY3RlZENvbHVtbiwgJ3ZhbHVlQ2hhbmdlJyk7XG4gICAgfVxuXG4gICAgZ2V0TWFyZ2luU3R5bGUobWFyZ2luOiBudW1iZXJbXSB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgICBpZiAoIW1hcmdpbiB8fCBtYXJnaW4ubGVuZ3RoICE9PSA0KSByZXR1cm4gJzAnO1xuICAgICAgcmV0dXJuIGAke21hcmdpblsxXX1weCAke21hcmdpblsyXX1weCAke21hcmdpblszXX1weCAke21hcmdpblswXX1weGA7XG4gICAgfVxuICAgIHBkZlNhdmVIYW5kbGVyKGV2ZW50OmFueSl7XG4gICAgICBpZihldmVudCA9PT0gJ3ByZXZpZXcnKXtcbiAgICAgICAgdGhpcy5wZGZTYXZlSGFuZGxlckVtaXQuZW1pdCh7XCJhY3Rpb25cIjoncHJldmlldycsXCJwZGZcIjp0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5kb3dubG9hZEVsZW1lbnQoKX0pXG4gICAgICB9IGVsc2UgaWYoZXZlbnQgPT09ICdkb3dubG9hZCcpe1xuICAgICAgICB0aGlzLnBkZlNhdmVIYW5kbGVyRW1pdC5lbWl0KHtcImFjdGlvblwiOidkb3dubG9hZCcsXCJwZGZcIjp0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5kb3dubG9hZEVsZW1lbnQoKX0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBkZlNhdmVIYW5kbGVyRW1pdC5lbWl0KGV2ZW50KVxuICAgICAgfVxuICAgIH1cbn0iLCI8IS0tIEFQIDIySkFOMjUgLSBmb3JtIHByZXZpZXcgYW5kIEFsbCBmb3JtIGVsZW1lbnRzIC0tPlxuPCEtLSBBUCAyNUZFQjI1IC0gQWxsIGVsZW1lbnRzIHVwZGF0ZSAtLT5cbjxkaXYgY2xhc3M9XCJmb3JtLWNvbnRhaW5lclwiIFtuZ0NsYXNzXT1cInsnaXNQcmV2aWV3JzogaXNQcmV2aWV3fVwiPlxuICA8ZGl2IGNsYXNzPVwiY2VudGVyLWZyYW1lXCIgW25nQ2xhc3NdPVwieydpc1ByZXZpZXcnOiBpc1ByZXZpZXd9XCI+XG4gICAgPCEtLSBGb3JtIEJ1aWxkZXIgU2VjdGlvbiBBbGwgRWxlbWVudHMgLS0+XG4gICAgPGRpdiAqbmdJZj1cIiFpc1ByZXZpZXdcIiBjbGFzcz1cImZvcm0tYnVpbGRlclwiPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbGVtZW50IG9mIGVsZW1lbnRzTGlzdFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZWxlbWVudFwiIFtjbGFzcy5kaXNhYmxlZF09XCJpc0VsZW1lbnREaXNhYmxlZChlbGVtZW50LnR5cGUpXCJcbiAgICAgICAgICAoY2xpY2spPVwiIWlzRWxlbWVudERpc2FibGVkKGVsZW1lbnQudHlwZSkgJiYgYWRkRWxlbWVudChlbGVtZW50LnR5cGUpXCJcbiAgICAgICAgICBbZHJhZ2dhYmxlXT1cIiFpc0VsZW1lbnREaXNhYmxlZChlbGVtZW50LnR5cGUpXCJcbiAgICAgICAgICBbbWF0VG9vbHRpcF09XCJpc0VsZW1lbnREaXNhYmxlZChlbGVtZW50LnR5cGUpID8gJ1RoaXMgZWxlbWVudCBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gYSAnICsgKHNlbGVjdGVkRWxlbWVudD8udHlwZSB8fCAnY2VydGFpbiBlbGVtZW50JykgKyAnIGlzIHByZXNlbnQnIDogbnVsbFwiPlxuICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL3t7IGVsZW1lbnQuaW1nIH19LnN2Z1wiIGNsYXNzPVwiZWxlbWVudC1pY29uXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImhvdmVyLWxhYmVsXCI+e3sgZWxlbWVudC5sYWJlbCB9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcmFnLWRvdHNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb3RcIiAqbmdGb3I9XCJsZXQgZG90IG9mIGRvdHNcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbjwhLS0gXG4gICAgICA8ZGl2IGNsYXNzPVwidGVtcGxhdGUtc2VjdGlvblwiPlxuICAgICAgICA8YXBwLXRlbXBsYXRlcyAodGVtcGxhdGVTZWxlY3RlZCk9XCJvblRlbXBsYXRlU2VsZWN0ZWQoJGV2ZW50KVwiPjwvYXBwLXRlbXBsYXRlcz5cbiAgICAgIDwvZGl2PiAtLT5cblxuICAgICAgPCEtLSBTS1MxME1BUjI1IGZvb3RlciB2ZXJzaW9uIHNob3cgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic3RpY2t5LWZvb3Rlci12ZXJzaW9uXCI+XG4gICAgICAgIHt7dmVyc2lvbn19XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIEFQLTI3TUFSMjUgUmVtb3ZlIENESyBkcmFnIGFuZCBkcm9wIHJlcGxhY2UgZHJhZ2dhYmxlIGZ1bmN0aW9uICAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1wcmV2aWV3XCI+XG4gICAgICA8IS0tIEFQLTEwTUFSMjUgSGVhZGluZyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIlxuICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlO2JhY2tncm91bmQtY29sb3I6ICNFRkY4RkY7IGJvcmRlcjogMXB4IHNvbGlkICNFNkYzRkY7bWFyZ2luLWJvdHRvbToxMHB4XCJcbiAgICAgICAgKGNsaWNrKT1cInNlbGVjdEhlYWRpbmcoJ0hlYWRlcicpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIiBzdHlsZT1cInBhZGRpbmc6IDEwcHg7IGRpc3BsYXk6IGZsZXg7anVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1wiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJwZGZcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwZGYudGl0bGUgPT0gJydcIiBzdHlsZT1cImNvbG9yOiMzZjRhNTI1Y1wiPkhlYWRpbmc8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwZGYudGl0bGUgIT09ICcnXCI+e3twZGYudGl0bGV9fTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnV0dG9uc1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG5cIiAoY2xpY2spPVwicGRmU2F2ZUhhbmRsZXIoJ3ByZXZpZXcnKVwiPlBSRVZJRVc8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgKGNsaWNrKT1cInBkZlNhdmVIYW5kbGVyKCdkb3dubG9hZCcpXCI+RE9XTkxPQUQ8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmllbGQgb2YgcGRmRWxlbWVudHM7IGxldCBpID0gaW5kZXhcIiBnZXRQcm9wZXJ0aWVzKCkuZWxlbWVudFByb3BzPlxuXG4gICAgICAgIDwhLS0gQVAtMTlNQVIyNSBMaW5lIEVsZW1lbnQgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZD8udHlwZSA9PT0gJ0xpbmUnXCIgY2xhc3M9XCJsaW5lLWZpZWxkXCIgW25nQ2xhc3NdPVwieydpc1ByZXZpZXcnOiBpc1ByZXZpZXd9XCJcbiAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpICYmICFpc1ByZXZpZXdcIlxuICAgICAgICAgIGRyYWdnYWJsZT1cInRydWUgJiYgIWlzUHJldmlld1wiIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIlxuICAgICAgICAgIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQsIGkpXCI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc1ByZXZpZXdcIiBjbGFzcz1cImxpbmUtZWxlbWVudFwiPlxuICAgICAgICAgICAgPGRpdj48L2Rpdj5cbiAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGZpZWxkLCBpKVwiIGNsYXNzPVwiZGVsZXRlLWljb25cIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxociBjbGFzcz1cImN1c3RvbS1saW5lXCIgc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmUtZmxleFwiIFtuZ1N0eWxlXT1cImdldExpbmVTdHlsZXMoZmllbGQpXCIgLz5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLVNLUzI1TUFSMjUgSW1hZ2UgVXBsb2FkIEVsZW1lbnQgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZD8udHlwZSA9PT0gJ2ltYWdlJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIlxuICAgICAgICAgIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpICYmICFpc1ByZXZpZXdcIiBkcmFnZ2FibGU9XCJ0cnVlICYmICFpc1ByZXZpZXdcIlxuICAgICAgICAgIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0Rm9udFN0eWxlcyhmaWVsZClcIiAobW91c2VlbnRlcik9XCJpc0ltYWdlSG92ZXIgPSB0cnVlO1wiXG4gICAgICAgICAgKG1vdXNlbGVhdmUpPVwiaXNJbWFnZUhvdmVyID0gZmFsc2U7XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXdyYXBwZXJcIiBbbmdDbGFzc109XCJ7J2lzUHJldmlldyc6IGlzUHJldmlld31cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNQcmV2aWV3XCIgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9kcmFnLWRvdHMuc3ZnXCIgYWx0PVwiRHJhZ1wiIGNsYXNzPVwiZHJhZy1kb3RcIiAvPlxuICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvVHJhc2guc3ZnXCIgKGNsaWNrKT1cInJlbW92ZUVsZW1lbnQoZmllbGQsIGkpXCIgY2xhc3M9XCJkZWxldGUtaWNvblwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzSW1hZ2VIb3ZlclwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBlbmQ7XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJpc1ByZXZpZXdcIiAoY2xpY2spPVwib25JbWFnZUVkaXQoZmllbGQpXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTEuMTA2NyA2LjA3MTc0TDkuOTI4MzMgNC44OTM0TDIuMTY2NjcgMTIuNjU1MVYxMy44MzM0SDMuMzQ1TDExLjEwNjcgNi4wNzE3NFpNMTIuMjg1IDQuODkzNEwxMy40NjMzIDMuNzE1MDdMMTIuMjg1IDIuNTM2NzRMMTEuMTA2NyAzLjcxNTA3TDEyLjI4NSA0Ljg5MzRaTTQuMDM1IDE1LjUwMDFIMC41VjExLjk2NDJMMTEuNjk1OCAwLjc2ODQwM0MxMS44NTIxIDAuNjEyMTc3IDEyLjA2NCAwLjUyNDQxNCAxMi4yODUgMC41MjQ0MTRDMTIuNTA2IDAuNTI0NDE0IDEyLjcxNzkgMC42MTIxNzcgMTIuODc0MiAwLjc2ODQwM0wxNS4yMzE3IDMuMTI1OUMxNS4zODc5IDMuMjgyMTggMTUuNDc1NyAzLjQ5NDEgMTUuNDc1NyAzLjcxNTA3QzE1LjQ3NTcgMy45MzYwNCAxNS4zODc5IDQuMTQ3OTYgMTUuMjMxNyA0LjMwNDI0TDQuMDM1ODMgMTUuNTAwMUg0LjAzNVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM2Qzc1N0RcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImlzUHJldmlld1wiIChjbGljayk9XCJvbkltYWdlRGVsZXRlKGZpZWxkKVwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE0IDMuOTg3MjZDMTEuNzggMy43NjcyNiA5LjU0NjY3IDMuNjUzOTMgNy4zMiAzLjY1MzkzQzYgMy42NTM5MyA0LjY4IDMuNzIwNiAzLjM2IDMuODUzOTNMMiAzLjk4NzI2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNGRjJDMTBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTUuNjY2NSAzLjMxMzYyTDUuODEzMTcgMi40NDAyOEM1LjkxOTg0IDEuODA2OTUgNS45OTk4NCAxLjMzMzYyIDcuMTI2NSAxLjMzMzYySDguODczMTdDOS45OTk4NCAxLjMzMzYyIDEwLjA4NjUgMS44MzM2MiAxMC4xODY1IDIuNDQ2OTVMMTAuMzMzMiAzLjMxMzYyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNGRjJDMTBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEyLjU2NjcgNi4wOTM3NUwxMi4xMzM0IDEyLjgwNzFDMTIuMDYgMTMuODUzNyAxMiAxNC42NjcxIDEwLjE0IDE0LjY2NzFINS44NjAwMkM0LjAwMDAyIDE0LjY2NzEgMy45NDAwMiAxMy44NTM3IDMuODY2NjggMTIuODA3MUwzLjQzMzM1IDYuMDkzNzVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0ZGMkMxMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk02Ljg4NjQ3IDExLjAwMDRIOS4xMDY0N1wiIHN0cm9rZT1cIiNGRjJDMTBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuMzMzNSA4LjMzMzI1SDkuNjY2ODNcIiBzdHJva2U9XCIjRkYyQzEwXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9nby1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZ28tcHJldmlld1wiICpuZ0lmPVwiZmllbGQuaW1hZ2VEYXRhXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImZpZWxkLmltYWdlRGF0YVwiIFxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJmaWVsZC5pbWFnZVNpemU/LndpZHRoIHx8IDEwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJmaWVsZC5pbWFnZVNpemU/LmhlaWdodCB8fCAxMDBcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWZpZWxkLmltYWdlRGF0YVwiIGNsYXNzPVwibG9nby11cGxvYWQtcGxhY2Vob2xkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibG9nby11cGxvYWQte3tpfX1cIiBjbGFzcz1cImxvZ28tdXBsb2FkLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9JbWFnZS5zdmdcIiBhbHQ9XCJVcGxvYWRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+VXBsb2FkIEltYWdlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJsb2dvLXVwbG9hZC17e2l9fVwiIGFjY2VwdD1cImltYWdlLypcIiAoY2hhbmdlKT1cImZpbGVDaGFuZ2VFdmVudChmaWVsZCwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBTcGFjZSBFbGVtZW50IC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQ/LnR5cGUgPT09ICdTcGFjZSdcIiBjbGFzcz1cImZpZWxkLWNvbnRhaW5lclwiIChjbGljayk9XCJzZWxlY3RFbGVtZW50KGkpXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRGb250U3R5bGVzKGZpZWxkKVwiIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpICYmICFpc1ByZXZpZXdcIlxuICAgICAgICAgIGRyYWdnYWJsZT1cInRydWUgJiYgIWlzUHJldmlld1wiIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIlxuICAgICAgICAgIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQsIGkpXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXdyYXBwZXJcIiBzdHlsZT1cImhlaWdodDo5M3B4XCIgW25nQ2xhc3NdPVwieydpc1ByZXZpZXcnOiBpc1ByZXZpZXd9XCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzUHJldmlld1wiIGNsYXNzPVwiZmllbGQtY29udGVudFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvcC1yaWdodFwiIHN0eWxlPVwibWFyZ2luOiAtMTFweCAtMTFweCAwIDA7XCI+XG4gICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9kcmFnLWRvdHMuc3ZnXCIgYWx0PVwiRHJhZ1wiIGNsYXNzPVwiZHJhZy1kb3RcIiAvPlxuICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvVHJhc2guc3ZnXCIgKGNsaWNrKT1cInJlbW92ZUVsZW1lbnQoZmllbGQsIGkpXCIgY2xhc3M9XCJkZWxldGUtaWNvblwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gVGV4dEFyZWEgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZD8udHlwZSA9PT0gJ3RleHQnXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0Rm9udFN0eWxlcyhmaWVsZClcIiBbY2xhc3MuaGlnaGxpZ2h0XT1cInNlbGVjdGVkRmllbGRJbmRleCA9PT0gaSAmJiAhaXNQcmV2aWV3XCJcbiAgICAgICAgICBkcmFnZ2FibGU9XCJ0cnVlICYmICFpc1ByZXZpZXdcIiAoZHJhZ3N0YXJ0KT1cIm9uRHJhZ1N0YXJ0KCRldmVudCwgaSlcIiAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQsIGkpXCJcbiAgICAgICAgICAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCIgW25nQ2xhc3NdPVwieydpc1ByZXZpZXcnOiBpc1ByZXZpZXd9XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtY29udGVudFwiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzUHJldmlld1wiIGNsYXNzPVwibGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvcC1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvZHJhZy1kb3RzLnN2Z1wiIGFsdD1cIkRyYWdcIiBjbGFzcz1cImRyYWctZG90XCIgLz5cblxuICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvVHJhc2guc3ZnXCIgKGNsaWNrKT1cInJlbW92ZUVsZW1lbnQoZmllbGQsIGkpXCIgY2xhc3M9XCJkZWxldGUtaWNvblwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJjdXN0b20tdGV4dGFyZWFcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0VudGVyIGRldGFpbGVkIHRleHQgaGVyZS4uLidcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiZmllbGQudmFsdWU/IGZpZWxkLnZhbHVlIDogJydcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25UZXh0QXJlYUlucHV0KCRldmVudCwgZmllbGQpXCJcbiAgICAgICAgICAgICAgI2F1dG9UZXh0YXJlYVxuICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImlzUHJldmlldyA/IDQwIDogbnVsbFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvcGVuVGV4dFNldHRpbmdzKGZpZWxkLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlQ29udGVudCgpXCIgXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgICAgICAgICAnZm9udC1zaXplJzogZmllbGQuc3R5bGUuZm9udFNpemVcbiAgICAgICAgICAgICAgICAgID8gZmllbGQuc3R5bGUuZm9udFNpemUgKyAncHgnXG4gICAgICAgICAgICAgICAgICA6ICcxNHB4JyxcbiAgICAgICAgICAgICAgICAnZm9udC13ZWlnaHQnOiBmaWVsZC5zdHlsZS5ib2xkID8gJ2JvbGQnIDogJ25vcm1hbCcsXG4gICAgICAgICAgICAgICAgJ2ZvbnQtc3R5bGUnOiBmaWVsZC5zdHlsZS5pdGFsaWNzID8gJ2l0YWxpYycgOiAnbm9ybWFsJyxcbiAgICAgICAgICAgICAgICAndGV4dC1kZWNvcmF0aW9uJzogZmllbGQuc3R5bGUuZGVjb3JhdGlvbiA/ICdkZWNvcmF0aW9uJyA6ICdub25lJyxcbiAgICAgICAgICAgICAgICAndGV4dC1hbGlnbic6IGZpZWxkLnN0eWxlLmFsaWdubWVudCB8fCAnbGVmdCcsXG4gICAgICAgICAgICAgICAgIG1hcmdpbjogZmllbGQuc3R5bGUubWFyZ2luID8gZ2V0TWFyZ2luU3R5bGUoZmllbGQuc3R5bGUubWFyZ2luKSA6ICcwJyxcbiAgICAgICAgICAgICAgICAgY29sb3I6IGZpZWxkLnN0eWxlLmNvbG9yIHx8ICcjMDAwJyxcbiAgICAgICAgICAgICAgfVwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tQVAtMDVKVU4yNSBUZXh0IFNldHRpbmdzIFRvb2xiYXI6IEFsbG93cyBlZGl0aW5nIGZvbnQgc2l6ZSwgYm9sZC9pdGFsaWMgc3R5bGVzLCBhbGlnbm1lbnQsIGFuZCBjbG9zaW5nIHRoZSB0b29sYmFyIGZvciB0aGUgc2VsZWN0ZWQgY29sdW1uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dUZXh0U2V0dGluZ3MgJiYgaXNQcmV2aWV3ICYmIHNlbGVjdGVkQ29sdW1uID09PSBmaWVsZFwiIGNsYXNzPVwidGV4dC1zZXR0aW5ncy10b29sYmFyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICcjZmZmJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkICNjY2MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAnNnB4IDEwcHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYm9yZGVyLXJhZGl1cyc6ICc0cHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYm94LXNoYWRvdyc6ICcwIDJweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3otaW5kZXgnOiAnNjU1MzUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbGlnbi1pdGVtcyc6ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXA6ICc4cHgnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvbnQgU2l6ZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgWyhuZ01vZGVsKV09XCJzZWxlY3RlZENvbHVtbi5zdHlsZS5mb250U2l6ZVwiIGNsYXNzPVwidG9vbGJhci1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiMTJcIj4xMnB0PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIjE0XCI+MTRwdDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCIxNlwiPjE2cHQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiMThcIj4xOHB0PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIjI0XCI+MjRwdDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUZXh0IENvbG9yIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgdGl0bGU9XCJUZXh0IENvbG9yXCIgY2xhc3M9XCJjb2xvci1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbG9yLWJveFwiIFtzdHlsZS5jb2xvcl09XCJzZWxlY3RlZENvbHVtbi5zdHlsZS5jb2xvciB8fCAnIzAwMCdcIiAoY2xpY2spPVwidGV4dENvbG9ySW5wdXQuY2xpY2soKVwiPkE8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAjdGV4dENvbG9ySW5wdXQgdHlwZT1cImNvbG9yXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZENvbHVtbi5zdHlsZS5jb2xvclwiIChjaGFuZ2UpPVwidXBkYXRlQ29udGVudCgpXCIgY2xhc3M9XCJjb2xvci1waWNrZXItaGlkZGVuXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEJvbGQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJ0b2dnbGVTdHlsZSgnYm9sZCcpXCIgW2NsYXNzLmFjdGl2ZV09XCJzZWxlY3RlZENvbHVtbj8uc3R5bGU/LmJvbGRcIiBjbGFzcz1cInRvb2xiYXItYnRuXCI+QjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJdGFsaWMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJ0b2dnbGVTdHlsZSgnaXRhbGljJylcIiBbY2xhc3MuYWN0aXZlXT1cInNlbGVjdGVkQ29sdW1uPy5zdHlsZT8uaXRhbGljc1wiIGNsYXNzPVwidG9vbGJhci1idG5cIj48aT5JPC9pPjwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFVuZGVybGluZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGJ1dHRvbiAoY2xpY2spPVwidG9nZ2xlU3R5bGUoJ3VuZGVybGluZScpXCIgW2NsYXNzLmFjdGl2ZV09XCJzZWxlY3RlZENvbHVtbj8uc3R5bGU/LnVuZGVybGluZVwiIGNsYXNzPVwidG9vbGJhci1idG5cIj48dT5VPC91PjwvYnV0dG9uPiAtLT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBbGlnbiBMZWZ0IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwic2V0QWxpZ25tZW50KCdsZWZ0JylcIiBbY2xhc3MuYWN0aXZlXT1cInNlbGVjdGVkQ29sdW1uPy5zdHlsZT8uYWxpZ25tZW50ID09PSAnbGVmdCdcIiBjbGFzcz1cInRvb2xiYXItYnRuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnNcIj5mb3JtYXRfYWxpZ25fbGVmdDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBbGlnbiBDZW50ZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJzZXRBbGlnbm1lbnQoJ2NlbnRlcicpXCIgW2NsYXNzLmFjdGl2ZV09XCJzZWxlY3RlZENvbHVtbj8uc3R5bGU/LmFsaWdubWVudCA9PT0gJ2NlbnRlcidcIiBjbGFzcz1cInRvb2xiYXItYnRuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnNcIj5mb3JtYXRfYWxpZ25fY2VudGVyPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFsaWduIFJpZ2h0IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwic2V0QWxpZ25tZW50KCdyaWdodCcpXCIgW2NsYXNzLmFjdGl2ZV09XCJzZWxlY3RlZENvbHVtbj8uc3R5bGU/LmFsaWdubWVudCA9PT0gJ3JpZ2h0J1wiIGNsYXNzPVwidG9vbGJhci1idG5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiPmZvcm1hdF9hbGlnbl9yaWdodDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDbG9zZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImNsb3NlVGV4dFNldHRpbmdzKClcIiBjbGFzcz1cInRvb2xiYXItYnRuXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogYXV0bztcIj7inJU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gSW5wdXQgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZD8udHlwZSA9PT0gJ2lucHV0J1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldEZvbnRTdHlsZXMoZmllbGQpXCIgW2NsYXNzLmhpZ2hsaWdodF09XCJzZWxlY3RlZEZpZWxkSW5kZXggPT09IGkgJiYgIWlzUHJldmlld1wiXG4gICAgICAgICAgZHJhZ2dhYmxlPVwidHJ1ZSAmJiAhaXNQcmV2aWV3XCIgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIGkpXCIgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgKGRyb3ApPVwib25Ecm9wKCRldmVudCwgaSlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiIFtuZ0NsYXNzXT1cInsnaXNQcmV2aWV3JzogaXNQcmV2aWV3fVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc1ByZXZpZXdcIiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL2RyYWctZG90cy5zdmdcIiBhbHQ9XCJEcmFnXCIgY2xhc3M9XCJkcmFnLWRvdFwiIC8+XG4gICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwhLS0gQVAtMDRKVU4yNSAtIHJlcGxhY2UgYXBwLWN1c3RvbS1pbnB1dCAtLT5cbiAgICAgICAgICAgICAgPG54dC1pbnB1dCBbdHlwZV09XCIndGV4dCdcIiBbbW9kZV09XCInZWRpdCdcIiBbdmFsdWVdPVwiZmllbGQudmFsdWVcIiBbcXVlc3Rpb25dPVwiXCIgW2xhYmVsRm9udF09XCJcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZD8ucXVlc3Rpb25UZXh0XCIgW2xhYmVsQ29sb3JdPVwiXCIgW2xhYmVsU2l6ZV09XCJcIiBbaW5wdXRWYWx1ZVNpemVdPVwiXCIgW2xhYmVsV2VpZ2h0XT1cIlwiXG4gICAgICAgICAgICAgICAgW2lucHV0V2VpZ2h0XT1cIlwiIFtzaG93TGFiZWxdPVwiXCIgaW5wdXRCb3JkZXI9XCJub25lXCIgc3ZnSGVpZ2h0PVwiMjBweFwiIHN2Z1dpZHRoPVwiMjBweFwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnF1ZXN0aW9uID8gZmllbGQucXVlc3Rpb24gOiAnRW50ZXIgeW91ciBpbnB1dCdcIiBbcmVxdWlyZWRdPVwiXCJcbiAgICAgICAgICAgICAgICBpbnB1dEJnQ29sb3I9XCIjRjVGNUY1XCIgW2lucHV0SWRdPVwiXCIgW2Vycm9yTWVzc2FnZXNdPVwieyByZXF1aXJlZDogJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQnIH1cIlxuICAgICAgICAgICAgICAgIFtpbnB1dEljb25MZWZ0U3JjXT1cIicnXCIgKGlucHV0VmFsdWUpPVwib25RdWVzdGlvbkNoYW5nZSgkZXZlbnQsIGZpZWxkKVwiPlxuICAgICAgICAgICAgICA8L254dC1pbnB1dD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIERhdGUgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZD8udHlwZSA9PT0gJ2RhdGUnXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0Rm9udFN0eWxlcyhmaWVsZClcIiBbY2xhc3MuaGlnaGxpZ2h0XT1cInNlbGVjdGVkRmllbGRJbmRleCA9PT0gaSAmJiAhaXNQcmV2aWV3XCJcbiAgICAgICAgICBkcmFnZ2FibGU9XCJ0cnVlICYmICFpc1ByZXZpZXdcIiAoZHJhZ3N0YXJ0KT1cIm9uRHJhZ1N0YXJ0KCRldmVudCwgaSlcIiAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQsIGkpXCJcbiAgICAgICAgICAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCIgW25nQ2xhc3NdPVwieydpc1ByZXZpZXcnOiBpc1ByZXZpZXd9XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtY29udGVudFwiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzUHJldmlld1wiIGNsYXNzPVwibGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvcC1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvZHJhZy1kb3RzLnN2Z1wiIGFsdD1cIkRyYWdcIiBjbGFzcz1cImRyYWctZG90XCIgLz5cbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGZpZWxkLCBpKVwiIGNsYXNzPVwiZGVsZXRlLWljb25cIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPCEtLSBBUC0wNEpVTjI1IC0gcmVwbGFjZSBjdXN0b20gZGF0ZSBwaWNrZXIgLS0+XG4gICAgICAgICAgICAgIDxueHQtaW5wdXQgW3R5cGVdPVwiJ2RhdGUnXCIgW21vZGVdPVwiJ2VkaXQnXCIgW3ZhbHVlXT1cImZpZWxkLnZhbHVlXCIgW3F1ZXN0aW9uXT1cIlwiIFtsYWJlbEZvbnRdPVwiXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQ/LnF1ZXN0aW9uVGV4dFwiIFtsYWJlbENvbG9yXT1cIlwiIFtsYWJlbFNpemVdPVwiXCIgW2lucHV0VmFsdWVTaXplXT1cIlwiIFtsYWJlbFdlaWdodF09XCJcIlxuICAgICAgICAgICAgICAgIFtpbnB1dFdlaWdodF09XCJcIiBbc2hvd0xhYmVsXT1cIlwiIGlucHV0Qm9yZGVyPVwibm9uZVwiIHN2Z0hlaWdodD1cIjIwcHhcIiBzdmdXaWR0aD1cIjIwcHhcIlxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5xdWVzdGlvbiA/IGZpZWxkLnF1ZXN0aW9uIDogJ0VudGVyIHlvdXIgaW5wdXQnXCIgW3JlcXVpcmVkXT1cIlwiXG4gICAgICAgICAgICAgICAgaW5wdXRCZ0NvbG9yPVwiI0Y1RjVGNVwiIFtpbnB1dElkXT1cIlwiIFtlcnJvck1lc3NhZ2VzXT1cInsgcmVxdWlyZWQ6ICdUaGlzIGZpZWxkIGlzIHJlcXVpcmVkJyB9XCJcbiAgICAgICAgICAgICAgICBbaW5wdXRJY29uTGVmdFNyY109XCInJ1wiIChpbnB1dFZhbHVlKT1cIm9uUXVlc3Rpb25DaGFuZ2UoJGV2ZW50LCBmaWVsZClcIj5cbiAgICAgICAgICAgICAgPC9ueHQtaW5wdXQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBQZGYgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZD8udHlwZSA9PT0gJ1BkZidcIiBjbGFzcz1cImZpZWxkLWNvbnRhaW5lclwiIChjbGljayk9XCJzZWxlY3RFbGVtZW50KGkpXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRGb250U3R5bGVzKGZpZWxkKVwiIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpICYmICFpc1ByZXZpZXdcIlxuICAgICAgICAgIGRyYWdnYWJsZT1cInRydWUgJiYgIWlzUHJldmlld1wiIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIlxuICAgICAgICAgIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQsIGkpXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXdyYXBwZXJcIiBbbmdDbGFzc109XCJ7J2lzUHJldmlldyc6IGlzUHJldmlld31cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNQcmV2aWV3XCIgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9kcmFnLWRvdHMuc3ZnXCIgYWx0PVwiRHJhZ1wiIGNsYXNzPVwiZHJhZy1kb3RcIiAvPlxuICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvVHJhc2guc3ZnXCIgKGNsaWNrKT1cInJlbW92ZUVsZW1lbnQoZmllbGQsIGkpXCIgY2xhc3M9XCJkZWxldGUtaWNvblwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8IS0tIDxsaWItYm9va2xldCBbYm9va2xldEpTT05dPVwiZmllbGQucGRmUmVmZXJlbmNlUXVlc3Rpb25zXCI+PC9saWItYm9va2xldD4gLS0+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZD8ucGRmUmVmZXJlbmNlUXVlc3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZmllbGQ/LnBkZlJlZmVyZW5jZVF1ZXN0aW9uc1tmaWVsZD8ucGRmUmVmZXJlbmNlXTsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgPCEtLSBBUC0xOU1BUjI1IExpbmUgRWxlbWVudCAtLT5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZD8udHlwZSA9PT0gJ0xpbmUnXCIgY2xhc3M9XCJsaW5lLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxociBjbGFzcz1cImN1c3RvbS1saW5lXCIgc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmUtZmxleFwiIFtuZ1N0eWxlXT1cImdldExpbmVTdHlsZXMoZmllbGQpXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQ/LnR5cGUgPT09ICdpbWFnZSdcIiBjbGFzcz1cImZpZWxkLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiIFtuZ0NsYXNzXT1cInsnaXNQcmV2aWV3JzogaXNQcmV2aWV3fVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9nby1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIExvZ28gcHJldmlldyBhcmVhIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2dvLXByZXZpZXdcIiAqbmdJZj1cImZpZWxkLmltYWdlRGF0YVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImZpZWxkLmltYWdlRGF0YVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFVwbG9hZCBidXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFmaWVsZC5pbWFnZURhdGFcIiBjbGFzcz1cImxvZ28tdXBsb2FkLXBsYWNlaG9sZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibG9nby11cGxvYWQte3tpfX1cIiBjbGFzcz1cImxvZ28tdXBsb2FkLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL0ltYWdlLnN2Z1wiIGFsdD1cIlVwbG9hZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlVwbG9hZCBJbWFnZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBpZD1cImxvZ28tdXBsb2FkLXt7aX19XCIgYWNjZXB0PVwiaW1hZ2UvKlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiZmlsZUNoYW5nZUV2ZW50KGZpZWxkLCAkZXZlbnQpXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQ/LnR5cGUgPT09ICdTcGFjZSdcIiBjbGFzcz1cImZpZWxkLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiIHN0eWxlPVwiaGVpZ2h0OjkzcHhcIiBbbmdDbGFzc109XCJ7J2lzUHJldmlldyc6IGlzUHJldmlld31cIj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZD8udHlwZSA9PT0gJ3RleHQnXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXdyYXBwZXJcIiBbbmdDbGFzc109XCJ7J2lzUHJldmlldyc6IGlzUHJldmlld31cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiY3VzdG9tLXRleHRhcmVhXCIgW3BsYWNlaG9sZGVyXT1cIidFbnRlciBkZXRhaWxlZCB0ZXh0IGhlcmUuLi4nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJpc1ByZXZpZXcgPyA0MCA6IGZpZWxkLnNpemUgfHwgMTAwXCIgWyhuZ01vZGVsKV09XCJmaWVsZC52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25RdWVzdGlvbkNoYW5nZSgkZXZlbnQsIGZpZWxkKVwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8IS0tIEFQLTE0SlVOMjUgQWRkZWQgbnh0LWlucHV0IGluIHBkZiAtLT5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZD8udHlwZSA9PT0gJ2lucHV0J1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCIgW25nQ2xhc3NdPVwieydpc1ByZXZpZXcnOiBpc1ByZXZpZXd9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj4gXG4gICAgICAgICAgICAgICAgICAgICAgICA8bnh0LWlucHV0IFt0eXBlXT1cIid0ZXh0J1wiIFttb2RlXT1cIidlZGl0J1wiIFsobmdNb2RlbCldPVwiZmllbGQudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0VudGVyIHlvdXIgaW5wdXQnXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25RdWVzdGlvbkNoYW5nZSgkZXZlbnQsIGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9ueHQtaW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8IS0tIEFQLTA2TUFSMjUgLS0+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQ/LnR5cGUgPT09ICdUYWJsZSdcIiBjbGFzcz1cImZpZWxkLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiIHN0eWxlPVwib3ZlcmZsb3c6IGhpZGRlbjtcIiBbbmdDbGFzc109XCJ7J2lzUHJldmlldyc6IGlzUHJldmlld31cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm54dC10YWJsZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG54dC1kYXRhdGFibGUgaXNCdXR0b25zIFtxdWVzdGlvbl09XCJmaWVsZFwiIGZyb209XCJmb3JtQnVpbGRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vZGVdPVwiaXNQcmV2aWV3ID8gJ3ZpZXcnIDogJ2VkaXQnXCIgW2FwaU1ldGFdPVwiZmllbGQ/LnN1YlRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0YWJsZUNvbmZpZ109XCJmaWVsZC50YWJsZUNvbmZpZ1wiIHRhYmxlSWQ9XCJcIiBkaXJlY3Rpb249XCJsdHJcIiB0YWJsZVdpZHRoPVwiYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uUXVlc3Rpb25DaGFuZ2UoJGV2ZW50LCBmaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImZpZWxkLnZhbHVlPy5kYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0VkaXRhYmxlPXRydWUgKGNvbHVtblNlbGVjdGVkKT1jb2x1bW5TZWxlY3RlZCgkZXZlbnQpIChyZW1vdmVDb2x1bW4pPXJlbW92ZUNvbHVtbigkZXZlbnQpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L254dC1kYXRhdGFibGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSAgVGFibGUgIC0tPlxuICAgICAgICA8IS0tIEFQLTA2TUFSMjUgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZD8udHlwZSA9PT0gJ1RhYmxlJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldEZvbnRTdHlsZXMoZmllbGQpXCIgW2NsYXNzLmhpZ2hsaWdodF09XCJzZWxlY3RlZEZpZWxkSW5kZXggPT09IGkgJiYgIWlzUHJldmlld1wiXG4gICAgICAgICAgZHJhZ2dhYmxlPVwidHJ1ZSAmJiAhaXNQcmV2aWV3XCIgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIGkpXCIgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgKGRyb3ApPVwib25Ecm9wKCRldmVudCwgaSlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiIHN0eWxlPVwib3ZlcmZsb3c6IGhpZGRlbjtcIiBbbmdDbGFzc109XCJ7J2lzUHJldmlldyc6IGlzUHJldmlld31cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNQcmV2aWV3XCIgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9kcmFnLWRvdHMuc3ZnXCIgYWx0PVwiRHJhZ1wiIGNsYXNzPVwiZHJhZy1kb3RcIiAvPlxuICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvVHJhc2guc3ZnXCIgKGNsaWNrKT1cInJlbW92ZUVsZW1lbnQoZmllbGQsIGkpXCIgY2xhc3M9XCJkZWxldGUtaWNvblwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibnh0LXRhYmxlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxueHQtZGF0YXRhYmxlIGlzQnV0dG9ucyBbcXVlc3Rpb25dPVwiZmllbGRcIiBmcm9tPVwiZm9ybUJ1aWxkZXJcIiBbbW9kZV09XCJpc1ByZXZpZXcgPyAndmlldycgOiAnZWRpdCdcIlxuICAgICAgICAgICAgICAgICAgW2FwaU1ldGFdPVwiZmllbGQ/LnN1YlRleHRcIiBbdGFibGVDb25maWddPVwiZmllbGQudGFibGVDb25maWdcIiB0YWJsZUlkPVwiXCIgZGlyZWN0aW9uPVwibHRyXCJcbiAgICAgICAgICAgICAgICAgIHRhYmxlV2lkdGg9XCJhdXRvXCIgaXNFZGl0YWJsZT10cnVlIChjb2x1bW5TZWxlY3RlZCk9Y29sdW1uU2VsZWN0ZWQoJGV2ZW50KVxuICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiZmllbGQudmFsdWU/LmRhdGFcIlxuICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uUXVlc3Rpb25DaGFuZ2UoJGV2ZW50LCBmaWVsZClcIlxuICAgICAgICAgICAgICAgICAgKHJlbW92ZUNvbHVtbik9cmVtb3ZlQ29sdW1uKCRldmVudCk+XG4gICAgICAgICAgICAgICAgPC9ueHQtZGF0YXRhYmxlPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8IS0tIFNLUzEzTUFSMjUgcG9wdXAgY29uZm9ybWF0aW9uIGJveCAtLT5cbiAgPGRpdiBjbGFzcz1cImRpYWxvZy1vdmVybGF5XCIgKm5nSWY9XCJpc1NlbGVjdFRhYmxlUG9wdXBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWJveFwiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImNsb3NlLWJ0bi1mYlwiIChjbGljayk9XCJvbkNsb3NlKClcIj7inJU8L2J1dHRvbj5cbiAgICAgIDxwPlRoZXNlIGVsZW1lbnQgd2FudCB0byBhZGQgYSB0YWJsZTwvcD5cbiAgICAgIDxkaXYgY2xhc3M9XCJidXR0b24tY29udGFpbmVyLWZiXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJ5ZXMtYnRuLWZiXCIgKGNsaWNrKT1cImFkZE9uVGFibGUoKVwiPlllczwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwibm8tYnRuLWZiXCIgKGNsaWNrKT1cIm9uQ2xvc2UoKVwiPk5vPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxhcHAtcGRmLXByb3BlcnRpZXMgKm5nSWY9XCIhaXNQcmV2aWV3XCIgKGZvcm1CdXR0b25IYW5kbGVyKT1cInBkZlNhdmVIYW5kbGVyKCRldmVudClcIj48L2FwcC1wZGYtcHJvcGVydGllcz5cbjwvZGl2PlxuPCEtLVNLUzI1TUFSMjUgTW9kYWwgT3ZlcmxheSAtLT5cbjxkaXYgY2xhc3M9XCJtb2RhbC1vdmVybGF5XCIgKm5nSWY9XCJpc0ltYWdlRWRpdFwiPlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjbG9zZS1idXR0b25cIiAoY2xpY2spPVwiY2xvc2VNb2RhbCgpXCI+w5c8L3NwYW4+XG4gICAgICA8IS0tIEltYWdlIEVkaXRvciAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZEltYWdlRWxlbWVudD8udHlwZSA9PT0gJ2ltYWdlJ1wiPlxuICAgICAgICAgIDxpbWFnZS1jcm9wcGVyICpuZ0lmPVwic2VsZWN0ZWRJbWFnZUVsZW1lbnQuaW1hZ2VEYXRhXCIgW2ltYWdlQmFzZTY0XT1cInNlbGVjdGVkSW1hZ2VFbGVtZW50Lm9yZ0ltYWdlRGF0YVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmYWxzZVwiIFthbGlnbkltYWdlXT1cImFsaWduSW1hZ2VcIiBbcm91bmRDcm9wcGVyXT1cInJvdW5kQ3JvcHBlclwiIFtiYWNrZ3JvdW5kQ29sb3JdPVwiJ3doaXRlJ1wiXG4gICAgICAgICAgICAgIGltYWdlQWx0VGV4dD1cIkFsdGVybmF0aXZlIGltYWdlIHRleHRcIiBbYWxsb3dNb3ZlSW1hZ2VdPVwiZmFsc2VcIiBbaGlkZVJlc2l6ZVNxdWFyZXNdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbY2FudmFzUm90YXRpb25dPVwiY2FudmFzUm90YXRpb25cIiBbYXNwZWN0UmF0aW9dPVwiYXNwZWN0UmF0aW9cIiBbY29udGFpbldpdGhpbkFzcGVjdFJhdGlvXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW21haW50YWluQXNwZWN0UmF0aW9dPVwiZmFsc2VcIiBbY3JvcHBlclN0YXRpY1dpZHRoXT1cImNyb3BwZXJTdGF0aWNXaWR0aFwiXG4gICAgICAgICAgICAgIFtjcm9wcGVyU3RhdGljSGVpZ2h0XT1cImNyb3BwZXJTdGF0aWNIZWlnaHRcIiBbY3JvcHBlck1pbldpZHRoXT1cImNyb3BwZXJNaW5XaWR0aFwiXG4gICAgICAgICAgICAgIFtjcm9wcGVyTWluSGVpZ2h0XT1cImNyb3BwZXJNaW5IZWlnaHRcIiBbY3JvcHBlck1heFdpZHRoXT1cImNyb3BwZXJNYXhXaWR0aFwiXG4gICAgICAgICAgICAgIFtjcm9wcGVyTWF4SGVpZ2h0XT1cImNyb3BwZXJNYXhIZWlnaHRcIiBbcmVzZXRDcm9wT25Bc3BlY3RSYXRpb0NoYW5nZV09J3RydWUnIFsoY3JvcHBlcildPVwiY3JvcHBlclwiXG4gICAgICAgICAgICAgIFsodHJhbnNmb3JtKV09XCJ0cmFuc2Zvcm1cIiBbb25seVNjYWxlRG93bl09XCJ0cnVlXCIgb3V0cHV0PVwiYmxvYlwiIGZvcm1hdD1cInBuZ1wiXG4gICAgICAgICAgICAgIChpbWFnZUNyb3BwZWQpPVwiaW1hZ2VDcm9wcGVkKCRldmVudClcIiAoY3JvcHBlclJlYWR5KT1cImNyb3BwZXJSZWFkeSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9pbWFnZS1jcm9wcGVyPlxuXG4gICAgICAgICAgPCEtLUFQLTIwSlVOMjUgLSBJbWFnZSBzaXplIGNvbnRyb2xzOiBBbGxvdyB1c2VyIHRvIG1hbnVhbGx5IGFkanVzdCB3aWR0aCBhbmQgaGVpZ2h0IHVzaW5nIHJhbmdlIHNsaWRlcnMgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkSW1hZ2VFbGVtZW50LmltYWdlRGF0YVwiIGNsYXNzPVwibWFudWFsLXNpemUtaW5wdXRzXCI+XG4gICAgICAgICAgICA8bGFiZWw+V2lkdGgge3sgc2VsZWN0ZWRJbWFnZUVsZW1lbnQuaW1hZ2VTaXplLndpZHRoIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFuZ2VcIiBtaW49XCI1MFwiIG1heD1cIjMwMFwiIHN0ZXA9XCIxXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEltYWdlRWxlbWVudC5pbWFnZVNpemUud2lkdGhcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25JbWFnZVNpemVDaGFuZ2UoKVwiIC8+XG4gICAgICAgICAgXG4gICAgICAgICAgICA8bGFiZWw+SGVpZ2h0IHt7IHNlbGVjdGVkSW1hZ2VFbGVtZW50LmltYWdlU2l6ZS5oZWlnaHQgfX08L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIG1pbj1cIjUwXCIgbWF4PVwiMzAwXCIgc3RlcD1cIjFcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkSW1hZ2VFbGVtZW50LmltYWdlU2l6ZS5oZWlnaHRcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25JbWFnZVNpemVDaGFuZ2UoKVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgXG5cbiAgICAgICAgICA8IS0tIENvbnRyb2xzIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZEltYWdlRWxlbWVudC5pbWFnZURhdGFcIiBjbGFzcz1cImNvbnRyb2xzXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwicm90YXRlTGVmdCgpXCIgdGl0bGU9XCJSb3RhdGUgTGVmdFwiPuKfsjwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cInJvdGF0ZVJpZ2h0KClcIiB0aXRsZT1cIlJvdGF0ZSBSaWdodFwiPuKfszwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cInpvb21PdXQoKVwiIHRpdGxlPVwiWm9vbSBPdXRcIj4tPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwiem9vbUluKClcIiB0aXRsZT1cIlpvb20gSW5cIj4rPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwibW92ZUxlZnQoKVwiIHRpdGxlPVwiTW92ZSBMZWZ0XCI+4oaQPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwibW92ZVJpZ2h0KClcIiB0aXRsZT1cIk1vdmUgUmlnaHRcIj7ihpI8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxvZ28taWNvblwiIChjbGljayk9XCJtb3ZlVXAoKVwiIHRpdGxlPVwiTW92ZSBVcFwiPuKGkTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cIm1vdmVEb3duKClcIiB0aXRsZT1cIk1vdmUgRG93blwiPuKGkzwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cImZsaXBIb3Jpem9udGFsKClcIiBbY2xhc3MuZW5hYmxlZF09XCJ0cmFuc2Zvcm0uZmxpcEhcIlxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCJGbGlwIEhvcml6b250YWxseVwiPuKGlDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cImZsaXBWZXJ0aWNhbCgpXCIgW2NsYXNzLmVuYWJsZWRdPVwidHJhbnNmb3JtLmZsaXBWXCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwiRmxpcCBWZXJ0aWNhbGx5XCI+4oaVPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwicmVzZXRJbWFnZSgpXCIgdGl0bGU9XCJSZXNldFwiPsOXPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
639
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLWRlc2lnbmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9wYWdlcy9wZGZEZXNpZ25lci9wZGYtZGVzaWduZXIvcGRmLWRlc2lnbmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9wYWdlcy9wZGZEZXNpZ25lci9wZGYtZGVzaWduZXIvcGRmLWRlc2lnbmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQTRCLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDM0QsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDcEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDakYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDcEYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBSTdFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFFQUFxRSxDQUFDO0FBQzVHLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQyxDQUFDLDZCQUE2QjtBQUVyRCxPQUFPLEVBQUUsc0JBQXNCLEVB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LGdCQUFnQixFQUFFLHFCQUFxQixFQUFFLFFBQVEsRUFBRSxzQkFBc0IsQ0FBQzt1RkFNaEssU0FBUztzQkFBdEMsWUFBWTt1QkFBQyxjQUFjO2dCQUNuQixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVJLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgUXVlcnlMaXN0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZFUlNJT04gfSBmcm9tICcuLi8uLi8uLi8uLi9lbnZpcm9ubWVudHMvdmVyc2lvbic7XG5pbXBvcnQgeyBQZGZQcm9wZXJ0aWVzQ29tcG9uZW50IH0gZnJvbSAnLi4vcGRmLXByb3BlcnRpZXMvcGRmLXByb3BlcnRpZXMuY29tcG9uZW50JztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE54dERhdGF0YWJsZSB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvZGF0YXRhYmxlL2RhdGF0YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQm9va2xldENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2Jvb2tsZXQvYm9va2xldC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQXBwVGVtcGxhdGVzQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYnVpbGRlci90ZW1wbGF0ZXMvdGVtcGxhdGVzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOeHRJbnB1dCB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvbnh0LWlucHV0L254dC1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSW1hZ2VUcmFuc2Zvcm0gfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL2ltYWdlLWNyb3BwZXIvaW50ZXJmYWNlcy9pbWFnZS10cmFuc2Zvcm0uaW50ZXJmYWNlJztcbmltcG9ydCB7IERpbWVuc2lvbnMgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL2ltYWdlLWNyb3BwZXIvaW50ZXJmYWNlcy9kaW1lbnNpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDcm9wcGVyUG9zaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL2ltYWdlLWNyb3BwZXIvaW50ZXJmYWNlcy9jcm9wcGVyLXBvc2l0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJbWFnZUNyb3BwZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL2ltYWdlLWNyb3BwZXIvY29tcG9uZW50L2ltYWdlLWNyb3BwZXIuY29tcG9uZW50JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7IC8vIEVuc3VyZSBsb2Rhc2ggaXMgaW5zdGFsbGVkXG5pbXBvcnQgeyBQZGZEZXNpZ25lclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9wZGYtZGVzaWduZXIvcGRmLWRlc2lnbmVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTnh0Q3VzdG9tVHJhbnNsYXRlUGlwZSB9IGZyb20gJy4uLy4uLy4uL3BpcGUvY3VzdG9tLXRyYW5zbGF0ZS5waXBlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXBkZi1kZXNpZ25lcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEltYWdlQ3JvcHBlckNvbXBvbmVudCwgUGRmUHJvcGVydGllc0NvbXBvbmVudCwgTWF0VG9vbHRpcE1vZHVsZSwgRm9ybXNNb2R1bGUsIE54dERhdGF0YWJsZSwgQm9va2xldENvbXBvbmVudCwgQXBwVGVtcGxhdGVzQ29tcG9uZW50LCBOeHRJbnB1dCwgTnh0Q3VzdG9tVHJhbnNsYXRlUGlwZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9wZGYtZGVzaWduZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wZGYtZGVzaWduZXIuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIFBkZkRlc2lnbmVyQ29tcG9uZW50IHtcbiAgLy9AT3V0cHV0KCkgZWxlbWVudEJ1dHRvbkNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQFZpZXdDaGlsZHJlbignYXV0b1RleHRhcmVhJykgdGV4dGFyZWFzITogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBASW5wdXQoKSBwZGZKU09OOiBhbnk7XG4gIEBJbnB1dCgpIGJvb2tsZXRJZDogYW55O1xuICBASW5wdXQoKSBpc1ByZXZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgcGRmU2F2ZUhhbmRsZXJFbWl0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSB0ZW1wbGF0ZU1vZGUgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBwZGZQcmV2aWV3RW1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBmaWVsZDogYW55O1xuICBwZGZFbGVtZW50czogYW55W10gPSBbXTtcbiAgZWxlbWVudHM6IGFueVtdID0gW107XG4gIGJvb2tJZDogc3RyaW5nO1xuICBzZWN0aW9ucyA9IHtcbiAgICBiYXNpYzogdHJ1ZSxcbiAgICBhZHZhbmNlZDogdHJ1ZVxuICB9O1xuICBlbGVtZW50c0xpc3Q6IGFueVtdID0gW107XG4gIGVsZW1lbnREaXNhYmxlZEFycmF5OiBhbnk7XG4gIHZlcnNpb24gPSBWRVJTSU9OLnZlcnNpb247XG4gIHBkZjogYW55O1xuICBzZWxlY3RlZEVsZW1lbnQ6IGFueSA9IG51bGw7XG4gIGlzU2VsZWN0VGFibGVQb3B1cDogYm9vbGVhbiA9IGZhbHNlO1xuICBjdXJyZW50VHlwZTogc3RyaW5nO1xuICBhZGRUYWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIGRvdHMgPSBBcnJheSg2KTtcbiAgZHJhZ2dlZEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgdGVtcGxhdGVTZWxlY3RlZCA9IGZhbHNlO1xuICBpc0ltYWdlRWRpdDogYm9vbGVhbiA9IGZhbHNlO1xuICBzZWxlY3RlZEltYWdlRWxlbWVudDogYW55O1xuICB0cmFuc2Zvcm06IEltYWdlVHJhbnNmb3JtID0ge1xuICAgIHRyYW5zbGF0ZVVuaXQ6ICdweCcsXG4gICAgc2NhbGU6IDEsXG4gICAgcm90YXRlOiAwLFxuICAgIGZsaXBIOiBmYWxzZSxcbiAgICBmbGlwVjogZmFsc2UsXG4gICAgdHJhbnNsYXRlSDogMCxcbiAgICB0cmFuc2xhdGVWOiAwXG4gIH07XG4gIGxvYWRpbmcgPSBmYWxzZTtcbiAgY2FudmFzUm90YXRpb24gPSAwO1xuICBjcm9wcGVyPzogQ3JvcHBlclBvc2l0aW9uO1xuICBjcm9wcGVyTWF4SGVpZ2h0ID0gMDtcbiAgY3JvcHBlck1heFdpZHRoID0gMDtcbiAgY3JvcHBlck1pbkhlaWdodCA9IDA7XG4gIGNyb3BwZXJNaW5XaWR0aCA9IDA7XG4gIGNyb3BwZXJTdGF0aWNXaWR0aCA9IDA7XG4gIGNyb3BwZXJTdGF0aWNIZWlnaHQgPSAwO1xuICBhc3BlY3RSYXRpbyA9IDQgLyAzO1xuICByb3VuZENyb3BwZXIgPSBmYWxzZTtcbiAgaXNJbWFnZUhvdmVyID0gZmFsc2U7XG4gIGFsaWduSW1hZ2UgPSAnY2VudGVyJyBhcyBjb25zdDtcbiAgc2hvd1RleHRTZXR0aW5ncyA9IGZhbHNlO1xuICBzZWxlY3RlZENvbHVtbjogYW55ID0gbnVsbDtcbiAgXG5cbiAgLy9zdWJzY3JpcHRpb246IGFueTtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBwZGZEZXNpZ25lclNlcnZpY2U6IFBkZkRlc2lnbmVyU2VydmljZSkge1xuICB9XG4gIC8vQVAtMTRKVU4yNSAtIENhbGxlZCBhZnRlciB2aWV3IGluaXRpYWxpemF0aW9uIHRvIGF1dG8tcmVzaXplIGFsbCB0ZXh0YXJlYXNcbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMucmVzaXplQWxsVGV4dGFyZWFzKCk7XG4gIH1cblxuICAvL0FQLTE0SlVOMjUgLSBDYWxjdWxhdGVzIGNvbnRyYXN0IHRleHQgY29sb3IgKGJsYWNrIG9yIHdoaXRlKSBiYXNlZCBvbiBiYWNrZ3JvdW5kIGNvbG9yXG4gIGdldENvbnRyYXN0Q29sb3IoYmdDb2xvcjogc3RyaW5nID0gJyMwMDAwMDAnKTogc3RyaW5nIHtcbiAgICAvLyBDb252ZXJ0IGhleCB0byBSR0JcbiAgICBjb25zdCBjb2xvciA9IGJnQ29sb3IucmVwbGFjZSgnIycsICcnKTtcbiAgICBjb25zdCByID0gcGFyc2VJbnQoY29sb3Iuc3Vic3RyaW5nKDAsIDIpLCAxNik7XG4gICAgY29uc3QgZyA9IHBhcnNlSW50KGNvbG9yLnN1YnN0cmluZygyLCA0KSwgMTYpO1xuICAgIGNvbnN0IGIgPSBwYXJzZUludChjb2xvci5zdWJzdHJpbmcoNCwgNiksIDE2KTtcbiAgICBjb25zdCBicmlnaHRuZXNzID0gKHIgKiAyOTkgKyBnICogNTg3ICsgYiAqIDExNCkgLyAxMDAwO1xuICAgIHJldHVybiBicmlnaHRuZXNzID4gMTI4ID8gJyMwMDAwMDAnIDogJyNmZmZmZmYnO1xuICB9XG5cbiAgLy9BUC0xNEpVTjI1IC0gQXV0b21hdGljYWxseSByZXNpemVzIGFsbCB0ZXh0YXJlYXMgYmFzZWQgb24gdGhlaXIgY29udGVudFxuICByZXNpemVBbGxUZXh0YXJlYXMoKTogdm9pZCB7XG4gICAgdGhpcy50ZXh0YXJlYXMuZm9yRWFjaCgodGV4dGFyZWFSZWY6IEVsZW1lbnRSZWYpID0+IHtcbiAgICAgIGNvbnN0IHRleHRhcmVhID0gdGV4dGFyZWFSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50O1xuICAgICAgdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuICAgICAgdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gdGV4dGFyZWEuc2Nyb2xsSGVpZ2h0ICsgJ3B4JztcbiAgICB9KTtcbiAgfVxuICBcbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5lbGVtZW50c0xpc3QgPSBbXG4gICAgICB7IFwidHlwZVwiOiBcInRleHRcIiwgXCJpbWdcIjogXCJUZXh0QXJlYVwiLCBcImxhYmVsXCI6IFwiVGV4dFwiIH0sXG4gICAgICB7IFwidHlwZVwiOiBcImlucHV0XCIsIFwiaW1nXCI6IFwiVGV4dFwiLCBcImxhYmVsXCI6IFwiSW5wdXRcIiB9LFxuICAgICAgeyBcInR5cGVcIjogXCJkYXRlXCIsIFwiaW1nXCI6IFwiRGF0ZVwiLCBcImxhYmVsXCI6IFwiRGF0ZVwiIH0sXG4gICAgICB7IFwidHlwZVwiOiBcImltYWdlXCIsIFwiaW1nXCI6IFwiSW1hZ2VcIiwgXCJsYWJlbFwiOiBcIkltYWdlXCIgfSxcbiAgICAgIHsgXCJ0eXBlXCI6IFwiTGluZVwiLCBcImltZ1wiOiBcImxpbmVcIiwgXCJsYWJlbFwiOiBcIkxpbmVcIiB9LFxuICAgICAgeyBcInR5cGVcIjogXCJTcGFjZVwiLCBcImltZ1wiOiBcInNwYWNlXCIsIFwibGFiZWxcIjogXCJTcGFjZVwiIH0sXG4gICAgICB7IFwidHlwZVwiOiBcIlRhYmxlXCIsIFwiaW1nXCI6IFwiVGFibGVcIiwgXCJsYWJlbFwiOiBcIlRhYmxlXCIgfSxcbiAgICAgIHsgXCJ0eXBlXCI6IFwiUGRmXCIsIFwiaW1nXCI6IFwiU2VhcmNoXCIsIFwibGFiZWxcIjogXCJCb29rXCIgfSxcbiAgICBdO1xuICAgIHRoaXMuZWxlbWVudERpc2FibGVkQXJyYXkgPSB7XG4gICAgICBUYWJsZTogW1xuICAgICAgICAnUGRmJywgJ0NhbGVuZGFyJywgXCJCb29sZWFuXCIsICdMaXN0JywgJ1RhYmxlJywgJ0NoZWNrYm94JywgJ1JhZGlvJyxcbiAgICAgICAgJ0Ryb3Bkb3duJywgJ1JpY2hUZXh0QXJlYScsICdOdW1iZXInLCAnTGFiZWwnLCAnaW1hZ2UnLFxuICAgICAgICAnRW1haWwnLCAnRGF0ZScsICdUaW1lJywgJ0RhdGVUaW1lJywgJ0xpbmUnLCAnU3BhY2UnXG4gICAgICBdXG4gICAgfTtcbiAgICBpZiAoIXRoaXMuaXNQcmV2aWV3KSB7XG4gICAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5wZGZFbGVtZW50cyQuc3Vic2NyaWJlKGVsZW1lbnRzID0+IHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5wZGZFbGVtZW50cyA9IGVsZW1lbnRzLm1hcChmaWVsZCA9PiAoeyAuLi5maWVsZCB9KSk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnBkZkpTT04gJiYgKHRoaXMucGRmSlNPTiAhPT0gJycpKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVGb3JtKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLm5ld0Jvb2soKVxuICAgIH1cbiAgICAvLyBBUC0xMk1BUjI1IC0gQWRkZWQgdG8gaGFuZGxlIGJvb2tsZXRJZFxuICAgIGlmICh0aGlzLmJvb2tsZXRJZCkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3VuaXF1ZV9pZCcsIHRoaXMuYm9va2xldElkKTtcblxuICAgIH1cbiAgICB0aGlzLnBkZiA9IHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmdldEJvb2soKTtcbiAgICBpZiAoIXRoaXMuaXNQcmV2aWV3KSB7XG4gICAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5zZWxlY3RlZEVsZW1lbnQkLnN1YnNjcmliZShpbmRleCA9PiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZ2V0RWxlbWVudHMoKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudCA9IGVsZW1lbnRzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0aGlzLnBkZkVsZW1lbnRzID0gWy4uLmVsZW1lbnRzXVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmFkZEVsZW1lbnRXaXRoSWQoKTtcbiAgfVxuXG4gIGlzU2VjdGlvbk9wZW4oc2VjdGlvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VjdGlvbnNbc2VjdGlvbl07XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXNbJ3BkZkpTT04nXSAmJiBjaGFuZ2VzWydwZGZKU09OJ10uY3VycmVudFZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5wZGZKU09OICYmICh0aGlzLnBkZkpTT04gIT09ICcnKSkge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVGb3JtKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5uZXdCb29rKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvblRlbXBsYXRlU2VsZWN0ZWQoZXZlbnQ6IHsgc2VsZWN0ZWRUZW1wbGF0ZTogYW55OyBlbGVtZW50czogYW55W10gfSkge1xuICAgIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmNsZWFyRWxlbWVudHMoKTtcbiAgICBldmVudC5lbGVtZW50cy5mb3JFYWNoKGVsID0+IHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmFkZEVsZW1lbnQoZWwpKTtcblxuICAgIC8vIEVtaXQgdGVtcGxhdGUgbW9kZSB0byBwYXJlbnRcbiAgICB0aGlzLnRlbXBsYXRlTW9kZS5lbWl0KHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplRm9ybSgpIHtcbiAgICBpZiAoIXRoaXMucGRmSlNPTiB8fCAhdGhpcy5wZGZKU09OKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJJbnZhbGlkIHBkZkpTT04gc3RydWN0dXJlXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnBkZkVsZW1lbnRzID0gW11cbiAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5jbGVhckVsZW1lbnRzKCk7XG4gICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuaW50aWFsaXplQm9vayh0aGlzLnBkZkpTT04pO1xuICAgIHRoaXMucGRmRWxlbWVudHMgPSB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5nZXRFbGVtZW50cygpO1xuICB9XG5cbiAgc2VsZWN0RWxlbWVudChpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZWxlY3RlZEZpZWxkSW5kZXggPSBpbmRleDtcbiAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5zZXRTZWxlY3RlZEVsZW1lbnQoaW5kZXgpO1xuICAgIHRoaXMucGRmID0gdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZ2V0Qm9vaygpO1xuICB9XG5cbiAgc2VsZWN0ZWRGaWVsZEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgc2VsZWN0SGVhZGluZyhldmVudDogYW55KSB7XG4gICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2Uuc2VsZWN0SGVhZGluZyhldmVudCk7XG4gICAgdGhpcy5wZGYgPSB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5nZXRCb29rKCk7XG4gIH1cbiAgLy8gQVAtMTdBUFIyNSBnZW5lcmF0ZVVpSWQgXG4gIGdlbmVyYXRlVWlJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuYWRkRWxlbWVudFdpdGhJZCgpO1xuICB9XG5cbiAgYWRkRWxlbWVudCh0eXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB1bmlxdWVfaWQgPSB0aGlzLmdlbmVyYXRlVWlJZCgpO1xuICAgIHRoaXMuY3VycmVudFR5cGUgPSB0eXBlXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRFbGVtZW50Py50eXBlID09PSAnVGFibGUnICYmIHRoaXMuYWRkVGFibGUpIHtcbiAgICAgIHRoaXMuaXNTZWxlY3RUYWJsZVBvcHVwID0gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBuZXdFbGVtZW50ID0ge1xuICAgICAgICBpZDogdW5pcXVlX2lkLFxuICAgICAgICB0eXBlLFxuICAgICAgICBtYXJnaW46IFswLCAwLCAwLCAwXSxcbiAgICAgICAgZm9udFNpemU6IDE0LFxuICAgICAgICBmb250V2VpZ2h0OiAnNDAwJyxcbiAgICAgICAgZm9udFN0eWxlOiBbXSxcbiAgICAgICAgYWxpZ25JdGVtczogJycsXG4gICAgICAgIG54dFR5cGU6IHR5cGUsXG4gICAgICAgIHJlZmVyZW5jZUZpZWxkOiBudWxsLFxuICAgICAgICBxdWVzdGlvbjogbnVsbCxcbiAgICAgICAgcXVlc3Rpb25OdW1iZXI6IHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmdldEVsZW1lbnRzKCkubGVuZ3RoICsgMSxcbiAgICAgICAgZmllbGRzTWV0YTogW10sXG4gICAgICAgIHBkZlJlZmVyZW5jZTogbnVsbCxcbiAgICAgICAgcGRmUmVmZXJlbmNlUXVlc3Rpb25zOiBudWxsLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIGJvbGQ6IGZhbHNlLFxuICAgICAgICAgIGl0YWxpYzogZmFsc2UsXG4gICAgICAgICAgYWxpZ25tZW50OiAnbGVmdCcsXG4gICAgICAgICAgZm9udFNpemU6IDE0LCAgXG4gICAgICAgICAgbWFyZ2luOiBbMCwgMCwgMCwgMF0sXG4gICAgICAgICAgY29sb3I6ICcjMDAwMDAwJywgIFxuICAgICAgICB9LFxuICAgICAgICBpbWFnZURhdGE6IG51bGwsXG4gICAgICAgIGltYWdlU2l6ZTogdHlwZSA9PT0gJ2ltYWdlJyA/IHsgd2lkdGg6IDEwMCwgaGVpZ2h0OiAxMDAgfSA6IG51bGwsXG4gICAgICAgIHRhYmxlQ29uZmlnOiB0eXBlID09PSAnVGFibGUnID8ge1xuICAgICAgICAgIGlzTm9zSW5kaWNhdG9yOiBmYWxzZSxcbiAgICAgICAgICBhZGRJbmxpbmVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgaXNQYWdpbmF0aW9uOiBmYWxzZSxcbiAgICAgICAgICBhY3Rpb25CdXR0b246IGZhbHNlLFxuICAgICAgICAgIGlzRGVsZXRlUm93OiB0cnVlLFxuICAgICAgICAgIGlzRWRpdFJvdzogZmFsc2UsXG4gICAgICAgICAgc2VhcmNoQmFyOiBmYWxzZSxcbiAgICAgICAgICBpc0J1dHRvbnM6IGZhbHNlLFxuICAgICAgICB9IDogbnVsbCxcblxuICAgICAgICB3aWR0aDogMTAwLFxuICAgICAgICBzdHlsZUNsYXNzOiB1bmlxdWVfaWQsXG4gICAgICB9O1xuICAgICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuYWRkRWxlbWVudChuZXdFbGVtZW50KTtcbiAgICAgIHRoaXMucGRmRWxlbWVudHMgPSB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5nZXRFbGVtZW50cygpO1xuICAgICAgdGhpcy5hZGRUYWJsZSA9IHRydWVcbiAgICB9XG4gIH1cblxuICAvL0FQLTE0SlVOMjUgLSBIYW5kbGVzIHRleHRhcmVhIGlucHV0OiBhdXRvLXJlc2l6ZXMgYW5kIHVwZGF0ZXMgdGhlIGZpZWxkIGNvbnRlbnRcbiAgb25UZXh0QXJlYUlucHV0KGV2ZW50OiBFdmVudCwgZmllbGQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHRleHRhcmVhID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxUZXh0QXJlYUVsZW1lbnQ7XG4gIFxuICAgIC8vIDEuIEF1dG8tcmVzaXplIGxvZ2ljXG4gICAgdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuICAgIHRleHRhcmVhLnN0eWxlLmhlaWdodCA9IHRleHRhcmVhLnNjcm9sbEhlaWdodCArICdweCc7XG4gIFxuICAgIC8vIDIuIFRyaWdnZXIgdmFsdWUgdXBkYXRlIGFuZCBQREYgc3luY1xuICAgIHRoaXMub25RdWVzdGlvbkNoYW5nZSh0ZXh0YXJlYS52YWx1ZSwgZmllbGQpO1xuICB9XG5cbm9uUXVlc3Rpb25DaGFuZ2UodmFsdWU6IHN0cmluZywgZmllbGQ6IGFueSkge1xuICBsZXQgZWxlbWVudElkOiBhbnkgfCB1bmRlZmluZWQ7XG5cbiAgLy8gU0tTMTlKVU4yNSBDbG9uZSB0byBhdm9pZCBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsXG4gIGNvbnN0IHBkZkVsZW1lbnRzQ2xvbmUgPSBfLmNsb25lRGVlcCh0aGlzLnBkZkVsZW1lbnRzKTtcblxuICBjb25zdCB1cGRhdGVQZGZRdWVzdGlvbiA9IChlbGVtZW50OiBhbnksIHZhbHVlOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICBpZiAoZWxlbWVudC50eXBlID09PSAnUGRmJykge1xuICAgICAgY29uc3Qgc3ViRWxlbWVudHMgPSBlbGVtZW50LnBkZlJlZmVyZW5jZVF1ZXN0aW9ucz8uW2VsZW1lbnQucGRmUmVmZXJlbmNlXSB8fCBbXTtcbiAgICAgIGZvciAoY29uc3Qgc3ViRWxlbWVudCBvZiBzdWJFbGVtZW50cykge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHVwZGF0ZVBkZlF1ZXN0aW9uKHN1YkVsZW1lbnQsIHZhbHVlKTsgLy8gcmVjdXJzaXZlIGNhbGxcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gdHJ1ZTsgLy8gc3RvcCBvbmNlIG1hdGNoIGlzIGZvdW5kXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlbGVtZW50LmlkID09PSBmaWVsZC5pZCkge1xuICAgICAgICBlbGVtZW50LnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgcGRmRWxlbWVudHNDbG9uZS5mb3JFYWNoKChlbGVtZW50OiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBmb3VuZCA9IHVwZGF0ZVBkZlF1ZXN0aW9uKGVsZW1lbnQsIHZhbHVlKTtcbiAgICBpZiAoZm91bmQgJiYgZWxlbWVudElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVsZW1lbnRJZCA9IGluZGV4O1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGVsZW1lbnRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgdXBkYXRlZEVsZW1lbnQgPSBwZGZFbGVtZW50c0Nsb25lW2VsZW1lbnRJZF07XG4gICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZWxlbWVudFVwZGF0ZSh1cGRhdGVkRWxlbWVudCwgJ3ZhbHVlQ2hhbmdlJyk7XG4gICAgLy8gU0tTMTlKVU4yNSBPcHRpb25hbGx5IHByZXZpZXcgb3IgdGVzdCB1c2luZyB1cGRhdGVkRWxlbWVudCAod2l0aG91dCB1cGRhdGluZyBvcmlnaW5hbClcbiAgICBpZiAodGhpcy5pc1ByZXZpZXcpIHtcbiAgICAgIHRoaXMucGRmUHJldmlldyh0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5kb3dubG9hZEVsZW1lbnQoKSk7XG4gICAgfVxuICB9XG59XG4gIFxucGRmUHJldmlldyhwZGY6YW55KXtcbiAgdGhpcy5wZGZQcmV2aWV3RW1pdC5lbWl0KHBkZilcbn1cbiAgb25GaWVsZERhdGVDaGFuZ2UoZXZlbnQ6IGFueSkge1xuICB9XG5cbiAgcmVtb3ZlRWxlbWVudChmaWVsZDogYW55LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UucmVtb3ZlRWxlbWVudENvbXBvbmVudChmaWVsZC5pZCk7XG4gICAgdGhpcy5wZGZFbGVtZW50cyA9IHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmdldEVsZW1lbnRzKCk7XG4gIH1cblxuICBvbkRyYWdTdGFydChldmVudDogRHJhZ0V2ZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5kcmFnZ2VkSW5kZXggPSBpbmRleDtcbiAgICBldmVudC5kYXRhVHJhbnNmZXI/LnNldERhdGEoJ3RleHQvcGxhaW4nLCBpbmRleC50b1N0cmluZygpKTtcbiAgfVxuXG4gIG9uRHJhZ092ZXIoZXZlbnQ6IERyYWdFdmVudCwgaW5kZXg6IG51bWJlcikge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBvbkRyb3AoZXZlbnQ6IERyYWdFdmVudCwgZHJvcEluZGV4OiBudW1iZXIpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgaWYgKHRoaXMuZHJhZ2dlZEluZGV4ID09PSBudWxsIHx8IHRoaXMuZHJhZ2dlZEluZGV4ID09PSBkcm9wSW5kZXgpIHJldHVybjtcblxuICAgIGNvbnN0IGRyYWdnZWRJdGVtID0gdGhpcy5wZGZFbGVtZW50c1t0aGlzLmRyYWdnZWRJbmRleF07XG5cbiAgICAvLyBSZW1vdmUgZHJhZ2dlZCBpdGVtIGZyb20gb2xkIHBvc2l0aW9uIGFuZCBpbnNlcnQgaXQgaW4gbmV3IHBvc2l0aW9uXG4gICAgdGhpcy5wZGZFbGVtZW50cy5zcGxpY2UodGhpcy5kcmFnZ2VkSW5kZXgsIDEpO1xuICAgIHRoaXMucGRmRWxlbWVudHMuc3BsaWNlKGRyb3BJbmRleCwgMCwgZHJhZ2dlZEl0ZW0pO1xuXG4gICAgLy9BUC0yOE1BUjI1IFVwZGF0ZSBxdWVzdGlvbk51bWJlciBkeW5hbWljYWxseSBiYXNlZCBvbiBuZXcgb3JkZXJcbiAgICB0aGlzLnBkZkVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICBlbGVtZW50LnF1ZXN0aW9uTnVtYmVyID0gaW5kZXggKyAxO1xuICAgIH0pO1xuXG4gICAgLy8gUmVzZXQgZHJhZ2dlZCBpbmRleFxuICAgIHRoaXMuZHJhZ2dlZEluZGV4ID0gbnVsbDtcblxuICAgIC8vIE5vdGlmeSBzZXJ2aWNlIGFib3V0IHRoZSB1cGRhdGVcbiAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS51cGRhdGVFbGVtZW50c09yZGVyKHRoaXMucGRmRWxlbWVudHMpO1xuICB9XG5cbiAgdG9nZ2xlQm9vbGVhbihmaWVsZDogYW55KTogdm9pZCB7XG4gICAgZmllbGQuYm9vbGVhbiA9ICFmaWVsZC5ib29sZWFuO1xuICB9XG4gIC8vIFNLUzEzTUFSMjUgdGFibGUgcG9wdXAgY29uZm9ybWF0aW9uIGJhc2VkIGVsZW1lbnQgYWRkXG4gIG9uQ2xvc2UoKSB7XG4gICAgdGhpcy5pc1NlbGVjdFRhYmxlUG9wdXAgPSBmYWxzZVxuICAgIHRoaXMuYWRkVGFibGUgPSBmYWxzZVxuICAgIHRoaXMuYWRkRWxlbWVudCh0aGlzLmN1cnJlbnRUeXBlKVxuICB9XG4gIC8vIFNLUzEzTUFSMjUgY29sdW1uIGVsZW1lbnQgYWRkIGluc2lkZSBhIHRhYmxlXG4gIGFkZE9uVGFibGUoKSB7XG4gICAgdGhpcy5hZGRUYWJsZSA9IHRydWVcbiAgICB0aGlzLmlzU2VsZWN0VGFibGVQb3B1cCA9IGZhbHNlXG4gICAgY29uc3QgZWxlbWVudHMgPSBbLi4udGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZ2V0RWxlbWVudHMoKV07XG5cbiAgICAvLyBGaW5kIHRoZSBlbGVtZW50IGFuZCB1cGRhdGUgaXRzIGNvbHVtbnNcbiAgICBjb25zdCBpbmRleCA9IGVsZW1lbnRzLmZpbmRJbmRleChlbCA9PiBlbC5pZCA9PT0gdGhpcy5zZWxlY3RlZEVsZW1lbnQuaWQpO1xuICAgIGNvbnN0IHJvd051bSA9IHRoaXMucGRmRWxlbWVudHNbaW5kZXhdLmNvbHVtbnMgPyB0aGlzLnBkZkVsZW1lbnRzW2luZGV4XS5jb2x1bW5zPy5sZW5ndGggOiAwXG4gICAgY29uc3QgdW5pcXVlX2lkID0gdGhpcy5nZW5lcmF0ZVVpSWQoKTtcbiAgICBjb25zdCB0YWJsZUVsZW1lbnQgPSB7XG4gICAgICBsYWJlbDogYEhFQURFUiBMQUJFTCAke3Jvd051bX1gLFxuICAgICAgZmllbGROYW1lOiBgRklFTEQgTkFNRSR7cm93TnVtfWAsXG4gICAgICB0eXBlOiB0aGlzLmN1cnJlbnRUeXBlLFxuICAgICAgaWQ6IHVuaXF1ZV9pZFxuICAgIH1cbiAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5hZGRUYWJsZUVsZW1lbnQodGFibGVFbGVtZW50LCB0aGlzLnNlbGVjdGVkRmllbGRJbmRleCk7XG4gICAgdGhpcy5wZGZFbGVtZW50cyA9IHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmdldEVsZW1lbnRzKCk7XG4gICAgLy8gdGhpcy5hZGRUYWJsZURhdGEodW5pcXVlX2lkLCBmaWVsZE5hbWUpXG4gIH1cbiAgYWRkVGFibGVEYXRhKGZpZWxkSWQsIGZpZWxkTmFtZSkge1xuICAgIC8vIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmFkZFRhYmxlZmllbGREYXRhKHRhYmxlRWxlbWVudCk7XG4gIH1cbiAgY29sdW1uU2VsZWN0ZWQoZXZlbnQ6IGFueSkge1xuICAgIC8vIFNLUzE5TUFSMjUgdGFibGUgY29sdW1uIHVwZGF0ZVxuICAgIGlmICghdGhpcy5pc1ByZXZpZXcpIHtcbiAgICAgIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLnNldFNlbGVjdGVkVGFibGVFbGVtZW50KHRoaXMuc2VsZWN0ZWRGaWVsZEluZGV4LCBldmVudCk7XG4gICAgfVxuICB9XG4gIHJlbW92ZUNvbHVtbihldmVudDogYW55KSB7XG4gICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UucmVtb3ZlU2VsZWN0ZWRUYWJsZUVsZW1lbnQodGhpcy5zZWxlY3RlZEZpZWxkSW5kZXgsIGV2ZW50KTtcbiAgfVxuXG4gIC8vIFNLUzI1TUFSMjUgaW1hZ2UgYWRkXG4gIGFzeW5jIGZpbGVDaGFuZ2VFdmVudChmaWVsZDogYW55LCBldmVudDogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LnRhcmdldC5maWxlc1swXTtcbiAgICBpZiAoIWZpbGUpIHJldHVybjtcbiAgXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGltYWdlRGF0YSA9IGF3YWl0IHRoaXMucmVhZEZpbGVBc0RhdGFVUkwoZmlsZSk7XG4gICAgICBsZXQgZWxlbWVudElkOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIFxuICAgICAgY29uc3QgdXBkYXRlUGRmSW1hZ2UgPSAoZWxlbWVudDogYW55KTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdQZGYnKSB7XG4gICAgICAgICAgY29uc3Qgc3ViRWxlbWVudHMgPSBlbGVtZW50LnBkZlJlZmVyZW5jZVF1ZXN0aW9ucz8uW2VsZW1lbnQucGRmUmVmZXJlbmNlXSB8fCBbXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHN1YkVsZW1lbnQgb2Ygc3ViRWxlbWVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gdXBkYXRlUGRmSW1hZ2Uoc3ViRWxlbWVudCk7IC8vIHJlY3Vyc2l2ZSBjYWxsXG4gICAgICAgICAgICBpZiAoZm91bmQpIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoZWxlbWVudC5pZCA9PT0gZmllbGQuaWQpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuaW1hZ2VEYXRhID0gaW1hZ2VEYXRhO1xuICAgICAgICAgICAgZWxlbWVudC5vcmdJbWFnZURhdGEgPSBpbWFnZURhdGE7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnQuaW1hZ2VTaXplKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuaW1hZ2VTaXplID0geyB3aWR0aDogMTAwLCBoZWlnaHQ6IDEwMCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH07XG4gIFxuICAgICAgdGhpcy5wZGZFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50OiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgZm91bmQgPSB1cGRhdGVQZGZJbWFnZShlbGVtZW50KTtcbiAgICAgICAgaWYgKGZvdW5kICYmIGVsZW1lbnRJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZWxlbWVudElkID0gaW5kZXg7IC8vIHJlbWVtYmVyIHRvcC1sZXZlbCBtYXRjaFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgXG4gICAgICBpZiAoZWxlbWVudElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZWxlbWVudFVwZGF0ZSh0aGlzLnBkZkVsZW1lbnRzW2VsZW1lbnRJZF0sICd2YWx1ZUNoYW5nZScpO1xuICAgICAgICBpZih0aGlzLmlzUHJldmlldyl7XG4gICAgICAgICAgdGhpcy5wZGZQcmV2aWV3KHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmRvd25sb2FkRWxlbWVudCgpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciByZWFkaW5nIGZpbGU6XCIsIGVycm9yKTtcbiAgICB9XG4gIH0gIFxuICBcbiAgcHJpdmF0ZSByZWFkRmlsZUFzRGF0YVVSTChmaWxlOiBGaWxlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKTtcbiAgICAgIHJlYWRlci5vbmVycm9yID0gKGVycm9yKSA9PiByZWplY3QoZXJyb3IpO1xuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgfSk7XG4gIH1cbiAgLy8gU0tTMkFQUjI1IGRpc2FibGVkIGVsZW1lbnRcbiAgaXNFbGVtZW50RGlzYWJsZWQoZWxlbWVudFR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnREaXNhYmxlZEFycmF5W3RoaXMuc2VsZWN0ZWRFbGVtZW50LnR5cGVdXG4gICAgICBpZiAoZWxlbWVudHMpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzLmluY2x1ZGVzKGVsZW1lbnRUeXBlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGFzeW5jIG9uSW1hZ2VFZGl0KHF1ZXM6IGFueSkge1xuICAgIHRoaXMuaXNJbWFnZUVkaXQgPSB0cnVlO1xuICAgIHRoaXMuc2VsZWN0ZWRJbWFnZUVsZW1lbnQgPSBxdWVzO1xuXG4gIC8vQXNzaWduIGltYWdlU2l6ZSBkZWZhdWx0IHZhbHVlXG4gIGlmICghdGhpcy5zZWxlY3RlZEltYWdlRWxlbWVudC5pbWFnZVNpemUpIHtcbiAgICB0aGlzLnNlbGVjdGVkSW1hZ2VFbGVtZW50LmltYWdlU2l6ZSA9IHsgd2lkdGg6IDEwMCwgaGVpZ2h0OiAxMDAgfTtcbiAgfVxuICB9XG4gIGFzeW5jIG9uSW1hZ2VEZWxldGUocXVlczogYW55KSB7XG4gICAgdHJ5IHtcbiAgICAgIHF1ZXMuaW1hZ2VEYXRhID0gJyc7XG4gICAgICBxdWVzLm9yZ0ltYWdlRGF0YSA9ICcnO1xuICAgICAgLy8gSW5pdGlhbGl6ZSBsb2dvIHNpemUgaWYgbm90IGFscmVhZHkgc2V0XG4gICAgICBpZiAoIXF1ZXMuaW1hZ2VTaXplKSB7XG4gICAgICAgIHF1ZXMuaW1hZ2VTaXplID0geyB3aWR0aDogMTAwLCBoZWlnaHQ6IDEwMCB9O1xuICAgICAgfVxuICAgICAgLy8gYXdhaXQgdGhpcy5jaGlsZEV2ZW50Q2FwdHVyZShxdWVzLmltYWdlRGF0YSwgcXVlcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciByZWFkaW5nIGZpbGU6XCIsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvLyBTS1MyNU1BUjI1IGltYWdlIGVkaXQgZnVuY3Rpb25zXG4gIGZsaXBIb3Jpem9udGFsKCkge1xuICAgIHRoaXMudHJhbnNmb3JtID0ge1xuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXG4gICAgICBmbGlwSDogIXRoaXMudHJhbnNmb3JtLmZsaXBIXG4gICAgfTtcbiAgfVxuXG4gIGZsaXBWZXJ0aWNhbCgpIHtcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcbiAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxuICAgICAgZmxpcFY6ICF0aGlzLnRyYW5zZm9ybS5mbGlwVlxuICAgIH07XG4gIH1cblxuICByZXNldEltYWdlKCkge1xuICAgIHRoaXMuY2FudmFzUm90YXRpb24gPSAwO1xuICAgIHRoaXMuY3JvcHBlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcbiAgICAgIHRyYW5zbGF0ZVVuaXQ6ICdweCcsXG4gICAgICBzY2FsZTogMSxcbiAgICAgIHJvdGF0ZTogMCxcbiAgICAgIGZsaXBIOiBmYWxzZSxcbiAgICAgIGZsaXBWOiBmYWxzZSxcbiAgICAgIHRyYW5zbGF0ZUg6IDAsXG4gICAgICB0cmFuc2xhdGVWOiAwXG4gICAgfTtcbiAgfVxuXG4gIHpvb21PdXQoKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7XG4gICAgICAuLi50aGlzLnRyYW5zZm9ybSxcbiAgICAgIHNjYWxlOiB0aGlzLnRyYW5zZm9ybS5zY2FsZSEgLSAuMVxuICAgIH07XG4gIH1cblxuICB6b29tSW4oKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7XG4gICAgICAuLi50aGlzLnRyYW5zZm9ybSxcbiAgICAgIHNjYWxlOiB0aGlzLnRyYW5zZm9ybS5zY2FsZSEgKyAuMVxuICAgIH07XG4gIH1cbiAgcm90YXRlTGVmdCgpIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4geyAvLyBVc2UgdGltZW91dCBiZWNhdXNlIHJvdGF0aW5nIGltYWdlIGlzIGEgaGVhdnkgb3BlcmF0aW9uIGFuZCB3aWxsIGJsb2NrIHRoZSB1aSB0aHJlYWRcbiAgICAgIHRoaXMuY2FudmFzUm90YXRpb24tLTtcbiAgICAgIHRoaXMuZmxpcEFmdGVyUm90YXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICByb3RhdGVSaWdodCgpIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jYW52YXNSb3RhdGlvbisrO1xuICAgICAgdGhpcy5mbGlwQWZ0ZXJSb3RhdGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIG1vdmVMZWZ0KCkge1xuICAgIHRoaXMudHJhbnNmb3JtID0ge1xuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXG4gICAgICB0cmFuc2xhdGVIOiB0aGlzLnRyYW5zZm9ybS50cmFuc2xhdGVIISAtIDFcbiAgICB9O1xuICB9XG5cbiAgbW92ZVJpZ2h0KCkge1xuICAgIHRoaXMudHJhbnNmb3JtID0ge1xuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXG4gICAgICB0cmFuc2xhdGVIOiB0aGlzLnRyYW5zZm9ybS50cmFuc2xhdGVIISArIDFcbiAgICB9O1xuICB9XG5cbiAgbW92ZURvd24oKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7XG4gICAgICAuLi50aGlzLnRyYW5zZm9ybSxcbiAgICAgIHRyYW5zbGF0ZVY6IHRoaXMudHJhbnNmb3JtLnRyYW5zbGF0ZVYhICsgMVxuICAgIH07XG4gIH1cblxuICBtb3ZlVXAoKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7XG4gICAgICAuLi50aGlzLnRyYW5zZm9ybSxcbiAgICAgIHRyYW5zbGF0ZVY6IHRoaXMudHJhbnNmb3JtLnRyYW5zbGF0ZVYhIC0gMVxuICAgIH07XG4gIH1cbiAgcHJpdmF0ZSBmbGlwQWZ0ZXJSb3RhdGUoKSB7XG4gICAgY29uc3QgZmxpcHBlZEggPSB0aGlzLnRyYW5zZm9ybS5mbGlwSDtcbiAgICBjb25zdCBmbGlwcGVkViA9IHRoaXMudHJhbnNmb3JtLmZsaXBWO1xuICAgIHRoaXMudHJhbnNmb3JtID0ge1xuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXG4gICAgICBmbGlwSDogZmxpcHBlZFYsXG4gICAgICBmbGlwVjogZmxpcHBlZEgsXG4gICAgICB0cmFuc2xhdGVIOiAwLFxuICAgICAgdHJhbnNsYXRlVjogMFxuICAgIH07XG4gIH1cbi8vQVAtMjBKVU4yNSAtIFVwZGF0ZXMgdGhlIGltYWdlIHNpemUgKHdpZHRoIGFuZCBoZWlnaHQpIG9mIHRoZSBzZWxlY3RlZCBpbWFnZSBlbGVtZW50IGFuZCByZWZsZWN0cyB0aGUgY2hhbmdlIHZpYSB0aGUgc2VydmljZVxub25JbWFnZVNpemVDaGFuZ2UoKSB7XG4gIGNvbnN0IGluZGV4ID0gdGhpcy5wZGZFbGVtZW50cy5maW5kSW5kZXgoKGVsOiBhbnkpID0+IGVsLmlkID09PSB0aGlzLnNlbGVjdGVkSW1hZ2VFbGVtZW50LmlkKTtcbiAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgIHRoaXMucGRmRWxlbWVudHNbaW5kZXhdLmltYWdlU2l6ZSA9IHsgXG4gICAgICB3aWR0aDogdGhpcy5zZWxlY3RlZEltYWdlRWxlbWVudC5pbWFnZVNpemUud2lkdGgsIFxuICAgICAgaGVpZ2h0OiB0aGlzLnNlbGVjdGVkSW1hZ2VFbGVtZW50LmltYWdlU2l6ZS5oZWlnaHQgXG4gICAgfTtcbiAgICAvLyBVcGRhdGUgZWxlbWVudCBpbiBzZXJ2aWNlXG4gICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZWxlbWVudFVwZGF0ZSh0aGlzLnBkZkVsZW1lbnRzW2luZGV4XSwgJ3ZhbHVlQ2hhbmdlJyk7XG4gIH1cbn1cbiAgYXN5bmMgaW1hZ2VDcm9wcGVkKGV2ZW50OiBhbnkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYmFzZTY0ID0gYXdhaXQgdGhpcy5jb252ZXJ0QmxvYlRvQmFzZTY0KGV2ZW50Lm9iamVjdFVybCk7XG4gICAgICB0aGlzLnNlbGVjdGVkSW1hZ2VFbGVtZW50LmltYWdlRGF0YSA9IGJhc2U2NDtcbiAgICAgIC8vIGF3YWl0IHRoaXMuY2hpbGRFdmVudENhcHR1cmUoYmFzZTY0LCB0aGlzLnNlbGVjdGVkSW1hZ2VFbGVtZW50KTtcbiAgICAgICAvLyBzZXQgZGVmYXVsdCBpZiBub3QgcHJlc2VudFxuICAgIGlmICghdGhpcy5zZWxlY3RlZEltYWdlRWxlbWVudC5pbWFnZVNpemUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbWFnZUVsZW1lbnQuaW1hZ2VTaXplID0geyB3aWR0aDogMTAwLCBoZWlnaHQ6IDEwMCB9O1xuICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGluIGltYWdlQ3JvcHBlZDpcIiwgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG5cbiAgY3JvcHBlclJlYWR5KHNvdXJjZUltYWdlRGltZW5zaW9uczogRGltZW5zaW9ucykge1xuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICB9XG4gIC8vIFNLUzI1TUFSMjUgYmxvYiB0byBiYXNlIDY0IGNvbnZlcnRlclxuICBjb252ZXJ0QmxvYlRvQmFzZTY0KG9iamVjdFVybDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gZmV0Y2gob2JqZWN0VXJsKVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuYmxvYigpKVxuICAgICAgLnRoZW4oYmxvYiA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcbiAgICAgICAgICByZWFkZXIub25sb2FkZW5kID0gKCkgPT4gcmVzb2x2ZShyZWFkZXIucmVzdWx0IGFzIHN0cmluZyk7XG4gICAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG4gIGNsb3NlTW9kYWwoKSB7XG4gICAgdGhpcy5pc0ltYWdlRWRpdCA9IGZhbHNlO1xuICB9XG4gICAgIG9wZW5UZXh0U2V0dGluZ3MoZmllbGQ6IGFueSwgZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW4gPSBmaWVsZDtcbiAgICAgIHRoaXMuc2hvd1RleHRTZXR0aW5ncyA9IHRydWU7XG4gICAgfVxuICBcbiAgICBjbG9zZVRleHRTZXR0aW5ncygpIHtcbiAgICAgIHRoaXMuc2hvd1RleHRTZXR0aW5ncyA9IGZhbHNlO1xuICAgIH1cbiAgIFxuICAgIC8vQVAtMTRKVU4yNSAtIFRvZ2dsZXMgYm9sZCBvciBpdGFsaWMgc3R5bGUgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGJsb2NrXG4gICAgdG9nZ2xlU3R5bGUoc3R5bGU6ICdib2xkJyB8ICdpdGFsaWMnKSB7XG4gICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDb2x1bW4pIHJldHVybjtcbiAgICAgIGlmIChzdHlsZSA9PT0gJ2JvbGQnKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW4uc3R5bGUuYm9sZCA9ICF0aGlzLnNlbGVjdGVkQ29sdW1uLnN0eWxlLmJvbGQ7XG4gICAgICB9IGVsc2UgaWYgKHN0eWxlID09PSAnaXRhbGljJykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1uLnN0eWxlLml0YWxpY3MgPSAhdGhpcy5zZWxlY3RlZENvbHVtbi5zdHlsZS5pdGFsaWNzO1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVDb250ZW50KCk7XG4gICAgfVxuICBcbiAgICAvL0FQLTE0SlVOMjUgLSBTZXRzIHRleHQgYWxpZ25tZW50IChsZWZ0LCBjZW50ZXIsIHJpZ2h0KSBmb3IgdGhlIHNlbGVjdGVkIHRleHQgYmxvY2tcbiAgICBzZXRBbGlnbm1lbnQoYWxpZ25tZW50OiAnbGVmdCcgfCAnY2VudGVyJyB8ICdyaWdodCcpIHtcbiAgICAgIGlmICghdGhpcy5zZWxlY3RlZENvbHVtbikgcmV0dXJuO1xuICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbi5zdHlsZS5hbGlnbm1lbnQgPSBhbGlnbm1lbnQ7XG4gICAgICB0aGlzLnVwZGF0ZUNvbnRlbnQoKTtcbiAgICB9XG5cbiAgICAvL0FQLTE0SlVOMjUgLSBVcGRhdGVzIHRoZSBjb250ZW50IGluIHRoZSBQREYgZGVzaWduZXIgd2l0aCB0aGUgc2VsZWN0ZWQgc3R5bGUgY2hhbmdlc1xuICAgIHVwZGF0ZUNvbnRlbnQoKSB7XG4gICAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5lbGVtZW50VXBkYXRlKHRoaXMuc2VsZWN0ZWRDb2x1bW4sICd2YWx1ZUNoYW5nZScpO1xuICAgIH1cbiAgICBwZGZTYXZlSGFuZGxlcihldmVudDphbnkpe1xuICAgICAgaWYoZXZlbnQgPT09ICdwcmV2aWV3Jyl7XG4gICAgICAgIHRoaXMucGRmU2F2ZUhhbmRsZXJFbWl0LmVtaXQoe1wiYWN0aW9uXCI6J3ByZXZpZXcnLFwicGRmXCI6dGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZG93bmxvYWRFbGVtZW50KCl9KVxuICAgICAgfSBlbHNlIGlmKGV2ZW50ID09PSAnZG93bmxvYWQnKXtcbiAgICAgICAgdGhpcy5wZGZTYXZlSGFuZGxlckVtaXQuZW1pdCh7XCJhY3Rpb25cIjonZG93bmxvYWQnLFwicGRmXCI6dGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZG93bmxvYWRFbGVtZW50KCl9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wZGZTYXZlSGFuZGxlckVtaXQuZW1pdChldmVudClcbiAgICAgIH1cbiAgICB9XG59IiwiPCEtLSBBUCAyMkpBTjI1IC0gZm9ybSBwcmV2aWV3IGFuZCBBbGwgZm9ybSBlbGVtZW50cyAtLT5cbjwhLS0gQVAgMjVGRUIyNSAtIEFsbCBlbGVtZW50cyB1cGRhdGUgLS0+XG48ZGl2IGNsYXNzPVwiZm9ybS1jb250YWluZXJcIiBbbmdDbGFzc109XCJ7J2lzUHJldmlldyc6IGlzUHJldmlld31cIj5cbiAgPGRpdiBjbGFzcz1cImNlbnRlci1mcmFtZVwiIFtuZ0NsYXNzXT1cInsnaXNQcmV2aWV3JzogaXNQcmV2aWV3fVwiPlxuICAgIDwhLS0gRm9ybSBCdWlsZGVyIFNlY3Rpb24gQWxsIEVsZW1lbnRzIC0tPlxuICAgIDxkaXYgKm5nSWY9XCIhaXNQcmV2aWV3XCIgY2xhc3M9XCJmb3JtLWJ1aWxkZXJcIj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZWxlbWVudCBvZiBlbGVtZW50c0xpc3RcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJlbGVtZW50XCJcbiAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJzZWxlY3RlZEVsZW1lbnQ/LnR5cGUgJiYgZWxlbWVudERpc2FibGVkQXJyYXlbc2VsZWN0ZWRFbGVtZW50LnR5cGVdPy5pbmNsdWRlcyhlbGVtZW50LnR5cGUpXCJcbiAgICAgICAgICAgIChjbGljayk9XCIhKHNlbGVjdGVkRWxlbWVudD8udHlwZSAmJiBlbGVtZW50RGlzYWJsZWRBcnJheVtzZWxlY3RlZEVsZW1lbnQudHlwZV0/LmluY2x1ZGVzKGVsZW1lbnQudHlwZSkpICYmIGFkZEVsZW1lbnQoZWxlbWVudC50eXBlKVwiXG4gICAgICAgICAgICBbZHJhZ2dhYmxlXT1cIiEoc2VsZWN0ZWRFbGVtZW50Py50eXBlICYmIGVsZW1lbnREaXNhYmxlZEFycmF5W3NlbGVjdGVkRWxlbWVudC50eXBlXT8uaW5jbHVkZXMoZWxlbWVudC50eXBlKSlcIlxuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiXG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudD8udHlwZSAmJiBlbGVtZW50RGlzYWJsZWRBcnJheVtzZWxlY3RlZEVsZW1lbnQudHlwZV0/LmluY2x1ZGVzKGVsZW1lbnQudHlwZSlcbiAgICAgICAgICAgICAgICA/ICgnVEhJU19FTEVNRU5UX05PVF9TVVBQT1JURUQnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1RoaXMgZWxlbWVudCBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gYSAnKSArXG4gICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRFbGVtZW50Py50eXBlIHx8ICgnQ0VSVEFJTl9FTEVNRU5UJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdjZXJ0YWluIGVsZW1lbnQnKSkgK1xuICAgICAgICAgICAgICAgICAgKCcgSVNfUFJFU0VOVCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnIGlzIHByZXNlbnQnKVxuICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMve3sgZWxlbWVudC5pbWcgfX0uc3ZnXCIgY2xhc3M9XCJlbGVtZW50LWljb25cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG92ZXItbGFiZWxcIj57eyBlbGVtZW50LmxhYmVsIH19PC9kaXY+ICAgICAgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRyYWctZG90c1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRvdFwiICpuZ0Zvcj1cImxldCBkb3Qgb2YgZG90c1wiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuPCEtLSBcbiAgICAgIDxkaXYgY2xhc3M9XCJ0ZW1wbGF0ZS1zZWN0aW9uXCI+XG4gICAgICAgIDxhcHAtdGVtcGxhdGVzICh0ZW1wbGF0ZVNlbGVjdGVkKT1cIm9uVGVtcGxhdGVTZWxlY3RlZCgkZXZlbnQpXCI+PC9hcHAtdGVtcGxhdGVzPlxuICAgICAgPC9kaXY+IC0tPlxuXG4gICAgICA8IS0tIFNLUzEwTUFSMjUgZm9vdGVyIHZlcnNpb24gc2hvdyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdGlja3ktZm9vdGVyLXZlcnNpb25cIj5cbiAgICAgICAge3t2ZXJzaW9ufX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwhLS0gQVAtMjdNQVIyNSBSZW1vdmUgQ0RLIGRyYWcgYW5kIGRyb3AgcmVwbGFjZSBkcmFnZ2FibGUgZnVuY3Rpb24gIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLXByZXZpZXdcIj5cbiAgICAgIDwhLS0gQVAtMTBNQVIyNSBIZWFkaW5nIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRhaW5lclwiXG4gICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7YmFja2dyb3VuZC1jb2xvcjogI0VGRjhGRjsgYm9yZGVyOiAxcHggc29saWQgI0U2RjNGRjttYXJnaW4tYm90dG9tOjEwcHhcIlxuICAgICAgICAoY2xpY2spPVwic2VsZWN0SGVhZGluZygnSGVhZGVyJylcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiIHN0eWxlPVwicGFkZGluZzogMTBweDsgZGlzcGxheTogZmxleDtqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XCI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInBkZlwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInBkZi50aXRsZSA9PSAnJ1wiIHN0eWxlPVwiY29sb3I6IzNmNGE1MjVjXCI+e3sgJ0hFQURJTkcnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0hlYWRpbmcnIH19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicGRmLnRpdGxlICE9PSAnJ1wiPnt7cGRmLnRpdGxlfX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbnNcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgKGNsaWNrKT1cInBkZlNhdmVIYW5kbGVyKCdwcmV2aWV3JylcIj57eyAnUFJFVklFVycgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnUFJFVklFVycgfX08L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnRuXCIgKGNsaWNrKT1cInBkZlNhdmVIYW5kbGVyKCdkb3dubG9hZCcpXCI+e3sgJ0RPV05MT0FEJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdET1dOTE9BRCcgfX08L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmllbGQgb2YgcGRmRWxlbWVudHM7IGxldCBpID0gaW5kZXhcIj5cblxuICAgICAgICA8IS0tIEFQLTE5TUFSMjUgTGluZSBFbGVtZW50IC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQ/LnR5cGUgPT09ICdMaW5lJ1wiIGNsYXNzPVwibGluZS1maWVsZFwiIFtuZ0NsYXNzXT1cInsnaXNQcmV2aWV3JzogaXNQcmV2aWV3fVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIiBbY2xhc3MuaGlnaGxpZ2h0XT1cInNlbGVjdGVkRmllbGRJbmRleCA9PT0gaSAmJiAhaXNQcmV2aWV3XCJcbiAgICAgICAgICBkcmFnZ2FibGU9XCJ0cnVlICYmICFpc1ByZXZpZXdcIiAoZHJhZ3N0YXJ0KT1cIm9uRHJhZ1N0YXJ0KCRldmVudCwgaSlcIiAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQsIGkpXCJcbiAgICAgICAgICAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNQcmV2aWV3XCIgY2xhc3M9XCJsaW5lLWVsZW1lbnRcIj5cbiAgICAgICAgICAgIDxkaXY+PC9kaXY+XG4gICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8aHIgY2xhc3M9XCJjdXN0b20tbGluZVwiIHN0eWxlPVwiZGlzcGxheTogaW5saW5lLWZsZXhcIiBbbmdTdHlsZV09XCJ7XG4gICAgJ2ZvbnQtZmFtaWx5JzogZmllbGQuZm9udCB8fCAnSGVsdmV0aWNhIE5ldWUnLFxuICAgICdmb250LXdlaWdodCc6IGZpZWxkLmZvbnRXZWlnaHQgfHwgJzQwMCcsXG4gICAgJ2ZvbnQtc2l6ZSc6IChmaWVsZC5mb250U2l6ZSB8fCAxNCkgKyAncHgnLFxuICAgICd3aWR0aCc6IChmaWVsZC53aWR0aCB8fCAxMDApICsgJyUnLFxuICAgICd0ZXh0LWFsaWduJzogZmllbGQudGV4dEFsaWduIHx8ICdsZWZ0JyxcbiAgICAnYm9yZGVyLXJhZGl1cyc6ICc1cHgnLFxuICAgICdib3JkZXItd2lkdGgnOiAoZmllbGQubGluZVdpZHRoIHx8IDEpICsgJ3B4JyxcbiAgICAnYm9yZGVyLXN0eWxlJzogKGZpZWxkLmxpbmVTdHlsZT8udG9Mb3dlckNhc2UoKSB8fCAnc29saWQnKSxcbiAgICAnY29sb3InOiBmaWVsZC5mb250Q29sb3IgfHwgJyMwMDAwMDAnLFxuICAgICdtYXJnaW4tdG9wJzogKGZpZWxkLnBhZGRpbmdUb3AgfHwgMCkgKyAncHgnLFxuICAgICdtYXJnaW4tYm90dG9tJzogKGZpZWxkLnBhZGRpbmdCb3R0b20gPz8gMTApICsgJ3B4J1xuICB9XCIgLz5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLVNLUzI1TUFSMjUgSW1hZ2UgVXBsb2FkIEVsZW1lbnQgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZD8udHlwZSA9PT0gJ2ltYWdlJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIlxuICAgICAgICAgIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpICYmICFpc1ByZXZpZXdcIiBkcmFnZ2FibGU9XCJ0cnVlICYmICFpc1ByZXZpZXdcIlxuICAgICAgICAgIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICdmb250LWZhbWlseSc6IGZpZWxkLmZvbnQgfHwgJ0hlbHZldGljYSBOZXVlJyxcbiAgICAnZm9udC1zaXplJzogKGZpZWxkLmZvbnRTaXplIHx8IDE0KSArICdweCcsXG4gICAgJ3dpZHRoJzogKGZpZWxkLndpZHRoIHx8IDEwMCkgKyAnJScsXG4gICAgJ2FsaWduLWl0ZW1zJzogZmllbGQuYWxpZ25JdGVtcyB8fCAnJyxcbiAgICAnYm9yZGVyLXJhZGl1cyc6ICc1cHgnLFxuICAgICdib3JkZXItd2lkdGgnOiAoZmllbGQubGluZVdpZHRoIHx8IDEpICsgJ3B4JyxcbiAgICAnY29sb3InOiBmaWVsZC5mb250Q29sb3IgfHwgJyMwMDAwMDAnLFxuICAgICdmb250LXN0eWxlJzogKGZpZWxkLmZvbnRTdHlsZSB8fCBbXSkuaW5jbHVkZXMoJ2l0YWxpYycpID8gJ2l0YWxpYycgOiAnbm9ybWFsJyxcbiAgICAnZm9udC13ZWlnaHQnOiAoZmllbGQuZm9udFN0eWxlIHx8IFtdKS5pbmNsdWRlcygnYm9sZCcpID8gJ2JvbGQnIDogKGZpZWxkLmZvbnRXZWlnaHQgfHwgJzQwMCcpLFxuICAgICdtYXJnaW4nOiBcbiAgICAgIChmaWVsZC5tYXJnaW4/LlswXSB8fCAwKSArICdweCAnICtcbiAgICAgIChmaWVsZC5tYXJnaW4/LlsxXSB8fCAwKSArICdweCAnICtcbiAgICAgIChmaWVsZC5tYXJnaW4/LlsyXSB8fCAwKSArICdweCAnICtcbiAgICAgIChmaWVsZC5tYXJnaW4/LlszXSB8fCAwKSArICdweCcsXG4gICAgJ3BhZGRpbmctdG9wJzogKGZpZWxkLnBhZGRpbmdUb3AgfHwgMCkgKyAncHgnLFxuICAgICdwYWRkaW5nLWJvdHRvbSc6IChmaWVsZC5wYWRkaW5nQm90dG9tID8/IDEwKSArICdweCdcbiAgfVwiIChtb3VzZWVudGVyKT1cImlzSW1hZ2VIb3ZlciA9IHRydWU7XCJcbiAgICAgICAgICAobW91c2VsZWF2ZSk9XCJpc0ltYWdlSG92ZXIgPSBmYWxzZTtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiIFtuZ0NsYXNzXT1cInsnaXNQcmV2aWV3JzogaXNQcmV2aWV3fVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc1ByZXZpZXdcIiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL2RyYWctZG90cy5zdmdcIiBhbHQ9XCJEcmFnXCIgY2xhc3M9XCJkcmFnLWRvdFwiIC8+XG4gICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNJbWFnZUhvdmVyXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IGVuZDtcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImlzUHJldmlld1wiIChjbGljayk9XCJvbkltYWdlRWRpdChmaWVsZClcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMS4xMDY3IDYuMDcxNzRMOS45MjgzMyA0Ljg5MzRMMi4xNjY2NyAxMi42NTUxVjEzLjgzMzRIMy4zNDVMMTEuMTA2NyA2LjA3MTc0Wk0xMi4yODUgNC44OTM0TDEzLjQ2MzMgMy43MTUwN0wxMi4yODUgMi41MzY3NEwxMS4xMDY3IDMuNzE1MDdMMTIuMjg1IDQuODkzNFpNNC4wMzUgMTUuNTAwMUgwLjVWMTEuOTY0MkwxMS42OTU4IDAuNzY4NDAzQzExLjg1MjEgMC42MTIxNzcgMTIuMDY0IDAuNTI0NDE0IDEyLjI4NSAwLjUyNDQxNEMxMi41MDYgMC41MjQ0MTQgMTIuNzE3OSAwLjYxMjE3NyAxMi44NzQyIDAuNzY4NDAzTDE1LjIzMTcgMy4xMjU5QzE1LjM4NzkgMy4yODIxOCAxNS40NzU3IDMuNDk0MSAxNS40NzU3IDMuNzE1MDdDMTUuNDc1NyAzLjkzNjA0IDE1LjM4NzkgNC4xNDc5NiAxNS4yMzE3IDQuMzA0MjRMNC4wMzU4MyAxNS41MDAxSDQuMDM1WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzZDNzU3RFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXNQcmV2aWV3XCIgKGNsaWNrKT1cIm9uSW1hZ2VEZWxldGUoZmllbGQpXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCJcbiAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTQgMy45ODcyNkMxMS43OCAzLjc2NzI2IDkuNTQ2NjcgMy42NTM5MyA3LjMyIDMuNjUzOTNDNiAzLjY1MzkzIDQuNjggMy43MjA2IDMuMzYgMy44NTM5M0wyIDMuOTg3MjZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0ZGMkMxMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNS42NjY1IDMuMzEzNjJMNS44MTMxNyAyLjQ0MDI4QzUuOTE5ODQgMS44MDY5NSA1Ljk5OTg0IDEuMzMzNjIgNy4xMjY1IDEuMzMzNjJIOC44NzMxN0M5Ljk5OTg0IDEuMzMzNjIgMTAuMDg2NSAxLjgzMzYyIDEwLjE4NjUgMi40NDY5NUwxMC4zMzMyIDMuMzEzNjJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0ZGMkMxMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTIuNTY2NyA2LjA5Mzc1TDEyLjEzMzQgMTIuODA3MUMxMi4wNiAxMy44NTM3IDEyIDE0LjY2NzEgMTAuMTQgMTQuNjY3MUg1Ljg2MDAyQzQuMDAwMDIgMTQuNjY3MSAzLjk0MDAyIDEzLjg1MzcgMy44NjY2OCAxMi44MDcxTDMuNDMzMzUgNi4wOTM3NVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjRkYyQzEwXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuODg2NDcgMTEuMDAwNEg5LjEwNjQ3XCIgc3Ryb2tlPVwiI0ZGMkMxMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi4zMzM1IDguMzMzMjVIOS42NjY4M1wiIHN0cm9rZT1cIiNGRjJDMTBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2dvLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9nby1wcmV2aWV3XCIgKm5nSWY9XCJmaWVsZC5pbWFnZURhdGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiZmllbGQuaW1hZ2VEYXRhXCIgXG4gICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImZpZWxkLmltYWdlU2l6ZT8ud2lkdGggfHwgMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImZpZWxkLmltYWdlU2l6ZT8uaGVpZ2h0IHx8IDEwMFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhZmllbGQuaW1hZ2VEYXRhXCIgY2xhc3M9XCJsb2dvLXVwbG9hZC1wbGFjZWhvbGRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJsb2dvLXVwbG9hZC17e2l9fVwiIGNsYXNzPVwibG9nby11cGxvYWQtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL0ltYWdlLnN2Z1wiIGFsdD1cIlVwbG9hZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyAnVVBMT0FEX0lNQUdFJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdVcGxvYWQgSW1hZ2UnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJsb2dvLXVwbG9hZC17e2l9fVwiIGFjY2VwdD1cImltYWdlLypcIiAoY2hhbmdlKT1cImZpbGVDaGFuZ2VFdmVudChmaWVsZCwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBTcGFjZSBFbGVtZW50IC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQ/LnR5cGUgPT09ICdTcGFjZSdcIiBjbGFzcz1cImZpZWxkLWNvbnRhaW5lclwiIChjbGljayk9XCJzZWxlY3RFbGVtZW50KGkpXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgJ2ZvbnQtZmFtaWx5JzogZmllbGQuZm9udCB8fCAnSGVsdmV0aWNhIE5ldWUnLFxuICAgICdmb250LXNpemUnOiAoZmllbGQuZm9udFNpemUgfHwgMTQpICsgJ3B4JyxcbiAgICAnd2lkdGgnOiAoZmllbGQud2lkdGggfHwgMTAwKSArICclJyxcbiAgICAnYWxpZ24taXRlbXMnOiBmaWVsZC5hbGlnbkl0ZW1zIHx8ICcnLFxuICAgICdib3JkZXItcmFkaXVzJzogJzVweCcsXG4gICAgJ2JvcmRlci13aWR0aCc6IChmaWVsZC5saW5lV2lkdGggfHwgMSkgKyAncHgnLFxuICAgICdjb2xvcic6IGZpZWxkLmZvbnRDb2xvciB8fCAnIzAwMDAwMCcsXG4gICAgJ2ZvbnQtc3R5bGUnOiAoZmllbGQuZm9udFN0eWxlIHx8IFtdKS5pbmNsdWRlcygnaXRhbGljJykgPyAnaXRhbGljJyA6ICdub3JtYWwnLFxuICAgICdmb250LXdlaWdodCc6IChmaWVsZC5mb250U3R5bGUgfHwgW10pLmluY2x1ZGVzKCdib2xkJykgPyAnYm9sZCcgOiAoZmllbGQuZm9udFdlaWdodCB8fCAnNDAwJyksXG4gICAgJ21hcmdpbic6IFxuICAgICAgKGZpZWxkLm1hcmdpbj8uWzBdIHx8IDApICsgJ3B4ICcgK1xuICAgICAgKGZpZWxkLm1hcmdpbj8uWzFdIHx8IDApICsgJ3B4ICcgK1xuICAgICAgKGZpZWxkLm1hcmdpbj8uWzJdIHx8IDApICsgJ3B4ICcgK1xuICAgICAgKGZpZWxkLm1hcmdpbj8uWzNdIHx8IDApICsgJ3B4JyxcbiAgICAncGFkZGluZy10b3AnOiAoZmllbGQucGFkZGluZ1RvcCB8fCAwKSArICdweCcsXG4gICAgJ3BhZGRpbmctYm90dG9tJzogKGZpZWxkLnBhZGRpbmdCb3R0b20gPz8gMTApICsgJ3B4J1xuICB9XCIgW2NsYXNzLmhpZ2hsaWdodF09XCJzZWxlY3RlZEZpZWxkSW5kZXggPT09IGkgJiYgIWlzUHJldmlld1wiXG4gICAgICAgICAgZHJhZ2dhYmxlPVwidHJ1ZSAmJiAhaXNQcmV2aWV3XCIgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIGkpXCIgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgKGRyb3ApPVwib25Ecm9wKCRldmVudCwgaSlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiIHN0eWxlPVwiaGVpZ2h0OjkzcHhcIiBbbmdDbGFzc109XCJ7J2lzUHJldmlldyc6IGlzUHJldmlld31cIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNQcmV2aWV3XCIgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLXJpZ2h0XCIgc3R5bGU9XCJtYXJnaW46IC0xMXB4IC0xMXB4IDAgMDtcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL2RyYWctZG90cy5zdmdcIiBhbHQ9XCJEcmFnXCIgY2xhc3M9XCJkcmFnLWRvdFwiIC8+XG4gICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBUZXh0QXJlYSAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkPy50eXBlID09PSAndGV4dCdcIiBjbGFzcz1cImZpZWxkLWNvbnRhaW5lclwiIChjbGljayk9XCJzZWxlY3RFbGVtZW50KGkpXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgJ2ZvbnQtZmFtaWx5JzogZmllbGQuZm9udCB8fCAnSGVsdmV0aWNhIE5ldWUnLFxuICAgICdmb250LXNpemUnOiAoZmllbGQuZm9udFNpemUgfHwgMTQpICsgJ3B4JyxcbiAgICAnd2lkdGgnOiAoZmllbGQud2lkdGggfHwgMTAwKSArICclJyxcbiAgICAnYWxpZ24taXRlbXMnOiBmaWVsZC5hbGlnbkl0ZW1zIHx8ICcnLFxuICAgICdib3JkZXItcmFkaXVzJzogJzVweCcsXG4gICAgJ2JvcmRlci13aWR0aCc6IChmaWVsZC5saW5lV2lkdGggfHwgMSkgKyAncHgnLFxuICAgICdjb2xvcic6IGZpZWxkLmZvbnRDb2xvciB8fCAnIzAwMDAwMCcsXG4gICAgJ2ZvbnQtc3R5bGUnOiAoZmllbGQuZm9udFN0eWxlIHx8IFtdKS5pbmNsdWRlcygnaXRhbGljJykgPyAnaXRhbGljJyA6ICdub3JtYWwnLFxuICAgICdmb250LXdlaWdodCc6IChmaWVsZC5mb250U3R5bGUgfHwgW10pLmluY2x1ZGVzKCdib2xkJykgPyAnYm9sZCcgOiAoZmllbGQuZm9udFdlaWdodCB8fCAnNDAwJyksXG4gICAgJ21hcmdpbic6IFxuICAgICAgKGZpZWxkLm1hcmdpbj8uWzBdIHx8IDApICsgJ3B4ICcgK1xuICAgICAgKGZpZWxkLm1hcmdpbj8uWzFdIHx8IDApICsgJ3B4ICcgK1xuICAgICAgKGZpZWxkLm1hcmdpbj8uWzJdIHx8IDApICsgJ3B4ICcgK1xuICAgICAgKGZpZWxkLm1hcmdpbj8uWzNdIHx8IDApICsgJ3B4JyxcbiAgICAncGFkZGluZy10b3AnOiAoZmllbGQucGFkZGluZ1RvcCB8fCAwKSArICdweCcsXG4gICAgJ3BhZGRpbmctYm90dG9tJzogKGZpZWxkLnBhZGRpbmdCb3R0b20gPz8gMTApICsgJ3B4J1xuICB9XCIgW2NsYXNzLmhpZ2hsaWdodF09XCJzZWxlY3RlZEZpZWxkSW5kZXggPT09IGkgJiYgIWlzUHJldmlld1wiXG4gICAgICAgICAgZHJhZ2dhYmxlPVwidHJ1ZSAmJiAhaXNQcmV2aWV3XCIgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIGkpXCIgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgKGRyb3ApPVwib25Ecm9wKCRldmVudCwgaSlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiIFtuZ0NsYXNzXT1cInsnaXNQcmV2aWV3JzogaXNQcmV2aWV3fVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc1ByZXZpZXdcIiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL2RyYWctZG90cy5zdmdcIiBhbHQ9XCJEcmFnXCIgY2xhc3M9XCJkcmFnLWRvdFwiIC8+XG5cbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGZpZWxkLCBpKVwiIGNsYXNzPVwiZGVsZXRlLWljb25cIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiY3VzdG9tLXRleHRhcmVhXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidFTlRFUl9ERVRBSUxFRF9URVhUX0hFUkUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0VudGVyIGRldGFpbGVkIHRleHQgaGVyZS4uLidcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiZmllbGQudmFsdWU/IGZpZWxkLnZhbHVlIDogJydcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25UZXh0QXJlYUlucHV0KCRldmVudCwgZmllbGQpXCJcbiAgICAgICAgICAgICAgI2F1dG9UZXh0YXJlYVxuICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImlzUHJldmlldyA/IDQwIDogbnVsbFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvcGVuVGV4dFNldHRpbmdzKGZpZWxkLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlQ29udGVudCgpXCIgXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgICAgICAgICAnZm9udC1zaXplJzogZmllbGQuc3R5bGU/LmZvbnRTaXplID8gZmllbGQuc3R5bGUuZm9udFNpemUgKyAncHgnIDogJzE0cHgnLFxuICAgICAgICAgICAgICAgICdmb250LXdlaWdodCc6IGZpZWxkLnN0eWxlPy5ib2xkID8gJ2JvbGQnIDogJ25vcm1hbCcsXG4gICAgICAgICAgICAgICAgJ2ZvbnQtc3R5bGUnOiBmaWVsZC5zdHlsZT8uaXRhbGljcyA/ICdpdGFsaWMnIDogJ25vcm1hbCcsXG4gICAgICAgICAgICAgICAgJ3RleHQtZGVjb3JhdGlvbic6IGZpZWxkLnN0eWxlPy5kZWNvcmF0aW9uID8gJ2RlY29yYXRpb24nIDogJ25vbmUnLFxuICAgICAgICAgICAgICAgICd0ZXh0LWFsaWduJzogZmllbGQuc3R5bGU/LmFsaWdubWVudCB8fCAnbGVmdCcsXG4gICAgICAgICAgICAgICAgJ21hcmdpbic6IGZpZWxkLnN0eWxlPy5tYXJnaW4/Lmxlbmd0aCA9PT0gNFxuICAgICAgICAgICAgICAgICAgPyBmaWVsZC5zdHlsZS5tYXJnaW5bMV0gKyAncHggJyArIGZpZWxkLnN0eWxlLm1hcmdpblsyXSArICdweCAnICtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuc3R5bGUubWFyZ2luWzNdICsgJ3B4ICcgKyBmaWVsZC5zdHlsZS5tYXJnaW5bMF0gKyAncHgnXG4gICAgICAgICAgICAgICAgICA6ICcwJyxcbiAgICAgICAgICAgICAgICAnY29sb3InOiBmaWVsZC5zdHlsZT8uY29sb3IgfHwgJyMwMDAnXG4gICAgICAgICAgICAgIH1cIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLUFQLTA1SlVOMjUgVGV4dCBTZXR0aW5ncyBUb29sYmFyOiBBbGxvd3MgZWRpdGluZyBmb250IHNpemUsIGJvbGQvaXRhbGljIHN0eWxlcywgYWxpZ25tZW50LCBhbmQgY2xvc2luZyB0aGUgdG9vbGJhciBmb3IgdGhlIHNlbGVjdGVkIGNvbHVtbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93VGV4dFNldHRpbmdzICYmIGlzUHJldmlldyAmJiBzZWxlY3RlZENvbHVtbiA9PT0gZmllbGRcIiBjbGFzcz1cInRleHQtc2V0dGluZ3MtdG9vbGJhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAnI2ZmZicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCAjY2NjJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogJzZweCAxMHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JvcmRlci1yYWRpdXMnOiAnNHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JveC1zaGFkb3cnOiAnMCAycHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xKScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6LWluZGV4JzogJzY1NTM1JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWxpZ24taXRlbXMnOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FwOiAnOHB4J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGb250IFNpemUgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IFsobmdNb2RlbCldPVwic2VsZWN0ZWRDb2x1bW4uc3R5bGUuZm9udFNpemVcIiBjbGFzcz1cInRvb2xiYXItc2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIjEyXCI+MTJwdDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCIxNFwiPjE0cHQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiMTZcIj4xNnB0PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIjE4XCI+MThwdDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCIyNFwiPjI0cHQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGV4dCBDb2xvciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHRpdGxlPVwiVGV4dCBDb2xvclwiIGNsYXNzPVwiY29sb3ItbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2xvci1ib3hcIiBbc3R5bGUuY29sb3JdPVwic2VsZWN0ZWRDb2x1bW4uc3R5bGUuY29sb3IgfHwgJyMwMDAnXCIgKGNsaWNrKT1cInRleHRDb2xvcklucHV0LmNsaWNrKClcIj5BPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgI3RleHRDb2xvcklucHV0IHR5cGU9XCJjb2xvclwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRDb2x1bW4uc3R5bGUuY29sb3JcIiAoY2hhbmdlKT1cInVwZGF0ZUNvbnRlbnQoKVwiIGNsYXNzPVwiY29sb3ItcGlja2VyLWhpZGRlblwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBCb2xkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwidG9nZ2xlU3R5bGUoJ2JvbGQnKVwiIFtjbGFzcy5hY3RpdmVdPVwic2VsZWN0ZWRDb2x1bW4/LnN0eWxlPy5ib2xkXCIgY2xhc3M9XCJ0b29sYmFyLWJ0blwiPnt7ICdCT0xEJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdCJyB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJdGFsaWMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJ0b2dnbGVTdHlsZSgnaXRhbGljJylcIiBbY2xhc3MuYWN0aXZlXT1cInNlbGVjdGVkQ29sdW1uPy5zdHlsZT8uaXRhbGljc1wiIGNsYXNzPVwidG9vbGJhci1idG5cIj48aT57eyAnSVRBTElDJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdJJyB9fTwvaT48L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBVbmRlcmxpbmUgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxidXR0b24gKGNsaWNrKT1cInRvZ2dsZVN0eWxlKCd1bmRlcmxpbmUnKVwiIFtjbGFzcy5hY3RpdmVdPVwic2VsZWN0ZWRDb2x1bW4/LnN0eWxlPy51bmRlcmxpbmVcIiBjbGFzcz1cInRvb2xiYXItYnRuXCI+PHU+VTwvdT48L2J1dHRvbj4gLS0+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWxpZ24gTGVmdCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInNldEFsaWdubWVudCgnbGVmdCcpXCIgW2NsYXNzLmFjdGl2ZV09XCJzZWxlY3RlZENvbHVtbj8uc3R5bGU/LmFsaWdubWVudCA9PT0gJ2xlZnQnXCIgY2xhc3M9XCJ0b29sYmFyLWJ0blwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+e3sgJ0ZPUk1BVF9BTElHTl9MRUZUJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdmb3JtYXRfYWxpZ25fbGVmdCcgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWxpZ24gQ2VudGVyIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwic2V0QWxpZ25tZW50KCdjZW50ZXInKVwiIFtjbGFzcy5hY3RpdmVdPVwic2VsZWN0ZWRDb2x1bW4/LnN0eWxlPy5hbGlnbm1lbnQgPT09ICdjZW50ZXInXCIgY2xhc3M9XCJ0b29sYmFyLWJ0blwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+e3sgJ0ZPUk1BVF9BTElHTl9DRU5URVInIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ2Zvcm1hdF9hbGlnbl9jZW50ZXInIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFsaWduIFJpZ2h0IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwic2V0QWxpZ25tZW50KCdyaWdodCcpXCIgW2NsYXNzLmFjdGl2ZV09XCJzZWxlY3RlZENvbHVtbj8uc3R5bGU/LmFsaWdubWVudCA9PT0gJ3JpZ2h0J1wiIGNsYXNzPVwidG9vbGJhci1idG5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiPnt7ICdGT1JNQVRfQUxJR05fUklHSFQnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ2Zvcm1hdF9hbGlnbl9yaWdodCcgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ2xvc2UgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJjbG9zZVRleHRTZXR0aW5ncygpXCIgY2xhc3M9XCJ0b29sYmFyLWJ0blwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IGF1dG87XCI+4pyVPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIElucHV0IC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQ/LnR5cGUgPT09ICdpbnB1dCdcIiBjbGFzcz1cImZpZWxkLWNvbnRhaW5lclwiIChjbGljayk9XCJzZWxlY3RFbGVtZW50KGkpXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgJ2ZvbnQtZmFtaWx5JzogZmllbGQuZm9udCB8fCAnSGVsdmV0aWNhIE5ldWUnLFxuICAgICdmb250LXNpemUnOiAoZmllbGQuZm9udFNpemUgfHwgMTQpICsgJ3B4JyxcbiAgICAnd2lkdGgnOiAoZmllbGQud2lkdGggfHwgMTAwKSArICclJyxcbiAgICAnYWxpZ24taXRlbXMnOiBmaWVsZC5hbGlnbkl0ZW1zIHx8ICcnLFxuICAgICdib3JkZXItcmFkaXVzJzogJzVweCcsXG4gICAgJ2JvcmRlci13aWR0aCc6IChmaWVsZC5saW5lV2lkdGggfHwgMSkgKyAncHgnLFxuICAgICdjb2xvcic6IGZpZWxkLmZvbnRDb2xvciB8fCAnIzAwMDAwMCcsXG4gICAgJ2ZvbnQtc3R5bGUnOiAoZmllbGQuZm9udFN0eWxlIHx8IFtdKS5pbmNsdWRlcygnaXRhbGljJykgPyAnaXRhbGljJyA6ICdub3JtYWwnLFxuICAgICdmb250LXdlaWdodCc6IChmaWVsZC5mb250U3R5bGUgfHwgW10pLmluY2x1ZGVzKCdib2xkJykgPyAnYm9sZCcgOiAoZmllbGQuZm9udFdlaWdodCB8fCAnNDAwJyksXG4gICAgJ21hcmdpbic6IFxuICAgICAgKGZpZWxkLm1hcmdpbj8uWzBdIHx8IDApICsgJ3B4ICcgK1xuICAgICAgKGZpZWxkLm1hcmdpbj8uWzFdIHx8IDApICsgJ3B4ICcgK1xuICAgICAgKGZpZWxkLm1hcmdpbj8uWzJdIHx8IDApICsgJ3B4ICcgK1xuICAgICAgKGZpZWxkLm1hcmdpbj8uWzNdIHx8IDApICsgJ3B4JyxcbiAgICAncGFkZGluZy10b3AnOiAoZmllbGQucGFkZGluZ1RvcCB8fCAwKSArICdweCcsXG4gICAgJ3BhZGRpbmctYm90dG9tJzogKGZpZWxkLnBhZGRpbmdCb3R0b20gPz8gMTApICsgJ3B4J1xuICB9XCIgW2NsYXNzLmhpZ2hsaWdodF09XCJzZWxlY3RlZEZpZWxkSW5kZXggPT09IGkgJiYgIWlzUHJldmlld1wiXG4gICAgICAgICAgZHJhZ2dhYmxlPVwidHJ1ZSAmJiAhaXNQcmV2aWV3XCIgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIGkpXCIgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgKGRyb3ApPVwib25Ecm9wKCRldmVudCwgaSlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiIFtuZ0NsYXNzXT1cInsnaXNQcmV2aWV3JzogaXNQcmV2aWV3fVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc1ByZXZpZXdcIiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL2RyYWctZG90cy5zdmdcIiBhbHQ9XCJEcmFnXCIgY2xhc3M9XCJkcmFnLWRvdFwiIC8+XG4gICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwhLS0gQVAtMDRKVU4yNSAtIHJlcGxhY2UgYXBwLWN1c3RvbS1pbnB1dCAtLT5cbiAgICAgICAgICAgICAgPG54dC1pbnB1dCBbdHlwZV09XCIndGV4dCdcIiBbbW9kZV09XCInZWRpdCdcIiBbdmFsdWVdPVwiZmllbGQudmFsdWVcIiBbcXVlc3Rpb25dPVwiXCIgW2xhYmVsRm9udF09XCJcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZD8ucXVlc3Rpb25UZXh0XCIgW2xhYmVsQ29sb3JdPVwiXCIgW2xhYmVsU2l6ZV09XCJcIiBbaW5wdXRWYWx1ZVNpemVdPVwiXCIgW2xhYmVsV2VpZ2h0XT1cIlwiXG4gICAgICAgICAgICAgICAgW2lucHV0V2VpZ2h0XT1cIlwiIFtzaG93TGFiZWxdPVwiXCIgaW5wdXRCb3JkZXI9XCJub25lXCIgc3ZnSGVpZ2h0PVwiMjBweFwiIHN2Z1dpZHRoPVwiMjBweFwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnF1ZXN0aW9uID8gZmllbGQucXVlc3Rpb24gOiAnRU5URVJfWU9VUl9JTlBVVCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRW50ZXIgeW91ciBpbnB1dCdcIiBbcmVxdWlyZWRdPVwiXCJcbiAgICAgICAgICAgICAgICBpbnB1dEJnQ29sb3I9XCIjRjVGNUY1XCIgW2lucHV0SWRdPVwiXCIgW2Vycm9yTWVzc2FnZXNdPVwieyByZXF1aXJlZDogJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQnIH1cIlxuICAgICAgICAgICAgICAgIFtpbnB1dEljb25MZWZ0U3JjXT1cIicnXCIgKGlucHV0VmFsdWUpPVwib25RdWVzdGlvbkNoYW5nZSgkZXZlbnQsIGZpZWxkKVwiPlxuICAgICAgICAgICAgICA8L254dC1pbnB1dD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIERhdGUgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZD8udHlwZSA9PT0gJ2RhdGUnXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiXG4gICAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICdmb250LWZhbWlseSc6IGZpZWxkLmZvbnQgfHwgJ0hlbHZldGljYSBOZXVlJyxcbiAgICAnZm9udC1zaXplJzogKGZpZWxkLmZvbnRTaXplIHx8IDE0KSArICdweCcsXG4gICAgJ3dpZHRoJzogKGZpZWxkLndpZHRoIHx8IDEwMCkgKyAnJScsXG4gICAgJ2FsaWduLWl0ZW1zJzogZmllbGQuYWxpZ25JdGVtcyB8fCAnJyxcbiAgICAnYm9yZGVyLXJhZGl1cyc6ICc1cHgnLFxuICAgICdib3JkZXItd2lkdGgnOiAoZmllbGQubGluZVdpZHRoIHx8IDEpICsgJ3B4JyxcbiAgICAnY29sb3InOiBmaWVsZC5mb250Q29sb3IgfHwgJyMwMDAwMDAnLFxuICAgICdmb250LXN0eWxlJzogKGZpZWxkLmZvbnRTdHlsZSB8fCBbXSkuaW5jbHVkZXMoJ2l0YWxpYycpID8gJ2l0YWxpYycgOiAnbm9ybWFsJyxcbiAgICAnZm9udC13ZWlnaHQnOiAoZmllbGQuZm9udFN0eWxlIHx8IFtdKS5pbmNsdWRlcygnYm9sZCcpID8gJ2JvbGQnIDogKGZpZWxkLmZvbnRXZWlnaHQgfHwgJzQwMCcpLFxuICAgICdtYXJnaW4nOiBcbiAgICAgIChmaWVsZC5tYXJnaW4/LlswXSB8fCAwKSArICdweCAnICtcbiAgICAgIChmaWVsZC5tYXJnaW4/LlsxXSB8fCAwKSArICdweCAnICtcbiAgICAgIChmaWVsZC5tYXJnaW4/LlsyXSB8fCAwKSArICdweCAnICtcbiAgICAgIChmaWVsZC5tYXJnaW4/LlszXSB8fCAwKSArICdweCcsXG4gICAgJ3BhZGRpbmctdG9wJzogKGZpZWxkLnBhZGRpbmdUb3AgfHwgMCkgKyAncHgnLFxuICAgICdwYWRkaW5nLWJvdHRvbSc6IChmaWVsZC5wYWRkaW5nQm90dG9tID8/IDEwKSArICdweCdcbiAgfVwiIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpICYmICFpc1ByZXZpZXdcIlxuICAgICAgICAgIGRyYWdnYWJsZT1cInRydWUgJiYgIWlzUHJldmlld1wiIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIlxuICAgICAgICAgIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQsIGkpXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXdyYXBwZXJcIiBbbmdDbGFzc109XCJ7J2lzUHJldmlldyc6IGlzUHJldmlld31cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNQcmV2aWV3XCIgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9kcmFnLWRvdHMuc3ZnXCIgYWx0PVwiRHJhZ1wiIGNsYXNzPVwiZHJhZy1kb3RcIiAvPlxuICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvVHJhc2guc3ZnXCIgKGNsaWNrKT1cInJlbW92ZUVsZW1lbnQoZmllbGQsIGkpXCIgY2xhc3M9XCJkZWxldGUtaWNvblwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8IS0tIEFQLTA0SlVOMjUgLSByZXBsYWNlIGN1c3RvbSBkYXRlIHBpY2tlciAtLT5cbiAgICAgICAgICAgICAgPG54dC1pbnB1dCBbdHlwZV09XCInZGF0ZSdcIiBbbW9kZV09XCInZWRpdCdcIiBbdmFsdWVdPVwiZmllbGQudmFsdWVcIiBbcXVlc3Rpb25dPVwiXCIgW2xhYmVsRm9udF09XCJcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZD8ucXVlc3Rpb25UZXh0XCIgW2xhYmVsQ29sb3JdPVwiXCIgW2xhYmVsU2l6ZV09XCJcIiBbaW5wdXRWYWx1ZVNpemVdPVwiXCIgW2xhYmVsV2VpZ2h0XT1cIlwiXG4gICAgICAgICAgICAgICAgW2lucHV0V2VpZ2h0XT1cIlwiIFtzaG93TGFiZWxdPVwiXCIgaW5wdXRCb3JkZXI9XCJub25lXCIgc3ZnSGVpZ2h0PVwiMjBweFwiIHN2Z1dpZHRoPVwiMjBweFwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnF1ZXN0aW9uID8gZmllbGQucXVlc3Rpb24gOiAnRU5URVJfWU9VUl9JTlBVVCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRW50ZXIgeW91ciBpbnB1dCdcIiBbcmVxdWlyZWRdPVwiXCJcbiAgICAgICAgICAgICAgICBpbnB1dEJnQ29sb3I9XCIjRjVGNUY1XCIgW2lucHV0SWRdPVwiXCIgW2Vycm9yTWVzc2FnZXNdPVwieyByZXF1aXJlZDogJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQnIH1cIlxuICAgICAgICAgICAgICAgIFtpbnB1dEljb25MZWZ0U3JjXT1cIicnXCIgKGlucHV0VmFsdWUpPVwib25RdWVzdGlvbkNoYW5nZSgkZXZlbnQsIGZpZWxkKVwiPlxuICAgICAgICAgICAgICA8L254dC1pbnB1dD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFBkZiAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkPy50eXBlID09PSAnUGRmJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAnZm9udC1mYW1pbHknOiBmaWVsZC5mb250IHx8ICdIZWx2ZXRpY2EgTmV1ZScsXG4gICAgJ2ZvbnQtc2l6ZSc6IChmaWVsZC5mb250U2l6ZSB8fCAxNCkgKyAncHgnLFxuICAgICd3aWR0aCc6IChmaWVsZC53aWR0aCB8fCAxMDApICsgJyUnLFxuICAgICdhbGlnbi1pdGVtcyc6IGZpZWxkLmFsaWduSXRlbXMgfHwgJycsXG4gICAgJ2JvcmRlci1yYWRpdXMnOiAnNXB4JyxcbiAgICAnYm9yZGVyLXdpZHRoJzogKGZpZWxkLmxpbmVXaWR0aCB8fCAxKSArICdweCcsXG4gICAgJ2NvbG9yJzogZmllbGQuZm9udENvbG9yIHx8ICcjMDAwMDAwJyxcbiAgICAnZm9udC1zdHlsZSc6IChmaWVsZC5mb250U3R5bGUgfHwgW10pLmluY2x1ZGVzKCdpdGFsaWMnKSA/ICdpdGFsaWMnIDogJ25vcm1hbCcsXG4gICAgJ2ZvbnQtd2VpZ2h0JzogKGZpZWxkLmZvbnRTdHlsZSB8fCBbXSkuaW5jbHVkZXMoJ2JvbGQnKSA/ICdib2xkJyA6IChmaWVsZC5mb250V2VpZ2h0IHx8ICc0MDAnKSxcbiAgICAnbWFyZ2luJzogXG4gICAgICAoZmllbGQubWFyZ2luPy5bMF0gfHwgMCkgKyAncHggJyArXG4gICAgICAoZmllbGQubWFyZ2luPy5bMV0gfHwgMCkgKyAncHggJyArXG4gICAgICAoZmllbGQubWFyZ2luPy5bMl0gfHwgMCkgKyAncHggJyArXG4gICAgICAoZmllbGQubWFyZ2luPy5bM10gfHwgMCkgKyAncHgnLFxuICAgICdwYWRkaW5nLXRvcCc6IChmaWVsZC5wYWRkaW5nVG9wIHx8IDApICsgJ3B4JyxcbiAgICAncGFkZGluZy1ib3R0b20nOiAoZmllbGQucGFkZGluZ0JvdHRvbSA/PyAxMCkgKyAncHgnXG4gIH1cIiBbY2xhc3MuaGlnaGxpZ2h0XT1cInNlbGVjdGVkRmllbGRJbmRleCA9PT0gaSAmJiAhaXNQcmV2aWV3XCJcbiAgICAgICAgICBkcmFnZ2FibGU9XCJ0cnVlICYmICFpc1ByZXZpZXdcIiAoZHJhZ3N0YXJ0KT1cIm9uRHJhZ1N0YXJ0KCRldmVudCwgaSlcIiAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQsIGkpXCJcbiAgICAgICAgICAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCIgW25nQ2xhc3NdPVwieydpc1ByZXZpZXcnOiBpc1ByZXZpZXd9XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtY29udGVudFwiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzUHJldmlld1wiIGNsYXNzPVwibGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvcC1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvZHJhZy1kb3RzLnN2Z1wiIGFsdD1cIkRyYWdcIiBjbGFzcz1cImRyYWctZG90XCIgLz5cbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGZpZWxkLCBpKVwiIGNsYXNzPVwiZGVsZXRlLWljb25cIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPCEtLSA8bGliLWJvb2tsZXQgW2Jvb2tsZXRKU09OXT1cImZpZWxkLnBkZlJlZmVyZW5jZVF1ZXN0aW9uc1wiPjwvbGliLWJvb2tsZXQ+IC0tPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQ/LnBkZlJlZmVyZW5jZVF1ZXN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGZpZWxkPy5wZGZSZWZlcmVuY2VRdWVzdGlvbnNbZmllbGQ/LnBkZlJlZmVyZW5jZV07IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gQVAtMTlNQVIyNSBMaW5lIEVsZW1lbnQgLS0+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQ/LnR5cGUgPT09ICdMaW5lJ1wiIGNsYXNzPVwibGluZS1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICA8aHIgY2xhc3M9XCJjdXN0b20tbGluZVwiIHN0eWxlPVwiZGlzcGxheTogaW5saW5lLWZsZXhcIiBbbmdTdHlsZV09XCJ7XG4gICAgJ2ZvbnQtZmFtaWx5JzogZmllbGQuZm9udCB8fCAnSGVsdmV0aWNhIE5ldWUnLFxuICAgICdmb250LXdlaWdodCc6IGZpZWxkLmZvbnRXZWlnaHQgfHwgJzQwMCcsXG4gICAgJ2ZvbnQtc2l6ZSc6IChmaWVsZC5mb250U2l6ZSB8fCAxNCkgKyAncHgnLFxuICAgICd3aWR0aCc6IChmaWVsZC53aWR0aCB8fCAxMDApICsgJyUnLFxuICAgICd0ZXh0LWFsaWduJzogZmllbGQudGV4dEFsaWduIHx8ICdsZWZ0JyxcbiAgICAnYm9yZGVyLXJhZGl1cyc6ICc1cHgnLFxuICAgICdib3JkZXItd2lkdGgnOiAoZmllbGQubGluZVdpZHRoIHx8IDEpICsgJ3B4JyxcbiAgICAnYm9yZGVyLXN0eWxlJzogKGZpZWxkLmxpbmVTdHlsZT8udG9Mb3dlckNhc2UoKSB8fCAnc29saWQnKSxcbiAgICAnY29sb3InOiBmaWVsZC5mb250Q29sb3IgfHwgJyMwMDAwMDAnLFxuICAgICdtYXJnaW4tdG9wJzogKGZpZWxkLnBhZGRpbmdUb3AgfHwgMCkgKyAncHgnLFxuICAgICdtYXJnaW4tYm90dG9tJzogKGZpZWxkLnBhZGRpbmdCb3R0b20gPz8gMTApICsgJ3B4J1xuICB9XCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQ/LnR5cGUgPT09ICdpbWFnZSdcIiBjbGFzcz1cImZpZWxkLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiIFtuZ0NsYXNzXT1cInsnaXNQcmV2aWV3JzogaXNQcmV2aWV3fVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9nby1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIExvZ28gcHJldmlldyBhcmVhIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2dvLXByZXZpZXdcIiAqbmdJZj1cImZpZWxkLmltYWdlRGF0YVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImZpZWxkLmltYWdlRGF0YVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFVwbG9hZCBidXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFmaWVsZC5pbWFnZURhdGFcIiBjbGFzcz1cImxvZ28tdXBsb2FkLXBsYWNlaG9sZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibG9nby11cGxvYWQte3tpfX1cIiBjbGFzcz1cImxvZ28tdXBsb2FkLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL0ltYWdlLnN2Z1wiIGFsdD1cIlVwbG9hZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7ICdVUExPQURfSU1BR0UnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1VwbG9hZCBJbWFnZScgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJsb2dvLXVwbG9hZC17e2l9fVwiIGFjY2VwdD1cImltYWdlLypcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImZpbGVDaGFuZ2VFdmVudChmaWVsZCwgJGV2ZW50KVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkPy50eXBlID09PSAnU3BhY2UnXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXdyYXBwZXJcIiBzdHlsZT1cImhlaWdodDo5M3B4XCIgW25nQ2xhc3NdPVwieydpc1ByZXZpZXcnOiBpc1ByZXZpZXd9XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQ/LnR5cGUgPT09ICd0ZXh0J1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCIgW25nQ2xhc3NdPVwieydpc1ByZXZpZXcnOiBpc1ByZXZpZXd9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImN1c3RvbS10ZXh0YXJlYVwiIFtwbGFjZWhvbGRlcl09XCInRU5URVJfREVUQUlMRURfVEVYVF9IRVJFJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdFbnRlciBkZXRhaWxlZCB0ZXh0IGhlcmUuLi4nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJpc1ByZXZpZXcgPyA0MCA6IGZpZWxkLnNpemUgfHwgMTAwXCIgWyhuZ01vZGVsKV09XCJmaWVsZC52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25RdWVzdGlvbkNoYW5nZSgkZXZlbnQsIGZpZWxkKVwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8IS0tIEFQLTE0SlVOMjUgQWRkZWQgbnh0LWlucHV0IGluIHBkZiAtLT5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZD8udHlwZSA9PT0gJ2lucHV0J1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCIgW25nQ2xhc3NdPVwieydpc1ByZXZpZXcnOiBpc1ByZXZpZXd9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj4gXG4gICAgICAgICAgICAgICAgICAgICAgICA8bnh0LWlucHV0IFt0eXBlXT1cIid0ZXh0J1wiIFttb2RlXT1cIidlZGl0J1wiIFsobmdNb2RlbCldPVwiZmllbGQudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0VOVEVSX1lPVVJfSU5QVVQnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0VudGVyIHlvdXIgaW5wdXQnXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25RdWVzdGlvbkNoYW5nZSgkZXZlbnQsIGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9ueHQtaW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8IS0tIEFQLTA2TUFSMjUgLS0+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQ/LnR5cGUgPT09ICdUYWJsZSdcIiBjbGFzcz1cImZpZWxkLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiIHN0eWxlPVwib3ZlcmZsb3c6IGhpZGRlbjtcIiBbbmdDbGFzc109XCJ7J2lzUHJldmlldyc6IGlzUHJldmlld31cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm54dC10YWJsZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG54dC1kYXRhdGFibGUgaXNCdXR0b25zIFtxdWVzdGlvbl09XCJmaWVsZFwiIGZyb209XCJmb3JtQnVpbGRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vZGVdPVwiaXNQcmV2aWV3ID8gJ3ZpZXcnIDogJ2VkaXQnXCIgW2FwaU1ldGFdPVwiZmllbGQ/LnN1YlRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0YWJsZUNvbmZpZ109XCJmaWVsZC50YWJsZUNvbmZpZ1wiIHRhYmxlSWQ9XCJcIiBkaXJlY3Rpb249XCJsdHJcIiB0YWJsZVdpZHRoPVwiYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uUXVlc3Rpb25DaGFuZ2UoJGV2ZW50LCBmaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImZpZWxkLnZhbHVlPy5kYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0VkaXRhYmxlPXRydWUgKGNvbHVtblNlbGVjdGVkKT1jb2x1bW5TZWxlY3RlZCgkZXZlbnQpIChyZW1vdmVDb2x1bW4pPXJlbW92ZUNvbHVtbigkZXZlbnQpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L254dC1kYXRhdGFibGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSAgVGFibGUgIC0tPlxuICAgICAgICA8IS0tIEFQLTA2TUFSMjUgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZD8udHlwZSA9PT0gJ1RhYmxlJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAnZm9udC1mYW1pbHknOiBmaWVsZC5mb250IHx8ICdIZWx2ZXRpY2EgTmV1ZScsXG4gICAgJ2ZvbnQtc2l6ZSc6IChmaWVsZC5mb250U2l6ZSB8fCAxNCkgKyAncHgnLFxuICAgICd3aWR0aCc6IChmaWVsZC53aWR0aCB8fCAxMDApICsgJyUnLFxuICAgICdhbGlnbi1pdGVtcyc6IGZpZWxkLmFsaWduSXRlbXMgfHwgJycsXG4gICAgJ2JvcmRlci1yYWRpdXMnOiAnNXB4JyxcbiAgICAnYm9yZGVyLXdpZHRoJzogKGZpZWxkLmxpbmVXaWR0aCB8fCAxKSArICdweCcsXG4gICAgJ2NvbG9yJzogZmllbGQuZm9udENvbG9yIHx8ICcjMDAwMDAwJyxcbiAgICAnZm9udC1zdHlsZSc6IChmaWVsZC5mb250U3R5bGUgfHwgW10pLmluY2x1ZGVzKCdpdGFsaWMnKSA/ICdpdGFsaWMnIDogJ25vcm1hbCcsXG4gICAgJ2ZvbnQtd2VpZ2h0JzogKGZpZWxkLmZvbnRTdHlsZSB8fCBbXSkuaW5jbHVkZXMoJ2JvbGQnKSA/ICdib2xkJyA6IChmaWVsZC5mb250V2VpZ2h0IHx8ICc0MDAnKSxcbiAgICAnbWFyZ2luJzogXG4gICAgICAoZmllbGQubWFyZ2luPy5bMF0gfHwgMCkgKyAncHggJyArXG4gICAgICAoZmllbGQubWFyZ2luPy5bMV0gfHwgMCkgKyAncHggJyArXG4gICAgICAoZmllbGQubWFyZ2luPy5bMl0gfHwgMCkgKyAncHggJyArXG4gICAgICAoZmllbGQubWFyZ2luPy5bM10gfHwgMCkgKyAncHgnLFxuICAgICdwYWRkaW5nLXRvcCc6IChmaWVsZC5wYWRkaW5nVG9wIHx8IDApICsgJ3B4JyxcbiAgICAncGFkZGluZy1ib3R0b20nOiAoZmllbGQucGFkZGluZ0JvdHRvbSA/PyAxMCkgKyAncHgnXG4gIH1cIiBbY2xhc3MuaGlnaGxpZ2h0XT1cInNlbGVjdGVkRmllbGRJbmRleCA9PT0gaSAmJiAhaXNQcmV2aWV3XCJcbiAgICAgICAgICBkcmFnZ2FibGU9XCJ0cnVlICYmICFpc1ByZXZpZXdcIiAoZHJhZ3N0YXJ0KT1cIm9uRHJhZ1N0YXJ0KCRldmVudCwgaSlcIiAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQsIGkpXCJcbiAgICAgICAgICAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCIgc3R5bGU9XCJvdmVyZmxvdzogaGlkZGVuO1wiIFtuZ0NsYXNzXT1cInsnaXNQcmV2aWV3JzogaXNQcmV2aWV3fVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc1ByZXZpZXdcIiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL2RyYWctZG90cy5zdmdcIiBhbHQ9XCJEcmFnXCIgY2xhc3M9XCJkcmFnLWRvdFwiIC8+XG4gICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJueHQtdGFibGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPG54dC1kYXRhdGFibGUgaXNCdXR0b25zIFtxdWVzdGlvbl09XCJmaWVsZFwiIGZyb209XCJmb3JtQnVpbGRlclwiIFttb2RlXT1cImlzUHJldmlldyA/ICd2aWV3JyA6ICdlZGl0J1wiXG4gICAgICAgICAgICAgICAgICBbYXBpTWV0YV09XCJmaWVsZD8uc3ViVGV4dFwiIFt0YWJsZUNvbmZpZ109XCJmaWVsZC50YWJsZUNvbmZpZ1wiIHRhYmxlSWQ9XCJcIiBkaXJlY3Rpb249XCJsdHJcIlxuICAgICAgICAgICAgICAgICAgdGFibGVXaWR0aD1cImF1dG9cIiBpc0VkaXRhYmxlPXRydWUgKGNvbHVtblNlbGVjdGVkKT1jb2x1bW5TZWxlY3RlZCgkZXZlbnQpXG4gICAgICAgICAgICAgICAgICBbZGF0YV09XCJmaWVsZC52YWx1ZT8uZGF0YVwiXG4gICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25RdWVzdGlvbkNoYW5nZSgkZXZlbnQsIGZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAocmVtb3ZlQ29sdW1uKT1yZW1vdmVDb2x1bW4oJGV2ZW50KT5cbiAgICAgICAgICAgICAgICA8L254dC1kYXRhdGFibGU+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDwhLS0gU0tTMTNNQVIyNSBwb3B1cCBjb25mb3JtYXRpb24gYm94IC0tPlxuICA8ZGl2IGNsYXNzPVwiZGlhbG9nLW92ZXJsYXlcIiAqbmdJZj1cImlzU2VsZWN0VGFibGVQb3B1cFwiPlxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctYm94XCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiY2xvc2UtYnRuLWZiXCIgKGNsaWNrKT1cIm9uQ2xvc2UoKVwiPuKclTwvYnV0dG9uPlxuICAgICAgPHA+e3sgJ0FERF9UQUJMRV9DT05GSVJNQVRJT04nIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1RoZXNlIGVsZW1lbnQgd2FudCB0byBhZGQgYSB0YWJsZScgfX08L3A+XG4gICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLWNvbnRhaW5lci1mYlwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwieWVzLWJ0bi1mYlwiIChjbGljayk9XCJhZGRPblRhYmxlKClcIj57eyAnWUVTJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdZZXMnIH19PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJuby1idG4tZmJcIiAoY2xpY2spPVwib25DbG9zZSgpXCI+e3sgJ05PJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdObycgfX08L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGFwcC1wZGYtcHJvcGVydGllcyAqbmdJZj1cIiFpc1ByZXZpZXdcIiAoZm9ybUJ1dHRvbkhhbmRsZXIpPVwicGRmU2F2ZUhhbmRsZXIoJGV2ZW50KVwiPjwvYXBwLXBkZi1wcm9wZXJ0aWVzPlxuPC9kaXY+XG48IS0tU0tTMjVNQVIyNSBNb2RhbCBPdmVybGF5IC0tPlxuPGRpdiBjbGFzcz1cIm1vZGFsLW92ZXJsYXlcIiAqbmdJZj1cImlzSW1hZ2VFZGl0XCI+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNsb3NlLWJ1dHRvblwiIChjbGljayk9XCJjbG9zZU1vZGFsKClcIj7Dlzwvc3Bhbj5cbiAgICAgIDwhLS0gSW1hZ2UgRWRpdG9yIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkSW1hZ2VFbGVtZW50Py50eXBlID09PSAnaW1hZ2UnXCI+XG4gICAgICAgICAgPGltYWdlLWNyb3BwZXIgKm5nSWY9XCJzZWxlY3RlZEltYWdlRWxlbWVudC5pbWFnZURhdGFcIiBbaW1hZ2VCYXNlNjRdPVwic2VsZWN0ZWRJbWFnZUVsZW1lbnQub3JnSW1hZ2VEYXRhXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZhbHNlXCIgW2FsaWduSW1hZ2VdPVwiYWxpZ25JbWFnZVwiIFtyb3VuZENyb3BwZXJdPVwicm91bmRDcm9wcGVyXCIgW2JhY2tncm91bmRDb2xvcl09XCInd2hpdGUnXCJcbiAgICAgICAgICAgICAgaW1hZ2VBbHRUZXh0PVwie3sgJ0FMVEVSTkFUSVZFX0lNQUdFX1RFWFQnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0FsdGVybmF0aXZlIGltYWdlIHRleHQnIH19XCIgW2FsbG93TW92ZUltYWdlXT1cImZhbHNlXCIgW2hpZGVSZXNpemVTcXVhcmVzXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW2NhbnZhc1JvdGF0aW9uXT1cImNhbnZhc1JvdGF0aW9uXCIgW2FzcGVjdFJhdGlvXT1cImFzcGVjdFJhdGlvXCIgW2NvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpb109XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFttYWludGFpbkFzcGVjdFJhdGlvXT1cImZhbHNlXCIgW2Nyb3BwZXJTdGF0aWNXaWR0aF09XCJjcm9wcGVyU3RhdGljV2lkdGhcIlxuICAgICAgICAgICAgICBbY3JvcHBlclN0YXRpY0hlaWdodF09XCJjcm9wcGVyU3RhdGljSGVpZ2h0XCIgW2Nyb3BwZXJNaW5XaWR0aF09XCJjcm9wcGVyTWluV2lkdGhcIlxuICAgICAgICAgICAgICBbY3JvcHBlck1pbkhlaWdodF09XCJjcm9wcGVyTWluSGVpZ2h0XCIgW2Nyb3BwZXJNYXhXaWR0aF09XCJjcm9wcGVyTWF4V2lkdGhcIlxuICAgICAgICAgICAgICBbY3JvcHBlck1heEhlaWdodF09XCJjcm9wcGVyTWF4SGVpZ2h0XCIgW3Jlc2V0Q3JvcE9uQXNwZWN0UmF0aW9DaGFuZ2VdPSd0cnVlJyBbKGNyb3BwZXIpXT1cImNyb3BwZXJcIlxuICAgICAgICAgICAgICBbKHRyYW5zZm9ybSldPVwidHJhbnNmb3JtXCIgW29ubHlTY2FsZURvd25dPVwidHJ1ZVwiIG91dHB1dD1cImJsb2JcIiBmb3JtYXQ9XCJwbmdcIlxuICAgICAgICAgICAgICAoaW1hZ2VDcm9wcGVkKT1cImltYWdlQ3JvcHBlZCgkZXZlbnQpXCIgKGNyb3BwZXJSZWFkeSk9XCJjcm9wcGVyUmVhZHkoJGV2ZW50KVwiPlxuICAgICAgICAgIDwvaW1hZ2UtY3JvcHBlcj5cblxuICAgICAgICAgIDwhLS1BUC0yMEpVTjI1IC0gSW1hZ2Ugc2l6ZSBjb250cm9sczogQWxsb3cgdXNlciB0byBtYW51YWxseSBhZGp1c3Qgd2lkdGggYW5kIGhlaWdodCB1c2luZyByYW5nZSBzbGlkZXJzIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZEltYWdlRWxlbWVudC5pbWFnZURhdGFcIiBjbGFzcz1cIm1hbnVhbC1zaXplLWlucHV0c1wiPlxuICAgICAgICAgICAgPGxhYmVsPnt7ICdXSURUSCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnV2lkdGgnIH19IHt7IHNlbGVjdGVkSW1hZ2VFbGVtZW50LmltYWdlU2l6ZS53aWR0aCB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCIgbWluPVwiNTBcIiBtYXg9XCIzMDBcIiBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRJbWFnZUVsZW1lbnQuaW1hZ2VTaXplLndpZHRoXCJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uSW1hZ2VTaXplQ2hhbmdlKClcIiAvPlxuICAgICAgICAgIFxuICAgICAgICAgICAgPGxhYmVsPnt7ICdIRUlHSFQnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0hlaWdodCcgfX0ge3sgc2VsZWN0ZWRJbWFnZUVsZW1lbnQuaW1hZ2VTaXplLmhlaWdodCB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCIgbWluPVwiNTBcIiBtYXg9XCIzMDBcIiBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRJbWFnZUVsZW1lbnQuaW1hZ2VTaXplLmhlaWdodFwiXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJvbkltYWdlU2l6ZUNoYW5nZSgpXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBcblxuICAgICAgICAgIDwhLS0gQ29udHJvbHMgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkSW1hZ2VFbGVtZW50LmltYWdlRGF0YVwiIGNsYXNzPVwiY29udHJvbHNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwicm90YXRlTGVmdCgpXCIgdGl0bGU9XCJ7eyAnUk9UQVRFX0xFRlQnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1JvdGF0ZSBMZWZ0JyB9fVwiPuKfsjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxvZ28taWNvblwiIChjbGljayk9XCJyb3RhdGVSaWdodCgpXCIgdGl0bGU9XCJ7eyAnUk9UQVRFX1JJR0hUJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdSb3RhdGUgUmlnaHQnIH19XCI+4p+zPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cInpvb21PdXQoKVwiIHRpdGxlPVwie3sgJ1pPT01fT1VUJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdab29tIE91dCcgfX1cIj4tPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cInpvb21JbigpXCIgdGl0bGU9XCJ7eyAnWk9PTV9JTicgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnWm9vbSBJbicgfX1cIj4rPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cIm1vdmVMZWZ0KClcIiB0aXRsZT1cInt7ICdNT1ZFX0xFRlQnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ01vdmUgTGVmdCcgfX1cIj7ihpA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwibW92ZVJpZ2h0KClcIiB0aXRsZT1cInt7ICdNT1ZFX1JJR0hUJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdNb3ZlIFJpZ2h0JyB9fVwiPuKGkjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxvZ28taWNvblwiIChjbGljayk9XCJtb3ZlVXAoKVwiIHRpdGxlPVwie3sgJ01PVkVfVVAnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ01vdmUgVXAnIH19XCI+4oaRPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cIm1vdmVEb3duKClcIiB0aXRsZT1cInt7ICdNT1ZFX0RPV04nIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ01vdmUgRG93bicgfX1cIj7ihpM8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwiZmxpcEhvcml6b250YWwoKVwiIFtjbGFzcy5lbmFibGVkXT1cInRyYW5zZm9ybS5mbGlwSFwiXG4gICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0ZMSVBfSE9SSVpPTlRBTExZJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdGbGlwIEhvcml6b250YWxseScgfX1cIj7ihpQ8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwiZmxpcFZlcnRpY2FsKClcIiBbY2xhc3MuZW5hYmxlZF09XCJ0cmFuc2Zvcm0uZmxpcFZcIlxuICAgICAgICAgICAgICB0aXRsZT1cInt7ICdGTElQX1ZFUlRJQ0FMTFknIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0ZsaXAgVmVydGljYWxseScgfX1cIj7ihpU8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwicmVzZXRJbWFnZSgpXCIgdGl0bGU9XCJ7eyAnUkVTRVQnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1Jlc2V0JyB9fVwiPsOXPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=