@fundamental-ngx/core 0.47.0-rc.22 → 0.47.0-rc.23

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.
@@ -192,7 +192,7 @@ export class MultiComboboxComponent extends BaseMultiCombobox {
192
192
  if (event) {
193
193
  event.preventDefault();
194
194
  }
195
- const optionItem = this._suggestions.find((s) => s.value === token.value);
195
+ const optionItem = this._flatSuggestions.find((s) => s.value === token.value);
196
196
  if (optionItem) {
197
197
  this._toggleSelection(optionItem, true);
198
198
  this._rangeSelector.reset();
@@ -436,11 +436,11 @@ export class MultiComboboxComponent extends BaseMultiCombobox {
436
436
  */
437
437
  _onListElementClicked(event, index) {
438
438
  // value has been changed at this point, so it can be safely used
439
- const selectionState = this._suggestions[index].selected;
439
+ const selectionState = this._flatSuggestions[index].selected;
440
440
  this._rangeSelector.onRangeElementToggled(index, event);
441
441
  const toRemoveSet = new Set();
442
442
  this._rangeSelector.applyValueToEachInRange((idx) => {
443
- const current = this._suggestions[idx];
443
+ const current = this._flatSuggestions[idx];
444
444
  if (current.selected !== selectionState) {
445
445
  if (current.selected) {
446
446
  // removing from "_selectedSuggestions" list
@@ -687,4 +687,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImpor
687
687
  type: ViewChild,
688
688
  args: ['inputGroup', { read: ElementRef }]
689
689
  }] } });
690
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvbXVsdGktY29tYm9ib3gvbXVsdGktY29tYm9ib3guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvbXVsdGktY29tYm9ib3gvbXVsdGktY29tYm9ib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9GLE9BQU8sRUFFSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLGNBQWMsRUFDZCxRQUFRLEVBQ1IsS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEVBQ1QsV0FBVyxFQUNYLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25HLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFnRCxNQUFNLDRCQUE0QixDQUFDO0FBQ3BILE9BQU8sRUFDSCxxQkFBcUIsRUFHckIsdUJBQXVCLEVBRXZCLE9BQU8sRUFFUCxtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixnQkFBZ0IsRUFDbkIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBQ0gsaUJBQWlCLEVBQ2pCLGFBQWEsRUFFYix3QkFBd0IsRUFDeEIsaUJBQWlCLEVBQ2pCLHNCQUFzQixFQUN0QixrQkFBa0IsRUFDckIsTUFBTSw0QkFBNEIsQ0FBQztBQUlwQyxPQUFPLEVBQUUsK0JBQStC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ZUFBZTtzQkFEZCxLQUFLO2dCQUtOLGNBQWM7c0JBRGIsS0FBSztnQkFLTixtQkFBbUI7c0JBRGxCLEtBQUs7Z0JBS04sU0FBUztzQkFEUixLQUFLO2dCQVFOLFNBQVM7c0JBRFIsS0FBSztnQkFVTixVQUFVO3NCQURULEtBQUs7Z0JBU04sSUFBSTtzQkFESCxLQUFLO2dCQUtOLHVCQUF1QjtzQkFEdEIsS0FBSztnQkFLTixlQUFlO3NCQURkLE1BQU07Z0JBS1AsWUFBWTtzQkFEWCxNQUFNO2dCQUtQLGtCQUFrQjtzQkFEakIsTUFBTTtnQkFLUCxhQUFhO3NCQURaLE1BQU07Z0JBS1AsWUFBWTtzQkFEWCxNQUFNO2dCQUtFLGtCQUFrQjtzQkFEMUIsU0FBUzt1QkFBQyxvQkFBb0IsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBS3BDLGFBQWE7c0JBRDdCLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUtYLGVBQWU7c0JBRC9CLGVBQWU7dUJBQUMsaUJBQWlCO2dCQUtqQixxQkFBcUI7c0JBRHJDLFNBQVM7dUJBQUMsdUJBQXVCO2dCQUtqQixZQUFZO3NCQUQ1QixTQUFTO3VCQUFDLGNBQWM7Z0JBS1IsVUFBVTtzQkFEMUIsU0FBUzt1QkFBQyxrQkFBa0I7Z0JBS1osV0FBVztzQkFEM0IsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQSwgQ09OVFJPTCwgRE9XTl9BUlJPVywgRU5URVIsIEVTQ0FQRSwgU1BBQ0UsIFVQX0FSUk9XIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEluamVjdGlvblRva2VuLFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q29udGFpbmVyUmVmLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZURpcmVjdGl2ZSwgRkRfREFUQV9TT1VSQ0VfVFJBTlNGT1JNRVIgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2Nkay9kYXRhLXNvdXJjZSc7XG5pbXBvcnQgeyBDdmFDb250cm9sLCBDdmFEaXJlY3RpdmUsIE9wdGlvbkl0ZW0sIFNlbGVjdEl0ZW0sIFNlbGVjdGFibGVPcHRpb25JdGVtIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvZm9ybXMnO1xuaW1wb3J0IHtcbiAgICBBdXRvQ29tcGxldGVEaXJlY3RpdmUsXG4gICAgQXV0b0NvbXBsZXRlRXZlbnQsXG4gICAgQ29udGVudERlbnNpdHksXG4gICAgRHluYW1pY0NvbXBvbmVudFNlcnZpY2UsXG4gICAgRm9jdXNFc2NhcGVEaXJlY3Rpb24sXG4gICAgS2V5VXRpbCxcbiAgICBOdWxsYWJsZSxcbiAgICBTZWFyY2hIaWdobGlnaHRQaXBlLFxuICAgIFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIGNvZXJjZUFycmF5U2FmZSxcbiAgICByZXNpemVPYnNlcnZhYmxlXG59IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY2RrL3V0aWxzJztcbmltcG9ydCB7XG4gICAgRkRfTElTVF9DT01QT05FTlQsXG4gICAgTGlzdENvbXBvbmVudCxcbiAgICBMaXN0Q29tcG9uZW50SW50ZXJmYWNlLFxuICAgIExpc3RHcm91cEhlYWRlckRpcmVjdGl2ZSxcbiAgICBMaXN0SXRlbUNvbXBvbmVudCxcbiAgICBMaXN0U2Vjb25kYXJ5RGlyZWN0aXZlLFxuICAgIExpc3RUaXRsZURpcmVjdGl2ZVxufSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvbGlzdCc7XG5pbXBvcnQgeyBNb2JpbGVNb2RlQ29uZmlnIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL21vYmlsZS1tb2RlJztcbmltcG9ydCB7IFBvcG92ZXJGaWxsTW9kZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9zaGFyZWQnO1xuXG5pbXBvcnQgeyBjb250ZW50RGVuc2l0eU9ic2VydmVyUHJvdmlkZXJzIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2NvbnRlbnQtZGVuc2l0eSc7XG5pbXBvcnQgeyBUb2tlbkNvbXBvbmVudCwgVG9rZW5pemVyQ29tcG9uZW50IH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL3Rva2VuJztcbmltcG9ydCBlcXVhbCBmcm9tICdmYXN0LWRlZXAtZXF1YWwnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQmFzZU11bHRpQ29tYm9ib3ggfSBmcm9tICcuL2Jhc2UtbXVsdGktY29tYm9ib3guY2xhc3MnO1xuaW1wb3J0IHsgTW9iaWxlTXVsdGlDb21ib2JveENvbXBvbmVudCB9IGZyb20gJy4vbW9iaWxlL21vYmlsZS1tdWx0aS1jb21ib2JveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTVVMVElfQ09NQk9CT1hfQ09NUE9ORU5UIH0gZnJvbSAnLi9tdWx0aS1jb21ib2JveC50b2tlbic7XG5cbmltcG9ydCB7IE11bHRpQ29tYm9ib3hEYXRhU291cmNlUGFyc2VyIH0gZnJvbSAnLi9kYXRhLXNvdXJjZS9tdWx0aS1jb21ib2JveC1kYXRhLXNvdXJjZS1wYXJzZXInO1xuXG5pbXBvcnQgeyBOZ0NsYXNzLCBOZ0ZvciwgTmdJZiwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2NoZWNrYm94JztcbmltcG9ydCB7IEZvcm1Db250cm9sQ29tcG9uZW50LCBGb3JtSW5wdXRNZXNzYWdlR3JvdXBDb21wb25lbnQsIEZvcm1NZXNzYWdlQ29tcG9uZW50IH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2Zvcm0nO1xuaW1wb3J0IHsgSW5wdXRHcm91cENvbXBvbmVudCwgSW5wdXRHcm91cElucHV0RGlyZWN0aXZlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2lucHV0LWdyb3VwJztcbmltcG9ydCB7IFBvcG92ZXJCb2R5Q29tcG9uZW50LCBQb3BvdmVyQ29tcG9uZW50LCBQb3BvdmVyQ29udHJvbENvbXBvbmVudCB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9wb3BvdmVyJztcbmltcG9ydCB7IEZkVHJhbnNsYXRlUGlwZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvaTE4bic7XG5pbXBvcnQgeyBnZXRTZWxlY3RJdGVtQnlJbnB1dFZhbHVlLCBnZXRUb2tlbkluZGV4QnlJZGxPclZhbHVlIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IE11bHRpQ29tYm9ib3hTZWxlY3Rpb25DaGFuZ2VFdmVudCB9IGZyb20gJy4vbW9kZWxzL3NlbGVjdGlvbi1jaGFuZ2UuZXZlbnQnO1xuaW1wb3J0IHsgTXVsdGlBbm5vdW5jZXJEaXJlY3RpdmUgfSBmcm9tICcuL211bHRpLWFubm91bmNlci9tdWx0aS1hbm5vdW5jZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IFNlbGVjdEFsbFRvZ2dsZXJDb21wb25lbnQgfSBmcm9tICcuL3NlbGVjdC1hbGwtdG9nZ2xlci9zZWxlY3QtYWxsLXRvZ2dsZXIuY29tcG9uZW50JztcblxuZXhwb3J0IGNvbnN0IEZEX01BUF9MSU1JVCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxudW1iZXI+KCdNYXAgbGltaXTiiaUnLCB7IGZhY3Rvcnk6ICgpID0+IDEyIH0pO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZkLW11bHRpLWNvbWJvYm94JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbXVsdGktY29tYm9ib3guY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL211bHRpLWNvbWJvYm94LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBob3N0RGlyZWN0aXZlczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBkaXJlY3RpdmU6IEN2YURpcmVjdGl2ZSxcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8taW5wdXRzLW1ldGFkYXRhLXByb3BlcnR5XG4gICAgICAgICAgICBpbnB1dHM6IFsnaWQ6aW5wdXRJZCcsICdwbGFjZWhvbGRlcicsICdzdGF0ZScsICdzdGF0ZU1lc3NhZ2UnLCAnZGlzYWJsZWQnLCAncmVhZG9ubHknLCAnbmFtZSddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRpcmVjdGl2ZTogRGF0YVNvdXJjZURpcmVjdGl2ZSxcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8taW5wdXRzLW1ldGFkYXRhLXByb3BlcnR5XG4gICAgICAgICAgICBpbnB1dHM6IFsnZGF0YVNvdXJjZSddLFxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXRzLW1ldGFkYXRhLXByb3BlcnR5XG4gICAgICAgICAgICBvdXRwdXRzOiBbJ2RhdGFDaGFuZ2VkJ11cbiAgICAgICAgfVxuICAgIF0sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIEN2YUNvbnRyb2wsXG4gICAgICAgIER5bmFtaWNDb21wb25lbnRTZXJ2aWNlLFxuICAgICAgICBjb250ZW50RGVuc2l0eU9ic2VydmVyUHJvdmlkZXJzKCksXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IEZEX0RBVEFfU09VUkNFX1RSQU5TRk9STUVSLFxuICAgICAgICAgICAgdXNlQ2xhc3M6IE11bHRpQ29tYm9ib3hEYXRhU291cmNlUGFyc2VyXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE1VTFRJX0NPTUJPQk9YX0NPTVBPTkVOVCxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBNdWx0aUNvbWJvYm94Q29tcG9uZW50XG4gICAgICAgIH1cbiAgICBdLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ0lmLFxuICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgICAgICBQb3BvdmVyQ29tcG9uZW50LFxuICAgICAgICBQb3BvdmVyQ29udHJvbENvbXBvbmVudCxcbiAgICAgICAgUG9wb3ZlckJvZHlDb21wb25lbnQsXG4gICAgICAgIEZvcm1JbnB1dE1lc3NhZ2VHcm91cENvbXBvbmVudCxcbiAgICAgICAgSW5wdXRHcm91cENvbXBvbmVudCxcbiAgICAgICAgVG9rZW5pemVyQ29tcG9uZW50LFxuICAgICAgICBOZ0ZvcixcbiAgICAgICAgVG9rZW5Db21wb25lbnQsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBBdXRvQ29tcGxldGVEaXJlY3RpdmUsXG4gICAgICAgIEZvcm1Db250cm9sQ29tcG9uZW50LFxuICAgICAgICBJbnB1dEdyb3VwSW5wdXREaXJlY3RpdmUsXG4gICAgICAgIEZvcm1NZXNzYWdlQ29tcG9uZW50LFxuICAgICAgICBMaXN0Q29tcG9uZW50LFxuICAgICAgICBTZWxlY3RBbGxUb2dnbGVyQ29tcG9uZW50LFxuICAgICAgICBMaXN0R3JvdXBIZWFkZXJEaXJlY3RpdmUsXG4gICAgICAgIExpc3RUaXRsZURpcmVjdGl2ZSxcbiAgICAgICAgTGlzdEl0ZW1Db21wb25lbnQsXG4gICAgICAgIENoZWNrYm94Q29tcG9uZW50LFxuICAgICAgICBOZ0NsYXNzLFxuICAgICAgICBMaXN0U2Vjb25kYXJ5RGlyZWN0aXZlLFxuICAgICAgICBGZFRyYW5zbGF0ZVBpcGUsXG4gICAgICAgIFNlYXJjaEhpZ2hsaWdodFBpcGUsXG4gICAgICAgIE11bHRpQW5ub3VuY2VyRGlyZWN0aXZlXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBNdWx0aUNvbWJvYm94Q29tcG9uZW50PFQgPSBhbnk+IGV4dGVuZHMgQmFzZU11bHRpQ29tYm9ib3g8VD4gaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkluaXQge1xuICAgIC8qKlxuICAgICAqIFNob3cgc2VsZWN0IGFsbCBjaGVja2JveFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2hvd1NlbGVjdEFsbCA9IGZhbHNlO1xuXG4gICAgLyoqIFByb3ZpZGVzIHNlbGVjdGVkIGl0ZW1zLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHNlbGVjdGVkSXRlbXModmFsdWU6IFRbXSkge1xuICAgICAgICB0aGlzLl9zZWxlY3RlZEl0ZW1zID0gY29lcmNlQXJyYXlTYWZlKHZhbHVlKTtcbiAgICB9XG4gICAgZ2V0IHNlbGVjdGVkSXRlbXMoKTogVFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkSXRlbXM7XG4gICAgfVxuICAgIC8qKiBQcm92aWRlcyBtYXhpbXVtIGhlaWdodCBmb3IgdGhlIG9wdGlvblBhbmVsLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgbWF4SGVpZ2h0ID0gJzI1MHB4JztcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgQWRkT24gQnV0dG9uIHNob3VsZCBiZSBmb2N1c2FibGVcbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgYnV0dG9uRm9jdXNhYmxlID0gZmFsc2U7XG5cbiAgICAvKiogV2hldGhlciB0aGUgYXV0b2NvbXBsZXRlIHNob3VsZCBiZSBlbmFibGVkOyBFbmFibGVkIGJ5IGRlZmF1bHQuICovXG4gICAgQElucHV0KClcbiAgICBhdXRvQ29tcGxldGUgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogVE9ETzogTmFtZSBvZiB0aGUgZW50aXR5IGZvciB3aGljaCBEYXRhUHJvdmlkZXIgd2lsbCBiZSBsb2FkZWQuIFlvdSBjYW4gZWl0aGVyIHBhc3MgbGlzdCBvZlxuICAgICAqIGl0ZW1zIG9yIHVzZSB0aGlzIGVudGl0eUNsYXNzIGFuZCBpbnRlcm5hbGx5IHdlIHNob3VsZCBiZSBhYmxlIHRvIGRvIGxvb2t1cCB0byBzb21lIHJlZ2lzdHJ5XG4gICAgICogYW5kIHJldHJpZXZlIHRoZSBiZXN0IG1hdGNoaW5nIERhdGFQcm92aWRlciB0aGF0IGlzIHNldCBvbiBhcHBsaWNhdGlvbiBsZXZlbFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZW50aXR5Q2xhc3M6IHN0cmluZztcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBtdWx0aS1jb21ib2JveCBzaG91bGQgYmUgYnVpbHQgb24gbW9iaWxlIG1vZGUuICovXG4gICAgQElucHV0KClcbiAgICBtb2JpbGUgPSBmYWxzZTtcblxuICAgIC8qKiBNdWx0aSBDb21ib2JveCBNb2JpbGUgQ29uZmlndXJhdGlvbiwgaXQncyBhcHBsaWVkIG9ubHksIHdoZW4gbW9iaWxlIGlzIGVuYWJsZWQuICovXG4gICAgQElucHV0KClcbiAgICBtb2JpbGVDb25maWc6IE1vYmlsZU1vZGVDb25maWc7XG5cbiAgICAvKiogVGVsbHMgdGhlIG11bHRpLWNvbWJvYm94IGlmIHdlIG5lZWQgdG8gZ3JvdXAgaXRlbXMuICovXG4gICAgQElucHV0KClcbiAgICBncm91cCA9IGZhbHNlO1xuXG4gICAgLyoqIEEgZmllbGQgbmFtZSB0byB1c2UgdG8gZ3JvdXAgZGF0YSBieSAoc3VwcG9ydCBkb3R0ZWQgbm90YXRpb24pLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ3JvdXBLZXk6IHN0cmluZztcblxuICAgIC8qKiBUaGUgZmllbGQgdG8gc2hvdyBkYXRhIGluIHNlY29uZGFyeSBjb2x1bW4uICovXG4gICAgQElucHV0KClcbiAgICBzZWNvbmRhcnlLZXk6IHN0cmluZztcblxuICAgIC8qKiBTaG93IHRoZSBzZWNvbmQgY29sdW1uIChhcHBsaWNhYmxlIGZvciB0d28gY29sdW1ucyBsYXlvdXQpLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2hvd1NlY29uZGFyeVRleHQgPSBmYWxzZTtcblxuICAgIC8qKiBIb3Jpem9udGFsbHkgYWxpZ24gdGV4dCBpbnNpZGUgdGhlIHNlY29uZCBjb2x1bW4gKGFwcGxpY2FibGUgZm9yIHR3byBjb2x1bW5zIGxheW91dCkuICovXG4gICAgQElucHV0KClcbiAgICBzZWNvbmRhcnlUZXh0QWxpZ25tZW50OiAnbGVmdCcgfCAncmlnaHQnID0gJ3JpZ2h0JztcblxuICAgIC8qKiBUdXJucyBvbi9vZmYgQWRqdXN0YWJsZSBXaWR0aCBmZWF0dXJlLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYXV0b1Jlc2l6ZSA9IHRydWU7XG5cbiAgICAvKiogV2hldGhlciB0byBvcGVuIHRoZSBkcm9wZG93biB3aGVuIHRoZSBhZGRvbiBidXR0b24gaXMgY2xpY2tlZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIG9wZW5Ecm9wZG93bk9uQWRkT25DbGlja2VkID0gdHJ1ZTtcblxuICAgIC8qKiBWYWx1ZSBvZiB0aGUgbXVsdGkgY29tYm9ib3ggKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCB2YWx1ZSh2YWx1ZTogVFtdKSB7XG4gICAgICAgIHRoaXMuc2V0VmFsdWUodmFsdWUsIHRydWUpO1xuICAgIH1cblxuICAgIGdldCB2YWx1ZSgpOiBUW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3ZhLnZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcmVzZXQgb3B0aW9ucyBmb3IgdGhlIFNlbGVjdCBib2R5IHdpZHRoLCB3aGF0ZXZlciBpcyBjaG9zZW4sIHRoZSBib2R5IGhhcyBhIDYwMHB4IGxpbWl0LlxuICAgICAqICogYGF0LWxlYXN0YCB3aWxsIGFwcGx5IGEgbWluaW11bSB3aWR0aCB0byB0aGUgYm9keSBlcXVpdmFsZW50IHRvIHRoZSB3aWR0aCBvZiB0aGUgY29udHJvbC4gLSBEZWZhdWx0XG4gICAgICogKiBgZXF1YWxgIHdpbGwgYXBwbHkgYSB3aWR0aCB0byB0aGUgYm9keSBlcXVpdmFsZW50IHRvIHRoZSB3aWR0aCBvZiB0aGUgY29udHJvbC5cbiAgICAgKiAqICdmaXQtY29udGVudCcgd2lsbCBhcHBseSB3aWR0aCBuZWVkZWQgdG8gcHJvcGVybHkgZGlzcGxheSBpdGVtcyBpbnNpZGUsIGluZGVwZW5kZW50IG9mIGNvbnRyb2wuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBmaWxsQ29udHJvbE1vZGU6IFBvcG92ZXJGaWxsTW9kZSA9ICdhdC1sZWFzdCc7XG5cbiAgICAvKiogU2V0cyB0aXRsZSBhdHRyaWJ1dGUgdG8gYWRkb24gYnV0dG9uLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYWRkb25JY29uVGl0bGU6IHN0cmluZztcblxuICAgIC8qKiBTZXRzIGludmFsaWQgZW50cnkgbWVzc2FnZS4gKi9cbiAgICBASW5wdXQoKVxuICAgIGludmFsaWRFbnRyeU1lc3NhZ2UgPSAnSW52YWxpZCBlbnRyeSc7XG5cbiAgICAvKiogVHVybnMgbGltaXRsZXNzIG1vZGUsIE9OIG9yIE9GRiAqL1xuICAgIEBJbnB1dCgpXG4gICAgbGltaXRsZXNzOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogVXNlZCBpbiBmaWx0ZXJzIGFuZCBhbnkga2luZCBvZiBjb21wYXJhdG9ycyB3aGVuIHdlIHdvcmsgd2l0aCBvYmplY3RzIGFuZCB0aGlzIGlkZW50aWZ5XG4gICAgICogdW5pcXVlIGZpZWxkIG5hbWUgYmFzZWQgb24gd2hpY2ggd2UgYXJlIGdvaW5nIHRvIGRvIHRoZSBqb2JcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGxvb2t1cEtleTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogV2hlbiB3ZSBkZWFsIHdpdGggdW5rbm93biBvYmplY3Qgd2UgY2FuIHVzZSBgZGlzcGxheUtleWAgdG8gcmV0cmlldmUgdmFsdWUgZnJvbSBzcGVjaWZpY1xuICAgICAqIHByb3BlcnR5IG9mIHRoZSBvYmplY3QgdG8gYWN0IGFzIGRpc3BsYXkgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAU2VlIENvbWJvQm94LCBTZWxlY3QsIFJhZGlvR3JvdXAsIENoZWNrQm94IEdyb3VwXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBkaXNwbGF5S2V5OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHZhbHVlcywgaXQgY2FuIGJlIG9mIHR5cGUgU2VsZWN0SXRlbSwgc3RyaW5nIG9yIGFueSBvYmplY3QuXG4gICAgICogR2VuZXJpYyBvYmplY3QgdHlwZSBpcyBhbW9uZyB0aGUgbGlzdCBvZiB0eXBlcyxcbiAgICAgKiBiZWNhdXNlIHdlIGFsbG93IHRvIGdldCBsYWJlbHMgYW5kIHZhbHVlcyB1c2luZyBgZGlzcGxheUtleWAgYW5kIGBsb29rdXBLZXlgIGlucHV0cyBhY2NvcmRpbmdseS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGxpc3Q6IEFycmF5PFNlbGVjdEl0ZW0gfCBzdHJpbmcgfCBvYmplY3Q+O1xuXG4gICAgLyoqIFRpbWUgaW4gbXMgZm9yIGhvdyBsb25nIG1lc3NhZ2Ugb2YgaW52YWxpZCBlbnRyeSBzaG91bGQgYmUgZGlzcGxheWVkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgaW52YWxpZEVudHJ5RGlzcGxheVRpbWUgPSAzMDAwO1xuXG4gICAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiBpdGVtIGlzIHNlbGVjdGVkLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TXVsdGlDb21ib2JveFNlbGVjdGlvbkNoYW5nZUV2ZW50PigpO1xuXG4gICAgLyoqIEBoaWRkZW4gRW1pdHMgZXZlbnQgd2hlbiB0aGUgbWVudSBpcyBvcGVuZWQvY2xvc2VkLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGlzT3BlbkNoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgLyoqIEVtaXRzIGV2ZW50IHdoZW4gdGhlIGFkZG9uIGJ1dHRvbiBpcyBjbGlja2VkLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGFkZE9uQnV0dG9uQ2xpY2tlZDogRXZlbnRFbWl0dGVyPEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG5cbiAgICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIGRhdGEgbG9hZGluZyBpcyBzdGFydGVkLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGRhdGFSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIGRhdGEgbG9hZGluZyBpcyBmaW5pc2hlZC4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBkYXRhUmVjZWl2ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoJ3NlYXJjaElucHV0RWxlbWVudCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHJlYWRvbmx5IHNlYXJjaElucHV0RWxlbWVudDogTnVsbGFibGU8RWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50Pj47XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoRkRfTElTVF9DT01QT05FTlQpXG4gICAgcHJpdmF0ZSByZWFkb25seSBsaXN0Q29tcG9uZW50OiBMaXN0Q29tcG9uZW50SW50ZXJmYWNlO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlRGlyZWN0aXZlKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgY3VzdG9tVGVtcGxhdGVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVEaXJlY3RpdmU+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKCdtb2JpbGVDb250cm9sVGVtcGxhdGUnKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgbW9iaWxlQ29udHJvbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKCdsaXN0VGVtcGxhdGUnKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgbGlzdFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKFRva2VuaXplckNvbXBvbmVudClcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90b2tlbml6ZXI6IFRva2VuaXplckNvbXBvbmVudDtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZCgnaW5wdXRHcm91cCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2lucHV0R3JvdXA6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEN1c3RvbSBPcHRpb24gaXRlbSBUZW1wbGF0ZS5cbiAgICAgKi9cbiAgICBvcHRpb25JdGVtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQ3VzdG9tIEdyb3VwIEhlYWRlciBpdGVtIFRlbXBsYXRlLlxuICAgICAqL1xuICAgIGdyb3VwSXRlbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEN1c3RvbSBTZWNvbmRhcnkgaXRlbSBUZW1wbGF0ZS5cbiAgICAgKi9cbiAgICBzZWNvbmRhcnlJdGVtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQ3VzdG9tIFNlbGVjdGVkIG9wdGlvbiBpdGVtIFRlbXBsYXRlLlxuICAgICAqL1xuICAgIHNlbGVjdGVkSXRlbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfY29udGVudERlbnNpdHk6IENvbnRlbnREZW5zaXR5ID0gdGhpcy5fbXVsdGlDb21ib2JveENvbmZpZz8uY29udGVudERlbnNpdHkgPz8gJ2NvenknO1xuXG4gICAgLyoqIFNldCB0aGUgaW5wdXQgdGV4dCBvZiB0aGUgaW5wdXQuICovXG4gICAgc2V0IGlucHV0VGV4dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2lucHV0VGV4dFZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgdGhpcy5fY3ZhLm9uVG91Y2hlZCgpO1xuICAgIH1cblxuICAgIC8qKiBHZXQgdGhlIGlucHV0IHRleHQgb2YgdGhlIGlucHV0LiAqL1xuICAgIGdldCBpbnB1dFRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lucHV0VGV4dFZhbHVlIHx8ICcnO1xuICAgIH1cblxuICAgIC8qKiBJcyBlbXB0eSBzZWFyY2ggZmllbGQuICovXG4gICAgZ2V0IGlzRW1wdHlWYWx1ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRUZXh0LnRyaW0oKS5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBnZXQgaXNHcm91cCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhKHRoaXMuZ3JvdXAgJiYgdGhpcy5ncm91cEtleSk7XG4gICAgfVxuXG4gICAgLyoqIFdoZXRoZXIgdGhlIE11bHRpIElucHV0IGlzIG9wZW5lZC4gKi9cbiAgICBpc09wZW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNYXggd2lkdGggb2YgbGlzdCBjb250YWluZXJcbiAgICAgKi9cbiAgICBtYXhXaWR0aDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1pbiB3aWR0aCBvZiBsaXN0IGNvbnRhaW5lclxuICAgICAqL1xuICAgIG1pbldpZHRoOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTmVlZCBmb3Igb3BlbmluZyBtb2JpbGUgdmVyc2lvblxuICAgICAqL1xuICAgIG9wZW5DaGFuZ2UgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9zZWxlY3RlZEl0ZW1zOiBUW10gPSBbXTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2luamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfZHluYW1pY0NvbXBvbmVudFNlcnZpY2U6IER5bmFtaWNDb21wb25lbnRTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5jb250ZW50RGVuc2l0eU9ic2VydmVyLnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3ZhQ29udHJvbC5saXN0ZW5Ub0NoYW5nZXMoKTtcbiAgICAgICAgdGhpcy5fb3BlbkRhdGFTdHJlYW0oKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGFzeW5jIG5nQWZ0ZXJWaWV3SW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMubW9iaWxlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9zZXRVcE1vYmlsZU1vZGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Fzc2lnbkN1c3RvbVRlbXBsYXRlcygpO1xuXG4gICAgICAgIHRoaXMuX2luaXRXaW5kb3dSZXNpemUoKTtcblxuICAgICAgICB0aGlzLl90b2tlbml6ZXIuX3Nob3dPdmVyZmxvd1BvcG92ZXIgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF90b2dnbGVTZWxlY3Rpb24oaXRlbTogU2VsZWN0YWJsZU9wdGlvbkl0ZW0sIGZyb21Ub2tlbkNsb3NlQ2xpY2sgPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpZHggPSBnZXRUb2tlbkluZGV4QnlJZGxPclZhbHVlKGl0ZW0sIHRoaXMuX3NlbGVjdGVkU3VnZ2VzdGlvbnMpO1xuICAgICAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRTdWdnZXN0aW9ucy5wdXNoKGl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRTdWdnZXN0aW9ucy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW0uc2VsZWN0ZWQgPSAhaXRlbS5zZWxlY3RlZDtcblxuICAgICAgICB0aGlzLl9wcm9wYWdhdGVDaGFuZ2UoZnJvbVRva2VuQ2xvc2VDbGljayk7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9zZWxlY3RlZFN1Z2dlc3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5fZm9jdXNUb1NlYXJjaEZpZWxkKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfb25PcHRpb25DaGVja2JveENsaWNrZWQoZXZlbnQ6IE1vdXNlRXZlbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuX29uTGlzdEVsZW1lbnRDbGlja2VkKGV2ZW50LCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfb25Db21wbGV0ZVRlcm0oZXZlbnQ6IEF1dG9Db21wbGV0ZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5mb3JjZUNsb3NlKSB7XG4gICAgICAgICAgICB0aGlzLl90b2dnbGVTZWxlY3Rpb25CeUlucHV0VGV4dChldmVudC50ZXJtKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCBzZWxlY3RzIGFsbCBwb3NzaWJsZSBvcHRpb25zLlxuICAgICAqICpzZWxlY3QqIGF0dHJpYnV0ZSDigJMgaWYgKnRydWUqIHNlbGVjdCBhbGwsIGlmICpmYWxzZSogdW5zZWxlY3QgYWxsXG4gICAgICogKi9cbiAgICBfaGFuZGxlU2VsZWN0QWxsSXRlbXMgPSAoc2VsZWN0OiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuX2ZsYXRTdWdnZXN0aW9ucy5mb3JFYWNoKChpdGVtKSA9PiAoaXRlbS5zZWxlY3RlZCA9IHNlbGVjdCkpO1xuICAgICAgICB0aGlzLl9vbkV2ZXJ5SXRlbSh0aGlzLl9zdWdnZXN0aW9ucywgKGl0ZW0pID0+IChpdGVtLnNlbGVjdGVkID0gc2VsZWN0KSk7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkU3VnZ2VzdGlvbnMgPSBzZWxlY3QgPyBbLi4udGhpcy5fZmxhdFN1Z2dlc3Rpb25zXSA6IFtdO1xuICAgICAgICB0aGlzLl9yYW5nZVNlbGVjdG9yLnJlc2V0KCk7XG5cbiAgICAgICAgdGhpcy5fcHJvcGFnYXRlQ2hhbmdlKCk7XG4gICAgfTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX25hdmlnYXRlQnlUb2tlbnMoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBbRE9XTl9BUlJPVywgVVBfQVJST1ddKSAmJiB0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5saXN0Q29tcG9uZW50Lml0ZW1zPy5maXJzdC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfcmVtb3ZlVG9rZW4odG9rZW46IFNlbGVjdGFibGVPcHRpb25JdGVtLCBldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvbkl0ZW0gPSB0aGlzLl9zdWdnZXN0aW9ucy5maW5kKChzKSA9PiBzLnZhbHVlID09PSB0b2tlbi52YWx1ZSk7XG4gICAgICAgIGlmIChvcHRpb25JdGVtKSB7XG4gICAgICAgICAgICB0aGlzLl90b2dnbGVTZWxlY3Rpb24ob3B0aW9uSXRlbSwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLl9yYW5nZVNlbGVjdG9yLnJlc2V0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9tb3JlQ2xpY2tlZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc3VnZ2VzdGlvbnMgPSB0aGlzLmlzR3JvdXBcbiAgICAgICAgICAgID8gdGhpcy5fY29udmVydE9iamVjdHNUb0dyb3VwT3B0aW9uSXRlbXModGhpcy5fc2VsZWN0ZWRTdWdnZXN0aW9ucy5tYXAoKHsgdmFsdWUgfSkgPT4gdmFsdWUpKVxuICAgICAgICAgICAgOiB0aGlzLl9zdWdnZXN0aW9ucy5maWx0ZXIoKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRTdWdnZXN0aW9ucy5zb21lKChpdGVtKSA9PiBlcXVhbChpdGVtLnZhbHVlLCB2YWx1ZS52YWx1ZSkpXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5fc2hvd0xpc3QodHJ1ZSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTaG93biQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfb25CbHVyKGV2ZW50OiBGb2N1c0V2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzTGlzdCA9ICEhdGFyZ2V0LmNsb3Nlc3QoJy5mZC1tdWx0aS1jb21ib2JveF9fbGlzdC1jb250YWluZXInKTtcbiAgICAgICAgICAgIGlmIChpc0xpc3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5fc3VnZ2VzdGlvbnM/Lmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX3N1Z2dlc3Rpb25zWzBdLmxhYmVsID09PSB0aGlzLmlucHV0VGV4dCAmJlxuICAgICAgICAgICAgICAgICF0aGlzLl9zdWdnZXN0aW9uc1swXS5zZWxlY3RlZFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdG9nZ2xlU2VsZWN0aW9uKHRoaXMuX3N1Z2dlc3Rpb25zWzBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3Nob3dMaXN0KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRUZXh0ID0gJyc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9vbkl0ZW1LZXlEb3duSGFuZGxlcihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIEVTQ0FQRSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzVG9TZWFyY2hGaWVsZCgpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmIGV2ZW50LnNoaWZ0S2V5ICYmIEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBBKSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZVNlbGVjdEFsbEl0ZW1zKGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiBLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgQSkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVTZWxlY3RBbGxJdGVtcyh0cnVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgRU5URVIpKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMubW9iaWxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcmFuZ2VTZWxlY3Rvci5yZXNldCgpO1xuICAgICAgICB9IGVsc2UgaWYgKEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBTUEFDRSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3JhbmdlU2VsZWN0b3IucmVzZXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX29uT3B0aW9uQ2xpY2tlZChldmVudDogTW91c2VFdmVudCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkxpc3RFbGVtZW50Q2xpY2tlZChldmVudCwgaW5kZXgpO1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEhhbmRsZSBkaWFsb2cgZGlzbWlzc2luZywgY2xvc2VzIHBvcG92ZXIgYW5kIHNldHMgYmFja3VwIGRhdGEuXG4gICAgICovXG4gICAgX2RpYWxvZ0Rpc21pc3MoYmFja3VwOiBTZWxlY3RhYmxlT3B0aW9uSXRlbVtdKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkU3VnZ2VzdGlvbnMgPSBbLi4uYmFja3VwXTtcbiAgICAgICAgdGhpcy5pbnB1dFRleHQgPSAnJztcbiAgICAgICAgdGhpcy5fc2hvd0xpc3QoZmFsc2UpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkU2hvd24kLm5leHQoZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBIYW5kbGUgZGlhbG9nIGFwcHJvdmFsLCBjbG9zZXMgcG9wb3ZlciBhbmQgcHJvcGFnYXRlcyBkYXRhIGNoYW5nZXMuXG4gICAgICovXG4gICAgX2RpYWxvZ0FwcHJvdmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5wdXRUZXh0ID0gJyc7XG4gICAgICAgIHRoaXMuX3Nob3dMaXN0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5fcHJvcGFnYXRlQ2hhbmdlKHRydWUpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX3BvcG92ZXJPcGVuQ2hhbmdlSGFuZGxlKGlzT3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmlzT3BlbiA9IGlzT3BlbjtcbiAgICAgICAgdGhpcy5fcmFuZ2VTZWxlY3Rvci5yZXNldCgpO1xuICAgIH1cblxuICAgIC8qKiBPcGVucyB0aGUgc2VsZWN0IHBvcG92ZXIgYm9keS4gKi9cbiAgICBvcGVuKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG4gICAgICAgIHRoaXMuaXNPcGVuQ2hhbmdlLmVtaXQodGhpcy5pc09wZW4pO1xuICAgICAgICB0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKiogQ2xvc2VzIHRoZSBzZWxlY3QgcG9wb3ZlciBib2R5LiAqL1xuICAgIGNsb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9mb2N1c1RvU2VhcmNoRmllbGQoKTtcbiAgICAgICAgdGhpcy5fcmFuZ2VTZWxlY3Rvci5yZXNldCgpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkU2hvd24kLm5leHQoZmFsc2UpO1xuICAgICAgICB0aGlzLmlucHV0VGV4dCA9ICcnO1xuXG4gICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNPcGVuQ2hhbmdlLmVtaXQodGhpcy5pc09wZW4pO1xuICAgICAgICB0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9zaG93TGlzdChpc09wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuICE9PSBpc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gaXNPcGVuO1xuICAgICAgICAgICAgdGhpcy5fY3ZhLm9uVG91Y2hlZCgpO1xuICAgICAgICAgICAgdGhpcy5vcGVuQ2hhbmdlLm5leHQoaXNPcGVuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX3NlYXJjaFRlcm1DaGFuZ2VkKCcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX3NlYXJjaFRlcm1DaGFuZ2VkKHRleHQ6IHN0cmluZyA9IHRoaXMuaW5wdXRUZXh0KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgbWFwLnNldCgncXVlcnknLCB0ZXh0KTtcblxuICAgICAgICBpZiAoIXRoaXMubGltaXRsZXNzKSB7XG4gICAgICAgICAgICBtYXAuc2V0KCdsaW1pdCcsIHRoaXMuX21hcExpbWl0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZURpcmVjdGl2ZS5kYXRhU291cmNlUHJvdmlkZXI/Lm1hdGNoKG1hcCk7XG5cbiAgICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIENsaWNrIG9uIEJ1dHRvblxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBfb25QcmltYXJ5QnV0dG9uQ2xpY2soaXNPcGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmICghaXNPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWFyY2hUZXJtQ2hhbmdlZCgnJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcGVuRHJvcGRvd25PbkFkZE9uQ2xpY2tlZCkge1xuICAgICAgICAgICAgdGhpcy5fc2hvd0xpc3QoIWlzT3Blbik7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX3Nob3dMaXN0KGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dEVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBLZXlkb3duIG9uIElucHV0XG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIF9vbklucHV0S2V5ZG93bkhhbmRsZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2N2YS5yZWFkb25seSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBET1dOX0FSUk9XKSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgaWYgKGV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3dMaXN0KHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5pc09wZW4gJiYgdGhpcy5saXN0Q29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0Q29tcG9uZW50LnNldEl0ZW1BY3RpdmUoMCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Nob29zZU90aGVySXRlbSgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgVVBfQVJST1cpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICB0aGlzLl9jaG9vc2VPdGhlckl0ZW0oLTEpO1xuICAgICAgICB9IGVsc2UgaWYgKEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBFTlRFUikpIHtcbiAgICAgICAgICAgIHRoaXMuX3RvZ2dsZVNlbGVjdGlvbkJ5SW5wdXRUZXh0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIEVTQ0FQRSkpIHtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgICAgICB0aGlzLl9zaG93TGlzdChmYWxzZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIUtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBbLi4udGhpcy5fbm9uT3BlbmluZ0tleXMsIENPTlRST0xdKSkge1xuICAgICAgICAgICAgdGhpcy5fc2hvd0xpc3QodHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCBhY2NlcHRlZEtleXMgPSAhS2V5VXRpbC5pc0tleVR5cGUoZXZlbnQsICdhbHBoYWJldGljYWwnKSAmJiAhS2V5VXRpbC5pc0tleVR5cGUoZXZlbnQsICdudW1lcmljJyk7XG4gICAgICAgICAgICBpZiAoYWNjZXB0ZWRLZXlzKSB7XG4gICAgICAgICAgICAgICAgLy8gU2V0VGltZW91dCBpcyBuZWVkZWQgZm9yIGlucHV0IHRvIHJlY2VpdmUgbmV3IHZhbHVlLlxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0VtcHR5VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGlzdENvbXBvbmVudD8uc2V0SXRlbUFjdGl2ZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCBwYXNzZWQgdG8gbGlzdCBjb21wb25lbnQuXG4gICAgICovXG4gICAgX2hhbmRsZUxpc3RGb2N1c0VzY2FwZShkaXJlY3Rpb246IEZvY3VzRXNjYXBlRGlyZWN0aW9uKTogdm9pZCB7XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09ICd1cCcpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzVG9TZWFyY2hGaWVsZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIF9hZGRPbkNsaWNrZWQoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFkZE9uQnV0dG9uQ2xpY2tlZC5lbWl0KCRldmVudCk7XG4gICAgICAgIGlmICghdGhpcy5tb2JpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX29uUHJpbWFyeUJ1dHRvbkNsaWNrKHRoaXMuaXNPcGVuKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogSXRlcmF0ZSBvdmVyIGV2ZXJ5IGl0ZW0gYW5kIHBlcmZvcm0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBwcml2YXRlIF9vbkV2ZXJ5SXRlbShpdGVtczogU2VsZWN0YWJsZU9wdGlvbkl0ZW1bXSwgY2FsbGJhY2s6IChpdGVtOiBTZWxlY3RhYmxlT3B0aW9uSXRlbSkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayhpdGVtKTtcbiAgICAgICAgICAgIGlmIChpdGVtLmNoaWxkcmVuICYmIGl0ZW0uY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uRXZlcnlJdGVtKGl0ZW0uY2hpbGRyZW4sIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF90b2dnbGVTZWxlY3Rpb25CeUlucHV0VGV4dCh0ZXh0ID0gdGhpcy5pbnB1dFRleHQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IGdldFNlbGVjdEl0ZW1CeUlucHV0VmFsdWU8VD4odGhpcy5fZnVsbEZsYXRTdWdnZXN0aW9ucywgdGV4dCk7XG4gICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICB0aGlzLl90b2dnbGVTZWxlY3Rpb24oaXRlbSk7XG4gICAgICAgICAgICB0aGlzLmlucHV0VGV4dCA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2VhcmNoVGVybUNoYW5nZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRvIHNldCBpbnB1dCB0ZXh0IGFzIGl0ZW0gbGFiZWwuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2V0SW5wdXRUZXh0RnJvbU9wdGlvbkl0ZW0oaXRlbTogT3B0aW9uSXRlbSk6IHZvaWQge1xuICAgICAgICB0aGlzLmlucHV0VGV4dCA9IGl0ZW0ubGFiZWw7XG5cbiAgICAgICAgaWYgKHRoaXMubW9iaWxlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zaG93TGlzdChmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIGFwcGx5aW5nIHJhbmdlIHNlbGVjdGlvbi4gTm90ZSwgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZCBhZnRlciBjb21ib2JveCBpdGVtJ3MgdmFsdWUgaGFzIGJlZW4gY2hhbmdlZFxuICAgICAqL1xuICAgIHByaXZhdGUgX29uTGlzdEVsZW1lbnRDbGlja2VkKGV2ZW50OiBNb3VzZUV2ZW50LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIC8vIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQgYXQgdGhpcyBwb2ludCwgc28gaXQgY2FuIGJlIHNhZmVseSB1c2VkXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvblN0YXRlID0gdGhpcy5fc3VnZ2VzdGlvbnNbaW5kZXhdLnNlbGVjdGVkO1xuICAgICAgICB0aGlzLl9yYW5nZVNlbGVjdG9yLm9uUmFuZ2VFbGVtZW50VG9nZ2xlZChpbmRleCwgZXZlbnQpO1xuICAgICAgICBjb25zdCB0b1JlbW92ZVNldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgdGhpcy5fcmFuZ2VTZWxlY3Rvci5hcHBseVZhbHVlVG9FYWNoSW5SYW5nZSgoaWR4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fc3VnZ2VzdGlvbnNbaWR4XTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50LnNlbGVjdGVkICE9PSBzZWxlY3Rpb25TdGF0ZSkge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92aW5nIGZyb20gXCJfc2VsZWN0ZWRTdWdnZXN0aW9uc1wiIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgdG9SZW1vdmVTZXQuYWRkKGN1cnJlbnQudmFsdWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFkZGluZyBjdXJyZW50IGl0ZW0gdG8gXCJfc2VsZWN0ZWRTdWdnZXN0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkU3VnZ2VzdGlvbnMucHVzaChjdXJyZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VycmVudC5zZWxlY3RlZCA9IHNlbGVjdGlvblN0YXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRTdWdnZXN0aW9ucyA9IHRoaXMuX3NlbGVjdGVkU3VnZ2VzdGlvbnMuZmlsdGVyKChzKSA9PiAhdG9SZW1vdmVTZXQuaGFzKHMudmFsdWUpKTtcbiAgICAgICAgdGhpcy5fcHJvcGFnYXRlQ2hhbmdlKCk7XG5cbiAgICAgICAgdGhpcy5fdG9rZW5pemVyLm9uUmVzaXplKCk7XG5cbiAgICAgICAgdGhpcy5fdG9rZW5pemVyLnRva2VuaXplcklubmVyRWwubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID1cbiAgICAgICAgICAgIHRoaXMuX3Rva2VuaXplci50b2tlbml6ZXJJbm5lckVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9wcm9wYWdhdGVDaGFuZ2UoZW1pdEluTW9iaWxlPzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMubW9iaWxlIHx8IGVtaXRJbk1vYmlsZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwQW5kVXBkYXRlTW9kZWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBhc3luYyBfc2V0VXBNb2JpbGVNb2RlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICAgICAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE1VTFRJX0NPTUJPQk9YX0NPTVBPTkVOVCwgdXNlVmFsdWU6IHRoaXMgfV0sXG4gICAgICAgICAgICBwYXJlbnQ6IHRoaXMuX2luamVjdG9yXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX2R5bmFtaWNDb21wb25lbnRTZXJ2aWNlLmNyZWF0ZUR5bmFtaWNDb21wb25lbnQoXG4gICAgICAgICAgICB7IGxpc3RUZW1wbGF0ZTogdGhpcy5saXN0VGVtcGxhdGUsIGNvbnRyb2xUZW1wbGF0ZTogdGhpcy5tb2JpbGVDb250cm9sVGVtcGxhdGUgfSxcbiAgICAgICAgICAgIE1vYmlsZU11bHRpQ29tYm9ib3hDb21wb25lbnQsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyUmVmOiB0aGlzLl92aWV3Q29udGFpbmVyUmVmXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBpbmplY3RvciB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IHBpY2tzIG90aGVyIHZhbHVlIG1vdmVkIGZyb20gY3VycmVudCBvbmUgYnkgb2Zmc2V0LCBjYWxsZWQgb25seSB3aGVuIE11bHRpIENvbWJvYm94IGlzIGNsb3NlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9jaG9vc2VPdGhlckl0ZW0ob2Zmc2V0OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkU3VnZ2VzdGlvbnM/Lmxlbmd0aCA9PT0gdGhpcy5fZmxhdFN1Z2dlc3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dFRleHQgPSAnJztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFjdGl2ZVZhbHVlID0gZ2V0U2VsZWN0SXRlbUJ5SW5wdXRWYWx1ZTxUPih0aGlzLl9mdWxsRmxhdFN1Z2dlc3Rpb25zLCB0aGlzLmlucHV0VGV4dCk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZmxhdFN1Z2dlc3Rpb25zLmZpbmRJbmRleCgodmFsdWUpID0+IHZhbHVlID09PSBhY3RpdmVWYWx1ZSk7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gIXRoaXMuaW5wdXRUZXh0ICYmIG9mZnNldCA9PT0gLTEgPyB0aGlzLl9mbGF0U3VnZ2VzdGlvbnMubGVuZ3RoIC0gMSA6IGluZGV4ICsgb2Zmc2V0O1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fZmxhdFN1Z2dlc3Rpb25zW3Bvc2l0aW9uXTtcblxuICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgdGhpcy5fc2V0SW5wdXRUZXh0RnJvbU9wdGlvbkl0ZW0oaXRlbSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gdGhpcy5fc2VsZWN0ZWRTdWdnZXN0aW9ucy5maW5kSW5kZXgoKHZhbHVlKSA9PiB2YWx1ZS5sYWJlbCA9PT0gaXRlbT8ubGFiZWwpO1xuICAgICAgICBpZiAoc2VsZWN0ZWRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuX2Nob29zZU90aGVySXRlbShvZmZzZXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9pbml0V2luZG93UmVzaXplKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9nZXRPcHRpb25zTGlzdFdpZHRoKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmF1dG9SZXNpemUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc2l6ZU9ic2VydmFibGUodGhpcy5faW5wdXRHcm91cC5uYXRpdmVFbGVtZW50KVxuICAgICAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDMwKSwgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9nZXRPcHRpb25zTGlzdFdpZHRoKCkpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZ2V0T3B0aW9uc0xpc3RXaWR0aCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmJvZHk7XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLl9pbnB1dEdyb3VwLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHNjcm9sbEJhcldpZHRoID0gYm9keS5vZmZzZXRXaWR0aCAtIGJvZHkuY2xpZW50V2lkdGg7XG4gICAgICAgIHRoaXMubWF4V2lkdGggPSB0aGlzLmF1dG9SZXNpemUgPyB3aW5kb3cuaW5uZXJXaWR0aCAtIHNjcm9sbEJhcldpZHRoIC0gcmVjdC5sZWZ0IDogdGhpcy5taW5XaWR0aDtcbiAgICAgICAgdGhpcy5taW5XaWR0aCA9IHJlY3Qud2lkdGggLSAyO1xuICAgICAgICB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEFzc2lnbiBjdXN0b20gdGVtcGxhdGVzXG4gICAgICovXG4gICAgcHJpdmF0ZSBfYXNzaWduQ3VzdG9tVGVtcGxhdGVzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlcy5mb3JFYWNoKCh0ZW1wbGF0ZSkgPT4ge1xuICAgICAgICAgICAgc3dpdGNoICh0ZW1wbGF0ZS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnb3B0aW9uSXRlbVRlbXBsYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25JdGVtVGVtcGxhdGUgPSB0ZW1wbGF0ZS50ZW1wbGF0ZVJlZjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZ3JvdXBJdGVtVGVtcGxhdGUnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwSXRlbVRlbXBsYXRlID0gdGVtcGxhdGUudGVtcGxhdGVSZWY7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NlY29uZGFyeUl0ZW1UZW1wbGF0ZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Vjb25kYXJ5SXRlbVRlbXBsYXRlID0gdGVtcGxhdGUudGVtcGxhdGVSZWY7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NlbGVjdGVkSXRlbVRlbXBsYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1UZW1wbGF0ZSA9IHRlbXBsYXRlLnRlbXBsYXRlUmVmO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZkLW11bHRpLWNvbWJvYm94XCI+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVGVtcGxhdGVcIiAqbmdJZj1cIm1vYmlsZVwiPjwvbmctY29udGFpbmVyPlxuXG4gICAgPGZkLXBvcG92ZXJcbiAgICAgICAgKm5nSWY9XCIhbW9iaWxlXCJcbiAgICAgICAgYWRkaXRpb25hbEJvZHlDbGFzcz1cImZkLXBvcG92ZXItY3VzdG9tLWxpc3QgZmQtbXVsdGktY29tYm9ib3hfX2xpc3QtY29udGFpbmVyXCJcbiAgICAgICAgKGlzT3BlbkNoYW5nZSk9XCJfcG9wb3Zlck9wZW5DaGFuZ2VIYW5kbGUoJGV2ZW50KVwiXG4gICAgICAgIFtpc09wZW5dPVwiaXNPcGVuXCJcbiAgICAgICAgW3RyaWdnZXJzXT1cIltdXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cInRoaXMuX2N2YS5kaXNhYmxlZFwiXG4gICAgICAgIFtmaWxsQ29udHJvbE1vZGVdPVwiZmlsbENvbnRyb2xNb2RlXCJcbiAgICA+XG4gICAgICAgIDxmZC1wb3BvdmVyLWNvbnRyb2w+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250cm9sVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2ZkLXBvcG92ZXItY29udHJvbD5cbiAgICAgICAgPGZkLXBvcG92ZXItYm9keSBbc3R5bGUud2lkdGguJV09XCIhYXV0b1Jlc2l6ZSAmJiAxMDBcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsaXN0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgPC9mZC1wb3BvdmVyLWJvZHk+XG4gICAgPC9mZC1wb3BvdmVyPlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjY29udHJvbFRlbXBsYXRlPlxuICAgIDxmZC1mb3JtLWlucHV0LW1lc3NhZ2UtZ3JvdXA+XG4gICAgICAgIDxmZC1pbnB1dC1ncm91cFxuICAgICAgICAgICAgI2lucHV0R3JvdXBcbiAgICAgICAgICAgIFtpZF09XCJ0aGlzLl9jdmEuaWQgKyAnLWlucHV0LWdyb3VwLWNvbnRhaW5lcidcIlxuICAgICAgICAgICAgW3N0YXRlXT1cInRoaXMuX2N2YS5zdGF0ZVwiXG4gICAgICAgICAgICBbYnV0dG9uRm9jdXNhYmxlXT1cImJ1dHRvbkZvY3VzYWJsZVwiXG4gICAgICAgICAgICBbYnV0dG9uXT1cIiF0aGlzLl9jdmEucmVhZG9ubHlcIlxuICAgICAgICAgICAgW2dseXBoXT1cIiF0aGlzLl9jdmEucmVhZG9ubHkgPyAnbmF2aWdhdGlvbi1kb3duLWFycm93JyA6ICcgJ1wiXG4gICAgICAgICAgICBbaXNDb250cm9sXT1cInRydWVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRoaXMuX2N2YS5kaXNhYmxlZCB8fCB0aGlzLl9jdmEucmVhZG9ubHlcIlxuICAgICAgICAgICAgW2lzRXhwYW5kZWRdPVwiIW1vYmlsZSAmJiBpc09wZW4gJiYgX3N1Z2dlc3Rpb25zLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJ0aGlzLl9jdmEuZGlzYWJsZWQgfHwgdGhpcy5fY3ZhLnJlYWRvbmx5XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtcmVhZG9ubHldPVwidGhpcy5fY3ZhLnJlYWRvbmx5XCJcbiAgICAgICAgICAgIFtnbHlwaEFyaWFMYWJlbF09XCJ0aGlzLl9jdmEuYXJpYUxhYmVsIHx8ICgncGxhdGZvcm1NdWx0aUNvbWJvYm94LmlucHV0R2x5cGhBcmlhTGFiZWwnIHwgZmRUcmFuc2xhdGUpXCJcbiAgICAgICAgICAgIFtpY29uVGl0bGVdPVwiYWRkb25JY29uVGl0bGUgfHwgKCdwbGF0Zm9ybU11bHRpQ29tYm9ib3guaW5wdXRHbHlwaEFyaWFMYWJlbCcgfCBmZFRyYW5zbGF0ZSlcIlxuICAgICAgICAgICAgKGFkZE9uQnV0dG9uQ2xpY2tlZCk9XCJfYWRkT25DbGlja2VkKCRldmVudClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm1vYmlsZSAmJiAhaXNPcGVuICYmIF9vblByaW1hcnlCdXR0b25DbGljayhmYWxzZSlcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwiX25hdmlnYXRlQnlUb2tlbnMoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxmZC10b2tlbml6ZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIl9zZWxlY3RlZFN1Z2dlc3Rpb25zXCJcbiAgICAgICAgICAgICAgICBbdG9rZW5pemVyRm9jdXNhYmxlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICBbY29tcGFjdENvbGxhcHNlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICN0b2tlbml6ZXJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZkLW11bHRpLWNvbWJvYm94LXRva2VuaXplci1jdXN0b21cIlxuICAgICAgICAgICAgICAgIChtb3JlQ2xpY2tlZEV2ZW50KT1cIl9tb3JlQ2xpY2tlZCgpXCJcbiAgICAgICAgICAgICAgICBmZE11bHRpQW5ub3VuY2VyXG4gICAgICAgICAgICAgICAgW211bHRpQW5ub3VuY2VyT3B0aW9uc109XCJfc3VnZ2VzdGlvbnNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxmZC10b2tlblxuICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwidGhpcy5fY3ZhLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uQ2xvc2VDbGljayk9XCJfcmVtb3ZlVG9rZW4odG9rZW4sICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdG9rZW4gb2YgX3NlbGVjdGVkU3VnZ2VzdGlvbnNcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3sgdG9rZW4ubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L2ZkLXRva2VuPlxuXG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICNzZWFyY2hJbnB1dEVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgZmRrQXV0b0NvbXBsZXRlXG4gICAgICAgICAgICAgICAgICAgIChvbkNvbXBsZXRlKT1cIl9vbkNvbXBsZXRlVGVybSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiX3N1Z2dlc3Rpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgW2lucHV0VGV4dF09XCJpbnB1dFRleHRcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgIFthcmlhTGFiZWxdPVwiJ2NvcmVNdWx0aUNvbWJvQm94Lm11bHRpQ29tYm9Cb3hBcmlhTGFiZWwnIHwgZmRUcmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwidGhpcy5fY3ZhLmFyaWFMYWJlbGxlZEJ5XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1hdXRvY29tcGxldGVdPVwiYXV0b0NvbXBsZXRlICYmICFtb2JpbGUgPyAnbGlzdCcgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1vd25zXT1cImF1dG9Db21wbGV0ZSAmJiAhbW9iaWxlID8gdGhpcy5fY3ZhLmlkICsgJy1yZXN1bHQnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwiYXV0b0NvbXBsZXRlICYmICFtb2JpbGVcIlxuICAgICAgICAgICAgICAgICAgICBmZC1mb3JtLWNvbnRyb2xcbiAgICAgICAgICAgICAgICAgICAgZmQtaW5wdXQtZ3JvdXAtaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cInRoaXMuX2N2YS5pZFwiXG4gICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cInRoaXMuX2N2YS5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiX29uSW5wdXRLZXlkb3duSGFuZGxlcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRoaXMuX2N2YS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaW5wdXRUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiX3NlYXJjaFRlcm1DaGFuZ2VkKClcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwidGhpcy5fY3ZhLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKGZvY3VzKT1cInRoaXMuX2N2YS5vblRvdWNoZWQoKTsgdG9rZW5pemVyLl9zaG93QWxsVG9rZW5zKClcIlxuICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCIhbW9iaWxlICYmIF9vbkJsdXIoJGV2ZW50KTsgdG9rZW5pemVyLl9oaWRlVG9rZW5zKClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzT3BlblwiXG4gICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJ0aGlzLl9jdmEucmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJlYWRvbmx5XT1cInRoaXMuX2N2YS5yZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwidGhpcy5fY3ZhLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlGbl09XCJfZGlzcGxheUZuXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmZC10b2tlbml6ZXJfX2lucHV0XCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9mZC10b2tlbml6ZXI+XG4gICAgICAgIDwvZmQtaW5wdXQtZ3JvdXA+XG5cbiAgICAgICAgPGZkLWZvcm0tbWVzc2FnZVxuICAgICAgICAgICAgKm5nSWY9XCJtb2JpbGUgJiYgaXNPcGVuID8gZmFsc2UgOiAhIXRoaXMuX2N2YS5zdGF0ZU1lc3NhZ2VcIlxuICAgICAgICAgICAgW3R5cGVdPVwidGhpcy5fY3ZhLnN0YXRlXCJcbiAgICAgICAgICAgIFtpbm5lckh0bWxdPVwidGhpcy5fY3ZhLnN0YXRlTWVzc2FnZVwiXG4gICAgICAgID48L2ZkLWZvcm0tbWVzc2FnZT5cbiAgICA8L2ZkLWZvcm0taW5wdXQtbWVzc2FnZS1ncm91cD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbW9iaWxlQ29udHJvbFRlbXBsYXRlPlxuICAgIDxmZC1pbnB1dC1ncm91cFxuICAgICAgICBbaWRdPVwidGhpcy5fY3ZhLmlkICsgJy1pbnB1dC1ncm91cC1jb250YWluZXInXCJcbiAgICAgICAgY2xhc3M9XCJmZC1tdWx0aS1jb21ib2JveC1pbnB1dC1ncm91cC1jdXN0b21cIlxuICAgICAgICBbc3RhdGVdPVwidGhpcy5fY3ZhLnN0YXRlXCJcbiAgICAgICAgW2J1dHRvbkZvY3VzYWJsZV09XCJmYWxzZVwiXG4gICAgICAgIFtpc0NvbnRyb2xdPVwidHJ1ZVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJ0aGlzLl9jdmEuZGlzYWJsZWQgfHwgdGhpcy5fY3ZhLnJlYWRvbmx5XCJcbiAgICAgICAgW2lzRXhwYW5kZWRdPVwiIW1vYmlsZSAmJiBpc09wZW4gJiYgX3N1Z2dlc3Rpb25zLmxlbmd0aCA+IDBcIlxuICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInRoaXMuX2N2YS5kaXNhYmxlZCB8fCB0aGlzLl9jdmEucmVhZG9ubHlcIlxuICAgICAgICBbYXR0ci5hcmlhLXJlYWRvbmx5XT1cInRoaXMuX2N2YS5yZWFkb25seVwiXG4gICAgICAgIFtnbHlwaEFyaWFMYWJlbF09XCJ0aGlzLl9jdmEuYXJpYUxhYmVsXCJcbiAgICA+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgZmRrQXV0b0NvbXBsZXRlXG4gICAgICAgICAgICAob25Db21wbGV0ZSk9XCJfb25Db21wbGV0ZVRlcm0oJGV2ZW50KVwiXG4gICAgICAgICAgICBbb3B0aW9uc109XCJfc3VnZ2VzdGlvbnNcIlxuICAgICAgICAgICAgW2lucHV0VGV4dF09XCJpbnB1dFRleHRcIlxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICBbYXJpYUxhYmVsXT1cIidjb3JlTXVsdGlDb21ib0JveC5tdWx0aUNvbWJvQm94QXJpYUxhYmVsJyB8IGZkVHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJ0aGlzLl9jdmEuYXJpYUxhYmVsbGVkQnlcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1hdXRvY29tcGxldGVdPVwiYXV0b0NvbXBsZXRlICYmICFtb2JpbGUgPyAnbGlzdCcgOiBudWxsXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtb3duc109XCJhdXRvQ29tcGxldGUgJiYgIW1vYmlsZSA/IHRoaXMuX2N2YS5pZCArICctcmVzdWx0JyA6IG51bGxcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCJhdXRvQ29tcGxldGUgJiYgIW1vYmlsZVwiXG4gICAgICAgICAgICBmZC1mb3JtLWNvbnRyb2xcbiAgICAgICAgICAgIGZkLWlucHV0LWdyb3VwLWlucHV0XG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgW2lkXT1cInRoaXMuX2N2YS5pZFwiXG4gICAgICAgICAgICBbbmFtZV09XCJ0aGlzLl9jdmEubmFtZVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJfb25JbnB1dEtleWRvd25IYW5kbGVyKCRldmVudClcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRoaXMuX2N2YS5kaXNhYmxlZFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImlucHV0VGV4dFwiXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJfc2VhcmNoVGVybUNoYW5nZWQoKVwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwidGhpcy5fY3ZhLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgIChmb2N1cyk9XCJ0aGlzLl9jdmEub25Ub3VjaGVkKClcIlxuICAgICAgICAgICAgKGJsdXIpPVwiIW1vYmlsZSAmJiBfb25CbHVyKCRldmVudClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW5cIlxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cInRoaXMuX2N2YS5yZWFkb25seVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXJlYWRvbmx5XT1cInRoaXMuX2N2YS5yZWFkb25seVwiXG4gICAgICAgICAgICBbZGlzcGxheUZuXT1cIl9kaXNwbGF5Rm5cIlxuICAgICAgICAvPlxuICAgIDwvZmQtaW5wdXQtZ3JvdXA+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xpc3RUZW1wbGF0ZT5cbiAgICA8dWxcbiAgICAgICAgZmQtbGlzdFxuICAgICAgICAoZm9jdXNFc2NhcGVMaXN0KT1cIl9oYW5kbGVMaXN0Rm9jdXNFc2NhcGUoJGV2ZW50KVwiXG4gICAgICAgIFtkcm9wZG93bk1vZGVdPVwidHJ1ZVwiXG4gICAgICAgIGNsYXNzPVwiZmQtbXVsdGktY29tYm9ib3hfX2xpc3QgZmQtbGlzdC0tbXVsdGktaW5wdXRcIlxuICAgICAgICBbaWRdPVwidGhpcy5fY3ZhLmlkICsgJy1yZXN1bHQnXCJcbiAgICAgICAgcm9sZT1cImxpc3Rib3hcIlxuICAgICAgICBbc3R5bGUubWF4LWhlaWdodF09XCIhbW9iaWxlICYmIG1heEhlaWdodFwiXG4gICAgICAgIFtzdHlsZS5taW4td2lkdGgucHhdPVwiIW1vYmlsZSAmJiBtaW5XaWR0aFwiXG4gICAgICAgIFtzdHlsZS5tYXgtd2lkdGgucHhdPVwiYXV0b1Jlc2l6ZSAmJiBtYXhXaWR0aFwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJ0aGlzLl9jdmEuaWQgKyAnLXNlYXJjaCdcIlxuICAgICAgICBhcmlhLW11bHRpc2VsZWN0YWJsZT1cInRydWVcIlxuICAgICAgICAoa2V5ZG93bi50YWIpPVwiY2xvc2UoKVwiXG4gICAgICAgIChrZXlkb3duLnNoaWZ0LnRhYik9XCJjbG9zZSgpXCJcbiAgICA+XG4gICAgICAgIDxmZC1mb3JtLW1lc3NhZ2VcbiAgICAgICAgICAgICpuZ0lmPVwiISF0aGlzLl9jdmEuc3RhdGVNZXNzYWdlXCJcbiAgICAgICAgICAgIFt0eXBlXT1cInRoaXMuX2N2YS5zdGF0ZVwiXG4gICAgICAgICAgICBbaW5uZXJIdG1sXT1cInRoaXMuX2N2YS5zdGF0ZU1lc3NhZ2VcIlxuICAgICAgICA+PC9mZC1mb3JtLW1lc3NhZ2U+XG4gICAgICAgIDxmZC1tdWx0aS1jb21ib2JveC1zZWxlY3QtYWxsLXRvZ2dsZXJcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd1NlbGVjdEFsbFwiXG4gICAgICAgICAgICBbc2VsZWN0QWxsSGFuZGxlcl09XCJfaGFuZGxlU2VsZWN0QWxsSXRlbXNcIlxuICAgICAgICAgICAgW3ZhbHVlQ2hhbmdlc109XCJzZWxlY3Rpb25DaGFuZ2VcIlxuICAgICAgICAgICAgW3NlbGVjdGVkSXRlbXNdPVwiX3NlbGVjdGVkU3VnZ2VzdGlvbnNcIlxuICAgICAgICAgICAgW2ZsYXRJdGVtc109XCJfZmxhdFN1Z2dlc3Rpb25zXCJcbiAgICAgICAgPjwvZmQtbXVsdGktY29tYm9ib3gtc2VsZWN0LWFsbC10b2dnbGVyPlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0dyb3VwOyBlbHNlIGZsYXRMaXN0XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBncm91cCBvZiBfc3VnZ2VzdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWdyb3VwSXRlbVRlbXBsYXRlOyBlbHNlIGdyb3VwSXRlbVRlbXBsYXRlUmVuZGVyZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZkLWxpc3QtZ3JvdXAtaGVhZGVyIHJvbGU9XCJncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZmQtbGlzdC10aXRsZT57eyBncm91cC5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZ3JvdXBJdGVtVGVtcGxhdGVSZW5kZXJlcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ3JvdXBJdGVtVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiB7IGxhYmVsOiBncm91cC5sYWJlbCB9IH1cIlxuICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uSXRlbSBvZiBncm91cC5jaGlsZHJlbjsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIGZkLWxpc3QtaXRlbVxuICAgICAgICAgICAgICAgICAgICByb2xlPVwib3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiIW1vYmlsZSAmJiBjbG9zZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiX29uSXRlbUtleURvd25IYW5kbGVyKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiISFvcHRpb25JdGVtLnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxmZC1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIl9vbk9wdGlvbkNoZWNrYm94Q2xpY2tlZCgkZXZlbnQsIGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIl90b2dnbGVTZWxlY3Rpb24ob3B0aW9uSXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwib3B0aW9uSXRlbS5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPC9mZC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibGlzdEl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgb3B0aW9uSXRlbTogb3B0aW9uSXRlbSwgaW5kZXg6IGkgfVwiXG4gICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZmxhdExpc3Q+XG4gICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uSXRlbSBvZiBfc3VnZ2VzdGlvbnM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgIGZkLWxpc3QtaXRlbVxuICAgICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCIwXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiIW1vYmlsZSAmJiBfb25PcHRpb25DbGlja2VkKCRldmVudCwgaSlcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIl9vbkl0ZW1LZXlEb3duSGFuZGxlcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiISFvcHRpb25JdGVtLnNlbGVjdGVkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZmQtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIl9vbk9wdGlvbkNoZWNrYm94Q2xpY2tlZCgkZXZlbnQsIGkpXCJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiX3RvZ2dsZVNlbGVjdGlvbihvcHRpb25JdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIm9wdGlvbkl0ZW0uc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L2ZkLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibGlzdEl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBvcHRpb25JdGVtOiBvcHRpb25JdGVtLCBpbmRleDogaSB9XCJcbiAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvdWw+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgbGV0LW9wdGlvbkl0ZW09XCJvcHRpb25JdGVtXCIgbGV0LWluZGV4PVwiaW5kZXhcIiAjbGlzdEl0ZW0+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cIm9wdGlvbkl0ZW0uc2VsZWN0ZWQgJiYgISFzZWxlY3RlZEl0ZW1UZW1wbGF0ZVwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNlbGVjdGVkSXRlbVRlbXBsYXRlXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBvcHRpb25JdGVtLnZhbHVlLCBpbmRleDogaW5kZXggfVwiXG4gICAgPjwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEob3B0aW9uSXRlbS5zZWxlY3RlZCAmJiBzZWxlY3RlZEl0ZW1UZW1wbGF0ZSlcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwib3B0aW9uSXRlbVNvdXJjZVwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBvcHRpb25JdGVtOiBvcHRpb25JdGVtLCBpbmRleDogaW5kZXggfVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJzZWNvbmRhcnlUZXh0U291cmNlXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IG9wdGlvbkl0ZW06IG9wdGlvbkl0ZW0gfVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSBsZXQtb3B0aW9uSXRlbT1cIm9wdGlvbkl0ZW1cIiBsZXQtaW5kZXg9XCJpbmRleFwiICNvcHRpb25JdGVtU291cmNlPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhb3B0aW9uSXRlbVRlbXBsYXRlOyBlbHNlIG9wdGlvbkl0ZW1UZW1wbGF0ZVJlbmRlcmVyXCI+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgICBmZC1saXN0LXRpdGxlXG4gICAgICAgICAgICBbYXR0ci50aXRsZV09XCJvcHRpb25JdGVtLmxhYmVsXCJcbiAgICAgICAgICAgIFtpbm5lckhUTUxdPVwib3B0aW9uSXRlbS5sYWJlbCB8IGhpZ2hsaWdodCA6IGlucHV0VGV4dFwiXG4gICAgICAgID48L3NwYW4+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctdGVtcGxhdGUgI29wdGlvbkl0ZW1UZW1wbGF0ZVJlbmRlcmVyPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJvcHRpb25JdGVtVGVtcGxhdGVcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBvcHRpb25JdGVtLnZhbHVlLCBpbmRleDogaW5kZXggfVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlIGxldC1vcHRpb25JdGVtPVwib3B0aW9uSXRlbVwiICNzZWNvbmRhcnlUZXh0U291cmNlPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93U2Vjb25kYXJ5VGV4dFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNlY29uZGFyeUl0ZW1UZW1wbGF0ZTsgZWxzZSBzZWNvbmRhcnlJdGVtVGVtcGxhdGVSZW5kZXJlclwiPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICBbc3R5bGUudGV4dC1hbGlnbl09XCJzZWNvbmRhcnlUZXh0QWxpZ25tZW50XCJcbiAgICAgICAgICAgICAgICBmZC1saXN0LXNlY29uZGFyeVxuICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIm9wdGlvbkl0ZW0uc2Vjb25kYXJ5VGV4dFwiXG4gICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJvcHRpb25JdGVtLnNlY29uZGFyeVRleHQgfCBoaWdobGlnaHQgOiBpbnB1dFRleHRcIlxuICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNzZWNvbmRhcnlJdGVtVGVtcGxhdGVSZW5kZXJlcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJzZWNvbmRhcnlJdGVtVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogb3B0aW9uSXRlbS52YWx1ZSB9XCJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
690
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvbXVsdGktY29tYm9ib3gvbXVsdGktY29tYm9ib3guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvbXVsdGktY29tYm9ib3gvbXVsdGktY29tYm9ib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9GLE9BQU8sRUFFSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLGNBQWMsRUFDZCxRQUFRLEVBQ1IsS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEVBQ1QsV0FBVyxFQUNYLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25HLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFnRCxNQUFNLDRCQUE0QixDQUFDO0FBQ3BILE9BQU8sRUFDSCxxQkFBcUIsRUFHckIsdUJBQXVCLEVBRXZCLE9BQU8sRUFFUCxtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixnQkFBZ0IsRUFDbkIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBQ0gsaUJBQWlCLEVBQ2pCLGFBQWEsRUFFYix3QkFBd0IsRUFDeEIsaUJBQWlCLEVBQ2pCLHNCQUFzQixFQUN0QixrQkFBa0IsRUFDckIsTUFBTSw0QkFBNEIsQ0FBQztBQUlwQyxPQUFPLEVBQUUsK0JBQStC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Z0JBZU4sZUFBZTtzQkFEZCxLQUFLO2dCQUtOLGNBQWM7c0JBRGIsS0FBSztnQkFLTixtQkFBbUI7c0JBRGxCLEtBQUs7Z0JBS04sU0FBUztzQkFEUixLQUFLO2dCQVFOLFNBQVM7c0JBRFIsS0FBSztnQkFVTixVQUFVO3NCQURULEtBQUs7Z0JBU04sSUFBSTtzQkFESCxLQUFLO2dCQUtOLHVCQUF1QjtzQkFEdEIsS0FBSztnQkFLTixlQUFlO3NCQURkLE1BQU07Z0JBS1AsWUFBWTtzQkFEWCxNQUFNO2dCQUtQLGtCQUFrQjtzQkFEakIsTUFBTTtnQkFLUCxhQUFhO3NCQURaLE1BQU07Z0JBS1AsWUFBWTtzQkFEWCxNQUFNO2dCQUtFLGtCQUFrQjtzQkFEMUIsU0FBUzt1QkFBQyxvQkFBb0IsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBS3BDLGFBQWE7c0JBRDdCLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUtYLGVBQWU7c0JBRC9CLGVBQWU7dUJBQUMsaUJBQWlCO2dCQUtqQixxQkFBcUI7c0JBRHJDLFNBQVM7dUJBQUMsdUJBQXVCO2dCQUtqQixZQUFZO3NCQUQ1QixTQUFTO3VCQUFDLGNBQWM7Z0JBS1IsVUFBVTtzQkFEMUIsU0FBUzt1QkFBQyxrQkFBa0I7Z0JBS1osV0FBVztzQkFEM0IsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQSwgQ09OVFJPTCwgRE9XTl9BUlJPVywgRU5URVIsIEVTQ0FQRSwgU1BBQ0UsIFVQX0FSUk9XIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEluamVjdGlvblRva2VuLFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q29udGFpbmVyUmVmLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZURpcmVjdGl2ZSwgRkRfREFUQV9TT1VSQ0VfVFJBTlNGT1JNRVIgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2Nkay9kYXRhLXNvdXJjZSc7XG5pbXBvcnQgeyBDdmFDb250cm9sLCBDdmFEaXJlY3RpdmUsIE9wdGlvbkl0ZW0sIFNlbGVjdEl0ZW0sIFNlbGVjdGFibGVPcHRpb25JdGVtIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvZm9ybXMnO1xuaW1wb3J0IHtcbiAgICBBdXRvQ29tcGxldGVEaXJlY3RpdmUsXG4gICAgQXV0b0NvbXBsZXRlRXZlbnQsXG4gICAgQ29udGVudERlbnNpdHksXG4gICAgRHluYW1pY0NvbXBvbmVudFNlcnZpY2UsXG4gICAgRm9jdXNFc2NhcGVEaXJlY3Rpb24sXG4gICAgS2V5VXRpbCxcbiAgICBOdWxsYWJsZSxcbiAgICBTZWFyY2hIaWdobGlnaHRQaXBlLFxuICAgIFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIGNvZXJjZUFycmF5U2FmZSxcbiAgICByZXNpemVPYnNlcnZhYmxlXG59IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY2RrL3V0aWxzJztcbmltcG9ydCB7XG4gICAgRkRfTElTVF9DT01QT05FTlQsXG4gICAgTGlzdENvbXBvbmVudCxcbiAgICBMaXN0Q29tcG9uZW50SW50ZXJmYWNlLFxuICAgIExpc3RHcm91cEhlYWRlckRpcmVjdGl2ZSxcbiAgICBMaXN0SXRlbUNvbXBvbmVudCxcbiAgICBMaXN0U2Vjb25kYXJ5RGlyZWN0aXZlLFxuICAgIExpc3RUaXRsZURpcmVjdGl2ZVxufSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvbGlzdCc7XG5pbXBvcnQgeyBNb2JpbGVNb2RlQ29uZmlnIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL21vYmlsZS1tb2RlJztcbmltcG9ydCB7IFBvcG92ZXJGaWxsTW9kZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9zaGFyZWQnO1xuXG5pbXBvcnQgeyBjb250ZW50RGVuc2l0eU9ic2VydmVyUHJvdmlkZXJzIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2NvbnRlbnQtZGVuc2l0eSc7XG5pbXBvcnQgeyBUb2tlbkNvbXBvbmVudCwgVG9rZW5pemVyQ29tcG9uZW50IH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL3Rva2VuJztcbmltcG9ydCBlcXVhbCBmcm9tICdmYXN0LWRlZXAtZXF1YWwnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQmFzZU11bHRpQ29tYm9ib3ggfSBmcm9tICcuL2Jhc2UtbXVsdGktY29tYm9ib3guY2xhc3MnO1xuaW1wb3J0IHsgTW9iaWxlTXVsdGlDb21ib2JveENvbXBvbmVudCB9IGZyb20gJy4vbW9iaWxlL21vYmlsZS1tdWx0aS1jb21ib2JveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTVVMVElfQ09NQk9CT1hfQ09NUE9ORU5UIH0gZnJvbSAnLi9tdWx0aS1jb21ib2JveC50b2tlbic7XG5cbmltcG9ydCB7IE11bHRpQ29tYm9ib3hEYXRhU291cmNlUGFyc2VyIH0gZnJvbSAnLi9kYXRhLXNvdXJjZS9tdWx0aS1jb21ib2JveC1kYXRhLXNvdXJjZS1wYXJzZXInO1xuXG5pbXBvcnQgeyBOZ0NsYXNzLCBOZ0ZvciwgTmdJZiwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2NoZWNrYm94JztcbmltcG9ydCB7IEZvcm1Db250cm9sQ29tcG9uZW50LCBGb3JtSW5wdXRNZXNzYWdlR3JvdXBDb21wb25lbnQsIEZvcm1NZXNzYWdlQ29tcG9uZW50IH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2Zvcm0nO1xuaW1wb3J0IHsgSW5wdXRHcm91cENvbXBvbmVudCwgSW5wdXRHcm91cElucHV0RGlyZWN0aXZlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2lucHV0LWdyb3VwJztcbmltcG9ydCB7IFBvcG92ZXJCb2R5Q29tcG9uZW50LCBQb3BvdmVyQ29tcG9uZW50LCBQb3BvdmVyQ29udHJvbENvbXBvbmVudCB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9wb3BvdmVyJztcbmltcG9ydCB7IEZkVHJhbnNsYXRlUGlwZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvaTE4bic7XG5pbXBvcnQgeyBnZXRTZWxlY3RJdGVtQnlJbnB1dFZhbHVlLCBnZXRUb2tlbkluZGV4QnlJZGxPclZhbHVlIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IE11bHRpQ29tYm9ib3hTZWxlY3Rpb25DaGFuZ2VFdmVudCB9IGZyb20gJy4vbW9kZWxzL3NlbGVjdGlvbi1jaGFuZ2UuZXZlbnQnO1xuaW1wb3J0IHsgTXVsdGlBbm5vdW5jZXJEaXJlY3RpdmUgfSBmcm9tICcuL211bHRpLWFubm91bmNlci9tdWx0aS1hbm5vdW5jZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IFNlbGVjdEFsbFRvZ2dsZXJDb21wb25lbnQgfSBmcm9tICcuL3NlbGVjdC1hbGwtdG9nZ2xlci9zZWxlY3QtYWxsLXRvZ2dsZXIuY29tcG9uZW50JztcblxuZXhwb3J0IGNvbnN0IEZEX01BUF9MSU1JVCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxudW1iZXI+KCdNYXAgbGltaXTiiaUnLCB7IGZhY3Rvcnk6ICgpID0+IDEyIH0pO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZkLW11bHRpLWNvbWJvYm94JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbXVsdGktY29tYm9ib3guY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL211bHRpLWNvbWJvYm94LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBob3N0RGlyZWN0aXZlczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBkaXJlY3RpdmU6IEN2YURpcmVjdGl2ZSxcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8taW5wdXRzLW1ldGFkYXRhLXByb3BlcnR5XG4gICAgICAgICAgICBpbnB1dHM6IFsnaWQ6aW5wdXRJZCcsICdwbGFjZWhvbGRlcicsICdzdGF0ZScsICdzdGF0ZU1lc3NhZ2UnLCAnZGlzYWJsZWQnLCAncmVhZG9ubHknLCAnbmFtZSddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRpcmVjdGl2ZTogRGF0YVNvdXJjZURpcmVjdGl2ZSxcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8taW5wdXRzLW1ldGFkYXRhLXByb3BlcnR5XG4gICAgICAgICAgICBpbnB1dHM6IFsnZGF0YVNvdXJjZSddLFxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXRzLW1ldGFkYXRhLXByb3BlcnR5XG4gICAgICAgICAgICBvdXRwdXRzOiBbJ2RhdGFDaGFuZ2VkJ11cbiAgICAgICAgfVxuICAgIF0sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIEN2YUNvbnRyb2wsXG4gICAgICAgIER5bmFtaWNDb21wb25lbnRTZXJ2aWNlLFxuICAgICAgICBjb250ZW50RGVuc2l0eU9ic2VydmVyUHJvdmlkZXJzKCksXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IEZEX0RBVEFfU09VUkNFX1RSQU5TRk9STUVSLFxuICAgICAgICAgICAgdXNlQ2xhc3M6IE11bHRpQ29tYm9ib3hEYXRhU291cmNlUGFyc2VyXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE1VTFRJX0NPTUJPQk9YX0NPTVBPTkVOVCxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBNdWx0aUNvbWJvYm94Q29tcG9uZW50XG4gICAgICAgIH1cbiAgICBdLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ0lmLFxuICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgICAgICBQb3BvdmVyQ29tcG9uZW50LFxuICAgICAgICBQb3BvdmVyQ29udHJvbENvbXBvbmVudCxcbiAgICAgICAgUG9wb3ZlckJvZHlDb21wb25lbnQsXG4gICAgICAgIEZvcm1JbnB1dE1lc3NhZ2VHcm91cENvbXBvbmVudCxcbiAgICAgICAgSW5wdXRHcm91cENvbXBvbmVudCxcbiAgICAgICAgVG9rZW5pemVyQ29tcG9uZW50LFxuICAgICAgICBOZ0ZvcixcbiAgICAgICAgVG9rZW5Db21wb25lbnQsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBBdXRvQ29tcGxldGVEaXJlY3RpdmUsXG4gICAgICAgIEZvcm1Db250cm9sQ29tcG9uZW50LFxuICAgICAgICBJbnB1dEdyb3VwSW5wdXREaXJlY3RpdmUsXG4gICAgICAgIEZvcm1NZXNzYWdlQ29tcG9uZW50LFxuICAgICAgICBMaXN0Q29tcG9uZW50LFxuICAgICAgICBTZWxlY3RBbGxUb2dnbGVyQ29tcG9uZW50LFxuICAgICAgICBMaXN0R3JvdXBIZWFkZXJEaXJlY3RpdmUsXG4gICAgICAgIExpc3RUaXRsZURpcmVjdGl2ZSxcbiAgICAgICAgTGlzdEl0ZW1Db21wb25lbnQsXG4gICAgICAgIENoZWNrYm94Q29tcG9uZW50LFxuICAgICAgICBOZ0NsYXNzLFxuICAgICAgICBMaXN0U2Vjb25kYXJ5RGlyZWN0aXZlLFxuICAgICAgICBGZFRyYW5zbGF0ZVBpcGUsXG4gICAgICAgIFNlYXJjaEhpZ2hsaWdodFBpcGUsXG4gICAgICAgIE11bHRpQW5ub3VuY2VyRGlyZWN0aXZlXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBNdWx0aUNvbWJvYm94Q29tcG9uZW50PFQgPSBhbnk+IGV4dGVuZHMgQmFzZU11bHRpQ29tYm9ib3g8VD4gaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkluaXQge1xuICAgIC8qKlxuICAgICAqIFNob3cgc2VsZWN0IGFsbCBjaGVja2JveFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2hvd1NlbGVjdEFsbCA9IGZhbHNlO1xuXG4gICAgLyoqIFByb3ZpZGVzIHNlbGVjdGVkIGl0ZW1zLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHNlbGVjdGVkSXRlbXModmFsdWU6IFRbXSkge1xuICAgICAgICB0aGlzLl9zZWxlY3RlZEl0ZW1zID0gY29lcmNlQXJyYXlTYWZlKHZhbHVlKTtcbiAgICB9XG4gICAgZ2V0IHNlbGVjdGVkSXRlbXMoKTogVFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkSXRlbXM7XG4gICAgfVxuICAgIC8qKiBQcm92aWRlcyBtYXhpbXVtIGhlaWdodCBmb3IgdGhlIG9wdGlvblBhbmVsLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgbWF4SGVpZ2h0ID0gJzI1MHB4JztcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgQWRkT24gQnV0dG9uIHNob3VsZCBiZSBmb2N1c2FibGVcbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgYnV0dG9uRm9jdXNhYmxlID0gZmFsc2U7XG5cbiAgICAvKiogV2hldGhlciB0aGUgYXV0b2NvbXBsZXRlIHNob3VsZCBiZSBlbmFibGVkOyBFbmFibGVkIGJ5IGRlZmF1bHQuICovXG4gICAgQElucHV0KClcbiAgICBhdXRvQ29tcGxldGUgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogVE9ETzogTmFtZSBvZiB0aGUgZW50aXR5IGZvciB3aGljaCBEYXRhUHJvdmlkZXIgd2lsbCBiZSBsb2FkZWQuIFlvdSBjYW4gZWl0aGVyIHBhc3MgbGlzdCBvZlxuICAgICAqIGl0ZW1zIG9yIHVzZSB0aGlzIGVudGl0eUNsYXNzIGFuZCBpbnRlcm5hbGx5IHdlIHNob3VsZCBiZSBhYmxlIHRvIGRvIGxvb2t1cCB0byBzb21lIHJlZ2lzdHJ5XG4gICAgICogYW5kIHJldHJpZXZlIHRoZSBiZXN0IG1hdGNoaW5nIERhdGFQcm92aWRlciB0aGF0IGlzIHNldCBvbiBhcHBsaWNhdGlvbiBsZXZlbFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZW50aXR5Q2xhc3M6IHN0cmluZztcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBtdWx0aS1jb21ib2JveCBzaG91bGQgYmUgYnVpbHQgb24gbW9iaWxlIG1vZGUuICovXG4gICAgQElucHV0KClcbiAgICBtb2JpbGUgPSBmYWxzZTtcblxuICAgIC8qKiBNdWx0aSBDb21ib2JveCBNb2JpbGUgQ29uZmlndXJhdGlvbiwgaXQncyBhcHBsaWVkIG9ubHksIHdoZW4gbW9iaWxlIGlzIGVuYWJsZWQuICovXG4gICAgQElucHV0KClcbiAgICBtb2JpbGVDb25maWc6IE1vYmlsZU1vZGVDb25maWc7XG5cbiAgICAvKiogVGVsbHMgdGhlIG11bHRpLWNvbWJvYm94IGlmIHdlIG5lZWQgdG8gZ3JvdXAgaXRlbXMuICovXG4gICAgQElucHV0KClcbiAgICBncm91cCA9IGZhbHNlO1xuXG4gICAgLyoqIEEgZmllbGQgbmFtZSB0byB1c2UgdG8gZ3JvdXAgZGF0YSBieSAoc3VwcG9ydCBkb3R0ZWQgbm90YXRpb24pLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ3JvdXBLZXk6IHN0cmluZztcblxuICAgIC8qKiBUaGUgZmllbGQgdG8gc2hvdyBkYXRhIGluIHNlY29uZGFyeSBjb2x1bW4uICovXG4gICAgQElucHV0KClcbiAgICBzZWNvbmRhcnlLZXk6IHN0cmluZztcblxuICAgIC8qKiBTaG93IHRoZSBzZWNvbmQgY29sdW1uIChhcHBsaWNhYmxlIGZvciB0d28gY29sdW1ucyBsYXlvdXQpLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2hvd1NlY29uZGFyeVRleHQgPSBmYWxzZTtcblxuICAgIC8qKiBIb3Jpem9udGFsbHkgYWxpZ24gdGV4dCBpbnNpZGUgdGhlIHNlY29uZCBjb2x1bW4gKGFwcGxpY2FibGUgZm9yIHR3byBjb2x1bW5zIGxheW91dCkuICovXG4gICAgQElucHV0KClcbiAgICBzZWNvbmRhcnlUZXh0QWxpZ25tZW50OiAnbGVmdCcgfCAncmlnaHQnID0gJ3JpZ2h0JztcblxuICAgIC8qKiBUdXJucyBvbi9vZmYgQWRqdXN0YWJsZSBXaWR0aCBmZWF0dXJlLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYXV0b1Jlc2l6ZSA9IHRydWU7XG5cbiAgICAvKiogV2hldGhlciB0byBvcGVuIHRoZSBkcm9wZG93biB3aGVuIHRoZSBhZGRvbiBidXR0b24gaXMgY2xpY2tlZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIG9wZW5Ecm9wZG93bk9uQWRkT25DbGlja2VkID0gdHJ1ZTtcblxuICAgIC8qKiBWYWx1ZSBvZiB0aGUgbXVsdGkgY29tYm9ib3ggKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCB2YWx1ZSh2YWx1ZTogVFtdKSB7XG4gICAgICAgIHRoaXMuc2V0VmFsdWUodmFsdWUsIHRydWUpO1xuICAgIH1cblxuICAgIGdldCB2YWx1ZSgpOiBUW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3ZhLnZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcmVzZXQgb3B0aW9ucyBmb3IgdGhlIFNlbGVjdCBib2R5IHdpZHRoLCB3aGF0ZXZlciBpcyBjaG9zZW4sIHRoZSBib2R5IGhhcyBhIDYwMHB4IGxpbWl0LlxuICAgICAqICogYGF0LWxlYXN0YCB3aWxsIGFwcGx5IGEgbWluaW11bSB3aWR0aCB0byB0aGUgYm9keSBlcXVpdmFsZW50IHRvIHRoZSB3aWR0aCBvZiB0aGUgY29udHJvbC4gLSBEZWZhdWx0XG4gICAgICogKiBgZXF1YWxgIHdpbGwgYXBwbHkgYSB3aWR0aCB0byB0aGUgYm9keSBlcXVpdmFsZW50IHRvIHRoZSB3aWR0aCBvZiB0aGUgY29udHJvbC5cbiAgICAgKiAqICdmaXQtY29udGVudCcgd2lsbCBhcHBseSB3aWR0aCBuZWVkZWQgdG8gcHJvcGVybHkgZGlzcGxheSBpdGVtcyBpbnNpZGUsIGluZGVwZW5kZW50IG9mIGNvbnRyb2wuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBmaWxsQ29udHJvbE1vZGU6IFBvcG92ZXJGaWxsTW9kZSA9ICdhdC1sZWFzdCc7XG5cbiAgICAvKiogU2V0cyB0aXRsZSBhdHRyaWJ1dGUgdG8gYWRkb24gYnV0dG9uLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYWRkb25JY29uVGl0bGU6IHN0cmluZztcblxuICAgIC8qKiBTZXRzIGludmFsaWQgZW50cnkgbWVzc2FnZS4gKi9cbiAgICBASW5wdXQoKVxuICAgIGludmFsaWRFbnRyeU1lc3NhZ2UgPSAnSW52YWxpZCBlbnRyeSc7XG5cbiAgICAvKiogVHVybnMgbGltaXRsZXNzIG1vZGUsIE9OIG9yIE9GRiAqL1xuICAgIEBJbnB1dCgpXG4gICAgbGltaXRsZXNzOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogVXNlZCBpbiBmaWx0ZXJzIGFuZCBhbnkga2luZCBvZiBjb21wYXJhdG9ycyB3aGVuIHdlIHdvcmsgd2l0aCBvYmplY3RzIGFuZCB0aGlzIGlkZW50aWZ5XG4gICAgICogdW5pcXVlIGZpZWxkIG5hbWUgYmFzZWQgb24gd2hpY2ggd2UgYXJlIGdvaW5nIHRvIGRvIHRoZSBqb2JcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGxvb2t1cEtleTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogV2hlbiB3ZSBkZWFsIHdpdGggdW5rbm93biBvYmplY3Qgd2UgY2FuIHVzZSBgZGlzcGxheUtleWAgdG8gcmV0cmlldmUgdmFsdWUgZnJvbSBzcGVjaWZpY1xuICAgICAqIHByb3BlcnR5IG9mIHRoZSBvYmplY3QgdG8gYWN0IGFzIGRpc3BsYXkgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAU2VlIENvbWJvQm94LCBTZWxlY3QsIFJhZGlvR3JvdXAsIENoZWNrQm94IEdyb3VwXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBkaXNwbGF5S2V5OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHZhbHVlcywgaXQgY2FuIGJlIG9mIHR5cGUgU2VsZWN0SXRlbSwgc3RyaW5nIG9yIGFueSBvYmplY3QuXG4gICAgICogR2VuZXJpYyBvYmplY3QgdHlwZSBpcyBhbW9uZyB0aGUgbGlzdCBvZiB0eXBlcyxcbiAgICAgKiBiZWNhdXNlIHdlIGFsbG93IHRvIGdldCBsYWJlbHMgYW5kIHZhbHVlcyB1c2luZyBgZGlzcGxheUtleWAgYW5kIGBsb29rdXBLZXlgIGlucHV0cyBhY2NvcmRpbmdseS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGxpc3Q6IEFycmF5PFNlbGVjdEl0ZW0gfCBzdHJpbmcgfCBvYmplY3Q+O1xuXG4gICAgLyoqIFRpbWUgaW4gbXMgZm9yIGhvdyBsb25nIG1lc3NhZ2Ugb2YgaW52YWxpZCBlbnRyeSBzaG91bGQgYmUgZGlzcGxheWVkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgaW52YWxpZEVudHJ5RGlzcGxheVRpbWUgPSAzMDAwO1xuXG4gICAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiBpdGVtIGlzIHNlbGVjdGVkLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TXVsdGlDb21ib2JveFNlbGVjdGlvbkNoYW5nZUV2ZW50PigpO1xuXG4gICAgLyoqIEBoaWRkZW4gRW1pdHMgZXZlbnQgd2hlbiB0aGUgbWVudSBpcyBvcGVuZWQvY2xvc2VkLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGlzT3BlbkNoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgLyoqIEVtaXRzIGV2ZW50IHdoZW4gdGhlIGFkZG9uIGJ1dHRvbiBpcyBjbGlja2VkLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGFkZE9uQnV0dG9uQ2xpY2tlZDogRXZlbnRFbWl0dGVyPEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG5cbiAgICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIGRhdGEgbG9hZGluZyBpcyBzdGFydGVkLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGRhdGFSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIGRhdGEgbG9hZGluZyBpcyBmaW5pc2hlZC4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBkYXRhUmVjZWl2ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoJ3NlYXJjaElucHV0RWxlbWVudCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHJlYWRvbmx5IHNlYXJjaElucHV0RWxlbWVudDogTnVsbGFibGU8RWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50Pj47XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoRkRfTElTVF9DT01QT05FTlQpXG4gICAgcHJpdmF0ZSByZWFkb25seSBsaXN0Q29tcG9uZW50OiBMaXN0Q29tcG9uZW50SW50ZXJmYWNlO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlRGlyZWN0aXZlKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgY3VzdG9tVGVtcGxhdGVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVEaXJlY3RpdmU+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKCdtb2JpbGVDb250cm9sVGVtcGxhdGUnKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgbW9iaWxlQ29udHJvbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKCdsaXN0VGVtcGxhdGUnKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgbGlzdFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKFRva2VuaXplckNvbXBvbmVudClcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90b2tlbml6ZXI6IFRva2VuaXplckNvbXBvbmVudDtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZCgnaW5wdXRHcm91cCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2lucHV0R3JvdXA6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEN1c3RvbSBPcHRpb24gaXRlbSBUZW1wbGF0ZS5cbiAgICAgKi9cbiAgICBvcHRpb25JdGVtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQ3VzdG9tIEdyb3VwIEhlYWRlciBpdGVtIFRlbXBsYXRlLlxuICAgICAqL1xuICAgIGdyb3VwSXRlbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEN1c3RvbSBTZWNvbmRhcnkgaXRlbSBUZW1wbGF0ZS5cbiAgICAgKi9cbiAgICBzZWNvbmRhcnlJdGVtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQ3VzdG9tIFNlbGVjdGVkIG9wdGlvbiBpdGVtIFRlbXBsYXRlLlxuICAgICAqL1xuICAgIHNlbGVjdGVkSXRlbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfY29udGVudERlbnNpdHk6IENvbnRlbnREZW5zaXR5ID0gdGhpcy5fbXVsdGlDb21ib2JveENvbmZpZz8uY29udGVudERlbnNpdHkgPz8gJ2NvenknO1xuXG4gICAgLyoqIFNldCB0aGUgaW5wdXQgdGV4dCBvZiB0aGUgaW5wdXQuICovXG4gICAgc2V0IGlucHV0VGV4dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2lucHV0VGV4dFZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgdGhpcy5fY3ZhLm9uVG91Y2hlZCgpO1xuICAgIH1cblxuICAgIC8qKiBHZXQgdGhlIGlucHV0IHRleHQgb2YgdGhlIGlucHV0LiAqL1xuICAgIGdldCBpbnB1dFRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lucHV0VGV4dFZhbHVlIHx8ICcnO1xuICAgIH1cblxuICAgIC8qKiBJcyBlbXB0eSBzZWFyY2ggZmllbGQuICovXG4gICAgZ2V0IGlzRW1wdHlWYWx1ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRUZXh0LnRyaW0oKS5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBnZXQgaXNHcm91cCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhKHRoaXMuZ3JvdXAgJiYgdGhpcy5ncm91cEtleSk7XG4gICAgfVxuXG4gICAgLyoqIFdoZXRoZXIgdGhlIE11bHRpIElucHV0IGlzIG9wZW5lZC4gKi9cbiAgICBpc09wZW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNYXggd2lkdGggb2YgbGlzdCBjb250YWluZXJcbiAgICAgKi9cbiAgICBtYXhXaWR0aDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1pbiB3aWR0aCBvZiBsaXN0IGNvbnRhaW5lclxuICAgICAqL1xuICAgIG1pbldpZHRoOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTmVlZCBmb3Igb3BlbmluZyBtb2JpbGUgdmVyc2lvblxuICAgICAqL1xuICAgIG9wZW5DaGFuZ2UgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9zZWxlY3RlZEl0ZW1zOiBUW10gPSBbXTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2luamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfZHluYW1pY0NvbXBvbmVudFNlcnZpY2U6IER5bmFtaWNDb21wb25lbnRTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5jb250ZW50RGVuc2l0eU9ic2VydmVyLnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3ZhQ29udHJvbC5saXN0ZW5Ub0NoYW5nZXMoKTtcbiAgICAgICAgdGhpcy5fb3BlbkRhdGFTdHJlYW0oKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGFzeW5jIG5nQWZ0ZXJWaWV3SW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMubW9iaWxlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9zZXRVcE1vYmlsZU1vZGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Fzc2lnbkN1c3RvbVRlbXBsYXRlcygpO1xuXG4gICAgICAgIHRoaXMuX2luaXRXaW5kb3dSZXNpemUoKTtcblxuICAgICAgICB0aGlzLl90b2tlbml6ZXIuX3Nob3dPdmVyZmxvd1BvcG92ZXIgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF90b2dnbGVTZWxlY3Rpb24oaXRlbTogU2VsZWN0YWJsZU9wdGlvbkl0ZW0sIGZyb21Ub2tlbkNsb3NlQ2xpY2sgPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpZHggPSBnZXRUb2tlbkluZGV4QnlJZGxPclZhbHVlKGl0ZW0sIHRoaXMuX3NlbGVjdGVkU3VnZ2VzdGlvbnMpO1xuICAgICAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRTdWdnZXN0aW9ucy5wdXNoKGl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRTdWdnZXN0aW9ucy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW0uc2VsZWN0ZWQgPSAhaXRlbS5zZWxlY3RlZDtcblxuICAgICAgICB0aGlzLl9wcm9wYWdhdGVDaGFuZ2UoZnJvbVRva2VuQ2xvc2VDbGljayk7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9zZWxlY3RlZFN1Z2dlc3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5fZm9jdXNUb1NlYXJjaEZpZWxkKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfb25PcHRpb25DaGVja2JveENsaWNrZWQoZXZlbnQ6IE1vdXNlRXZlbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuX29uTGlzdEVsZW1lbnRDbGlja2VkKGV2ZW50LCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfb25Db21wbGV0ZVRlcm0oZXZlbnQ6IEF1dG9Db21wbGV0ZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5mb3JjZUNsb3NlKSB7XG4gICAgICAgICAgICB0aGlzLl90b2dnbGVTZWxlY3Rpb25CeUlucHV0VGV4dChldmVudC50ZXJtKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCBzZWxlY3RzIGFsbCBwb3NzaWJsZSBvcHRpb25zLlxuICAgICAqICpzZWxlY3QqIGF0dHJpYnV0ZSDigJMgaWYgKnRydWUqIHNlbGVjdCBhbGwsIGlmICpmYWxzZSogdW5zZWxlY3QgYWxsXG4gICAgICogKi9cbiAgICBfaGFuZGxlU2VsZWN0QWxsSXRlbXMgPSAoc2VsZWN0OiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuX2ZsYXRTdWdnZXN0aW9ucy5mb3JFYWNoKChpdGVtKSA9PiAoaXRlbS5zZWxlY3RlZCA9IHNlbGVjdCkpO1xuICAgICAgICB0aGlzLl9vbkV2ZXJ5SXRlbSh0aGlzLl9zdWdnZXN0aW9ucywgKGl0ZW0pID0+IChpdGVtLnNlbGVjdGVkID0gc2VsZWN0KSk7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkU3VnZ2VzdGlvbnMgPSBzZWxlY3QgPyBbLi4udGhpcy5fZmxhdFN1Z2dlc3Rpb25zXSA6IFtdO1xuICAgICAgICB0aGlzLl9yYW5nZVNlbGVjdG9yLnJlc2V0KCk7XG5cbiAgICAgICAgdGhpcy5fcHJvcGFnYXRlQ2hhbmdlKCk7XG4gICAgfTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX25hdmlnYXRlQnlUb2tlbnMoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBbRE9XTl9BUlJPVywgVVBfQVJST1ddKSAmJiB0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5saXN0Q29tcG9uZW50Lml0ZW1zPy5maXJzdC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfcmVtb3ZlVG9rZW4odG9rZW46IFNlbGVjdGFibGVPcHRpb25JdGVtLCBldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvbkl0ZW0gPSB0aGlzLl9mbGF0U3VnZ2VzdGlvbnMuZmluZCgocykgPT4gcy52YWx1ZSA9PT0gdG9rZW4udmFsdWUpO1xuICAgICAgICBpZiAob3B0aW9uSXRlbSkge1xuICAgICAgICAgICAgdGhpcy5fdG9nZ2xlU2VsZWN0aW9uKG9wdGlvbkl0ZW0sIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5fcmFuZ2VTZWxlY3Rvci5yZXNldCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfbW9yZUNsaWNrZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3N1Z2dlc3Rpb25zID0gdGhpcy5pc0dyb3VwXG4gICAgICAgICAgICA/IHRoaXMuX2NvbnZlcnRPYmplY3RzVG9Hcm91cE9wdGlvbkl0ZW1zKHRoaXMuX3NlbGVjdGVkU3VnZ2VzdGlvbnMubWFwKCh7IHZhbHVlIH0pID0+IHZhbHVlKSlcbiAgICAgICAgICAgIDogdGhpcy5fc3VnZ2VzdGlvbnMuZmlsdGVyKCh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkU3VnZ2VzdGlvbnMuc29tZSgoaXRlbSkgPT4gZXF1YWwoaXRlbS52YWx1ZSwgdmFsdWUudmFsdWUpKVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuX3Nob3dMaXN0KHRydWUpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkU2hvd24kLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX29uQmx1cihldmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC5yZWxhdGVkVGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICBjb25zdCBpc0xpc3QgPSAhIXRhcmdldC5jbG9zZXN0KCcuZmQtbXVsdGktY29tYm9ib3hfX2xpc3QtY29udGFpbmVyJyk7XG4gICAgICAgICAgICBpZiAoaXNMaXN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuX3N1Z2dlc3Rpb25zPy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAgICAgICB0aGlzLl9zdWdnZXN0aW9uc1swXS5sYWJlbCA9PT0gdGhpcy5pbnB1dFRleHQgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy5fc3VnZ2VzdGlvbnNbMF0uc2VsZWN0ZWRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RvZ2dsZVNlbGVjdGlvbih0aGlzLl9zdWdnZXN0aW9uc1swXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9zaG93TGlzdChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmlucHV0VGV4dCA9ICcnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfb25JdGVtS2V5RG93bkhhbmRsZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBFU0NBUEUpKSB7XG4gICAgICAgICAgICB0aGlzLl9mb2N1c1RvU2VhcmNoRmllbGQoKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiBldmVudC5zaGlmdEtleSAmJiBLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgQSkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVTZWxlY3RBbGxJdGVtcyhmYWxzZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIEEpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlU2VsZWN0QWxsSXRlbXModHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIEVOVEVSKSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm1vYmlsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3JhbmdlU2VsZWN0b3IucmVzZXQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgU1BBQ0UpKSB7XG4gICAgICAgICAgICB0aGlzLl9yYW5nZVNlbGVjdG9yLnJlc2V0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9vbk9wdGlvbkNsaWNrZWQoZXZlbnQ6IE1vdXNlRXZlbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25MaXN0RWxlbWVudENsaWNrZWQoZXZlbnQsIGluZGV4KTtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBIYW5kbGUgZGlhbG9nIGRpc21pc3NpbmcsIGNsb3NlcyBwb3BvdmVyIGFuZCBzZXRzIGJhY2t1cCBkYXRhLlxuICAgICAqL1xuICAgIF9kaWFsb2dEaXNtaXNzKGJhY2t1cDogU2VsZWN0YWJsZU9wdGlvbkl0ZW1bXSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zZWxlY3RlZFN1Z2dlc3Rpb25zID0gWy4uLmJhY2t1cF07XG4gICAgICAgIHRoaXMuaW5wdXRUZXh0ID0gJyc7XG4gICAgICAgIHRoaXMuX3Nob3dMaXN0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFNob3duJC5uZXh0KGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogSGFuZGxlIGRpYWxvZyBhcHByb3ZhbCwgY2xvc2VzIHBvcG92ZXIgYW5kIHByb3BhZ2F0ZXMgZGF0YSBjaGFuZ2VzLlxuICAgICAqL1xuICAgIF9kaWFsb2dBcHByb3ZlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlucHV0VGV4dCA9ICcnO1xuICAgICAgICB0aGlzLl9zaG93TGlzdChmYWxzZSk7XG4gICAgICAgIHRoaXMuX3Byb3BhZ2F0ZUNoYW5nZSh0cnVlKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9wb3BvdmVyT3BlbkNoYW5nZUhhbmRsZShpc09wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc09wZW4gPSBpc09wZW47XG4gICAgICAgIHRoaXMuX3JhbmdlU2VsZWN0b3IucmVzZXQoKTtcbiAgICB9XG5cbiAgICAvKiogT3BlbnMgdGhlIHNlbGVjdCBwb3BvdmVyIGJvZHkuICovXG4gICAgb3BlbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgICB0aGlzLmlzT3BlbkNoYW5nZS5lbWl0KHRoaXMuaXNPcGVuKTtcbiAgICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqIENsb3NlcyB0aGUgc2VsZWN0IHBvcG92ZXIgYm9keS4gKi9cbiAgICBjbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZm9jdXNUb1NlYXJjaEZpZWxkKCk7XG4gICAgICAgIHRoaXMuX3JhbmdlU2VsZWN0b3IucmVzZXQoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFNob3duJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5pbnB1dFRleHQgPSAnJztcblxuICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzT3BlbkNoYW5nZS5lbWl0KHRoaXMuaXNPcGVuKTtcbiAgICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfc2hvd0xpc3QoaXNPcGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzT3BlbiAhPT0gaXNPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLmlzT3BlbiA9IGlzT3BlbjtcbiAgICAgICAgICAgIHRoaXMuX2N2YS5vblRvdWNoZWQoKTtcbiAgICAgICAgICAgIHRoaXMub3BlbkNoYW5nZS5uZXh0KGlzT3Blbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWFyY2hUZXJtQ2hhbmdlZCgnJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9zZWFyY2hUZXJtQ2hhbmdlZCh0ZXh0OiBzdHJpbmcgPSB0aGlzLmlucHV0VGV4dCk6IHZvaWQge1xuICAgICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIG1hcC5zZXQoJ3F1ZXJ5JywgdGV4dCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmxpbWl0bGVzcykge1xuICAgICAgICAgICAgbWFwLnNldCgnbGltaXQnLCB0aGlzLl9tYXBMaW1pdCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRhdGFTb3VyY2VEaXJlY3RpdmUuZGF0YVNvdXJjZVByb3ZpZGVyPy5tYXRjaChtYXApO1xuXG4gICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBDbGljayBvbiBCdXR0b25cbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgX29uUHJpbWFyeUJ1dHRvbkNsaWNrKGlzT3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAoIWlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5fc2VhcmNoVGVybUNoYW5nZWQoJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3BlbkRyb3Bkb3duT25BZGRPbkNsaWNrZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Nob3dMaXN0KCFpc09wZW4pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLl9zaG93TGlzdChmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXRFbGVtZW50Py5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgS2V5ZG93biBvbiBJbnB1dFxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBfb25JbnB1dEtleWRvd25IYW5kbGVyKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9jdmEucmVhZG9ubHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgRE9XTl9BUlJPVykpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIGlmIChldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG93TGlzdCh0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNPcGVuICYmIHRoaXMubGlzdENvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMubGlzdENvbXBvbmVudC5zZXRJdGVtQWN0aXZlKDApO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaG9vc2VPdGhlckl0ZW0oMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIFVQX0FSUk9XKSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgdGhpcy5fY2hvb3NlT3RoZXJJdGVtKC0xKTtcbiAgICAgICAgfSBlbHNlIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgRU5URVIpKSB7XG4gICAgICAgICAgICB0aGlzLl90b2dnbGVTZWxlY3Rpb25CeUlucHV0VGV4dCgpO1xuICAgICAgICB9IGVsc2UgaWYgKEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBFU0NBUEUpKSB7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAgICAgdGhpcy5fc2hvd0xpc3QoZmFsc2UpO1xuICAgICAgICB9IGVsc2UgaWYgKCFLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgWy4uLnRoaXMuX25vbk9wZW5pbmdLZXlzLCBDT05UUk9MXSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3Nob3dMaXN0KHRydWUpO1xuICAgICAgICAgICAgY29uc3QgYWNjZXB0ZWRLZXlzID0gIUtleVV0aWwuaXNLZXlUeXBlKGV2ZW50LCAnYWxwaGFiZXRpY2FsJykgJiYgIUtleVV0aWwuaXNLZXlUeXBlKGV2ZW50LCAnbnVtZXJpYycpO1xuICAgICAgICAgICAgaWYgKGFjY2VwdGVkS2V5cykge1xuICAgICAgICAgICAgICAgIC8vIFNldFRpbWVvdXQgaXMgbmVlZGVkIGZvciBpbnB1dCB0byByZWNlaXZlIG5ldyB2YWx1ZS5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNFbXB0eVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RDb21wb25lbnQ/LnNldEl0ZW1BY3RpdmUoMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgcGFzc2VkIHRvIGxpc3QgY29tcG9uZW50LlxuICAgICAqL1xuICAgIF9oYW5kbGVMaXN0Rm9jdXNFc2NhcGUoZGlyZWN0aW9uOiBGb2N1c0VzY2FwZURpcmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAndXAnKSB7XG4gICAgICAgICAgICB0aGlzLl9mb2N1c1RvU2VhcmNoRmllbGQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBfYWRkT25DbGlja2VkKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hZGRPbkJ1dHRvbkNsaWNrZWQuZW1pdCgkZXZlbnQpO1xuICAgICAgICBpZiAoIXRoaXMubW9iaWxlKSB7XG4gICAgICAgICAgICB0aGlzLl9vblByaW1hcnlCdXR0b25DbGljayh0aGlzLmlzT3Blbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEl0ZXJhdGUgb3ZlciBldmVyeSBpdGVtIGFuZCBwZXJmb3JtIGNhbGxiYWNrXG4gICAgICovXG4gICAgcHJpdmF0ZSBfb25FdmVyeUl0ZW0oaXRlbXM6IFNlbGVjdGFibGVPcHRpb25JdGVtW10sIGNhbGxiYWNrOiAoaXRlbTogU2VsZWN0YWJsZU9wdGlvbkl0ZW0pID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2soaXRlbSk7XG4gICAgICAgICAgICBpZiAoaXRlbS5jaGlsZHJlbiAmJiBpdGVtLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkV2ZXJ5SXRlbShpdGVtLmNoaWxkcmVuLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfdG9nZ2xlU2VsZWN0aW9uQnlJbnB1dFRleHQodGV4dCA9IHRoaXMuaW5wdXRUZXh0KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBnZXRTZWxlY3RJdGVtQnlJbnB1dFZhbHVlPFQ+KHRoaXMuX2Z1bGxGbGF0U3VnZ2VzdGlvbnMsIHRleHQpO1xuICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgdGhpcy5fdG9nZ2xlU2VsZWN0aW9uKGl0ZW0pO1xuICAgICAgICAgICAgdGhpcy5pbnB1dFRleHQgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3NlYXJjaFRlcm1DaGFuZ2VkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0byBzZXQgaW5wdXQgdGV4dCBhcyBpdGVtIGxhYmVsLlxuICAgICAqL1xuICAgIHByaXZhdGUgX3NldElucHV0VGV4dEZyb21PcHRpb25JdGVtKGl0ZW06IE9wdGlvbkl0ZW0pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnB1dFRleHQgPSBpdGVtLmxhYmVsO1xuXG4gICAgICAgIGlmICh0aGlzLm1vYmlsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2hvd0xpc3QoZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBhcHBseWluZyByYW5nZSBzZWxlY3Rpb24uIE5vdGUsIHRoYXQgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgYWZ0ZXIgY29tYm9ib3ggaXRlbSdzIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWRcbiAgICAgKi9cbiAgICBwcml2YXRlIF9vbkxpc3RFbGVtZW50Q2xpY2tlZChldmVudDogTW91c2VFdmVudCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICAvLyB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkIGF0IHRoaXMgcG9pbnQsIHNvIGl0IGNhbiBiZSBzYWZlbHkgdXNlZFxuICAgICAgICBjb25zdCBzZWxlY3Rpb25TdGF0ZSA9IHRoaXMuX2ZsYXRTdWdnZXN0aW9uc1tpbmRleF0uc2VsZWN0ZWQ7XG4gICAgICAgIHRoaXMuX3JhbmdlU2VsZWN0b3Iub25SYW5nZUVsZW1lbnRUb2dnbGVkKGluZGV4LCBldmVudCk7XG4gICAgICAgIGNvbnN0IHRvUmVtb3ZlU2V0ID0gbmV3IFNldCgpO1xuICAgICAgICB0aGlzLl9yYW5nZVNlbGVjdG9yLmFwcGx5VmFsdWVUb0VhY2hJblJhbmdlKChpZHgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLl9mbGF0U3VnZ2VzdGlvbnNbaWR4XTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50LnNlbGVjdGVkICE9PSBzZWxlY3Rpb25TdGF0ZSkge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92aW5nIGZyb20gXCJfc2VsZWN0ZWRTdWdnZXN0aW9uc1wiIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgdG9SZW1vdmVTZXQuYWRkKGN1cnJlbnQudmFsdWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFkZGluZyBjdXJyZW50IGl0ZW0gdG8gXCJfc2VsZWN0ZWRTdWdnZXN0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkU3VnZ2VzdGlvbnMucHVzaChjdXJyZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VycmVudC5zZWxlY3RlZCA9IHNlbGVjdGlvblN0YXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRTdWdnZXN0aW9ucyA9IHRoaXMuX3NlbGVjdGVkU3VnZ2VzdGlvbnMuZmlsdGVyKChzKSA9PiAhdG9SZW1vdmVTZXQuaGFzKHMudmFsdWUpKTtcbiAgICAgICAgdGhpcy5fcHJvcGFnYXRlQ2hhbmdlKCk7XG5cbiAgICAgICAgdGhpcy5fdG9rZW5pemVyLm9uUmVzaXplKCk7XG5cbiAgICAgICAgdGhpcy5fdG9rZW5pemVyLnRva2VuaXplcklubmVyRWwubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID1cbiAgICAgICAgICAgIHRoaXMuX3Rva2VuaXplci50b2tlbml6ZXJJbm5lckVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9wcm9wYWdhdGVDaGFuZ2UoZW1pdEluTW9iaWxlPzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMubW9iaWxlIHx8IGVtaXRJbk1vYmlsZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwQW5kVXBkYXRlTW9kZWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBhc3luYyBfc2V0VXBNb2JpbGVNb2RlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICAgICAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE1VTFRJX0NPTUJPQk9YX0NPTVBPTkVOVCwgdXNlVmFsdWU6IHRoaXMgfV0sXG4gICAgICAgICAgICBwYXJlbnQ6IHRoaXMuX2luamVjdG9yXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX2R5bmFtaWNDb21wb25lbnRTZXJ2aWNlLmNyZWF0ZUR5bmFtaWNDb21wb25lbnQoXG4gICAgICAgICAgICB7IGxpc3RUZW1wbGF0ZTogdGhpcy5saXN0VGVtcGxhdGUsIGNvbnRyb2xUZW1wbGF0ZTogdGhpcy5tb2JpbGVDb250cm9sVGVtcGxhdGUgfSxcbiAgICAgICAgICAgIE1vYmlsZU11bHRpQ29tYm9ib3hDb21wb25lbnQsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyUmVmOiB0aGlzLl92aWV3Q29udGFpbmVyUmVmXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBpbmplY3RvciB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IHBpY2tzIG90aGVyIHZhbHVlIG1vdmVkIGZyb20gY3VycmVudCBvbmUgYnkgb2Zmc2V0LCBjYWxsZWQgb25seSB3aGVuIE11bHRpIENvbWJvYm94IGlzIGNsb3NlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9jaG9vc2VPdGhlckl0ZW0ob2Zmc2V0OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkU3VnZ2VzdGlvbnM/Lmxlbmd0aCA9PT0gdGhpcy5fZmxhdFN1Z2dlc3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dFRleHQgPSAnJztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFjdGl2ZVZhbHVlID0gZ2V0U2VsZWN0SXRlbUJ5SW5wdXRWYWx1ZTxUPih0aGlzLl9mdWxsRmxhdFN1Z2dlc3Rpb25zLCB0aGlzLmlucHV0VGV4dCk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZmxhdFN1Z2dlc3Rpb25zLmZpbmRJbmRleCgodmFsdWUpID0+IHZhbHVlID09PSBhY3RpdmVWYWx1ZSk7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gIXRoaXMuaW5wdXRUZXh0ICYmIG9mZnNldCA9PT0gLTEgPyB0aGlzLl9mbGF0U3VnZ2VzdGlvbnMubGVuZ3RoIC0gMSA6IGluZGV4ICsgb2Zmc2V0O1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fZmxhdFN1Z2dlc3Rpb25zW3Bvc2l0aW9uXTtcblxuICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgdGhpcy5fc2V0SW5wdXRUZXh0RnJvbU9wdGlvbkl0ZW0oaXRlbSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gdGhpcy5fc2VsZWN0ZWRTdWdnZXN0aW9ucy5maW5kSW5kZXgoKHZhbHVlKSA9PiB2YWx1ZS5sYWJlbCA9PT0gaXRlbT8ubGFiZWwpO1xuICAgICAgICBpZiAoc2VsZWN0ZWRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuX2Nob29zZU90aGVySXRlbShvZmZzZXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9pbml0V2luZG93UmVzaXplKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9nZXRPcHRpb25zTGlzdFdpZHRoKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmF1dG9SZXNpemUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc2l6ZU9ic2VydmFibGUodGhpcy5faW5wdXRHcm91cC5uYXRpdmVFbGVtZW50KVxuICAgICAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDMwKSwgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9nZXRPcHRpb25zTGlzdFdpZHRoKCkpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZ2V0T3B0aW9uc0xpc3RXaWR0aCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmJvZHk7XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLl9pbnB1dEdyb3VwLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHNjcm9sbEJhcldpZHRoID0gYm9keS5vZmZzZXRXaWR0aCAtIGJvZHkuY2xpZW50V2lkdGg7XG4gICAgICAgIHRoaXMubWF4V2lkdGggPSB0aGlzLmF1dG9SZXNpemUgPyB3aW5kb3cuaW5uZXJXaWR0aCAtIHNjcm9sbEJhcldpZHRoIC0gcmVjdC5sZWZ0IDogdGhpcy5taW5XaWR0aDtcbiAgICAgICAgdGhpcy5taW5XaWR0aCA9IHJlY3Qud2lkdGggLSAyO1xuICAgICAgICB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEFzc2lnbiBjdXN0b20gdGVtcGxhdGVzXG4gICAgICovXG4gICAgcHJpdmF0ZSBfYXNzaWduQ3VzdG9tVGVtcGxhdGVzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlcy5mb3JFYWNoKCh0ZW1wbGF0ZSkgPT4ge1xuICAgICAgICAgICAgc3dpdGNoICh0ZW1wbGF0ZS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnb3B0aW9uSXRlbVRlbXBsYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25JdGVtVGVtcGxhdGUgPSB0ZW1wbGF0ZS50ZW1wbGF0ZVJlZjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZ3JvdXBJdGVtVGVtcGxhdGUnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwSXRlbVRlbXBsYXRlID0gdGVtcGxhdGUudGVtcGxhdGVSZWY7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NlY29uZGFyeUl0ZW1UZW1wbGF0ZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Vjb25kYXJ5SXRlbVRlbXBsYXRlID0gdGVtcGxhdGUudGVtcGxhdGVSZWY7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NlbGVjdGVkSXRlbVRlbXBsYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1UZW1wbGF0ZSA9IHRlbXBsYXRlLnRlbXBsYXRlUmVmO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZkLW11bHRpLWNvbWJvYm94XCI+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVGVtcGxhdGVcIiAqbmdJZj1cIm1vYmlsZVwiPjwvbmctY29udGFpbmVyPlxuXG4gICAgPGZkLXBvcG92ZXJcbiAgICAgICAgKm5nSWY9XCIhbW9iaWxlXCJcbiAgICAgICAgYWRkaXRpb25hbEJvZHlDbGFzcz1cImZkLXBvcG92ZXItY3VzdG9tLWxpc3QgZmQtbXVsdGktY29tYm9ib3hfX2xpc3QtY29udGFpbmVyXCJcbiAgICAgICAgKGlzT3BlbkNoYW5nZSk9XCJfcG9wb3Zlck9wZW5DaGFuZ2VIYW5kbGUoJGV2ZW50KVwiXG4gICAgICAgIFtpc09wZW5dPVwiaXNPcGVuXCJcbiAgICAgICAgW3RyaWdnZXJzXT1cIltdXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cInRoaXMuX2N2YS5kaXNhYmxlZFwiXG4gICAgICAgIFtmaWxsQ29udHJvbE1vZGVdPVwiZmlsbENvbnRyb2xNb2RlXCJcbiAgICA+XG4gICAgICAgIDxmZC1wb3BvdmVyLWNvbnRyb2w+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250cm9sVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2ZkLXBvcG92ZXItY29udHJvbD5cbiAgICAgICAgPGZkLXBvcG92ZXItYm9keSBbc3R5bGUud2lkdGguJV09XCIhYXV0b1Jlc2l6ZSAmJiAxMDBcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsaXN0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgPC9mZC1wb3BvdmVyLWJvZHk+XG4gICAgPC9mZC1wb3BvdmVyPlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjY29udHJvbFRlbXBsYXRlPlxuICAgIDxmZC1mb3JtLWlucHV0LW1lc3NhZ2UtZ3JvdXA+XG4gICAgICAgIDxmZC1pbnB1dC1ncm91cFxuICAgICAgICAgICAgI2lucHV0R3JvdXBcbiAgICAgICAgICAgIFtpZF09XCJ0aGlzLl9jdmEuaWQgKyAnLWlucHV0LWdyb3VwLWNvbnRhaW5lcidcIlxuICAgICAgICAgICAgW3N0YXRlXT1cInRoaXMuX2N2YS5zdGF0ZVwiXG4gICAgICAgICAgICBbYnV0dG9uRm9jdXNhYmxlXT1cImJ1dHRvbkZvY3VzYWJsZVwiXG4gICAgICAgICAgICBbYnV0dG9uXT1cIiF0aGlzLl9jdmEucmVhZG9ubHlcIlxuICAgICAgICAgICAgW2dseXBoXT1cIiF0aGlzLl9jdmEucmVhZG9ubHkgPyAnbmF2aWdhdGlvbi1kb3duLWFycm93JyA6ICcgJ1wiXG4gICAgICAgICAgICBbaXNDb250cm9sXT1cInRydWVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRoaXMuX2N2YS5kaXNhYmxlZCB8fCB0aGlzLl9jdmEucmVhZG9ubHlcIlxuICAgICAgICAgICAgW2lzRXhwYW5kZWRdPVwiIW1vYmlsZSAmJiBpc09wZW4gJiYgX3N1Z2dlc3Rpb25zLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJ0aGlzLl9jdmEuZGlzYWJsZWQgfHwgdGhpcy5fY3ZhLnJlYWRvbmx5XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtcmVhZG9ubHldPVwidGhpcy5fY3ZhLnJlYWRvbmx5XCJcbiAgICAgICAgICAgIFtnbHlwaEFyaWFMYWJlbF09XCJ0aGlzLl9jdmEuYXJpYUxhYmVsIHx8ICgncGxhdGZvcm1NdWx0aUNvbWJvYm94LmlucHV0R2x5cGhBcmlhTGFiZWwnIHwgZmRUcmFuc2xhdGUpXCJcbiAgICAgICAgICAgIFtpY29uVGl0bGVdPVwiYWRkb25JY29uVGl0bGUgfHwgKCdwbGF0Zm9ybU11bHRpQ29tYm9ib3guaW5wdXRHbHlwaEFyaWFMYWJlbCcgfCBmZFRyYW5zbGF0ZSlcIlxuICAgICAgICAgICAgKGFkZE9uQnV0dG9uQ2xpY2tlZCk9XCJfYWRkT25DbGlja2VkKCRldmVudClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm1vYmlsZSAmJiAhaXNPcGVuICYmIF9vblByaW1hcnlCdXR0b25DbGljayhmYWxzZSlcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwiX25hdmlnYXRlQnlUb2tlbnMoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxmZC10b2tlbml6ZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIl9zZWxlY3RlZFN1Z2dlc3Rpb25zXCJcbiAgICAgICAgICAgICAgICBbdG9rZW5pemVyRm9jdXNhYmxlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICBbY29tcGFjdENvbGxhcHNlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICN0b2tlbml6ZXJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZkLW11bHRpLWNvbWJvYm94LXRva2VuaXplci1jdXN0b21cIlxuICAgICAgICAgICAgICAgIChtb3JlQ2xpY2tlZEV2ZW50KT1cIl9tb3JlQ2xpY2tlZCgpXCJcbiAgICAgICAgICAgICAgICBmZE11bHRpQW5ub3VuY2VyXG4gICAgICAgICAgICAgICAgW211bHRpQW5ub3VuY2VyT3B0aW9uc109XCJfc3VnZ2VzdGlvbnNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxmZC10b2tlblxuICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwidGhpcy5fY3ZhLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uQ2xvc2VDbGljayk9XCJfcmVtb3ZlVG9rZW4odG9rZW4sICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdG9rZW4gb2YgX3NlbGVjdGVkU3VnZ2VzdGlvbnNcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3sgdG9rZW4ubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L2ZkLXRva2VuPlxuXG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICNzZWFyY2hJbnB1dEVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgZmRrQXV0b0NvbXBsZXRlXG4gICAgICAgICAgICAgICAgICAgIChvbkNvbXBsZXRlKT1cIl9vbkNvbXBsZXRlVGVybSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiX3N1Z2dlc3Rpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgW2lucHV0VGV4dF09XCJpbnB1dFRleHRcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgIFthcmlhTGFiZWxdPVwiJ2NvcmVNdWx0aUNvbWJvQm94Lm11bHRpQ29tYm9Cb3hBcmlhTGFiZWwnIHwgZmRUcmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwidGhpcy5fY3ZhLmFyaWFMYWJlbGxlZEJ5XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1hdXRvY29tcGxldGVdPVwiYXV0b0NvbXBsZXRlICYmICFtb2JpbGUgPyAnbGlzdCcgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1vd25zXT1cImF1dG9Db21wbGV0ZSAmJiAhbW9iaWxlID8gdGhpcy5fY3ZhLmlkICsgJy1yZXN1bHQnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwiYXV0b0NvbXBsZXRlICYmICFtb2JpbGVcIlxuICAgICAgICAgICAgICAgICAgICBmZC1mb3JtLWNvbnRyb2xcbiAgICAgICAgICAgICAgICAgICAgZmQtaW5wdXQtZ3JvdXAtaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cInRoaXMuX2N2YS5pZFwiXG4gICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cInRoaXMuX2N2YS5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiX29uSW5wdXRLZXlkb3duSGFuZGxlcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRoaXMuX2N2YS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaW5wdXRUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiX3NlYXJjaFRlcm1DaGFuZ2VkKClcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwidGhpcy5fY3ZhLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKGZvY3VzKT1cInRoaXMuX2N2YS5vblRvdWNoZWQoKTsgdG9rZW5pemVyLl9zaG93QWxsVG9rZW5zKClcIlxuICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCIhbW9iaWxlICYmIF9vbkJsdXIoJGV2ZW50KTsgdG9rZW5pemVyLl9oaWRlVG9rZW5zKClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzT3BlblwiXG4gICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJ0aGlzLl9jdmEucmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJlYWRvbmx5XT1cInRoaXMuX2N2YS5yZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwidGhpcy5fY3ZhLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlGbl09XCJfZGlzcGxheUZuXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmZC10b2tlbml6ZXJfX2lucHV0XCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9mZC10b2tlbml6ZXI+XG4gICAgICAgIDwvZmQtaW5wdXQtZ3JvdXA+XG5cbiAgICAgICAgPGZkLWZvcm0tbWVzc2FnZVxuICAgICAgICAgICAgKm5nSWY9XCJtb2JpbGUgJiYgaXNPcGVuID8gZmFsc2UgOiAhIXRoaXMuX2N2YS5zdGF0ZU1lc3NhZ2VcIlxuICAgICAgICAgICAgW3R5cGVdPVwidGhpcy5fY3ZhLnN0YXRlXCJcbiAgICAgICAgICAgIFtpbm5lckh0bWxdPVwidGhpcy5fY3ZhLnN0YXRlTWVzc2FnZVwiXG4gICAgICAgID48L2ZkLWZvcm0tbWVzc2FnZT5cbiAgICA8L2ZkLWZvcm0taW5wdXQtbWVzc2FnZS1ncm91cD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbW9iaWxlQ29udHJvbFRlbXBsYXRlPlxuICAgIDxmZC1pbnB1dC1ncm91cFxuICAgICAgICBbaWRdPVwidGhpcy5fY3ZhLmlkICsgJy1pbnB1dC1ncm91cC1jb250YWluZXInXCJcbiAgICAgICAgY2xhc3M9XCJmZC1tdWx0aS1jb21ib2JveC1pbnB1dC1ncm91cC1jdXN0b21cIlxuICAgICAgICBbc3RhdGVdPVwidGhpcy5fY3ZhLnN0YXRlXCJcbiAgICAgICAgW2J1dHRvbkZvY3VzYWJsZV09XCJmYWxzZVwiXG4gICAgICAgIFtpc0NvbnRyb2xdPVwidHJ1ZVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJ0aGlzLl9jdmEuZGlzYWJsZWQgfHwgdGhpcy5fY3ZhLnJlYWRvbmx5XCJcbiAgICAgICAgW2lzRXhwYW5kZWRdPVwiIW1vYmlsZSAmJiBpc09wZW4gJiYgX3N1Z2dlc3Rpb25zLmxlbmd0aCA+IDBcIlxuICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInRoaXMuX2N2YS5kaXNhYmxlZCB8fCB0aGlzLl9jdmEucmVhZG9ubHlcIlxuICAgICAgICBbYXR0ci5hcmlhLXJlYWRvbmx5XT1cInRoaXMuX2N2YS5yZWFkb25seVwiXG4gICAgICAgIFtnbHlwaEFyaWFMYWJlbF09XCJ0aGlzLl9jdmEuYXJpYUxhYmVsXCJcbiAgICA+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgZmRrQXV0b0NvbXBsZXRlXG4gICAgICAgICAgICAob25Db21wbGV0ZSk9XCJfb25Db21wbGV0ZVRlcm0oJGV2ZW50KVwiXG4gICAgICAgICAgICBbb3B0aW9uc109XCJfc3VnZ2VzdGlvbnNcIlxuICAgICAgICAgICAgW2lucHV0VGV4dF09XCJpbnB1dFRleHRcIlxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICBbYXJpYUxhYmVsXT1cIidjb3JlTXVsdGlDb21ib0JveC5tdWx0aUNvbWJvQm94QXJpYUxhYmVsJyB8IGZkVHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJ0aGlzLl9jdmEuYXJpYUxhYmVsbGVkQnlcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1hdXRvY29tcGxldGVdPVwiYXV0b0NvbXBsZXRlICYmICFtb2JpbGUgPyAnbGlzdCcgOiBudWxsXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtb3duc109XCJhdXRvQ29tcGxldGUgJiYgIW1vYmlsZSA/IHRoaXMuX2N2YS5pZCArICctcmVzdWx0JyA6IG51bGxcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCJhdXRvQ29tcGxldGUgJiYgIW1vYmlsZVwiXG4gICAgICAgICAgICBmZC1mb3JtLWNvbnRyb2xcbiAgICAgICAgICAgIGZkLWlucHV0LWdyb3VwLWlucHV0XG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgW2lkXT1cInRoaXMuX2N2YS5pZFwiXG4gICAgICAgICAgICBbbmFtZV09XCJ0aGlzLl9jdmEubmFtZVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJfb25JbnB1dEtleWRvd25IYW5kbGVyKCRldmVudClcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRoaXMuX2N2YS5kaXNhYmxlZFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImlucHV0VGV4dFwiXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJfc2VhcmNoVGVybUNoYW5nZWQoKVwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwidGhpcy5fY3ZhLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgIChmb2N1cyk9XCJ0aGlzLl9jdmEub25Ub3VjaGVkKClcIlxuICAgICAgICAgICAgKGJsdXIpPVwiIW1vYmlsZSAmJiBfb25CbHVyKCRldmVudClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW5cIlxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cInRoaXMuX2N2YS5yZWFkb25seVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXJlYWRvbmx5XT1cInRoaXMuX2N2YS5yZWFkb25seVwiXG4gICAgICAgICAgICBbZGlzcGxheUZuXT1cIl9kaXNwbGF5Rm5cIlxuICAgICAgICAvPlxuICAgIDwvZmQtaW5wdXQtZ3JvdXA+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xpc3RUZW1wbGF0ZT5cbiAgICA8dWxcbiAgICAgICAgZmQtbGlzdFxuICAgICAgICAoZm9jdXNFc2NhcGVMaXN0KT1cIl9oYW5kbGVMaXN0Rm9jdXNFc2NhcGUoJGV2ZW50KVwiXG4gICAgICAgIFtkcm9wZG93bk1vZGVdPVwidHJ1ZVwiXG4gICAgICAgIGNsYXNzPVwiZmQtbXVsdGktY29tYm9ib3hfX2xpc3QgZmQtbGlzdC0tbXVsdGktaW5wdXRcIlxuICAgICAgICBbaWRdPVwidGhpcy5fY3ZhLmlkICsgJy1yZXN1bHQnXCJcbiAgICAgICAgcm9sZT1cImxpc3Rib3hcIlxuICAgICAgICBbc3R5bGUubWF4LWhlaWdodF09XCIhbW9iaWxlICYmIG1heEhlaWdodFwiXG4gICAgICAgIFtzdHlsZS5taW4td2lkdGgucHhdPVwiIW1vYmlsZSAmJiBtaW5XaWR0aFwiXG4gICAgICAgIFtzdHlsZS5tYXgtd2lkdGgucHhdPVwiYXV0b1Jlc2l6ZSAmJiBtYXhXaWR0aFwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJ0aGlzLl9jdmEuaWQgKyAnLXNlYXJjaCdcIlxuICAgICAgICBhcmlhLW11bHRpc2VsZWN0YWJsZT1cInRydWVcIlxuICAgICAgICAoa2V5ZG93bi50YWIpPVwiY2xvc2UoKVwiXG4gICAgICAgIChrZXlkb3duLnNoaWZ0LnRhYik9XCJjbG9zZSgpXCJcbiAgICA+XG4gICAgICAgIDxmZC1mb3JtLW1lc3NhZ2VcbiAgICAgICAgICAgICpuZ0lmPVwiISF0aGlzLl9jdmEuc3RhdGVNZXNzYWdlXCJcbiAgICAgICAgICAgIFt0eXBlXT1cInRoaXMuX2N2YS5zdGF0ZVwiXG4gICAgICAgICAgICBbaW5uZXJIdG1sXT1cInRoaXMuX2N2YS5zdGF0ZU1lc3NhZ2VcIlxuICAgICAgICA+PC9mZC1mb3JtLW1lc3NhZ2U+XG4gICAgICAgIDxmZC1tdWx0aS1jb21ib2JveC1zZWxlY3QtYWxsLXRvZ2dsZXJcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd1NlbGVjdEFsbFwiXG4gICAgICAgICAgICBbc2VsZWN0QWxsSGFuZGxlcl09XCJfaGFuZGxlU2VsZWN0QWxsSXRlbXNcIlxuICAgICAgICAgICAgW3ZhbHVlQ2hhbmdlc109XCJzZWxlY3Rpb25DaGFuZ2VcIlxuICAgICAgICAgICAgW3NlbGVjdGVkSXRlbXNdPVwiX3NlbGVjdGVkU3VnZ2VzdGlvbnNcIlxuICAgICAgICAgICAgW2ZsYXRJdGVtc109XCJfZmxhdFN1Z2dlc3Rpb25zXCJcbiAgICAgICAgPjwvZmQtbXVsdGktY29tYm9ib3gtc2VsZWN0LWFsbC10b2dnbGVyPlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0dyb3VwOyBlbHNlIGZsYXRMaXN0XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBncm91cCBvZiBfc3VnZ2VzdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWdyb3VwSXRlbVRlbXBsYXRlOyBlbHNlIGdyb3VwSXRlbVRlbXBsYXRlUmVuZGVyZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZkLWxpc3QtZ3JvdXAtaGVhZGVyIHJvbGU9XCJncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZmQtbGlzdC10aXRsZT57eyBncm91cC5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZ3JvdXBJdGVtVGVtcGxhdGVSZW5kZXJlcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ3JvdXBJdGVtVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiB7IGxhYmVsOiBncm91cC5sYWJlbCB9IH1cIlxuICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uSXRlbSBvZiBncm91cC5jaGlsZHJlbjsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIGZkLWxpc3QtaXRlbVxuICAgICAgICAgICAgICAgICAgICByb2xlPVwib3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiIW1vYmlsZSAmJiBjbG9zZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiX29uSXRlbUtleURvd25IYW5kbGVyKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiISFvcHRpb25JdGVtLnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxmZC1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIl9vbk9wdGlvbkNoZWNrYm94Q2xpY2tlZCgkZXZlbnQsIGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIl90b2dnbGVTZWxlY3Rpb24ob3B0aW9uSXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwib3B0aW9uSXRlbS5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPC9mZC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibGlzdEl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgb3B0aW9uSXRlbTogb3B0aW9uSXRlbSwgaW5kZXg6IGkgfVwiXG4gICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZmxhdExpc3Q+XG4gICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uSXRlbSBvZiBfc3VnZ2VzdGlvbnM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgIGZkLWxpc3QtaXRlbVxuICAgICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCIwXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiIW1vYmlsZSAmJiBfb25PcHRpb25DbGlja2VkKCRldmVudCwgaSlcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIl9vbkl0ZW1LZXlEb3duSGFuZGxlcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiISFvcHRpb25JdGVtLnNlbGVjdGVkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZmQtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIl9vbk9wdGlvbkNoZWNrYm94Q2xpY2tlZCgkZXZlbnQsIGkpXCJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiX3RvZ2dsZVNlbGVjdGlvbihvcHRpb25JdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIm9wdGlvbkl0ZW0uc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L2ZkLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibGlzdEl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBvcHRpb25JdGVtOiBvcHRpb25JdGVtLCBpbmRleDogaSB9XCJcbiAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvdWw+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgbGV0LW9wdGlvbkl0ZW09XCJvcHRpb25JdGVtXCIgbGV0LWluZGV4PVwiaW5kZXhcIiAjbGlzdEl0ZW0+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cIm9wdGlvbkl0ZW0uc2VsZWN0ZWQgJiYgISFzZWxlY3RlZEl0ZW1UZW1wbGF0ZVwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNlbGVjdGVkSXRlbVRlbXBsYXRlXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBvcHRpb25JdGVtLnZhbHVlLCBpbmRleDogaW5kZXggfVwiXG4gICAgPjwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEob3B0aW9uSXRlbS5zZWxlY3RlZCAmJiBzZWxlY3RlZEl0ZW1UZW1wbGF0ZSlcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwib3B0aW9uSXRlbVNvdXJjZVwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBvcHRpb25JdGVtOiBvcHRpb25JdGVtLCBpbmRleDogaW5kZXggfVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJzZWNvbmRhcnlUZXh0U291cmNlXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IG9wdGlvbkl0ZW06IG9wdGlvbkl0ZW0gfVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSBsZXQtb3B0aW9uSXRlbT1cIm9wdGlvbkl0ZW1cIiBsZXQtaW5kZXg9XCJpbmRleFwiICNvcHRpb25JdGVtU291cmNlPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhb3B0aW9uSXRlbVRlbXBsYXRlOyBlbHNlIG9wdGlvbkl0ZW1UZW1wbGF0ZVJlbmRlcmVyXCI+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgICBmZC1saXN0LXRpdGxlXG4gICAgICAgICAgICBbYXR0ci50aXRsZV09XCJvcHRpb25JdGVtLmxhYmVsXCJcbiAgICAgICAgICAgIFtpbm5lckhUTUxdPVwib3B0aW9uSXRlbS5sYWJlbCB8IGhpZ2hsaWdodCA6IGlucHV0VGV4dFwiXG4gICAgICAgID48L3NwYW4+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctdGVtcGxhdGUgI29wdGlvbkl0ZW1UZW1wbGF0ZVJlbmRlcmVyPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJvcHRpb25JdGVtVGVtcGxhdGVcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBvcHRpb25JdGVtLnZhbHVlLCBpbmRleDogaW5kZXggfVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlIGxldC1vcHRpb25JdGVtPVwib3B0aW9uSXRlbVwiICNzZWNvbmRhcnlUZXh0U291cmNlPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93U2Vjb25kYXJ5VGV4dFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNlY29uZGFyeUl0ZW1UZW1wbGF0ZTsgZWxzZSBzZWNvbmRhcnlJdGVtVGVtcGxhdGVSZW5kZXJlclwiPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICBbc3R5bGUudGV4dC1hbGlnbl09XCJzZWNvbmRhcnlUZXh0QWxpZ25tZW50XCJcbiAgICAgICAgICAgICAgICBmZC1saXN0LXNlY29uZGFyeVxuICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIm9wdGlvbkl0ZW0uc2Vjb25kYXJ5VGV4dFwiXG4gICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJvcHRpb25JdGVtLnNlY29uZGFyeVRleHQgfCBoaWdobGlnaHQgOiBpbnB1dFRleHRcIlxuICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNzZWNvbmRhcnlJdGVtVGVtcGxhdGVSZW5kZXJlcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJzZWNvbmRhcnlJdGVtVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogb3B0aW9uSXRlbS52YWx1ZSB9XCJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
@@ -989,7 +989,7 @@ class MultiComboboxComponent extends BaseMultiCombobox {
989
989
  if (event) {
990
990
  event.preventDefault();
991
991
  }
992
- const optionItem = this._suggestions.find((s) => s.value === token.value);
992
+ const optionItem = this._flatSuggestions.find((s) => s.value === token.value);
993
993
  if (optionItem) {
994
994
  this._toggleSelection(optionItem, true);
995
995
  this._rangeSelector.reset();
@@ -1233,11 +1233,11 @@ class MultiComboboxComponent extends BaseMultiCombobox {
1233
1233
  */
1234
1234
  _onListElementClicked(event, index) {
1235
1235
  // value has been changed at this point, so it can be safely used
1236
- const selectionState = this._suggestions[index].selected;
1236
+ const selectionState = this._flatSuggestions[index].selected;
1237
1237
  this._rangeSelector.onRangeElementToggled(index, event);
1238
1238
  const toRemoveSet = new Set();
1239
1239
  this._rangeSelector.applyValueToEachInRange((idx) => {
1240
- const current = this._suggestions[idx];
1240
+ const current = this._flatSuggestions[idx];
1241
1241
  if (current.selected !== selectionState) {
1242
1242
  if (current.selected) {
1243
1243
  // removing from "_selectedSuggestions" list
@@ -1 +1 @@
1
- {"version":3,"file":"fundamental-ngx-core-multi-combobox.mjs","sources":["../../../../libs/core/src/lib/multi-combobox/multi-announcer/multi-announcer.directive.ts","../../../../libs/core/src/lib/multi-combobox/helpers.ts","../../../../libs/core/src/lib/multi-combobox/models/selection-change.event.ts","../../../../libs/core/src/lib/multi-combobox/multi-combobox-config.ts","../../../../libs/core/src/lib/multi-combobox/base-multi-combobox.class.ts","../../../../libs/core/src/lib/multi-combobox/multi-combobox.token.ts","../../../../libs/core/src/lib/multi-combobox/mobile/mobile-multi-combobox.component.ts","../../../../libs/core/src/lib/multi-combobox/mobile/mobile-multi-combobox.component.html","../../../../libs/core/src/lib/multi-combobox/data-source/multi-combobox-data-source.ts","../../../../libs/core/src/lib/multi-combobox/data-source/multi-combobox-data-source-parser.ts","../../../../libs/core/src/lib/multi-combobox/select-all-toggler/select-all-toggler.component.ts","../../../../libs/core/src/lib/multi-combobox/multi-combobox.component.ts","../../../../libs/core/src/lib/multi-combobox/multi-combobox.component.html","../../../../libs/core/src/lib/multi-combobox/multi-combobox.module.ts","../../../../libs/core/src/lib/multi-combobox/fundamental-ngx-core-multi-combobox.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/member-ordering */\nimport { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { ContentChildren, Directive, HostListener, inject, Input, QueryList } from '@angular/core';\nimport { KeyUtil } from '@fundamental-ngx/cdk/utils';\nimport { TokenComponent } from '@fundamental-ngx/core/token';\nimport { resolveTranslationSyncFn } from '@fundamental-ngx/i18n';\n\n@Directive({\n selector: '[fdMultiAnnouncer]',\n exportAs: 'fdMultiAnnouncer',\n standalone: true\n})\nexport class MultiAnnouncerDirective {\n /** @hidden */\n @Input()\n multiAnnouncerOptions: unknown[];\n\n /** @hidden */\n @ContentChildren(TokenComponent, { descendants: true })\n private _tokens: QueryList<TokenComponent>;\n\n /** @hidden */\n private _noResultsAnnounced = false;\n\n /** @hidden */\n private _resultsAnnounced = false;\n\n /** @hidden */\n private _announcement = '';\n\n /** @hidden */\n private readonly _liveAnnouncer: LiveAnnouncer = inject(LiveAnnouncer);\n\n /** @hidden */\n private _resolveTranslation = resolveTranslationSyncFn();\n\n /** @hidden */\n @HostListener('keyup', ['$event'])\n private _makeSearchTermChangeAnnouncements(event: KeyboardEvent): void {\n if (KeyUtil.isKeyType(event, 'alphabetical') || KeyUtil.isKeyType(event, 'numeric')) {\n this._liveAnnouncer.clear();\n if (!this.multiAnnouncerOptions.length && !this._noResultsAnnounced) {\n this._buildAnnouncement(this._resolveTranslation('coreMultiInput.noResults'));\n this._noResultsAnnounced = true;\n this._resultsAnnounced = false;\n } else if (this.multiAnnouncerOptions.length) {\n if (this.multiAnnouncerOptions.length === 1) {\n this._buildAnnouncement(\n this._resolveTranslation('coreMultiInput.countListResultsSingular', { count: 1 })\n );\n } else {\n this._buildAnnouncement(\n this._resolveTranslation('coreMultiInput.countListResultsPlural', {\n count: this.multiAnnouncerOptions.length\n })\n );\n }\n this._buildAnnouncement(this._resolveTranslation('coreMultiInput.navigateSelectionsWithArrows'));\n if (!this._resultsAnnounced) {\n this._noResultsAnnounced = false;\n this._resultsAnnounced = true;\n }\n }\n if (this._tokens && this._tokens.length) {\n this._buildAnnouncement(this._resolveTranslation('coreMultiInput.escapeNavigateTokens'));\n }\n this._makeAnnouncement(this._announcement);\n }\n }\n\n /** @hidden */\n private _buildAnnouncement(message: string): void {\n this._announcement = this._announcement + message + ' ';\n }\n\n /** @hidden */\n private async _makeAnnouncement(message: string): Promise<void> {\n await this._liveAnnouncer.announce(message, 'assertive').then(() => {\n this._announcement = '';\n });\n }\n}\n","import { isSelectItem, SelectableOptionItem } from '@fundamental-ngx/cdk/forms';\nimport { isFunction, isJsObject, isString } from '@fundamental-ngx/cdk/utils';\nimport equal from 'fast-deep-equal';\n\n/** @hidden */\nexport function lookupValue(item: unknown, lookupKey: string): string {\n if (isSelectItem(item)) {\n return lookupKey && item ? item.value[lookupKey] : item.value;\n } else {\n return lookupKey && item ? item[lookupKey] : item;\n }\n}\n\n/** @hidden */\nexport function displayValue(item: unknown, displayKey: string): string {\n if (isSelectItem(item)) {\n return item.label;\n } else if (isJsObject(item) && displayKey) {\n const currentItem = objectGet(item, displayKey);\n\n return isFunction(currentItem) ? currentItem() : currentItem;\n } else {\n return item as string;\n }\n}\n\n/** @hidden */\nexport function objectGet(obj: unknown, is: string | string[] | undefined): any {\n if (!isJsObject(obj)) {\n return obj;\n } else if (isString(is)) {\n return objectGet(obj, is.split('.'));\n } else if (!is?.length) {\n return obj;\n } else {\n return objectGet(obj[is[0]], is.slice(1));\n }\n}\n\n/** @hidden */\nexport function getSelectItemByInputValue<T>(\n suggestions: SelectableOptionItem<T>[],\n needleValue: string\n): SelectableOptionItem<T> | undefined {\n return suggestions.find((value) => value.label === needleValue);\n}\n\n/** @hidden\n * Map grouped values to array. */\nexport function flattenGroups(items: SelectableOptionItem[]): SelectableOptionItem[] {\n return items.reduce((result, item) => result.concat(item.children ?? []), <SelectableOptionItem[]>[]);\n}\n\n/** @hidden */\nexport function getTokenIndexByIdlOrValue(item: SelectableOptionItem, suggestions: SelectableOptionItem[]): number {\n return suggestions.findIndex((token) => token.id === item.id || equal(token.value, item.value));\n}\n","import { SelectableOptionItem } from '@fundamental-ngx/cdk/forms';\nimport { BaseMultiCombobox } from '../base-multi-combobox.class';\n\nexport class MultiComboboxSelectionChangeEvent {\n /**\n * Multi Combobox selection change event\n * @param source Multi Combobox component\n * @param selectedItems Selected items\n */\n constructor(\n public source: BaseMultiCombobox,\n public selectedItems: SelectableOptionItem['value'] // Contains selected items\n ) {}\n}\n","import { Injectable } from '@angular/core';\nimport { DataProvider, MatchingStrategy } from '@fundamental-ngx/cdk/data-source';\n\nimport { ContentDensity } from '@fundamental-ngx/cdk/utils';\n// import { PlatformConfig } from '@fundamental-ngx/platform/shared';\n\n/**\n * Default options for Multi-Combobox\n */\n@Injectable({ providedIn: 'root' })\nexport class MultiComboboxConfig {\n /**\n * Content Density of element. 'cozy' | 'compact'\n */\n contentDensity: ContentDensity;\n\n /**\n * String matching strategy for typeahead list. Default: 'starts with per term'\n */\n matchingStrategy: MatchingStrategy = MatchingStrategy.STARTS_WITH_PER_TERM;\n\n /**\n * Maps data providers\n */\n providers: Map<string, DataProvider<any>> | null = new Map();\n\n /**\n * Create Provider factory function\n */\n // static createProviderFactory(\n // obj: Partial<MultiComboboxConfig>\n // ): (platformConfig: PlatformConfig) => MultiComboboxConfig {\n // const useFactory = (platformConfig: PlatformConfig): MultiComboboxConfig =>\n // Object.assign(new MultiComboboxConfig(platformConfig), obj);\n // return useFactory;\n // }\n\n /** @hidden */\n // constructor(platformConfig: PlatformConfig) {\n // this.contentDensity = platformConfig.contentDensity;\n // }\n}\n","import {\n ALT,\n BACKSPACE,\n CONTROL,\n DOWN_ARROW,\n ENTER,\n ESCAPE,\n LEFT_ARROW,\n RIGHT_ARROW,\n SHIFT,\n TAB,\n UP_ARROW\n} from '@angular/cdk/keycodes';\nimport { ChangeDetectorRef, DestroyRef, Directive, ElementRef, EventEmitter, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { DataSourceDirective, MatchingBy, MatchingStrategy } from '@fundamental-ngx/cdk/data-source';\nimport {\n CvaControl,\n CvaDirective,\n FormStates,\n SelectableOptionItem,\n isOptionItem,\n isSelectableOptionItem\n} from '@fundamental-ngx/cdk/forms';\nimport { Nullable, RangeSelector, coerceArraySafe, isFunction, isJsObject, isString } from '@fundamental-ngx/cdk/utils';\nimport { ContentDensityObserver } from '@fundamental-ngx/core/content-density';\nimport equal from 'fast-deep-equal';\nimport { BehaviorSubject, Subscription, skip, startWith, timer } from 'rxjs';\nimport {\n FdMultiComboBoxDataSource,\n FdMultiComboboxAcceptableDataSource\n} from './data-source/multi-combobox-data-source';\nimport { displayValue, flattenGroups, lookupValue, objectGet } from './helpers';\nimport { MultiComboboxSelectionChangeEvent } from './models/selection-change.event';\nimport { MultiComboboxConfig } from './multi-combobox-config';\nimport { FD_MAP_LIMIT } from './multi-combobox.component';\n\nexport type TextAlignment = 'left' | 'right';\n\n@Directive()\nexport abstract class BaseMultiCombobox<T = any> {\n abstract selectedItems: T[];\n abstract group: boolean;\n abstract groupKey: string;\n abstract displayKey: string;\n abstract secondaryKey: string;\n abstract showSecondaryText: boolean;\n abstract lookupKey: string;\n abstract invalidEntryMessage: string;\n abstract invalidEntryDisplayTime: number;\n abstract limitless: boolean;\n abstract isGroup: boolean;\n abstract inputText: string;\n\n abstract searchInputElement: Nullable<ElementRef<HTMLInputElement>>;\n\n abstract selectionChange: EventEmitter<MultiComboboxSelectionChangeEvent>;\n abstract dataReceived: EventEmitter<boolean>;\n abstract dataRequested: EventEmitter<boolean>;\n // Injection section\n\n /** @hidden */\n readonly cvaControl: CvaControl<T> = inject(CvaControl);\n\n /** @hidden */\n readonly dataSourceDirective: DataSourceDirective<T, FdMultiComboBoxDataSource<T>> = inject(DataSourceDirective);\n\n /** Control Value Accessor directive for forms support. */\n readonly _cva = inject(CvaDirective<T>, {\n self: true\n });\n\n /** Multi combobox config. */\n readonly _multiComboboxConfig = inject(MultiComboboxConfig, {\n optional: true\n });\n\n /** Content Density Observer */\n readonly contentDensityObserver = inject(ContentDensityObserver);\n\n /**\n * @hidden\n * List of selected suggestions\n */\n _selectedSuggestions: SelectableOptionItem<T>[] = [];\n\n /**\n * @hidden\n * List of matched suggestions\n */\n _suggestions: SelectableOptionItem[];\n\n /**\n * @hidden\n * Grouped suggestions mapped to array.\n */\n _flatSuggestions: SelectableOptionItem[] = [];\n\n /** @hidden */\n _fullFlatSuggestions: SelectableOptionItem[] = [];\n\n /** @hidden */\n selectedShown$ = new BehaviorSubject(false);\n\n /** @Hidden */\n protected readonly _elmRef = inject(ElementRef<HTMLElement>);\n\n /** @hidden */\n protected readonly _cd = inject(ChangeDetectorRef);\n\n /** @hidden */\n protected readonly _mapLimit = inject(FD_MAP_LIMIT);\n\n /** @Hidden */\n protected readonly _destroyRef = inject(DestroyRef);\n\n /** @hidden */\n protected _dataSource: FdMultiComboboxAcceptableDataSource<T>;\n\n /** @hidden */\n protected _inputTextValue: string;\n\n /** @hidden */\n protected _previousInputText: string;\n\n /** @hidden */\n protected _matchingStrategy: MatchingStrategy =\n this._multiComboboxConfig?.matchingStrategy ?? MatchingStrategy.CONTAINS;\n\n /** @hidden */\n protected _dsSubscription: Subscription | null = null;\n\n /** @hidden */\n protected _element: HTMLElement = this._elmRef.nativeElement;\n\n /**\n * @hidden\n * Keys, that won't trigger the popover's open state, when dispatched on search input.\n */\n protected readonly _nonOpeningKeys: number[] = [\n BACKSPACE,\n ESCAPE,\n ENTER,\n CONTROL,\n TAB,\n SHIFT,\n UP_ARROW,\n RIGHT_ARROW,\n DOWN_ARROW,\n LEFT_ARROW,\n ALT\n ];\n\n /** @hidden */\n protected _timerSub$: Subscription;\n\n /** @hidden */\n protected _previousState?: FormStates;\n\n /** @hidden */\n protected _previousStateMessage: Nullable<string>;\n\n /** @hidden */\n protected readonly _rangeSelector = new RangeSelector();\n\n /** @hidden */\n private _dataSourceChanged = false;\n\n /** @hidden */\n writeValue(value: T[]): void {\n this.selectedItems = coerceArraySafe(value);\n this._cva.writeValue(this.selectedItems);\n this._setSelectedSuggestions();\n this._emitChangeEvent();\n }\n\n /**\n * Used to change the value of a control.\n * @param value the value to be applied\n * @param emitOnChange whether to emit \"onChange\" event.\n * Should be \"false\", if the change is made programmatically (internally) by the control, \"true\" otherwise\n */\n setValue(value: T[], emitOnChange = true): void {\n this.selectedItems = coerceArraySafe(value);\n this._cva.setValue(this.selectedItems, emitOnChange);\n this._setSelectedSuggestions();\n this._emitChangeEvent();\n }\n\n /** @hidden */\n protected _displayFn = (value: T): string => displayValue(value, this.displayKey);\n\n /** @hidden */\n protected _secondaryFn = (value: T): string => {\n if (isOptionItem(value)) {\n return value.secondaryText ?? '';\n } else if (isJsObject(value) && this.secondaryKey) {\n const currentItem = objectGet(value, this.secondaryKey);\n\n return isFunction(currentItem) ? currentItem() : currentItem;\n } else {\n return value as string;\n }\n };\n\n /**\n * @hidden\n * Method to emit change event\n */\n protected _emitChangeEvent(): void {\n const event = new MultiComboboxSelectionChangeEvent(this, this.selectedItems);\n\n this.selectionChange.emit(event);\n }\n\n /** @hidden */\n protected _setSelectedSuggestions(): void {\n this._selectedSuggestions = [];\n\n if (!this.selectedItems?.length) {\n return;\n }\n\n for (let i = 0; i <= this.selectedItems.length; i++) {\n const selectedItem = this.selectedItems[i];\n const idx = this._fullFlatSuggestions.findIndex(\n (item) => item.label === selectedItem || item.value === selectedItem\n );\n if (idx !== -1) {\n this._selectedSuggestions.push(this._fullFlatSuggestions[idx]);\n this._fullFlatSuggestions[idx].selected = true;\n }\n }\n\n this._cd.detectChanges();\n }\n\n /**\n * Convert original data to SelectableOptionItems Interface\n * @hidden\n */\n protected _convertToOptionItems(items: T[]): SelectableOptionItem<T>[] {\n const item = items[0];\n\n const elementTypeIsOptionItem = isSelectableOptionItem(item);\n if (elementTypeIsOptionItem) {\n return items as SelectableOptionItem[];\n }\n\n const elementTypeIsObject = isJsObject(item);\n if (elementTypeIsObject) {\n return this._convertObjectsToOptionItems(items);\n }\n\n const elementTypeIsString = isString(item);\n if (elementTypeIsString) {\n return this._convertPrimitiveToOptionItems(items);\n }\n\n return [];\n }\n\n /**\n * Convert data to SelectableOptionItems Interface\n * @hidden\n */\n protected _convertObjectsToOptionItems(items: T[]): SelectableOptionItem<T>[] {\n if (this.isGroup) {\n return this._convertObjectsToGroupOptionItems(items);\n } else if (this.showSecondaryText && this.secondaryKey) {\n return this._convertObjectsToSecondaryOptionItems(items);\n } else {\n return this._convertObjectsToDefaultOptionItems(items);\n }\n }\n\n /**\n * Convert object[] data to Group OptionItems Interface\n * @hidden\n */\n protected _convertObjectsToGroupOptionItems<K extends T>(items: K[]): SelectableOptionItem<T>[] {\n const group: Record<string, K[]> = {};\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const keyValue = item[this.groupKey];\n if (!keyValue) {\n continue;\n }\n\n if (!group[keyValue]) {\n group[keyValue] = [];\n }\n\n group[keyValue].push(item);\n }\n\n return Object.keys(group).map((key) => {\n const selectItem: SelectableOptionItem = {\n label: key,\n value: null,\n isGroup: true\n };\n\n const currentGroup = group[key];\n\n if (this.showSecondaryText && this.secondaryKey) {\n selectItem.children = this._convertObjectsToSecondaryOptionItems(currentGroup);\n } else {\n selectItem.children = this._convertObjectsToDefaultOptionItems(currentGroup);\n }\n\n return selectItem;\n });\n }\n\n /**\n * Convert T[] data to Secondary SelectableOptionItems<T> Interface\n * @hidden\n */\n protected _convertObjectsToSecondaryOptionItems<K extends T>(items: K[]): SelectableOptionItem<T>[] {\n const selectItems: SelectableOptionItem[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const value = items[i];\n selectItems.push({\n label: displayValue(value, this.displayKey),\n id: lookupValue(value, this.lookupKey),\n secondaryText: objectGet(value, this.secondaryKey),\n value,\n selected: this.selectedItems?.includes(value) || false\n });\n }\n\n return selectItems;\n }\n\n /**\n * Convert Primitive data(Boolean, String, Number) to SelectableOptionItems Interface\n * @hidden\n */\n protected _convertPrimitiveToOptionItems(items: any[]): SelectableOptionItem<T>[] {\n const selectItems: SelectableOptionItem[] = [];\n for (let i = 0; i < items.length; i++) {\n const value = items[i];\n selectItems.push({\n label: value,\n id: lookupValue(value, this.lookupKey),\n value,\n selected: this.selectedItems?.includes(value) || false\n });\n }\n\n return selectItems;\n }\n\n /**\n * Convert T[] to SelectableOptionItems<T> Interface (Default)\n * @hidden\n */\n protected _convertObjectsToDefaultOptionItems(items: T[]): SelectableOptionItem<T>[] {\n const selectItems: SelectableOptionItem[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const value = items[i];\n selectItems.push({\n label: displayValue(value, this.displayKey),\n id: lookupValue(value, this.lookupKey),\n value,\n selected: this.selectedItems?.includes(value) || false\n });\n }\n\n return selectItems;\n }\n\n /** @hidden */\n protected _setInvalidEntry(): void {\n if (this._previousState || this._previousStateMessage) {\n return;\n }\n\n this._previousState = this._cva.state;\n this._cva.state = 'error';\n\n this._previousStateMessage = this._cva.stateMessage;\n this._cva.stateMessage = this.invalidEntryMessage;\n\n this._cd.markForCheck();\n }\n\n /** @hidden */\n protected _unsetInvalidEntry(): void {\n this._cva.state = this._previousState;\n this._previousState = undefined;\n\n this._cva.stateMessage = this._previousStateMessage;\n this._previousStateMessage = undefined;\n\n this._cd.markForCheck();\n }\n\n /** @hidden */\n protected _focusToSearchField(): void {\n this.searchInputElement?.nativeElement.focus();\n }\n\n /** @hidden */\n protected _mapAndUpdateModel(): void {\n const selectedItems = this._selectedSuggestions.map(({ value }) => value);\n\n const shouldEmitChangeEvent = !equal(this.selectedItems, selectedItems);\n\n if (!shouldEmitChangeEvent) {\n return;\n }\n\n this.writeValue(selectedItems);\n\n this._cva.onChange(selectedItems);\n\n this._emitChangeEvent();\n }\n\n /**\n * @hidden\n * Prepares the data stream and subscribes to it.\n */\n protected _openDataStream(): void {\n const dataSourceProvider = this.dataSourceDirective.dataSourceProvider;\n\n if (!dataSourceProvider) {\n throw new Error(`[dataSource] source did not match an array, Observable, or DataSource`);\n }\n\n dataSourceProvider.limitless = this.limitless;\n\n dataSourceProvider.dataProvider.setLookupKey(this.lookupKey);\n const matchingBy: MatchingBy = {\n firstBy: this._displayFn\n };\n\n if (this.secondaryKey) {\n matchingBy.secondaryBy = this._secondaryFn;\n }\n\n dataSourceProvider.dataProvider.setMatchingBy(matchingBy);\n dataSourceProvider.dataProvider.setMatchingStrategy(this._matchingStrategy);\n\n // initial data fetch\n const map = new Map();\n map.set('query', '*');\n\n if (!this.limitless) {\n map.set('limit', this._mapLimit);\n }\n\n dataSourceProvider.match(map);\n\n this._dsSubscription = new Subscription();\n\n this._dsSubscription.add(\n this.dataSourceDirective.dataSourceProvider?.dataRequested.subscribe(this.dataRequested)\n );\n this._dsSubscription.add(\n this.dataSourceDirective.dataSourceProvider?.dataReceived.subscribe(this.dataReceived)\n );\n\n this.dataSourceDirective.dataSourceChanged\n .pipe(startWith(true), takeUntilDestroyed(this._destroyRef))\n .subscribe(() => {\n this._dataSourceChanged = true;\n });\n\n this.dataSourceDirective.dataChanged$.pipe(skip(0), takeUntilDestroyed(this._destroyRef)).subscribe((data) => {\n if (data.length === 0) {\n this._processingEmptyData();\n return;\n }\n\n this._previousInputText = this.inputText;\n\n this._parseDataSourceValue(data);\n\n this._cva.stateChanges.next('initDataSource.open().');\n\n this._cd.markForCheck();\n });\n }\n\n /**\n * Parses the data from the data stream and updates the model if needed.\n * @param data array of objects from the data stream.\n */\n protected _parseDataSourceValue(data: T[]): void {\n this._convertDataSourceSuggestions(data);\n\n const selectedSuggestionsLength = this._selectedSuggestions.length;\n if (selectedSuggestionsLength > 0) {\n for (let i = 0; i < selectedSuggestionsLength; i++) {\n const selectedSuggestion = this._selectedSuggestions[i];\n const idx = this._suggestions.findIndex((item) => equal(item.value, selectedSuggestion.value));\n\n if (idx !== -1) {\n this._suggestions[idx].selected = true;\n }\n }\n }\n\n if (this._dataSourceChanged) {\n this._flatSuggestions = this.isGroup ? flattenGroups(this._suggestions) : this._suggestions;\n this._fullFlatSuggestions = this._flatSuggestions;\n\n this._setSelectedSuggestions();\n\n this._mapAndUpdateModel();\n\n this._dataSourceChanged = false;\n }\n }\n\n /**\n * Transforms plain array into `SelectableOptionItem<T>`\n * @param data\n */\n protected _convertDataSourceSuggestions(data: T[]): void {\n this._suggestions = this._convertToOptionItems(data).map((optionItem) => {\n const selectedElement = this._selectedSuggestions.find((selectedItem) => selectedItem.id === optionItem.id);\n if (selectedElement) {\n optionItem.selected = selectedElement.selected;\n }\n return optionItem;\n });\n }\n\n /** @hidden */\n protected _processingEmptyData(): void {\n this.inputText = this._previousInputText;\n\n this._setInvalidEntry();\n\n if (this._timerSub$) {\n this._timerSub$.unsubscribe();\n }\n\n this._timerSub$ = timer(this.invalidEntryDisplayTime).subscribe(() => this._unsetInvalidEntry());\n\n this._cd.detectChanges();\n }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const MULTI_COMBOBOX_COMPONENT = new InjectionToken('FdMultiComboboxInterface');\n","import { CdkScrollable } from '@angular/cdk/overlay';\nimport { AsyncPipe, NgIf, NgTemplateOutlet } from '@angular/common';\nimport { Component, ElementRef, Inject, OnDestroy, OnInit, Optional, TemplateRef, ViewChild } from '@angular/core';\nimport { SelectableOptionItem } from '@fundamental-ngx/cdk/forms';\nimport { Nullable, TemplateDirective } from '@fundamental-ngx/cdk/utils';\nimport { BarElementDirective, BarMiddleDirective, ButtonBarComponent } from '@fundamental-ngx/core/bar';\nimport { ButtonComponent } from '@fundamental-ngx/core/button';\nimport { DialogModule, DialogService } from '@fundamental-ngx/core/dialog';\nimport {\n MOBILE_MODE_CONFIG,\n MobileModeBase,\n MobileModeConfigToken,\n MobileModeControl\n} from '@fundamental-ngx/core/mobile-mode';\nimport { ScrollbarDirective } from '@fundamental-ngx/core/scrollbar';\nimport { TitleComponent } from '@fundamental-ngx/core/title';\nimport { FdTranslatePipe } from '@fundamental-ngx/i18n';\nimport { takeUntil } from 'rxjs/operators';\nimport { MobileMultiComboboxInterface } from '../models/multi-combobox.interface';\nimport { MULTI_COMBOBOX_COMPONENT } from '../multi-combobox.token';\n\n@Component({\n selector: 'fd-mobile-multi-combobox',\n templateUrl: './mobile-multi-combobox.component.html',\n styleUrls: ['./mobile-multi-combobox.component.scss'],\n standalone: true,\n imports: [\n DialogModule,\n NgIf,\n TitleComponent,\n TemplateDirective,\n BarMiddleDirective,\n BarElementDirective,\n NgTemplateOutlet,\n ButtonComponent,\n CdkScrollable,\n ScrollbarDirective,\n ButtonBarComponent,\n AsyncPipe,\n FdTranslatePipe\n ]\n})\nexport class MobileMultiComboboxComponent\n extends MobileModeBase<MobileMultiComboboxInterface>\n implements OnInit, OnDestroy\n{\n /** @hidden */\n @ViewChild('dialogTemplate') dialogTemplate: TemplateRef<any>;\n\n /** @hidden\n * For internal usage\n * Control element, which will be rendered inside dialog.\n * List element, which will be rendered inside dialog.\n */\n childContent: Nullable<{\n listTemplate: TemplateRef<any>;\n controlTemplate: TemplateRef<any>;\n }> = null;\n\n /** @hidden */\n selectedShown$ = this._component.selectedShown$;\n\n /** @hidden */\n private _selectedBackup: SelectableOptionItem[];\n\n /** @hidden */\n constructor(\n elementRef: ElementRef,\n dialogService: DialogService,\n @Inject(MULTI_COMBOBOX_COMPONENT) multiComboboxComponent: MobileMultiComboboxInterface,\n @Optional() @Inject(MOBILE_MODE_CONFIG) mobileModes: MobileModeConfigToken[]\n ) {\n super(elementRef, dialogService, multiComboboxComponent, MobileModeControl.MULTI_COMBOBOX, mobileModes);\n }\n\n /** @hidden */\n ngOnInit(): void {\n this._listenOnMultiComboboxOpenChange();\n }\n\n /** @hidden */\n ngOnDestroy(): void {\n super.onDestroy();\n }\n\n /** @hidden */\n showSelected(): void {\n const isSelectedShown = this.selectedShown$.getValue();\n\n if (isSelectedShown) {\n this._component._searchTermChanged();\n this.selectedShown$.next(false);\n return;\n }\n\n this._component._moreClicked();\n }\n\n /** @hidden */\n handleDismiss(): void {\n this.dialogRef.dismiss();\n this._component._dialogDismiss(this._selectedBackup);\n }\n\n /** @hidden */\n handleApprove(): void {\n this.dialogRef.close();\n this._component._dialogApprove();\n }\n\n /** @hidden */\n private _toggleDialog(open: boolean): void {\n if (!open) {\n return;\n }\n\n this._selectedBackup = this._component._selectedSuggestions?.length\n ? [...this._component._selectedSuggestions]\n : [];\n if (!this._dialogService.hasOpenDialogs()) {\n this._open();\n }\n }\n\n /** @hidden */\n private _listenOnMultiComboboxOpenChange(): void {\n this._component.openChange.pipe(takeUntil(this._onDestroy$)).subscribe((isOpen) => this._toggleDialog(isOpen));\n }\n\n /** @hidden */\n private _open(): void {\n this.dialogRef = this._dialogService.open(this.dialogTemplate, {\n mobile: true,\n ...this.dialogConfig,\n backdropClickCloseable: false,\n escKeyCloseable: false,\n container: this._elementRef.nativeElement,\n disablePaddings: true\n });\n }\n}\n","<ng-template [fdDialogTemplate] let-dialog let-dialogConfig=\"dialogConfig\" #dialogTemplate>\n <fd-dialog [dialogConfig]=\"dialogConfig\" [dialogRef]=\"dialog\">\n <fd-dialog-header>\n <h1 fd-title fd-dialog-title *ngIf=\"mobileConfig?.title\">{{ mobileConfig.title }}</h1>\n <button\n fd-dialog-close-button\n *ngIf=\"mobileConfig?.hasCloseButton\"\n [mobile]=\"true\"\n (click)=\"handleDismiss()\"\n ></button>\n <ng-template fdkTemplate=\"subheader\">\n <div fd-bar-middle>\n <fd-bar-element [fullWidth]=\"true\">\n <ng-container *ngTemplateOutlet=\"childContent?.controlTemplate || null\"></ng-container>\n\n <button\n *ngIf=\"selectedShown$ | async\"\n fd-button\n glyph=\"multiselect-all\"\n fdType=\"emphasized\"\n [title]=\"'platformMultiCombobox.mobileShowAllItemsButton' | fdTranslate\"\n [attr.aria-label]=\"'platformMultiCombobox.mobileShowAllItemsButton' | fdTranslate\"\n class=\"fd-margin-begin--tiny\"\n (click)=\"showSelected()\"\n ></button>\n\n <button\n *ngIf=\"(selectedShown$ | async) === false\"\n fd-button\n glyph=\"multiselect-all\"\n fdType=\"transparent\"\n [title]=\"'platformMultiCombobox.mobileShowSelectedItemsButton' | fdTranslate\"\n [attr.aria-label]=\"'platformMultiCombobox.mobileShowSelectedItemsButton' | fdTranslate\"\n class=\"fd-margin-begin--tiny\"\n (click)=\"showSelected()\"\n ></button>\n </fd-bar-element>\n </div>\n </ng-template>\n </fd-dialog-header>\n\n <fd-dialog-body>\n <ng-container *ngTemplateOutlet=\"childContent?.listTemplate || null\"></ng-container>\n </fd-dialog-body>\n\n <fd-dialog-footer>\n <fd-button-bar\n *ngIf=\"mobileConfig?.approveButtonText\"\n fdType=\"emphasized\"\n [label]=\"mobileConfig.approveButtonText!\"\n (click)=\"handleApprove()\"\n >\n </fd-button-bar>\n <fd-button-bar\n *ngIf=\"mobileConfig?.cancelButtonText\"\n [label]=\"mobileConfig.cancelButtonText!\"\n (click)=\"handleDismiss()\"\n >\n </fd-button-bar>\n </fd-dialog-footer>\n </fd-dialog>\n</ng-template>\n","import { AbstractDataProvider, BaseDataSource, DataProvider } from '@fundamental-ngx/cdk/data-source';\nimport { Observable } from 'rxjs';\n\nexport class FdMultiComboBoxDataSource<T> extends BaseDataSource<T> {\n /** @hidden */\n limitless = false;\n /** @hidden */\n constructor(public dataProvider: AbstractDataProvider<T>) {\n super(dataProvider);\n }\n}\n\nexport class ArrayMultiComboBoxDataSource<T> extends FdMultiComboBoxDataSource<T> {\n /** @hidden */\n constructor(data: T[]) {\n super(new DataProvider(data));\n }\n}\n\nexport class ObservableMultiComboBoxDataSource<T> extends FdMultiComboBoxDataSource<T> {\n /** @hidden */\n constructor(data: Observable<T[]>) {\n super(new DataProvider(data));\n }\n}\n\n/**\n * Type of acceptable objects as a datasource for the Multi-Combo Box component.\n */\nexport type FdMultiComboboxAcceptableDataSource<T> = FdMultiComboBoxDataSource<T> | Observable<T[]> | T[];\n","import { DataSourceParser, isDataSource } from '@fundamental-ngx/cdk/data-source';\nimport { isObservable } from 'rxjs';\nimport {\n ArrayMultiComboBoxDataSource,\n FdMultiComboboxAcceptableDataSource,\n FdMultiComboBoxDataSource,\n ObservableMultiComboBoxDataSource\n} from './multi-combobox-data-source';\n\nexport class MultiComboboxDataSourceParser<T> implements DataSourceParser<T, FdMultiComboBoxDataSource<T>> {\n /**\n * Transforms plain array or observable into DataSource class.\n * @param source\n */\n parse(source: FdMultiComboboxAcceptableDataSource<T>): FdMultiComboBoxDataSource<T> | undefined {\n if (isDataSource(source)) {\n return source as FdMultiComboBoxDataSource<T>;\n }\n\n if (Array.isArray(source)) {\n return new ArrayMultiComboBoxDataSource<T>(source);\n }\n\n if (isObservable(source)) {\n return new ObservableMultiComboBoxDataSource<T>(source);\n }\n\n return undefined;\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n HostListener,\n inject,\n Input,\n OnInit,\n ViewEncapsulation\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { CheckboxComponent } from '@fundamental-ngx/core/checkbox';\nimport { FormItemComponent } from '@fundamental-ngx/core/form';\nimport { ListFocusItem } from '@fundamental-ngx/core/list';\nimport { ToolbarComponent } from '@fundamental-ngx/core/toolbar';\nimport { FdTranslatePipe } from '@fundamental-ngx/i18n';\nimport { Observable } from 'rxjs';\n\n@Component({\n selector: 'fd-multi-combobox-select-all-toggler',\n template: `\n <fd-toolbar>\n <div fd-form-item class=\"fd-multi-combobox-select-all__form-item\">\n <fd-checkbox tabIndexValue=\"-1\" [ngModel]=\"checkboxValue\" [tristate]=\"true\">\n {{\n 'coreMultiComboBox.selectAllLabel'\n | fdTranslate : { selectedItems: selectedItems.length, totalItems: flatItems.length }\n }}\n </fd-checkbox>\n </div>\n </fd-toolbar>\n `,\n styleUrls: ['./select-all-toggler.component.scss'],\n providers: [\n {\n provide: ListFocusItem,\n useExisting: SelectAllTogglerComponent\n }\n ],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [ToolbarComponent, FormItemComponent, CheckboxComponent, FormsModule, FdTranslatePipe]\n})\nexport class SelectAllTogglerComponent extends ListFocusItem implements OnInit {\n /**\n * Handler for the select all items\n * */\n @Input() selectAllHandler: (select: boolean) => void;\n\n /**\n * Stream for receiving information about the value changes,\n */\n @Input() valueChanges: Observable<unknown>;\n\n /** @hidden */\n @Input()\n selectedItems: Array<unknown> = [];\n\n /** @hidden */\n @Input()\n flatItems: Array<unknown> = [];\n\n /** @hidden */\n get allAreSelected(): boolean {\n return this.selectedItems.length === this.flatItems.length;\n }\n\n /** @hidden */\n get someAreSelected(): boolean {\n return this.selectedItems.length > 0 && !this.allAreSelected;\n }\n\n /** @hidden */\n get checkboxValue(): boolean | null {\n if (this.allAreSelected) {\n return true;\n }\n if (this.someAreSelected) {\n return null;\n }\n return false;\n }\n\n /** @hidden */\n private _destroyRef = inject(DestroyRef);\n\n /** @hidden */\n private changeDetector: ChangeDetectorRef = inject(ChangeDetectorRef);\n\n /** @hidden */\n @HostListener('keydown.enter', ['$event'])\n @HostListener('keydown.space', ['$event'])\n onKeyDown($event: KeyboardEvent): void {\n $event.preventDefault();\n this.change(!this.checkboxValue);\n }\n\n /** @hidden */\n @HostListener('click')\n onClick(): void {\n this.elementRef.nativeElement.focus();\n this.change(!this.checkboxValue);\n }\n\n /** @hidden */\n ngOnInit(): void {\n this.tabindex = 0;\n this.valueChanges.pipe(takeUntilDestroyed(this._destroyRef)).subscribe(() => {\n this.changeDetector.detectChanges();\n });\n }\n\n /** @hidden */\n change(value: boolean): void {\n this.selectAllHandler(value);\n }\n}\n","import { A, CONTROL, DOWN_ARROW, ENTER, ESCAPE, SPACE, UP_ARROW } from '@angular/cdk/keycodes';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ContentChildren,\n ElementRef,\n EventEmitter,\n InjectionToken,\n Injector,\n Input,\n OnInit,\n Output,\n QueryList,\n TemplateRef,\n ViewChild,\n ViewContainerRef,\n ViewEncapsulation\n} from '@angular/core';\nimport { DataSourceDirective, FD_DATA_SOURCE_TRANSFORMER } from '@fundamental-ngx/cdk/data-source';\nimport { CvaControl, CvaDirective, OptionItem, SelectItem, SelectableOptionItem } from '@fundamental-ngx/cdk/forms';\nimport {\n AutoCompleteDirective,\n AutoCompleteEvent,\n ContentDensity,\n DynamicComponentService,\n FocusEscapeDirection,\n KeyUtil,\n Nullable,\n SearchHighlightPipe,\n TemplateDirective,\n coerceArraySafe,\n resizeObservable\n} from '@fundamental-ngx/cdk/utils';\nimport {\n FD_LIST_COMPONENT,\n ListComponent,\n ListComponentInterface,\n ListGroupHeaderDirective,\n ListItemComponent,\n ListSecondaryDirective,\n ListTitleDirective\n} from '@fundamental-ngx/core/list';\nimport { MobileModeConfig } from '@fundamental-ngx/core/mobile-mode';\nimport { PopoverFillMode } from '@fundamental-ngx/core/shared';\n\nimport { contentDensityObserverProviders } from '@fundamental-ngx/core/content-density';\nimport { TokenComponent, TokenizerComponent } from '@fundamental-ngx/core/token';\nimport equal from 'fast-deep-equal';\nimport { Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\nimport { BaseMultiCombobox } from './base-multi-combobox.class';\nimport { MobileMultiComboboxComponent } from './mobile/mobile-multi-combobox.component';\nimport { MULTI_COMBOBOX_COMPONENT } from './multi-combobox.token';\n\nimport { MultiComboboxDataSourceParser } from './data-source/multi-combobox-data-source-parser';\n\nimport { NgClass, NgFor, NgIf, NgTemplateOutlet } from '@angular/common';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { CheckboxComponent } from '@fundamental-ngx/core/checkbox';\nimport { FormControlComponent, FormInputMessageGroupComponent, FormMessageComponent } from '@fundamental-ngx/core/form';\nimport { InputGroupComponent, InputGroupInputDirective } from '@fundamental-ngx/core/input-group';\nimport { PopoverBodyComponent, PopoverComponent, PopoverControlComponent } from '@fundamental-ngx/core/popover';\nimport { FdTranslatePipe } from '@fundamental-ngx/i18n';\nimport { getSelectItemByInputValue, getTokenIndexByIdlOrValue } from './helpers';\nimport { MultiComboboxSelectionChangeEvent } from './models/selection-change.event';\nimport { MultiAnnouncerDirective } from './multi-announcer/multi-announcer.directive';\nimport { SelectAllTogglerComponent } from './select-all-toggler/select-all-toggler.component';\n\nexport const FD_MAP_LIMIT = new InjectionToken<number>('Map limit≥', { factory: () => 12 });\n\n@Component({\n selector: 'fd-multi-combobox',\n templateUrl: './multi-combobox.component.html',\n styleUrls: ['./multi-combobox.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [\n {\n directive: CvaDirective,\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['id:inputId', 'placeholder', 'state', 'stateMessage', 'disabled', 'readonly', 'name']\n },\n {\n directive: DataSourceDirective,\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['dataSource'],\n // eslint-disable-next-line @angular-eslint/no-outputs-metadata-property\n outputs: ['dataChanged']\n }\n ],\n providers: [\n CvaControl,\n DynamicComponentService,\n contentDensityObserverProviders(),\n {\n provide: FD_DATA_SOURCE_TRANSFORMER,\n useClass: MultiComboboxDataSourceParser\n },\n {\n provide: MULTI_COMBOBOX_COMPONENT,\n useExisting: MultiComboboxComponent\n }\n ],\n standalone: true,\n imports: [\n NgIf,\n NgTemplateOutlet,\n PopoverComponent,\n PopoverControlComponent,\n PopoverBodyComponent,\n FormInputMessageGroupComponent,\n InputGroupComponent,\n TokenizerComponent,\n NgFor,\n TokenComponent,\n FormsModule,\n AutoCompleteDirective,\n FormControlComponent,\n InputGroupInputDirective,\n FormMessageComponent,\n ListComponent,\n SelectAllTogglerComponent,\n ListGroupHeaderDirective,\n ListTitleDirective,\n ListItemComponent,\n CheckboxComponent,\n NgClass,\n ListSecondaryDirective,\n FdTranslatePipe,\n SearchHighlightPipe,\n MultiAnnouncerDirective\n ]\n})\nexport class MultiComboboxComponent<T = any> extends BaseMultiCombobox<T> implements AfterViewInit, OnInit {\n /**\n * Show select all checkbox\n */\n @Input()\n showSelectAll = false;\n\n /** Provides selected items. */\n @Input()\n set selectedItems(value: T[]) {\n this._selectedItems = coerceArraySafe(value);\n }\n get selectedItems(): T[] {\n return this._selectedItems;\n }\n /** Provides maximum height for the optionPanel. */\n @Input()\n maxHeight = '250px';\n\n /**\n * Whether AddOn Button should be focusable\n * @default false\n */\n @Input()\n buttonFocusable = false;\n\n /** Whether the autocomplete should be enabled; Enabled by default. */\n @Input()\n autoComplete = true;\n\n /**\n * TODO: Name of the entity for which DataProvider will be loaded. You can either pass list of\n * items or use this entityClass and internally we should be able to do lookup to some registry\n * and retrieve the best matching DataProvider that is set on application level\n */\n @Input()\n entityClass: string;\n\n /** Whether the multi-combobox should be built on mobile mode. */\n @Input()\n mobile = false;\n\n /** Multi Combobox Mobile Configuration, it's applied only, when mobile is enabled. */\n @Input()\n mobileConfig: MobileModeConfig;\n\n /** Tells the multi-combobox if we need to group items. */\n @Input()\n group = false;\n\n /** A field name to use to group data by (support dotted notation). */\n @Input()\n groupKey: string;\n\n /** The field to show data in secondary column. */\n @Input()\n secondaryKey: string;\n\n /** Show the second column (applicable for two columns layout). */\n @Input()\n showSecondaryText = false;\n\n /** Horizontally align text inside the second column (applicable for two columns layout). */\n @Input()\n secondaryTextAlignment: 'left' | 'right' = 'right';\n\n /** Turns on/off Adjustable Width feature. */\n @Input()\n autoResize = true;\n\n /** Whether to open the dropdown when the addon button is clicked. */\n @Input()\n openDropdownOnAddOnClicked = true;\n\n /** Value of the multi combobox */\n @Input()\n set value(value: T[]) {\n this.setValue(value, true);\n }\n\n get value(): T[] {\n return this._cva.value;\n }\n /**\n * Preset options for the Select body width, whatever is chosen, the body has a 600px limit.\n * * `at-least` will apply a minimum width to the body equivalent to the width of the control. - Default\n * * `equal` will apply a width to the body equivalent to the width of the control.\n * * 'fit-content' will apply width needed to properly display items inside, independent of control.\n */\n @Input()\n fillControlMode: PopoverFillMode = 'at-least';\n\n /** Sets title attribute to addon button. */\n @Input()\n addonIconTitle: string;\n\n /** Sets invalid entry message. */\n @Input()\n invalidEntryMessage = 'Invalid entry';\n\n /** Turns limitless mode, ON or OFF */\n @Input()\n limitless: boolean;\n\n /**\n * Used in filters and any kind of comparators when we work with objects and this identify\n * unique field name based on which we are going to do the job\n */\n @Input()\n lookupKey: string;\n\n /**\n * When we deal with unknown object we can use `displayKey` to retrieve value from specific\n * property of the object to act as display value.\n *\n * @See ComboBox, Select, RadioGroup, CheckBox Group\n */\n @Input()\n displayKey: string;\n\n /**\n * List of values, it can be of type SelectItem, string or any object.\n * Generic object type is among the list of types,\n * because we allow to get labels and values using `displayKey` and `lookupKey` inputs accordingly.\n */\n @Input()\n list: Array<SelectItem | string | object>;\n\n /** Time in ms for how long message of invalid entry should be displayed. */\n @Input()\n invalidEntryDisplayTime = 3000;\n\n /** Event emitted when item is selected. */\n @Output()\n selectionChange = new EventEmitter<MultiComboboxSelectionChangeEvent>();\n\n /** @hidden Emits event when the menu is opened/closed. */\n @Output()\n isOpenChange: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n /** Emits event when the addon button is clicked. */\n @Output()\n addOnButtonClicked: EventEmitter<Event> = new EventEmitter<Event>();\n\n /** Event emitted when data loading is started. */\n @Output()\n dataRequested = new EventEmitter<boolean>();\n\n /** Event emitted when data loading is finished. */\n @Output()\n dataReceived = new EventEmitter<boolean>();\n\n /** @hidden */\n @ViewChild('searchInputElement', { read: ElementRef })\n readonly searchInputElement: Nullable<ElementRef<HTMLInputElement>>;\n\n /** @hidden */\n @ViewChild(FD_LIST_COMPONENT)\n private readonly listComponent: ListComponentInterface;\n\n /** @hidden */\n @ContentChildren(TemplateDirective)\n private readonly customTemplates: QueryList<TemplateDirective>;\n\n /** @hidden */\n @ViewChild('mobileControlTemplate')\n private readonly mobileControlTemplate: TemplateRef<any>;\n\n /** @hidden */\n @ViewChild('listTemplate')\n private readonly listTemplate: TemplateRef<any>;\n\n /** @hidden */\n @ViewChild(TokenizerComponent)\n private readonly _tokenizer: TokenizerComponent;\n\n /** @hidden */\n @ViewChild('inputGroup', { read: ElementRef })\n private readonly _inputGroup: ElementRef<HTMLElement>;\n\n /**\n * @hidden\n * Custom Option item Template.\n */\n optionItemTemplate: TemplateRef<any>;\n\n /**\n * @hidden\n * Custom Group Header item Template.\n */\n groupItemTemplate: TemplateRef<any>;\n\n /**\n * @hidden\n * Custom Secondary item Template.\n */\n secondaryItemTemplate: TemplateRef<any>;\n\n /**\n * @hidden\n * Custom Selected option item Template.\n */\n selectedItemTemplate: TemplateRef<any>;\n\n /** @hidden */\n _contentDensity: ContentDensity = this._multiComboboxConfig?.contentDensity ?? 'cozy';\n\n /** Set the input text of the input. */\n set inputText(value: string) {\n this._inputTextValue = value;\n\n this._cva.onTouched();\n }\n\n /** Get the input text of the input. */\n get inputText(): string {\n return this._inputTextValue || '';\n }\n\n /** Is empty search field. */\n get isEmptyValue(): boolean {\n return this.inputText.trim().length === 0;\n }\n\n /** @hidden */\n get isGroup(): boolean {\n return !!(this.group && this.groupKey);\n }\n\n /** Whether the Multi Input is opened. */\n isOpen = false;\n\n /**\n * @hidden\n * Max width of list container\n */\n maxWidth: number;\n\n /**\n * @hidden\n * Min width of list container\n */\n minWidth: number;\n\n /**\n * @hidden\n * Need for opening mobile version\n */\n openChange = new Subject<boolean>();\n\n /** @hidden */\n private _selectedItems: T[] = [];\n\n /** @hidden */\n constructor(\n private readonly _injector: Injector,\n private readonly _viewContainerRef: ViewContainerRef,\n private readonly _dynamicComponentService: DynamicComponentService\n ) {\n super();\n\n this.contentDensityObserver.subscribe();\n }\n\n /** @hidden */\n ngOnInit(): void {\n this.cvaControl.listenToChanges();\n this._openDataStream();\n }\n\n /** @hidden */\n async ngAfterViewInit(): Promise<void> {\n if (this.mobile) {\n await this._setUpMobileMode();\n }\n\n this._assignCustomTemplates();\n\n this._initWindowResize();\n\n this._tokenizer._showOverflowPopover = false;\n }\n\n /** @hidden */\n _toggleSelection(item: SelectableOptionItem, fromTokenCloseClick = false): void {\n const idx = getTokenIndexByIdlOrValue(item, this._selectedSuggestions);\n if (idx === -1) {\n this._selectedSuggestions.push(item);\n } else {\n this._selectedSuggestions.splice(idx, 1);\n }\n\n item.selected = !item.selected;\n\n this._propagateChange(fromTokenCloseClick);\n\n if (!this._selectedSuggestions.length) {\n this._focusToSearchField();\n }\n\n this._cd.detectChanges();\n }\n\n /** @hidden */\n _onOptionCheckboxClicked(event: MouseEvent, index: number): void {\n event.stopPropagation();\n this._onListElementClicked(event, index);\n }\n\n /** @hidden */\n _onCompleteTerm(event: AutoCompleteEvent): void {\n if (event.forceClose) {\n this._toggleSelectionByInputText(event.term);\n this.close();\n }\n }\n\n /**\n * @hidden\n * Method that selects all possible options.\n * *select* attribute – if *true* select all, if *false* unselect all\n * */\n _handleSelectAllItems = (select: boolean): void => {\n this._flatSuggestions.forEach((item) => (item.selected = select));\n this._onEveryItem(this._suggestions, (item) => (item.selected = select));\n this._selectedSuggestions = select ? [...this._flatSuggestions] : [];\n this._rangeSelector.reset();\n\n this._propagateChange();\n };\n\n /** @hidden */\n _navigateByTokens(event: KeyboardEvent): void {\n if (KeyUtil.isKeyCode(event, [DOWN_ARROW, UP_ARROW]) && this.isOpen) {\n this.listComponent.items?.first.focus();\n }\n }\n\n /** @hidden */\n _removeToken(token: SelectableOptionItem, event?: MouseEvent): void {\n if (event) {\n event.preventDefault();\n }\n const optionItem = this._suggestions.find((s) => s.value === token.value);\n if (optionItem) {\n this._toggleSelection(optionItem, true);\n this._rangeSelector.reset();\n }\n }\n\n /** @hidden */\n _moreClicked(): void {\n this._suggestions = this.isGroup\n ? this._convertObjectsToGroupOptionItems(this._selectedSuggestions.map(({ value }) => value))\n : this._suggestions.filter((value) =>\n this._selectedSuggestions.some((item) => equal(item.value, value.value))\n );\n\n this._showList(true);\n this.selectedShown$.next(true);\n this._cd.markForCheck();\n }\n\n /** @hidden */\n _onBlur(event: FocusEvent): void {\n const target = event.relatedTarget as HTMLElement;\n if (target) {\n const isList = !!target.closest('.fd-multi-combobox__list-container');\n if (isList) {\n return;\n }\n if (\n this._suggestions?.length === 1 &&\n this._suggestions[0].label === this.inputText &&\n !this._suggestions[0].selected\n ) {\n this._toggleSelection(this._suggestions[0]);\n }\n this._showList(false);\n this.inputText = '';\n }\n }\n\n /** @hidden */\n _onItemKeyDownHandler(event: KeyboardEvent): void {\n if (KeyUtil.isKeyCode(event, ESCAPE)) {\n this._focusToSearchField();\n this.close();\n } else if ((event.ctrlKey || event.metaKey) && event.shiftKey && KeyUtil.isKeyCode(event, A)) {\n event.preventDefault();\n this._handleSelectAllItems(false);\n } else if ((event.ctrlKey || event.metaKey) && KeyUtil.isKeyCode(event, A)) {\n event.preventDefault();\n this._handleSelectAllItems(true);\n } else if (KeyUtil.isKeyCode(event, ENTER)) {\n if (!this.mobile) {\n this.close();\n }\n this._rangeSelector.reset();\n } else if (KeyUtil.isKeyCode(event, SPACE)) {\n this._rangeSelector.reset();\n }\n }\n\n /** @hidden */\n _onOptionClicked(event: MouseEvent, index: number): void {\n this._onListElementClicked(event, index);\n this.close();\n }\n\n /**\n * @hidden\n * Handle dialog dismissing, closes popover and sets backup data.\n */\n _dialogDismiss(backup: SelectableOptionItem[]): void {\n this._selectedSuggestions = [...backup];\n this.inputText = '';\n this._showList(false);\n this.selectedShown$.next(false);\n }\n\n /**\n * @hidden\n * Handle dialog approval, closes popover and propagates data changes.\n */\n _dialogApprove(): void {\n this.inputText = '';\n this._showList(false);\n this._propagateChange(true);\n }\n\n /** @hidden */\n _popoverOpenChangeHandle(isOpen: boolean): void {\n this.isOpen = isOpen;\n this._rangeSelector.reset();\n }\n\n /** Opens the select popover body. */\n open(): void {\n this.isOpen = true;\n this.isOpenChange.emit(this.isOpen);\n this._cd.markForCheck();\n }\n\n /** Closes the select popover body. */\n close(): void {\n this._focusToSearchField();\n this._rangeSelector.reset();\n this.selectedShown$.next(false);\n this.inputText = '';\n\n this.isOpen = false;\n this.isOpenChange.emit(this.isOpen);\n this._cd.markForCheck();\n }\n\n /** @hidden */\n _showList(isOpen: boolean): void {\n if (this.isOpen !== isOpen) {\n this.isOpen = isOpen;\n this._cva.onTouched();\n this.openChange.next(isOpen);\n }\n\n if (!this.isOpen) {\n this._searchTermChanged('');\n }\n\n this._cd.markForCheck();\n }\n\n /** @hidden */\n _searchTermChanged(text: string = this.inputText): void {\n const map = new Map();\n map.set('query', text);\n\n if (!this.limitless) {\n map.set('limit', this._mapLimit);\n }\n\n this.dataSourceDirective.dataSourceProvider?.match(map);\n\n if (text) {\n this.open();\n }\n\n this._cd.markForCheck();\n }\n\n /**\n * Handle Click on Button\n * @hidden\n */\n _onPrimaryButtonClick(isOpen: boolean): void {\n if (!isOpen) {\n this._searchTermChanged('');\n }\n\n if (this.openDropdownOnAddOnClicked) {\n this._showList(!isOpen);\n } else if (this.isOpen) {\n this._showList(false);\n }\n\n if (this.isOpen) {\n this.searchInputElement?.nativeElement.focus();\n }\n }\n\n /**\n * Handle Keydown on Input\n * @hidden\n */\n _onInputKeydownHandler(event: KeyboardEvent): void {\n if (this._cva.readonly) {\n return;\n }\n\n if (KeyUtil.isKeyCode(event, DOWN_ARROW)) {\n event.preventDefault();\n\n if (event.altKey) {\n this._showList(true);\n }\n\n if (this.isOpen && this.listComponent) {\n this.listComponent.setItemActive(0);\n } else if (!this.isOpen) {\n this._chooseOtherItem(1);\n }\n } else if (KeyUtil.isKeyCode(event, UP_ARROW)) {\n event.preventDefault();\n\n this._chooseOtherItem(-1);\n } else if (KeyUtil.isKeyCode(event, ENTER)) {\n this._toggleSelectionByInputText();\n } else if (KeyUtil.isKeyCode(event, ESCAPE)) {\n event.stopPropagation();\n\n this._showList(false);\n } else if (!KeyUtil.isKeyCode(event, [...this._nonOpeningKeys, CONTROL])) {\n this._showList(true);\n const acceptedKeys = !KeyUtil.isKeyType(event, 'alphabetical') && !KeyUtil.isKeyType(event, 'numeric');\n if (acceptedKeys) {\n // SetTimeout is needed for input to receive new value.\n setTimeout(() => {\n if (this.isEmptyValue) {\n this.listComponent?.setItemActive(0);\n }\n });\n }\n }\n }\n\n /**\n * @hidden\n * Method passed to list component.\n */\n _handleListFocusEscape(direction: FocusEscapeDirection): void {\n if (direction === 'up') {\n this._focusToSearchField();\n }\n }\n\n /**\n * @hidden\n */\n _addOnClicked($event: Event): void {\n this.addOnButtonClicked.emit($event);\n if (!this.mobile) {\n this._onPrimaryButtonClick(this.isOpen);\n }\n }\n /**\n * @hidden\n * Iterate over every item and perform callback\n */\n private _onEveryItem(items: SelectableOptionItem[], callback: (item: SelectableOptionItem) => void): void {\n items.forEach((item) => {\n callback(item);\n if (item.children && item.children.length > 0) {\n this._onEveryItem(item.children, callback);\n }\n });\n }\n\n /** @hidden */\n private _toggleSelectionByInputText(text = this.inputText): void {\n const item = getSelectItemByInputValue<T>(this._fullFlatSuggestions, text);\n if (item) {\n this._toggleSelection(item);\n this.inputText = '';\n }\n\n this._searchTermChanged();\n }\n\n /**\n * @hidden\n * Method to set input text as item label.\n */\n private _setInputTextFromOptionItem(item: OptionItem): void {\n this.inputText = item.label;\n\n if (this.mobile) {\n return;\n }\n\n this._showList(false);\n }\n\n /**\n * @hidden\n * applying range selection. Note, that this function will be invoked after combobox item's value has been changed\n */\n private _onListElementClicked(event: MouseEvent, index: number): void {\n // value has been changed at this point, so it can be safely used\n const selectionState = this._suggestions[index].selected;\n this._rangeSelector.onRangeElementToggled(index, event);\n const toRemoveSet = new Set();\n this._rangeSelector.applyValueToEachInRange((idx) => {\n const current = this._suggestions[idx];\n if (current.selected !== selectionState) {\n if (current.selected) {\n // removing from \"_selectedSuggestions\" list\n toRemoveSet.add(current.value);\n } else {\n // adding current item to \"_selectedSuggestions\"\n this._selectedSuggestions.push(current);\n }\n current.selected = selectionState;\n }\n });\n this._selectedSuggestions = this._selectedSuggestions.filter((s) => !toRemoveSet.has(s.value));\n this._propagateChange();\n\n this._tokenizer.onResize();\n\n this._tokenizer.tokenizerInnerEl.nativeElement.scrollLeft =\n this._tokenizer.tokenizerInnerEl.nativeElement.scrollWidth;\n }\n\n /** @hidden */\n private _propagateChange(emitInMobile?: boolean): void {\n if (!this.mobile || emitInMobile) {\n this._mapAndUpdateModel();\n }\n }\n\n /** @hidden */\n private async _setUpMobileMode(): Promise<void> {\n const injector = Injector.create({\n providers: [{ provide: MULTI_COMBOBOX_COMPONENT, useValue: this }],\n parent: this._injector\n });\n\n this._dynamicComponentService.createDynamicComponent(\n { listTemplate: this.listTemplate, controlTemplate: this.mobileControlTemplate },\n MobileMultiComboboxComponent,\n {\n containerRef: this._viewContainerRef\n },\n { injector }\n );\n }\n\n /**\n * @hidden\n * Method that picks other value moved from current one by offset, called only when Multi Combobox is closed.\n */\n private _chooseOtherItem(offset: number): void {\n if (this._selectedSuggestions?.length === this._flatSuggestions.length) {\n this.inputText = '';\n return;\n }\n\n const activeValue = getSelectItemByInputValue<T>(this._fullFlatSuggestions, this.inputText);\n const index = this._flatSuggestions.findIndex((value) => value === activeValue);\n const position = !this.inputText && offset === -1 ? this._flatSuggestions.length - 1 : index + offset;\n const item = this._flatSuggestions[position];\n\n if (item) {\n this._setInputTextFromOptionItem(item);\n }\n\n const selectedIndex = this._selectedSuggestions.findIndex((value) => value.label === item?.label);\n if (selectedIndex !== -1) {\n this._chooseOtherItem(offset);\n }\n }\n\n /** @hidden */\n private _initWindowResize(): void {\n this._getOptionsListWidth();\n\n if (!this.autoResize) {\n return;\n }\n\n resizeObservable(this._inputGroup.nativeElement)\n .pipe(debounceTime(30), takeUntilDestroyed(this._destroyRef))\n .subscribe(() => this._getOptionsListWidth());\n }\n\n /** @hidden */\n private _getOptionsListWidth(): void {\n const body = document.body;\n const rect = this._inputGroup.nativeElement.getBoundingClientRect();\n const scrollBarWidth = body.offsetWidth - body.clientWidth;\n this.maxWidth = this.autoResize ? window.innerWidth - scrollBarWidth - rect.left : this.minWidth;\n this.minWidth = rect.width - 2;\n this._cd.detectChanges();\n }\n\n /**\n * @hidden\n * Assign custom templates\n */\n private _assignCustomTemplates(): void {\n this.customTemplates.forEach((template) => {\n switch (template.name) {\n case 'optionItemTemplate':\n this.optionItemTemplate = template.templateRef;\n break;\n case 'groupItemTemplate':\n this.groupItemTemplate = template.templateRef;\n break;\n case 'secondaryItemTemplate':\n this.secondaryItemTemplate = template.templateRef;\n break;\n case 'selectedItemTemplate':\n this.selectedItemTemplate = template.templateRef;\n break;\n }\n });\n }\n}\n","<div class=\"fd-multi-combobox\">\n <ng-container [ngTemplateOutlet]=\"controlTemplate\" *ngIf=\"mobile\"></ng-container>\n\n <fd-popover\n *ngIf=\"!mobile\"\n additionalBodyClass=\"fd-popover-custom-list fd-multi-combobox__list-container\"\n (isOpenChange)=\"_popoverOpenChangeHandle($event)\"\n [isOpen]=\"isOpen\"\n [triggers]=\"[]\"\n [disabled]=\"this._cva.disabled\"\n [fillControlMode]=\"fillControlMode\"\n >\n <fd-popover-control>\n <ng-container>\n <ng-container *ngTemplateOutlet=\"controlTemplate\"></ng-container>\n </ng-container>\n </fd-popover-control>\n <fd-popover-body [style.width.%]=\"!autoResize && 100\">\n <ng-container *ngTemplateOutlet=\"listTemplate\"></ng-container>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n</div>\n\n<ng-template #controlTemplate>\n <fd-form-input-message-group>\n <fd-input-group\n #inputGroup\n [id]=\"this._cva.id + '-input-group-container'\"\n [state]=\"this._cva.state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"!this._cva.readonly\"\n [glyph]=\"!this._cva.readonly ? 'navigation-down-arrow' : ' '\"\n [isControl]=\"true\"\n [disabled]=\"this._cva.disabled || this._cva.readonly\"\n [isExpanded]=\"!mobile && isOpen && _suggestions.length > 0\"\n [attr.aria-disabled]=\"this._cva.disabled || this._cva.readonly\"\n [attr.aria-readonly]=\"this._cva.readonly\"\n [glyphAriaLabel]=\"this._cva.ariaLabel || ('platformMultiCombobox.inputGlyphAriaLabel' | fdTranslate)\"\n [iconTitle]=\"addonIconTitle || ('platformMultiCombobox.inputGlyphAriaLabel' | fdTranslate)\"\n (addOnButtonClicked)=\"_addOnClicked($event)\"\n (click)=\"mobile && !isOpen && _onPrimaryButtonClick(false)\"\n (keydown)=\"_navigateByTokens($event)\"\n >\n <fd-tokenizer\n *ngIf=\"_selectedSuggestions\"\n [tokenizerFocusable]=\"false\"\n [compactCollapse]=\"true\"\n #tokenizer\n class=\"fd-multi-combobox-tokenizer-custom\"\n (moreClickedEvent)=\"_moreClicked()\"\n fdMultiAnnouncer\n [multiAnnouncerOptions]=\"_suggestions\"\n >\n <fd-token\n [readOnly]=\"this._cva.disabled\"\n (onCloseClick)=\"_removeToken(token, $event)\"\n *ngFor=\"let token of _selectedSuggestions\"\n >\n {{ token.label }}\n </fd-token>\n\n <input\n #searchInputElement\n fdkAutoComplete\n (onComplete)=\"_onCompleteTerm($event)\"\n [options]=\"_suggestions\"\n [inputText]=\"inputText\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n [ariaLabel]=\"'coreMultiComboBox.multiComboBoxAriaLabel' | fdTranslate\"\n [attr.aria-labelledby]=\"this._cva.ariaLabelledBy\"\n [attr.aria-autocomplete]=\"autoComplete && !mobile ? 'list' : null\"\n [attr.aria-owns]=\"autoComplete && !mobile ? this._cva.id + '-result' : null\"\n [attr.aria-haspopup]=\"autoComplete && !mobile\"\n fd-form-control\n fd-input-group-input\n tabindex=\"0\"\n [id]=\"this._cva.id\"\n [name]=\"this._cva.name\"\n (keydown)=\"_onInputKeydownHandler($event)\"\n [disabled]=\"this._cva.disabled\"\n [(ngModel)]=\"inputText\"\n (ngModelChange)=\"_searchTermChanged()\"\n [placeholder]=\"this._cva.placeholder\"\n (focus)=\"this._cva.onTouched(); tokenizer._showAllTokens()\"\n (blur)=\"!mobile && _onBlur($event); tokenizer._hideTokens()\"\n [attr.aria-expanded]=\"isOpen\"\n [readonly]=\"this._cva.readonly\"\n [attr.aria-readonly]=\"this._cva.readonly\"\n [attr.aria-required]=\"this._cva.required\"\n [displayFn]=\"_displayFn\"\n class=\"fd-tokenizer__input\"\n />\n </fd-tokenizer>\n </fd-input-group>\n\n <fd-form-message\n *ngIf=\"mobile && isOpen ? false : !!this._cva.stateMessage\"\n [type]=\"this._cva.state\"\n [innerHtml]=\"this._cva.stateMessage\"\n ></fd-form-message>\n </fd-form-input-message-group>\n</ng-template>\n\n<ng-template #mobileControlTemplate>\n <fd-input-group\n [id]=\"this._cva.id + '-input-group-container'\"\n class=\"fd-multi-combobox-input-group-custom\"\n [state]=\"this._cva.state\"\n [buttonFocusable]=\"false\"\n [isControl]=\"true\"\n [disabled]=\"this._cva.disabled || this._cva.readonly\"\n [isExpanded]=\"!mobile && isOpen && _suggestions.length > 0\"\n [attr.aria-disabled]=\"this._cva.disabled || this._cva.readonly\"\n [attr.aria-readonly]=\"this._cva.readonly\"\n [glyphAriaLabel]=\"this._cva.ariaLabel\"\n >\n <input\n fdkAutoComplete\n (onComplete)=\"_onCompleteTerm($event)\"\n [options]=\"_suggestions\"\n [inputText]=\"inputText\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n [ariaLabel]=\"'coreMultiComboBox.multiComboBoxAriaLabel' | fdTranslate\"\n [attr.aria-labelledby]=\"this._cva.ariaLabelledBy\"\n [attr.aria-autocomplete]=\"autoComplete && !mobile ? 'list' : null\"\n [attr.aria-owns]=\"autoComplete && !mobile ? this._cva.id + '-result' : null\"\n [attr.aria-haspopup]=\"autoComplete && !mobile\"\n fd-form-control\n fd-input-group-input\n tabindex=\"0\"\n [id]=\"this._cva.id\"\n [name]=\"this._cva.name\"\n (keydown)=\"_onInputKeydownHandler($event)\"\n [disabled]=\"this._cva.disabled\"\n [(ngModel)]=\"inputText\"\n (ngModelChange)=\"_searchTermChanged()\"\n [placeholder]=\"this._cva.placeholder\"\n (focus)=\"this._cva.onTouched()\"\n (blur)=\"!mobile && _onBlur($event)\"\n [attr.aria-expanded]=\"isOpen\"\n [readonly]=\"this._cva.readonly\"\n [attr.aria-readonly]=\"this._cva.readonly\"\n [displayFn]=\"_displayFn\"\n />\n </fd-input-group>\n</ng-template>\n\n<ng-template #listTemplate>\n <ul\n fd-list\n (focusEscapeList)=\"_handleListFocusEscape($event)\"\n [dropdownMode]=\"true\"\n class=\"fd-multi-combobox__list fd-list--multi-input\"\n [id]=\"this._cva.id + '-result'\"\n role=\"listbox\"\n [style.max-height]=\"!mobile && maxHeight\"\n [style.min-width.px]=\"!mobile && minWidth\"\n [style.max-width.px]=\"autoResize && maxWidth\"\n [attr.aria-labelledby]=\"this._cva.id + '-search'\"\n aria-multiselectable=\"true\"\n (keydown.tab)=\"close()\"\n (keydown.shift.tab)=\"close()\"\n >\n <fd-form-message\n *ngIf=\"!!this._cva.stateMessage\"\n [type]=\"this._cva.state\"\n [innerHtml]=\"this._cva.stateMessage\"\n ></fd-form-message>\n <fd-multi-combobox-select-all-toggler\n *ngIf=\"showSelectAll\"\n [selectAllHandler]=\"_handleSelectAllItems\"\n [valueChanges]=\"selectionChange\"\n [selectedItems]=\"_selectedSuggestions\"\n [flatItems]=\"_flatSuggestions\"\n ></fd-multi-combobox-select-all-toggler>\n <ng-content></ng-content>\n <ng-container *ngIf=\"isGroup; else flatList\">\n <ng-container *ngFor=\"let group of _suggestions\">\n <ng-container *ngIf=\"!groupItemTemplate; else groupItemTemplateRenderer\">\n <label fd-list-group-header role=\"group\">\n <span fd-list-title>{{ group.label }}</span>\n </label>\n </ng-container>\n\n <ng-template #groupItemTemplateRenderer>\n <ng-container\n [ngTemplateOutlet]=\"groupItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: { label: group.label } }\"\n ></ng-container>\n </ng-template>\n\n <li\n *ngFor=\"let optionItem of group.children; let i = index\"\n fd-list-item\n role=\"option\"\n [tabindex]=\"0\"\n (click)=\"!mobile && close()\"\n (keydown)=\"_onItemKeyDownHandler($event)\"\n [selected]=\"!!optionItem.selected\"\n >\n <fd-checkbox\n (click)=\"_onOptionCheckboxClicked($event, i)\"\n (ngModelChange)=\"_toggleSelection(optionItem)\"\n [ngModel]=\"optionItem.selected\"\n >\n </fd-checkbox>\n <ng-container\n [ngTemplateOutlet]=\"listItem\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem, index: i }\"\n ></ng-container>\n </li>\n </ng-container>\n </ng-container>\n\n <ng-template #flatList>\n <li\n *ngFor=\"let optionItem of _suggestions; let i = index\"\n fd-list-item\n role=\"option\"\n [tabindex]=\"0\"\n (click)=\"!mobile && _onOptionClicked($event, i)\"\n (keydown)=\"_onItemKeyDownHandler($event)\"\n [selected]=\"!!optionItem.selected\"\n >\n <fd-checkbox\n (click)=\"_onOptionCheckboxClicked($event, i)\"\n (ngModelChange)=\"_toggleSelection(optionItem)\"\n [ngModel]=\"optionItem.selected\"\n >\n </fd-checkbox>\n <ng-container\n [ngTemplateOutlet]=\"listItem\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem, index: i }\"\n ></ng-container>\n </li>\n </ng-template>\n </ul>\n</ng-template>\n\n<ng-template let-optionItem=\"optionItem\" let-index=\"index\" #listItem>\n <ng-container\n *ngIf=\"optionItem.selected && !!selectedItemTemplate\"\n [ngTemplateOutlet]=\"selectedItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: optionItem.value, index: index }\"\n ></ng-container>\n\n <ng-container *ngIf=\"!(optionItem.selected && selectedItemTemplate)\">\n <ng-container\n [ngTemplateOutlet]=\"optionItemSource\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem, index: index }\"\n ></ng-container>\n\n <ng-container\n [ngTemplateOutlet]=\"secondaryTextSource\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem }\"\n ></ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template let-optionItem=\"optionItem\" let-index=\"index\" #optionItemSource>\n <ng-container *ngIf=\"!optionItemTemplate; else optionItemTemplateRenderer\">\n <span\n fd-list-title\n [attr.title]=\"optionItem.label\"\n [innerHTML]=\"optionItem.label | highlight : inputText\"\n ></span>\n </ng-container>\n\n <ng-template #optionItemTemplateRenderer>\n <ng-container\n [ngTemplateOutlet]=\"optionItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: optionItem.value, index: index }\"\n ></ng-container>\n </ng-template>\n</ng-template>\n\n<ng-template let-optionItem=\"optionItem\" #secondaryTextSource>\n <ng-container *ngIf=\"showSecondaryText\">\n <ng-container *ngIf=\"!secondaryItemTemplate; else secondaryItemTemplateRenderer\">\n <span\n [style.text-align]=\"secondaryTextAlignment\"\n fd-list-secondary\n [attr.title]=\"optionItem.secondaryText\"\n [innerHTML]=\"optionItem.secondaryText | highlight : inputText\"\n ></span>\n </ng-container>\n\n <ng-template #secondaryItemTemplateRenderer>\n <ng-container\n [ngTemplateOutlet]=\"secondaryItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: optionItem.value }\"\n ></ng-container>\n </ng-template>\n </ng-container>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { MultiAnnouncerDirective } from './multi-announcer/multi-announcer.directive';\nimport { MultiComboboxComponent } from './multi-combobox.component';\nimport { SelectAllTogglerComponent } from './select-all-toggler/select-all-toggler.component';\n\n@NgModule({\n imports: [MultiComboboxComponent, SelectAllTogglerComponent, MultiAnnouncerDirective],\n exports: [MultiComboboxComponent, SelectAllTogglerComponent, MultiAnnouncerDirective]\n})\nexport class MultiComboboxModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2","i1","i3","i4"],"mappings":"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"}
1
+ {"version":3,"file":"fundamental-ngx-core-multi-combobox.mjs","sources":["../../../../libs/core/src/lib/multi-combobox/multi-announcer/multi-announcer.directive.ts","../../../../libs/core/src/lib/multi-combobox/helpers.ts","../../../../libs/core/src/lib/multi-combobox/models/selection-change.event.ts","../../../../libs/core/src/lib/multi-combobox/multi-combobox-config.ts","../../../../libs/core/src/lib/multi-combobox/base-multi-combobox.class.ts","../../../../libs/core/src/lib/multi-combobox/multi-combobox.token.ts","../../../../libs/core/src/lib/multi-combobox/mobile/mobile-multi-combobox.component.ts","../../../../libs/core/src/lib/multi-combobox/mobile/mobile-multi-combobox.component.html","../../../../libs/core/src/lib/multi-combobox/data-source/multi-combobox-data-source.ts","../../../../libs/core/src/lib/multi-combobox/data-source/multi-combobox-data-source-parser.ts","../../../../libs/core/src/lib/multi-combobox/select-all-toggler/select-all-toggler.component.ts","../../../../libs/core/src/lib/multi-combobox/multi-combobox.component.ts","../../../../libs/core/src/lib/multi-combobox/multi-combobox.component.html","../../../../libs/core/src/lib/multi-combobox/multi-combobox.module.ts","../../../../libs/core/src/lib/multi-combobox/fundamental-ngx-core-multi-combobox.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/member-ordering */\nimport { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { ContentChildren, Directive, HostListener, inject, Input, QueryList } from '@angular/core';\nimport { KeyUtil } from '@fundamental-ngx/cdk/utils';\nimport { TokenComponent } from '@fundamental-ngx/core/token';\nimport { resolveTranslationSyncFn } from '@fundamental-ngx/i18n';\n\n@Directive({\n selector: '[fdMultiAnnouncer]',\n exportAs: 'fdMultiAnnouncer',\n standalone: true\n})\nexport class MultiAnnouncerDirective {\n /** @hidden */\n @Input()\n multiAnnouncerOptions: unknown[];\n\n /** @hidden */\n @ContentChildren(TokenComponent, { descendants: true })\n private _tokens: QueryList<TokenComponent>;\n\n /** @hidden */\n private _noResultsAnnounced = false;\n\n /** @hidden */\n private _resultsAnnounced = false;\n\n /** @hidden */\n private _announcement = '';\n\n /** @hidden */\n private readonly _liveAnnouncer: LiveAnnouncer = inject(LiveAnnouncer);\n\n /** @hidden */\n private _resolveTranslation = resolveTranslationSyncFn();\n\n /** @hidden */\n @HostListener('keyup', ['$event'])\n private _makeSearchTermChangeAnnouncements(event: KeyboardEvent): void {\n if (KeyUtil.isKeyType(event, 'alphabetical') || KeyUtil.isKeyType(event, 'numeric')) {\n this._liveAnnouncer.clear();\n if (!this.multiAnnouncerOptions.length && !this._noResultsAnnounced) {\n this._buildAnnouncement(this._resolveTranslation('coreMultiInput.noResults'));\n this._noResultsAnnounced = true;\n this._resultsAnnounced = false;\n } else if (this.multiAnnouncerOptions.length) {\n if (this.multiAnnouncerOptions.length === 1) {\n this._buildAnnouncement(\n this._resolveTranslation('coreMultiInput.countListResultsSingular', { count: 1 })\n );\n } else {\n this._buildAnnouncement(\n this._resolveTranslation('coreMultiInput.countListResultsPlural', {\n count: this.multiAnnouncerOptions.length\n })\n );\n }\n this._buildAnnouncement(this._resolveTranslation('coreMultiInput.navigateSelectionsWithArrows'));\n if (!this._resultsAnnounced) {\n this._noResultsAnnounced = false;\n this._resultsAnnounced = true;\n }\n }\n if (this._tokens && this._tokens.length) {\n this._buildAnnouncement(this._resolveTranslation('coreMultiInput.escapeNavigateTokens'));\n }\n this._makeAnnouncement(this._announcement);\n }\n }\n\n /** @hidden */\n private _buildAnnouncement(message: string): void {\n this._announcement = this._announcement + message + ' ';\n }\n\n /** @hidden */\n private async _makeAnnouncement(message: string): Promise<void> {\n await this._liveAnnouncer.announce(message, 'assertive').then(() => {\n this._announcement = '';\n });\n }\n}\n","import { isSelectItem, SelectableOptionItem } from '@fundamental-ngx/cdk/forms';\nimport { isFunction, isJsObject, isString } from '@fundamental-ngx/cdk/utils';\nimport equal from 'fast-deep-equal';\n\n/** @hidden */\nexport function lookupValue(item: unknown, lookupKey: string): string {\n if (isSelectItem(item)) {\n return lookupKey && item ? item.value[lookupKey] : item.value;\n } else {\n return lookupKey && item ? item[lookupKey] : item;\n }\n}\n\n/** @hidden */\nexport function displayValue(item: unknown, displayKey: string): string {\n if (isSelectItem(item)) {\n return item.label;\n } else if (isJsObject(item) && displayKey) {\n const currentItem = objectGet(item, displayKey);\n\n return isFunction(currentItem) ? currentItem() : currentItem;\n } else {\n return item as string;\n }\n}\n\n/** @hidden */\nexport function objectGet(obj: unknown, is: string | string[] | undefined): any {\n if (!isJsObject(obj)) {\n return obj;\n } else if (isString(is)) {\n return objectGet(obj, is.split('.'));\n } else if (!is?.length) {\n return obj;\n } else {\n return objectGet(obj[is[0]], is.slice(1));\n }\n}\n\n/** @hidden */\nexport function getSelectItemByInputValue<T>(\n suggestions: SelectableOptionItem<T>[],\n needleValue: string\n): SelectableOptionItem<T> | undefined {\n return suggestions.find((value) => value.label === needleValue);\n}\n\n/** @hidden\n * Map grouped values to array. */\nexport function flattenGroups(items: SelectableOptionItem[]): SelectableOptionItem[] {\n return items.reduce((result, item) => result.concat(item.children ?? []), <SelectableOptionItem[]>[]);\n}\n\n/** @hidden */\nexport function getTokenIndexByIdlOrValue(item: SelectableOptionItem, suggestions: SelectableOptionItem[]): number {\n return suggestions.findIndex((token) => token.id === item.id || equal(token.value, item.value));\n}\n","import { SelectableOptionItem } from '@fundamental-ngx/cdk/forms';\nimport { BaseMultiCombobox } from '../base-multi-combobox.class';\n\nexport class MultiComboboxSelectionChangeEvent {\n /**\n * Multi Combobox selection change event\n * @param source Multi Combobox component\n * @param selectedItems Selected items\n */\n constructor(\n public source: BaseMultiCombobox,\n public selectedItems: SelectableOptionItem['value'] // Contains selected items\n ) {}\n}\n","import { Injectable } from '@angular/core';\nimport { DataProvider, MatchingStrategy } from '@fundamental-ngx/cdk/data-source';\n\nimport { ContentDensity } from '@fundamental-ngx/cdk/utils';\n// import { PlatformConfig } from '@fundamental-ngx/platform/shared';\n\n/**\n * Default options for Multi-Combobox\n */\n@Injectable({ providedIn: 'root' })\nexport class MultiComboboxConfig {\n /**\n * Content Density of element. 'cozy' | 'compact'\n */\n contentDensity: ContentDensity;\n\n /**\n * String matching strategy for typeahead list. Default: 'starts with per term'\n */\n matchingStrategy: MatchingStrategy = MatchingStrategy.STARTS_WITH_PER_TERM;\n\n /**\n * Maps data providers\n */\n providers: Map<string, DataProvider<any>> | null = new Map();\n\n /**\n * Create Provider factory function\n */\n // static createProviderFactory(\n // obj: Partial<MultiComboboxConfig>\n // ): (platformConfig: PlatformConfig) => MultiComboboxConfig {\n // const useFactory = (platformConfig: PlatformConfig): MultiComboboxConfig =>\n // Object.assign(new MultiComboboxConfig(platformConfig), obj);\n // return useFactory;\n // }\n\n /** @hidden */\n // constructor(platformConfig: PlatformConfig) {\n // this.contentDensity = platformConfig.contentDensity;\n // }\n}\n","import {\n ALT,\n BACKSPACE,\n CONTROL,\n DOWN_ARROW,\n ENTER,\n ESCAPE,\n LEFT_ARROW,\n RIGHT_ARROW,\n SHIFT,\n TAB,\n UP_ARROW\n} from '@angular/cdk/keycodes';\nimport { ChangeDetectorRef, DestroyRef, Directive, ElementRef, EventEmitter, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { DataSourceDirective, MatchingBy, MatchingStrategy } from '@fundamental-ngx/cdk/data-source';\nimport {\n CvaControl,\n CvaDirective,\n FormStates,\n SelectableOptionItem,\n isOptionItem,\n isSelectableOptionItem\n} from '@fundamental-ngx/cdk/forms';\nimport { Nullable, RangeSelector, coerceArraySafe, isFunction, isJsObject, isString } from '@fundamental-ngx/cdk/utils';\nimport { ContentDensityObserver } from '@fundamental-ngx/core/content-density';\nimport equal from 'fast-deep-equal';\nimport { BehaviorSubject, Subscription, skip, startWith, timer } from 'rxjs';\nimport {\n FdMultiComboBoxDataSource,\n FdMultiComboboxAcceptableDataSource\n} from './data-source/multi-combobox-data-source';\nimport { displayValue, flattenGroups, lookupValue, objectGet } from './helpers';\nimport { MultiComboboxSelectionChangeEvent } from './models/selection-change.event';\nimport { MultiComboboxConfig } from './multi-combobox-config';\nimport { FD_MAP_LIMIT } from './multi-combobox.component';\n\nexport type TextAlignment = 'left' | 'right';\n\n@Directive()\nexport abstract class BaseMultiCombobox<T = any> {\n abstract selectedItems: T[];\n abstract group: boolean;\n abstract groupKey: string;\n abstract displayKey: string;\n abstract secondaryKey: string;\n abstract showSecondaryText: boolean;\n abstract lookupKey: string;\n abstract invalidEntryMessage: string;\n abstract invalidEntryDisplayTime: number;\n abstract limitless: boolean;\n abstract isGroup: boolean;\n abstract inputText: string;\n\n abstract searchInputElement: Nullable<ElementRef<HTMLInputElement>>;\n\n abstract selectionChange: EventEmitter<MultiComboboxSelectionChangeEvent>;\n abstract dataReceived: EventEmitter<boolean>;\n abstract dataRequested: EventEmitter<boolean>;\n // Injection section\n\n /** @hidden */\n readonly cvaControl: CvaControl<T> = inject(CvaControl);\n\n /** @hidden */\n readonly dataSourceDirective: DataSourceDirective<T, FdMultiComboBoxDataSource<T>> = inject(DataSourceDirective);\n\n /** Control Value Accessor directive for forms support. */\n readonly _cva = inject(CvaDirective<T>, {\n self: true\n });\n\n /** Multi combobox config. */\n readonly _multiComboboxConfig = inject(MultiComboboxConfig, {\n optional: true\n });\n\n /** Content Density Observer */\n readonly contentDensityObserver = inject(ContentDensityObserver);\n\n /**\n * @hidden\n * List of selected suggestions\n */\n _selectedSuggestions: SelectableOptionItem<T>[] = [];\n\n /**\n * @hidden\n * List of matched suggestions\n */\n _suggestions: SelectableOptionItem[];\n\n /**\n * @hidden\n * Grouped suggestions mapped to array.\n */\n _flatSuggestions: SelectableOptionItem[] = [];\n\n /** @hidden */\n _fullFlatSuggestions: SelectableOptionItem[] = [];\n\n /** @hidden */\n selectedShown$ = new BehaviorSubject(false);\n\n /** @Hidden */\n protected readonly _elmRef = inject(ElementRef<HTMLElement>);\n\n /** @hidden */\n protected readonly _cd = inject(ChangeDetectorRef);\n\n /** @hidden */\n protected readonly _mapLimit = inject(FD_MAP_LIMIT);\n\n /** @Hidden */\n protected readonly _destroyRef = inject(DestroyRef);\n\n /** @hidden */\n protected _dataSource: FdMultiComboboxAcceptableDataSource<T>;\n\n /** @hidden */\n protected _inputTextValue: string;\n\n /** @hidden */\n protected _previousInputText: string;\n\n /** @hidden */\n protected _matchingStrategy: MatchingStrategy =\n this._multiComboboxConfig?.matchingStrategy ?? MatchingStrategy.CONTAINS;\n\n /** @hidden */\n protected _dsSubscription: Subscription | null = null;\n\n /** @hidden */\n protected _element: HTMLElement = this._elmRef.nativeElement;\n\n /**\n * @hidden\n * Keys, that won't trigger the popover's open state, when dispatched on search input.\n */\n protected readonly _nonOpeningKeys: number[] = [\n BACKSPACE,\n ESCAPE,\n ENTER,\n CONTROL,\n TAB,\n SHIFT,\n UP_ARROW,\n RIGHT_ARROW,\n DOWN_ARROW,\n LEFT_ARROW,\n ALT\n ];\n\n /** @hidden */\n protected _timerSub$: Subscription;\n\n /** @hidden */\n protected _previousState?: FormStates;\n\n /** @hidden */\n protected _previousStateMessage: Nullable<string>;\n\n /** @hidden */\n protected readonly _rangeSelector = new RangeSelector();\n\n /** @hidden */\n private _dataSourceChanged = false;\n\n /** @hidden */\n writeValue(value: T[]): void {\n this.selectedItems = coerceArraySafe(value);\n this._cva.writeValue(this.selectedItems);\n this._setSelectedSuggestions();\n this._emitChangeEvent();\n }\n\n /**\n * Used to change the value of a control.\n * @param value the value to be applied\n * @param emitOnChange whether to emit \"onChange\" event.\n * Should be \"false\", if the change is made programmatically (internally) by the control, \"true\" otherwise\n */\n setValue(value: T[], emitOnChange = true): void {\n this.selectedItems = coerceArraySafe(value);\n this._cva.setValue(this.selectedItems, emitOnChange);\n this._setSelectedSuggestions();\n this._emitChangeEvent();\n }\n\n /** @hidden */\n protected _displayFn = (value: T): string => displayValue(value, this.displayKey);\n\n /** @hidden */\n protected _secondaryFn = (value: T): string => {\n if (isOptionItem(value)) {\n return value.secondaryText ?? '';\n } else if (isJsObject(value) && this.secondaryKey) {\n const currentItem = objectGet(value, this.secondaryKey);\n\n return isFunction(currentItem) ? currentItem() : currentItem;\n } else {\n return value as string;\n }\n };\n\n /**\n * @hidden\n * Method to emit change event\n */\n protected _emitChangeEvent(): void {\n const event = new MultiComboboxSelectionChangeEvent(this, this.selectedItems);\n\n this.selectionChange.emit(event);\n }\n\n /** @hidden */\n protected _setSelectedSuggestions(): void {\n this._selectedSuggestions = [];\n\n if (!this.selectedItems?.length) {\n return;\n }\n\n for (let i = 0; i <= this.selectedItems.length; i++) {\n const selectedItem = this.selectedItems[i];\n const idx = this._fullFlatSuggestions.findIndex(\n (item) => item.label === selectedItem || item.value === selectedItem\n );\n if (idx !== -1) {\n this._selectedSuggestions.push(this._fullFlatSuggestions[idx]);\n this._fullFlatSuggestions[idx].selected = true;\n }\n }\n\n this._cd.detectChanges();\n }\n\n /**\n * Convert original data to SelectableOptionItems Interface\n * @hidden\n */\n protected _convertToOptionItems(items: T[]): SelectableOptionItem<T>[] {\n const item = items[0];\n\n const elementTypeIsOptionItem = isSelectableOptionItem(item);\n if (elementTypeIsOptionItem) {\n return items as SelectableOptionItem[];\n }\n\n const elementTypeIsObject = isJsObject(item);\n if (elementTypeIsObject) {\n return this._convertObjectsToOptionItems(items);\n }\n\n const elementTypeIsString = isString(item);\n if (elementTypeIsString) {\n return this._convertPrimitiveToOptionItems(items);\n }\n\n return [];\n }\n\n /**\n * Convert data to SelectableOptionItems Interface\n * @hidden\n */\n protected _convertObjectsToOptionItems(items: T[]): SelectableOptionItem<T>[] {\n if (this.isGroup) {\n return this._convertObjectsToGroupOptionItems(items);\n } else if (this.showSecondaryText && this.secondaryKey) {\n return this._convertObjectsToSecondaryOptionItems(items);\n } else {\n return this._convertObjectsToDefaultOptionItems(items);\n }\n }\n\n /**\n * Convert object[] data to Group OptionItems Interface\n * @hidden\n */\n protected _convertObjectsToGroupOptionItems<K extends T>(items: K[]): SelectableOptionItem<T>[] {\n const group: Record<string, K[]> = {};\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const keyValue = item[this.groupKey];\n if (!keyValue) {\n continue;\n }\n\n if (!group[keyValue]) {\n group[keyValue] = [];\n }\n\n group[keyValue].push(item);\n }\n\n return Object.keys(group).map((key) => {\n const selectItem: SelectableOptionItem = {\n label: key,\n value: null,\n isGroup: true\n };\n\n const currentGroup = group[key];\n\n if (this.showSecondaryText && this.secondaryKey) {\n selectItem.children = this._convertObjectsToSecondaryOptionItems(currentGroup);\n } else {\n selectItem.children = this._convertObjectsToDefaultOptionItems(currentGroup);\n }\n\n return selectItem;\n });\n }\n\n /**\n * Convert T[] data to Secondary SelectableOptionItems<T> Interface\n * @hidden\n */\n protected _convertObjectsToSecondaryOptionItems<K extends T>(items: K[]): SelectableOptionItem<T>[] {\n const selectItems: SelectableOptionItem[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const value = items[i];\n selectItems.push({\n label: displayValue(value, this.displayKey),\n id: lookupValue(value, this.lookupKey),\n secondaryText: objectGet(value, this.secondaryKey),\n value,\n selected: this.selectedItems?.includes(value) || false\n });\n }\n\n return selectItems;\n }\n\n /**\n * Convert Primitive data(Boolean, String, Number) to SelectableOptionItems Interface\n * @hidden\n */\n protected _convertPrimitiveToOptionItems(items: any[]): SelectableOptionItem<T>[] {\n const selectItems: SelectableOptionItem[] = [];\n for (let i = 0; i < items.length; i++) {\n const value = items[i];\n selectItems.push({\n label: value,\n id: lookupValue(value, this.lookupKey),\n value,\n selected: this.selectedItems?.includes(value) || false\n });\n }\n\n return selectItems;\n }\n\n /**\n * Convert T[] to SelectableOptionItems<T> Interface (Default)\n * @hidden\n */\n protected _convertObjectsToDefaultOptionItems(items: T[]): SelectableOptionItem<T>[] {\n const selectItems: SelectableOptionItem[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const value = items[i];\n selectItems.push({\n label: displayValue(value, this.displayKey),\n id: lookupValue(value, this.lookupKey),\n value,\n selected: this.selectedItems?.includes(value) || false\n });\n }\n\n return selectItems;\n }\n\n /** @hidden */\n protected _setInvalidEntry(): void {\n if (this._previousState || this._previousStateMessage) {\n return;\n }\n\n this._previousState = this._cva.state;\n this._cva.state = 'error';\n\n this._previousStateMessage = this._cva.stateMessage;\n this._cva.stateMessage = this.invalidEntryMessage;\n\n this._cd.markForCheck();\n }\n\n /** @hidden */\n protected _unsetInvalidEntry(): void {\n this._cva.state = this._previousState;\n this._previousState = undefined;\n\n this._cva.stateMessage = this._previousStateMessage;\n this._previousStateMessage = undefined;\n\n this._cd.markForCheck();\n }\n\n /** @hidden */\n protected _focusToSearchField(): void {\n this.searchInputElement?.nativeElement.focus();\n }\n\n /** @hidden */\n protected _mapAndUpdateModel(): void {\n const selectedItems = this._selectedSuggestions.map(({ value }) => value);\n\n const shouldEmitChangeEvent = !equal(this.selectedItems, selectedItems);\n\n if (!shouldEmitChangeEvent) {\n return;\n }\n\n this.writeValue(selectedItems);\n\n this._cva.onChange(selectedItems);\n\n this._emitChangeEvent();\n }\n\n /**\n * @hidden\n * Prepares the data stream and subscribes to it.\n */\n protected _openDataStream(): void {\n const dataSourceProvider = this.dataSourceDirective.dataSourceProvider;\n\n if (!dataSourceProvider) {\n throw new Error(`[dataSource] source did not match an array, Observable, or DataSource`);\n }\n\n dataSourceProvider.limitless = this.limitless;\n\n dataSourceProvider.dataProvider.setLookupKey(this.lookupKey);\n const matchingBy: MatchingBy = {\n firstBy: this._displayFn\n };\n\n if (this.secondaryKey) {\n matchingBy.secondaryBy = this._secondaryFn;\n }\n\n dataSourceProvider.dataProvider.setMatchingBy(matchingBy);\n dataSourceProvider.dataProvider.setMatchingStrategy(this._matchingStrategy);\n\n // initial data fetch\n const map = new Map();\n map.set('query', '*');\n\n if (!this.limitless) {\n map.set('limit', this._mapLimit);\n }\n\n dataSourceProvider.match(map);\n\n this._dsSubscription = new Subscription();\n\n this._dsSubscription.add(\n this.dataSourceDirective.dataSourceProvider?.dataRequested.subscribe(this.dataRequested)\n );\n this._dsSubscription.add(\n this.dataSourceDirective.dataSourceProvider?.dataReceived.subscribe(this.dataReceived)\n );\n\n this.dataSourceDirective.dataSourceChanged\n .pipe(startWith(true), takeUntilDestroyed(this._destroyRef))\n .subscribe(() => {\n this._dataSourceChanged = true;\n });\n\n this.dataSourceDirective.dataChanged$.pipe(skip(0), takeUntilDestroyed(this._destroyRef)).subscribe((data) => {\n if (data.length === 0) {\n this._processingEmptyData();\n return;\n }\n\n this._previousInputText = this.inputText;\n\n this._parseDataSourceValue(data);\n\n this._cva.stateChanges.next('initDataSource.open().');\n\n this._cd.markForCheck();\n });\n }\n\n /**\n * Parses the data from the data stream and updates the model if needed.\n * @param data array of objects from the data stream.\n */\n protected _parseDataSourceValue(data: T[]): void {\n this._convertDataSourceSuggestions(data);\n\n const selectedSuggestionsLength = this._selectedSuggestions.length;\n if (selectedSuggestionsLength > 0) {\n for (let i = 0; i < selectedSuggestionsLength; i++) {\n const selectedSuggestion = this._selectedSuggestions[i];\n const idx = this._suggestions.findIndex((item) => equal(item.value, selectedSuggestion.value));\n\n if (idx !== -1) {\n this._suggestions[idx].selected = true;\n }\n }\n }\n\n if (this._dataSourceChanged) {\n this._flatSuggestions = this.isGroup ? flattenGroups(this._suggestions) : this._suggestions;\n this._fullFlatSuggestions = this._flatSuggestions;\n\n this._setSelectedSuggestions();\n\n this._mapAndUpdateModel();\n\n this._dataSourceChanged = false;\n }\n }\n\n /**\n * Transforms plain array into `SelectableOptionItem<T>`\n * @param data\n */\n protected _convertDataSourceSuggestions(data: T[]): void {\n this._suggestions = this._convertToOptionItems(data).map((optionItem) => {\n const selectedElement = this._selectedSuggestions.find((selectedItem) => selectedItem.id === optionItem.id);\n if (selectedElement) {\n optionItem.selected = selectedElement.selected;\n }\n return optionItem;\n });\n }\n\n /** @hidden */\n protected _processingEmptyData(): void {\n this.inputText = this._previousInputText;\n\n this._setInvalidEntry();\n\n if (this._timerSub$) {\n this._timerSub$.unsubscribe();\n }\n\n this._timerSub$ = timer(this.invalidEntryDisplayTime).subscribe(() => this._unsetInvalidEntry());\n\n this._cd.detectChanges();\n }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const MULTI_COMBOBOX_COMPONENT = new InjectionToken('FdMultiComboboxInterface');\n","import { CdkScrollable } from '@angular/cdk/overlay';\nimport { AsyncPipe, NgIf, NgTemplateOutlet } from '@angular/common';\nimport { Component, ElementRef, Inject, OnDestroy, OnInit, Optional, TemplateRef, ViewChild } from '@angular/core';\nimport { SelectableOptionItem } from '@fundamental-ngx/cdk/forms';\nimport { Nullable, TemplateDirective } from '@fundamental-ngx/cdk/utils';\nimport { BarElementDirective, BarMiddleDirective, ButtonBarComponent } from '@fundamental-ngx/core/bar';\nimport { ButtonComponent } from '@fundamental-ngx/core/button';\nimport { DialogModule, DialogService } from '@fundamental-ngx/core/dialog';\nimport {\n MOBILE_MODE_CONFIG,\n MobileModeBase,\n MobileModeConfigToken,\n MobileModeControl\n} from '@fundamental-ngx/core/mobile-mode';\nimport { ScrollbarDirective } from '@fundamental-ngx/core/scrollbar';\nimport { TitleComponent } from '@fundamental-ngx/core/title';\nimport { FdTranslatePipe } from '@fundamental-ngx/i18n';\nimport { takeUntil } from 'rxjs/operators';\nimport { MobileMultiComboboxInterface } from '../models/multi-combobox.interface';\nimport { MULTI_COMBOBOX_COMPONENT } from '../multi-combobox.token';\n\n@Component({\n selector: 'fd-mobile-multi-combobox',\n templateUrl: './mobile-multi-combobox.component.html',\n styleUrls: ['./mobile-multi-combobox.component.scss'],\n standalone: true,\n imports: [\n DialogModule,\n NgIf,\n TitleComponent,\n TemplateDirective,\n BarMiddleDirective,\n BarElementDirective,\n NgTemplateOutlet,\n ButtonComponent,\n CdkScrollable,\n ScrollbarDirective,\n ButtonBarComponent,\n AsyncPipe,\n FdTranslatePipe\n ]\n})\nexport class MobileMultiComboboxComponent\n extends MobileModeBase<MobileMultiComboboxInterface>\n implements OnInit, OnDestroy\n{\n /** @hidden */\n @ViewChild('dialogTemplate') dialogTemplate: TemplateRef<any>;\n\n /** @hidden\n * For internal usage\n * Control element, which will be rendered inside dialog.\n * List element, which will be rendered inside dialog.\n */\n childContent: Nullable<{\n listTemplate: TemplateRef<any>;\n controlTemplate: TemplateRef<any>;\n }> = null;\n\n /** @hidden */\n selectedShown$ = this._component.selectedShown$;\n\n /** @hidden */\n private _selectedBackup: SelectableOptionItem[];\n\n /** @hidden */\n constructor(\n elementRef: ElementRef,\n dialogService: DialogService,\n @Inject(MULTI_COMBOBOX_COMPONENT) multiComboboxComponent: MobileMultiComboboxInterface,\n @Optional() @Inject(MOBILE_MODE_CONFIG) mobileModes: MobileModeConfigToken[]\n ) {\n super(elementRef, dialogService, multiComboboxComponent, MobileModeControl.MULTI_COMBOBOX, mobileModes);\n }\n\n /** @hidden */\n ngOnInit(): void {\n this._listenOnMultiComboboxOpenChange();\n }\n\n /** @hidden */\n ngOnDestroy(): void {\n super.onDestroy();\n }\n\n /** @hidden */\n showSelected(): void {\n const isSelectedShown = this.selectedShown$.getValue();\n\n if (isSelectedShown) {\n this._component._searchTermChanged();\n this.selectedShown$.next(false);\n return;\n }\n\n this._component._moreClicked();\n }\n\n /** @hidden */\n handleDismiss(): void {\n this.dialogRef.dismiss();\n this._component._dialogDismiss(this._selectedBackup);\n }\n\n /** @hidden */\n handleApprove(): void {\n this.dialogRef.close();\n this._component._dialogApprove();\n }\n\n /** @hidden */\n private _toggleDialog(open: boolean): void {\n if (!open) {\n return;\n }\n\n this._selectedBackup = this._component._selectedSuggestions?.length\n ? [...this._component._selectedSuggestions]\n : [];\n if (!this._dialogService.hasOpenDialogs()) {\n this._open();\n }\n }\n\n /** @hidden */\n private _listenOnMultiComboboxOpenChange(): void {\n this._component.openChange.pipe(takeUntil(this._onDestroy$)).subscribe((isOpen) => this._toggleDialog(isOpen));\n }\n\n /** @hidden */\n private _open(): void {\n this.dialogRef = this._dialogService.open(this.dialogTemplate, {\n mobile: true,\n ...this.dialogConfig,\n backdropClickCloseable: false,\n escKeyCloseable: false,\n container: this._elementRef.nativeElement,\n disablePaddings: true\n });\n }\n}\n","<ng-template [fdDialogTemplate] let-dialog let-dialogConfig=\"dialogConfig\" #dialogTemplate>\n <fd-dialog [dialogConfig]=\"dialogConfig\" [dialogRef]=\"dialog\">\n <fd-dialog-header>\n <h1 fd-title fd-dialog-title *ngIf=\"mobileConfig?.title\">{{ mobileConfig.title }}</h1>\n <button\n fd-dialog-close-button\n *ngIf=\"mobileConfig?.hasCloseButton\"\n [mobile]=\"true\"\n (click)=\"handleDismiss()\"\n ></button>\n <ng-template fdkTemplate=\"subheader\">\n <div fd-bar-middle>\n <fd-bar-element [fullWidth]=\"true\">\n <ng-container *ngTemplateOutlet=\"childContent?.controlTemplate || null\"></ng-container>\n\n <button\n *ngIf=\"selectedShown$ | async\"\n fd-button\n glyph=\"multiselect-all\"\n fdType=\"emphasized\"\n [title]=\"'platformMultiCombobox.mobileShowAllItemsButton' | fdTranslate\"\n [attr.aria-label]=\"'platformMultiCombobox.mobileShowAllItemsButton' | fdTranslate\"\n class=\"fd-margin-begin--tiny\"\n (click)=\"showSelected()\"\n ></button>\n\n <button\n *ngIf=\"(selectedShown$ | async) === false\"\n fd-button\n glyph=\"multiselect-all\"\n fdType=\"transparent\"\n [title]=\"'platformMultiCombobox.mobileShowSelectedItemsButton' | fdTranslate\"\n [attr.aria-label]=\"'platformMultiCombobox.mobileShowSelectedItemsButton' | fdTranslate\"\n class=\"fd-margin-begin--tiny\"\n (click)=\"showSelected()\"\n ></button>\n </fd-bar-element>\n </div>\n </ng-template>\n </fd-dialog-header>\n\n <fd-dialog-body>\n <ng-container *ngTemplateOutlet=\"childContent?.listTemplate || null\"></ng-container>\n </fd-dialog-body>\n\n <fd-dialog-footer>\n <fd-button-bar\n *ngIf=\"mobileConfig?.approveButtonText\"\n fdType=\"emphasized\"\n [label]=\"mobileConfig.approveButtonText!\"\n (click)=\"handleApprove()\"\n >\n </fd-button-bar>\n <fd-button-bar\n *ngIf=\"mobileConfig?.cancelButtonText\"\n [label]=\"mobileConfig.cancelButtonText!\"\n (click)=\"handleDismiss()\"\n >\n </fd-button-bar>\n </fd-dialog-footer>\n </fd-dialog>\n</ng-template>\n","import { AbstractDataProvider, BaseDataSource, DataProvider } from '@fundamental-ngx/cdk/data-source';\nimport { Observable } from 'rxjs';\n\nexport class FdMultiComboBoxDataSource<T> extends BaseDataSource<T> {\n /** @hidden */\n limitless = false;\n /** @hidden */\n constructor(public dataProvider: AbstractDataProvider<T>) {\n super(dataProvider);\n }\n}\n\nexport class ArrayMultiComboBoxDataSource<T> extends FdMultiComboBoxDataSource<T> {\n /** @hidden */\n constructor(data: T[]) {\n super(new DataProvider(data));\n }\n}\n\nexport class ObservableMultiComboBoxDataSource<T> extends FdMultiComboBoxDataSource<T> {\n /** @hidden */\n constructor(data: Observable<T[]>) {\n super(new DataProvider(data));\n }\n}\n\n/**\n * Type of acceptable objects as a datasource for the Multi-Combo Box component.\n */\nexport type FdMultiComboboxAcceptableDataSource<T> = FdMultiComboBoxDataSource<T> | Observable<T[]> | T[];\n","import { DataSourceParser, isDataSource } from '@fundamental-ngx/cdk/data-source';\nimport { isObservable } from 'rxjs';\nimport {\n ArrayMultiComboBoxDataSource,\n FdMultiComboboxAcceptableDataSource,\n FdMultiComboBoxDataSource,\n ObservableMultiComboBoxDataSource\n} from './multi-combobox-data-source';\n\nexport class MultiComboboxDataSourceParser<T> implements DataSourceParser<T, FdMultiComboBoxDataSource<T>> {\n /**\n * Transforms plain array or observable into DataSource class.\n * @param source\n */\n parse(source: FdMultiComboboxAcceptableDataSource<T>): FdMultiComboBoxDataSource<T> | undefined {\n if (isDataSource(source)) {\n return source as FdMultiComboBoxDataSource<T>;\n }\n\n if (Array.isArray(source)) {\n return new ArrayMultiComboBoxDataSource<T>(source);\n }\n\n if (isObservable(source)) {\n return new ObservableMultiComboBoxDataSource<T>(source);\n }\n\n return undefined;\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n HostListener,\n inject,\n Input,\n OnInit,\n ViewEncapsulation\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { CheckboxComponent } from '@fundamental-ngx/core/checkbox';\nimport { FormItemComponent } from '@fundamental-ngx/core/form';\nimport { ListFocusItem } from '@fundamental-ngx/core/list';\nimport { ToolbarComponent } from '@fundamental-ngx/core/toolbar';\nimport { FdTranslatePipe } from '@fundamental-ngx/i18n';\nimport { Observable } from 'rxjs';\n\n@Component({\n selector: 'fd-multi-combobox-select-all-toggler',\n template: `\n <fd-toolbar>\n <div fd-form-item class=\"fd-multi-combobox-select-all__form-item\">\n <fd-checkbox tabIndexValue=\"-1\" [ngModel]=\"checkboxValue\" [tristate]=\"true\">\n {{\n 'coreMultiComboBox.selectAllLabel'\n | fdTranslate : { selectedItems: selectedItems.length, totalItems: flatItems.length }\n }}\n </fd-checkbox>\n </div>\n </fd-toolbar>\n `,\n styleUrls: ['./select-all-toggler.component.scss'],\n providers: [\n {\n provide: ListFocusItem,\n useExisting: SelectAllTogglerComponent\n }\n ],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [ToolbarComponent, FormItemComponent, CheckboxComponent, FormsModule, FdTranslatePipe]\n})\nexport class SelectAllTogglerComponent extends ListFocusItem implements OnInit {\n /**\n * Handler for the select all items\n * */\n @Input() selectAllHandler: (select: boolean) => void;\n\n /**\n * Stream for receiving information about the value changes,\n */\n @Input() valueChanges: Observable<unknown>;\n\n /** @hidden */\n @Input()\n selectedItems: Array<unknown> = [];\n\n /** @hidden */\n @Input()\n flatItems: Array<unknown> = [];\n\n /** @hidden */\n get allAreSelected(): boolean {\n return this.selectedItems.length === this.flatItems.length;\n }\n\n /** @hidden */\n get someAreSelected(): boolean {\n return this.selectedItems.length > 0 && !this.allAreSelected;\n }\n\n /** @hidden */\n get checkboxValue(): boolean | null {\n if (this.allAreSelected) {\n return true;\n }\n if (this.someAreSelected) {\n return null;\n }\n return false;\n }\n\n /** @hidden */\n private _destroyRef = inject(DestroyRef);\n\n /** @hidden */\n private changeDetector: ChangeDetectorRef = inject(ChangeDetectorRef);\n\n /** @hidden */\n @HostListener('keydown.enter', ['$event'])\n @HostListener('keydown.space', ['$event'])\n onKeyDown($event: KeyboardEvent): void {\n $event.preventDefault();\n this.change(!this.checkboxValue);\n }\n\n /** @hidden */\n @HostListener('click')\n onClick(): void {\n this.elementRef.nativeElement.focus();\n this.change(!this.checkboxValue);\n }\n\n /** @hidden */\n ngOnInit(): void {\n this.tabindex = 0;\n this.valueChanges.pipe(takeUntilDestroyed(this._destroyRef)).subscribe(() => {\n this.changeDetector.detectChanges();\n });\n }\n\n /** @hidden */\n change(value: boolean): void {\n this.selectAllHandler(value);\n }\n}\n","import { A, CONTROL, DOWN_ARROW, ENTER, ESCAPE, SPACE, UP_ARROW } from '@angular/cdk/keycodes';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ContentChildren,\n ElementRef,\n EventEmitter,\n InjectionToken,\n Injector,\n Input,\n OnInit,\n Output,\n QueryList,\n TemplateRef,\n ViewChild,\n ViewContainerRef,\n ViewEncapsulation\n} from '@angular/core';\nimport { DataSourceDirective, FD_DATA_SOURCE_TRANSFORMER } from '@fundamental-ngx/cdk/data-source';\nimport { CvaControl, CvaDirective, OptionItem, SelectItem, SelectableOptionItem } from '@fundamental-ngx/cdk/forms';\nimport {\n AutoCompleteDirective,\n AutoCompleteEvent,\n ContentDensity,\n DynamicComponentService,\n FocusEscapeDirection,\n KeyUtil,\n Nullable,\n SearchHighlightPipe,\n TemplateDirective,\n coerceArraySafe,\n resizeObservable\n} from '@fundamental-ngx/cdk/utils';\nimport {\n FD_LIST_COMPONENT,\n ListComponent,\n ListComponentInterface,\n ListGroupHeaderDirective,\n ListItemComponent,\n ListSecondaryDirective,\n ListTitleDirective\n} from '@fundamental-ngx/core/list';\nimport { MobileModeConfig } from '@fundamental-ngx/core/mobile-mode';\nimport { PopoverFillMode } from '@fundamental-ngx/core/shared';\n\nimport { contentDensityObserverProviders } from '@fundamental-ngx/core/content-density';\nimport { TokenComponent, TokenizerComponent } from '@fundamental-ngx/core/token';\nimport equal from 'fast-deep-equal';\nimport { Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\nimport { BaseMultiCombobox } from './base-multi-combobox.class';\nimport { MobileMultiComboboxComponent } from './mobile/mobile-multi-combobox.component';\nimport { MULTI_COMBOBOX_COMPONENT } from './multi-combobox.token';\n\nimport { MultiComboboxDataSourceParser } from './data-source/multi-combobox-data-source-parser';\n\nimport { NgClass, NgFor, NgIf, NgTemplateOutlet } from '@angular/common';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { CheckboxComponent } from '@fundamental-ngx/core/checkbox';\nimport { FormControlComponent, FormInputMessageGroupComponent, FormMessageComponent } from '@fundamental-ngx/core/form';\nimport { InputGroupComponent, InputGroupInputDirective } from '@fundamental-ngx/core/input-group';\nimport { PopoverBodyComponent, PopoverComponent, PopoverControlComponent } from '@fundamental-ngx/core/popover';\nimport { FdTranslatePipe } from '@fundamental-ngx/i18n';\nimport { getSelectItemByInputValue, getTokenIndexByIdlOrValue } from './helpers';\nimport { MultiComboboxSelectionChangeEvent } from './models/selection-change.event';\nimport { MultiAnnouncerDirective } from './multi-announcer/multi-announcer.directive';\nimport { SelectAllTogglerComponent } from './select-all-toggler/select-all-toggler.component';\n\nexport const FD_MAP_LIMIT = new InjectionToken<number>('Map limit≥', { factory: () => 12 });\n\n@Component({\n selector: 'fd-multi-combobox',\n templateUrl: './multi-combobox.component.html',\n styleUrls: ['./multi-combobox.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [\n {\n directive: CvaDirective,\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['id:inputId', 'placeholder', 'state', 'stateMessage', 'disabled', 'readonly', 'name']\n },\n {\n directive: DataSourceDirective,\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['dataSource'],\n // eslint-disable-next-line @angular-eslint/no-outputs-metadata-property\n outputs: ['dataChanged']\n }\n ],\n providers: [\n CvaControl,\n DynamicComponentService,\n contentDensityObserverProviders(),\n {\n provide: FD_DATA_SOURCE_TRANSFORMER,\n useClass: MultiComboboxDataSourceParser\n },\n {\n provide: MULTI_COMBOBOX_COMPONENT,\n useExisting: MultiComboboxComponent\n }\n ],\n standalone: true,\n imports: [\n NgIf,\n NgTemplateOutlet,\n PopoverComponent,\n PopoverControlComponent,\n PopoverBodyComponent,\n FormInputMessageGroupComponent,\n InputGroupComponent,\n TokenizerComponent,\n NgFor,\n TokenComponent,\n FormsModule,\n AutoCompleteDirective,\n FormControlComponent,\n InputGroupInputDirective,\n FormMessageComponent,\n ListComponent,\n SelectAllTogglerComponent,\n ListGroupHeaderDirective,\n ListTitleDirective,\n ListItemComponent,\n CheckboxComponent,\n NgClass,\n ListSecondaryDirective,\n FdTranslatePipe,\n SearchHighlightPipe,\n MultiAnnouncerDirective\n ]\n})\nexport class MultiComboboxComponent<T = any> extends BaseMultiCombobox<T> implements AfterViewInit, OnInit {\n /**\n * Show select all checkbox\n */\n @Input()\n showSelectAll = false;\n\n /** Provides selected items. */\n @Input()\n set selectedItems(value: T[]) {\n this._selectedItems = coerceArraySafe(value);\n }\n get selectedItems(): T[] {\n return this._selectedItems;\n }\n /** Provides maximum height for the optionPanel. */\n @Input()\n maxHeight = '250px';\n\n /**\n * Whether AddOn Button should be focusable\n * @default false\n */\n @Input()\n buttonFocusable = false;\n\n /** Whether the autocomplete should be enabled; Enabled by default. */\n @Input()\n autoComplete = true;\n\n /**\n * TODO: Name of the entity for which DataProvider will be loaded. You can either pass list of\n * items or use this entityClass and internally we should be able to do lookup to some registry\n * and retrieve the best matching DataProvider that is set on application level\n */\n @Input()\n entityClass: string;\n\n /** Whether the multi-combobox should be built on mobile mode. */\n @Input()\n mobile = false;\n\n /** Multi Combobox Mobile Configuration, it's applied only, when mobile is enabled. */\n @Input()\n mobileConfig: MobileModeConfig;\n\n /** Tells the multi-combobox if we need to group items. */\n @Input()\n group = false;\n\n /** A field name to use to group data by (support dotted notation). */\n @Input()\n groupKey: string;\n\n /** The field to show data in secondary column. */\n @Input()\n secondaryKey: string;\n\n /** Show the second column (applicable for two columns layout). */\n @Input()\n showSecondaryText = false;\n\n /** Horizontally align text inside the second column (applicable for two columns layout). */\n @Input()\n secondaryTextAlignment: 'left' | 'right' = 'right';\n\n /** Turns on/off Adjustable Width feature. */\n @Input()\n autoResize = true;\n\n /** Whether to open the dropdown when the addon button is clicked. */\n @Input()\n openDropdownOnAddOnClicked = true;\n\n /** Value of the multi combobox */\n @Input()\n set value(value: T[]) {\n this.setValue(value, true);\n }\n\n get value(): T[] {\n return this._cva.value;\n }\n /**\n * Preset options for the Select body width, whatever is chosen, the body has a 600px limit.\n * * `at-least` will apply a minimum width to the body equivalent to the width of the control. - Default\n * * `equal` will apply a width to the body equivalent to the width of the control.\n * * 'fit-content' will apply width needed to properly display items inside, independent of control.\n */\n @Input()\n fillControlMode: PopoverFillMode = 'at-least';\n\n /** Sets title attribute to addon button. */\n @Input()\n addonIconTitle: string;\n\n /** Sets invalid entry message. */\n @Input()\n invalidEntryMessage = 'Invalid entry';\n\n /** Turns limitless mode, ON or OFF */\n @Input()\n limitless: boolean;\n\n /**\n * Used in filters and any kind of comparators when we work with objects and this identify\n * unique field name based on which we are going to do the job\n */\n @Input()\n lookupKey: string;\n\n /**\n * When we deal with unknown object we can use `displayKey` to retrieve value from specific\n * property of the object to act as display value.\n *\n * @See ComboBox, Select, RadioGroup, CheckBox Group\n */\n @Input()\n displayKey: string;\n\n /**\n * List of values, it can be of type SelectItem, string or any object.\n * Generic object type is among the list of types,\n * because we allow to get labels and values using `displayKey` and `lookupKey` inputs accordingly.\n */\n @Input()\n list: Array<SelectItem | string | object>;\n\n /** Time in ms for how long message of invalid entry should be displayed. */\n @Input()\n invalidEntryDisplayTime = 3000;\n\n /** Event emitted when item is selected. */\n @Output()\n selectionChange = new EventEmitter<MultiComboboxSelectionChangeEvent>();\n\n /** @hidden Emits event when the menu is opened/closed. */\n @Output()\n isOpenChange: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n /** Emits event when the addon button is clicked. */\n @Output()\n addOnButtonClicked: EventEmitter<Event> = new EventEmitter<Event>();\n\n /** Event emitted when data loading is started. */\n @Output()\n dataRequested = new EventEmitter<boolean>();\n\n /** Event emitted when data loading is finished. */\n @Output()\n dataReceived = new EventEmitter<boolean>();\n\n /** @hidden */\n @ViewChild('searchInputElement', { read: ElementRef })\n readonly searchInputElement: Nullable<ElementRef<HTMLInputElement>>;\n\n /** @hidden */\n @ViewChild(FD_LIST_COMPONENT)\n private readonly listComponent: ListComponentInterface;\n\n /** @hidden */\n @ContentChildren(TemplateDirective)\n private readonly customTemplates: QueryList<TemplateDirective>;\n\n /** @hidden */\n @ViewChild('mobileControlTemplate')\n private readonly mobileControlTemplate: TemplateRef<any>;\n\n /** @hidden */\n @ViewChild('listTemplate')\n private readonly listTemplate: TemplateRef<any>;\n\n /** @hidden */\n @ViewChild(TokenizerComponent)\n private readonly _tokenizer: TokenizerComponent;\n\n /** @hidden */\n @ViewChild('inputGroup', { read: ElementRef })\n private readonly _inputGroup: ElementRef<HTMLElement>;\n\n /**\n * @hidden\n * Custom Option item Template.\n */\n optionItemTemplate: TemplateRef<any>;\n\n /**\n * @hidden\n * Custom Group Header item Template.\n */\n groupItemTemplate: TemplateRef<any>;\n\n /**\n * @hidden\n * Custom Secondary item Template.\n */\n secondaryItemTemplate: TemplateRef<any>;\n\n /**\n * @hidden\n * Custom Selected option item Template.\n */\n selectedItemTemplate: TemplateRef<any>;\n\n /** @hidden */\n _contentDensity: ContentDensity = this._multiComboboxConfig?.contentDensity ?? 'cozy';\n\n /** Set the input text of the input. */\n set inputText(value: string) {\n this._inputTextValue = value;\n\n this._cva.onTouched();\n }\n\n /** Get the input text of the input. */\n get inputText(): string {\n return this._inputTextValue || '';\n }\n\n /** Is empty search field. */\n get isEmptyValue(): boolean {\n return this.inputText.trim().length === 0;\n }\n\n /** @hidden */\n get isGroup(): boolean {\n return !!(this.group && this.groupKey);\n }\n\n /** Whether the Multi Input is opened. */\n isOpen = false;\n\n /**\n * @hidden\n * Max width of list container\n */\n maxWidth: number;\n\n /**\n * @hidden\n * Min width of list container\n */\n minWidth: number;\n\n /**\n * @hidden\n * Need for opening mobile version\n */\n openChange = new Subject<boolean>();\n\n /** @hidden */\n private _selectedItems: T[] = [];\n\n /** @hidden */\n constructor(\n private readonly _injector: Injector,\n private readonly _viewContainerRef: ViewContainerRef,\n private readonly _dynamicComponentService: DynamicComponentService\n ) {\n super();\n\n this.contentDensityObserver.subscribe();\n }\n\n /** @hidden */\n ngOnInit(): void {\n this.cvaControl.listenToChanges();\n this._openDataStream();\n }\n\n /** @hidden */\n async ngAfterViewInit(): Promise<void> {\n if (this.mobile) {\n await this._setUpMobileMode();\n }\n\n this._assignCustomTemplates();\n\n this._initWindowResize();\n\n this._tokenizer._showOverflowPopover = false;\n }\n\n /** @hidden */\n _toggleSelection(item: SelectableOptionItem, fromTokenCloseClick = false): void {\n const idx = getTokenIndexByIdlOrValue(item, this._selectedSuggestions);\n if (idx === -1) {\n this._selectedSuggestions.push(item);\n } else {\n this._selectedSuggestions.splice(idx, 1);\n }\n\n item.selected = !item.selected;\n\n this._propagateChange(fromTokenCloseClick);\n\n if (!this._selectedSuggestions.length) {\n this._focusToSearchField();\n }\n\n this._cd.detectChanges();\n }\n\n /** @hidden */\n _onOptionCheckboxClicked(event: MouseEvent, index: number): void {\n event.stopPropagation();\n this._onListElementClicked(event, index);\n }\n\n /** @hidden */\n _onCompleteTerm(event: AutoCompleteEvent): void {\n if (event.forceClose) {\n this._toggleSelectionByInputText(event.term);\n this.close();\n }\n }\n\n /**\n * @hidden\n * Method that selects all possible options.\n * *select* attribute – if *true* select all, if *false* unselect all\n * */\n _handleSelectAllItems = (select: boolean): void => {\n this._flatSuggestions.forEach((item) => (item.selected = select));\n this._onEveryItem(this._suggestions, (item) => (item.selected = select));\n this._selectedSuggestions = select ? [...this._flatSuggestions] : [];\n this._rangeSelector.reset();\n\n this._propagateChange();\n };\n\n /** @hidden */\n _navigateByTokens(event: KeyboardEvent): void {\n if (KeyUtil.isKeyCode(event, [DOWN_ARROW, UP_ARROW]) && this.isOpen) {\n this.listComponent.items?.first.focus();\n }\n }\n\n /** @hidden */\n _removeToken(token: SelectableOptionItem, event?: MouseEvent): void {\n if (event) {\n event.preventDefault();\n }\n const optionItem = this._flatSuggestions.find((s) => s.value === token.value);\n if (optionItem) {\n this._toggleSelection(optionItem, true);\n this._rangeSelector.reset();\n }\n }\n\n /** @hidden */\n _moreClicked(): void {\n this._suggestions = this.isGroup\n ? this._convertObjectsToGroupOptionItems(this._selectedSuggestions.map(({ value }) => value))\n : this._suggestions.filter((value) =>\n this._selectedSuggestions.some((item) => equal(item.value, value.value))\n );\n\n this._showList(true);\n this.selectedShown$.next(true);\n this._cd.markForCheck();\n }\n\n /** @hidden */\n _onBlur(event: FocusEvent): void {\n const target = event.relatedTarget as HTMLElement;\n if (target) {\n const isList = !!target.closest('.fd-multi-combobox__list-container');\n if (isList) {\n return;\n }\n if (\n this._suggestions?.length === 1 &&\n this._suggestions[0].label === this.inputText &&\n !this._suggestions[0].selected\n ) {\n this._toggleSelection(this._suggestions[0]);\n }\n this._showList(false);\n this.inputText = '';\n }\n }\n\n /** @hidden */\n _onItemKeyDownHandler(event: KeyboardEvent): void {\n if (KeyUtil.isKeyCode(event, ESCAPE)) {\n this._focusToSearchField();\n this.close();\n } else if ((event.ctrlKey || event.metaKey) && event.shiftKey && KeyUtil.isKeyCode(event, A)) {\n event.preventDefault();\n this._handleSelectAllItems(false);\n } else if ((event.ctrlKey || event.metaKey) && KeyUtil.isKeyCode(event, A)) {\n event.preventDefault();\n this._handleSelectAllItems(true);\n } else if (KeyUtil.isKeyCode(event, ENTER)) {\n if (!this.mobile) {\n this.close();\n }\n this._rangeSelector.reset();\n } else if (KeyUtil.isKeyCode(event, SPACE)) {\n this._rangeSelector.reset();\n }\n }\n\n /** @hidden */\n _onOptionClicked(event: MouseEvent, index: number): void {\n this._onListElementClicked(event, index);\n this.close();\n }\n\n /**\n * @hidden\n * Handle dialog dismissing, closes popover and sets backup data.\n */\n _dialogDismiss(backup: SelectableOptionItem[]): void {\n this._selectedSuggestions = [...backup];\n this.inputText = '';\n this._showList(false);\n this.selectedShown$.next(false);\n }\n\n /**\n * @hidden\n * Handle dialog approval, closes popover and propagates data changes.\n */\n _dialogApprove(): void {\n this.inputText = '';\n this._showList(false);\n this._propagateChange(true);\n }\n\n /** @hidden */\n _popoverOpenChangeHandle(isOpen: boolean): void {\n this.isOpen = isOpen;\n this._rangeSelector.reset();\n }\n\n /** Opens the select popover body. */\n open(): void {\n this.isOpen = true;\n this.isOpenChange.emit(this.isOpen);\n this._cd.markForCheck();\n }\n\n /** Closes the select popover body. */\n close(): void {\n this._focusToSearchField();\n this._rangeSelector.reset();\n this.selectedShown$.next(false);\n this.inputText = '';\n\n this.isOpen = false;\n this.isOpenChange.emit(this.isOpen);\n this._cd.markForCheck();\n }\n\n /** @hidden */\n _showList(isOpen: boolean): void {\n if (this.isOpen !== isOpen) {\n this.isOpen = isOpen;\n this._cva.onTouched();\n this.openChange.next(isOpen);\n }\n\n if (!this.isOpen) {\n this._searchTermChanged('');\n }\n\n this._cd.markForCheck();\n }\n\n /** @hidden */\n _searchTermChanged(text: string = this.inputText): void {\n const map = new Map();\n map.set('query', text);\n\n if (!this.limitless) {\n map.set('limit', this._mapLimit);\n }\n\n this.dataSourceDirective.dataSourceProvider?.match(map);\n\n if (text) {\n this.open();\n }\n\n this._cd.markForCheck();\n }\n\n /**\n * Handle Click on Button\n * @hidden\n */\n _onPrimaryButtonClick(isOpen: boolean): void {\n if (!isOpen) {\n this._searchTermChanged('');\n }\n\n if (this.openDropdownOnAddOnClicked) {\n this._showList(!isOpen);\n } else if (this.isOpen) {\n this._showList(false);\n }\n\n if (this.isOpen) {\n this.searchInputElement?.nativeElement.focus();\n }\n }\n\n /**\n * Handle Keydown on Input\n * @hidden\n */\n _onInputKeydownHandler(event: KeyboardEvent): void {\n if (this._cva.readonly) {\n return;\n }\n\n if (KeyUtil.isKeyCode(event, DOWN_ARROW)) {\n event.preventDefault();\n\n if (event.altKey) {\n this._showList(true);\n }\n\n if (this.isOpen && this.listComponent) {\n this.listComponent.setItemActive(0);\n } else if (!this.isOpen) {\n this._chooseOtherItem(1);\n }\n } else if (KeyUtil.isKeyCode(event, UP_ARROW)) {\n event.preventDefault();\n\n this._chooseOtherItem(-1);\n } else if (KeyUtil.isKeyCode(event, ENTER)) {\n this._toggleSelectionByInputText();\n } else if (KeyUtil.isKeyCode(event, ESCAPE)) {\n event.stopPropagation();\n\n this._showList(false);\n } else if (!KeyUtil.isKeyCode(event, [...this._nonOpeningKeys, CONTROL])) {\n this._showList(true);\n const acceptedKeys = !KeyUtil.isKeyType(event, 'alphabetical') && !KeyUtil.isKeyType(event, 'numeric');\n if (acceptedKeys) {\n // SetTimeout is needed for input to receive new value.\n setTimeout(() => {\n if (this.isEmptyValue) {\n this.listComponent?.setItemActive(0);\n }\n });\n }\n }\n }\n\n /**\n * @hidden\n * Method passed to list component.\n */\n _handleListFocusEscape(direction: FocusEscapeDirection): void {\n if (direction === 'up') {\n this._focusToSearchField();\n }\n }\n\n /**\n * @hidden\n */\n _addOnClicked($event: Event): void {\n this.addOnButtonClicked.emit($event);\n if (!this.mobile) {\n this._onPrimaryButtonClick(this.isOpen);\n }\n }\n /**\n * @hidden\n * Iterate over every item and perform callback\n */\n private _onEveryItem(items: SelectableOptionItem[], callback: (item: SelectableOptionItem) => void): void {\n items.forEach((item) => {\n callback(item);\n if (item.children && item.children.length > 0) {\n this._onEveryItem(item.children, callback);\n }\n });\n }\n\n /** @hidden */\n private _toggleSelectionByInputText(text = this.inputText): void {\n const item = getSelectItemByInputValue<T>(this._fullFlatSuggestions, text);\n if (item) {\n this._toggleSelection(item);\n this.inputText = '';\n }\n\n this._searchTermChanged();\n }\n\n /**\n * @hidden\n * Method to set input text as item label.\n */\n private _setInputTextFromOptionItem(item: OptionItem): void {\n this.inputText = item.label;\n\n if (this.mobile) {\n return;\n }\n\n this._showList(false);\n }\n\n /**\n * @hidden\n * applying range selection. Note, that this function will be invoked after combobox item's value has been changed\n */\n private _onListElementClicked(event: MouseEvent, index: number): void {\n // value has been changed at this point, so it can be safely used\n const selectionState = this._flatSuggestions[index].selected;\n this._rangeSelector.onRangeElementToggled(index, event);\n const toRemoveSet = new Set();\n this._rangeSelector.applyValueToEachInRange((idx) => {\n const current = this._flatSuggestions[idx];\n if (current.selected !== selectionState) {\n if (current.selected) {\n // removing from \"_selectedSuggestions\" list\n toRemoveSet.add(current.value);\n } else {\n // adding current item to \"_selectedSuggestions\"\n this._selectedSuggestions.push(current);\n }\n current.selected = selectionState;\n }\n });\n this._selectedSuggestions = this._selectedSuggestions.filter((s) => !toRemoveSet.has(s.value));\n this._propagateChange();\n\n this._tokenizer.onResize();\n\n this._tokenizer.tokenizerInnerEl.nativeElement.scrollLeft =\n this._tokenizer.tokenizerInnerEl.nativeElement.scrollWidth;\n }\n\n /** @hidden */\n private _propagateChange(emitInMobile?: boolean): void {\n if (!this.mobile || emitInMobile) {\n this._mapAndUpdateModel();\n }\n }\n\n /** @hidden */\n private async _setUpMobileMode(): Promise<void> {\n const injector = Injector.create({\n providers: [{ provide: MULTI_COMBOBOX_COMPONENT, useValue: this }],\n parent: this._injector\n });\n\n this._dynamicComponentService.createDynamicComponent(\n { listTemplate: this.listTemplate, controlTemplate: this.mobileControlTemplate },\n MobileMultiComboboxComponent,\n {\n containerRef: this._viewContainerRef\n },\n { injector }\n );\n }\n\n /**\n * @hidden\n * Method that picks other value moved from current one by offset, called only when Multi Combobox is closed.\n */\n private _chooseOtherItem(offset: number): void {\n if (this._selectedSuggestions?.length === this._flatSuggestions.length) {\n this.inputText = '';\n return;\n }\n\n const activeValue = getSelectItemByInputValue<T>(this._fullFlatSuggestions, this.inputText);\n const index = this._flatSuggestions.findIndex((value) => value === activeValue);\n const position = !this.inputText && offset === -1 ? this._flatSuggestions.length - 1 : index + offset;\n const item = this._flatSuggestions[position];\n\n if (item) {\n this._setInputTextFromOptionItem(item);\n }\n\n const selectedIndex = this._selectedSuggestions.findIndex((value) => value.label === item?.label);\n if (selectedIndex !== -1) {\n this._chooseOtherItem(offset);\n }\n }\n\n /** @hidden */\n private _initWindowResize(): void {\n this._getOptionsListWidth();\n\n if (!this.autoResize) {\n return;\n }\n\n resizeObservable(this._inputGroup.nativeElement)\n .pipe(debounceTime(30), takeUntilDestroyed(this._destroyRef))\n .subscribe(() => this._getOptionsListWidth());\n }\n\n /** @hidden */\n private _getOptionsListWidth(): void {\n const body = document.body;\n const rect = this._inputGroup.nativeElement.getBoundingClientRect();\n const scrollBarWidth = body.offsetWidth - body.clientWidth;\n this.maxWidth = this.autoResize ? window.innerWidth - scrollBarWidth - rect.left : this.minWidth;\n this.minWidth = rect.width - 2;\n this._cd.detectChanges();\n }\n\n /**\n * @hidden\n * Assign custom templates\n */\n private _assignCustomTemplates(): void {\n this.customTemplates.forEach((template) => {\n switch (template.name) {\n case 'optionItemTemplate':\n this.optionItemTemplate = template.templateRef;\n break;\n case 'groupItemTemplate':\n this.groupItemTemplate = template.templateRef;\n break;\n case 'secondaryItemTemplate':\n this.secondaryItemTemplate = template.templateRef;\n break;\n case 'selectedItemTemplate':\n this.selectedItemTemplate = template.templateRef;\n break;\n }\n });\n }\n}\n","<div class=\"fd-multi-combobox\">\n <ng-container [ngTemplateOutlet]=\"controlTemplate\" *ngIf=\"mobile\"></ng-container>\n\n <fd-popover\n *ngIf=\"!mobile\"\n additionalBodyClass=\"fd-popover-custom-list fd-multi-combobox__list-container\"\n (isOpenChange)=\"_popoverOpenChangeHandle($event)\"\n [isOpen]=\"isOpen\"\n [triggers]=\"[]\"\n [disabled]=\"this._cva.disabled\"\n [fillControlMode]=\"fillControlMode\"\n >\n <fd-popover-control>\n <ng-container>\n <ng-container *ngTemplateOutlet=\"controlTemplate\"></ng-container>\n </ng-container>\n </fd-popover-control>\n <fd-popover-body [style.width.%]=\"!autoResize && 100\">\n <ng-container *ngTemplateOutlet=\"listTemplate\"></ng-container>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n</div>\n\n<ng-template #controlTemplate>\n <fd-form-input-message-group>\n <fd-input-group\n #inputGroup\n [id]=\"this._cva.id + '-input-group-container'\"\n [state]=\"this._cva.state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"!this._cva.readonly\"\n [glyph]=\"!this._cva.readonly ? 'navigation-down-arrow' : ' '\"\n [isControl]=\"true\"\n [disabled]=\"this._cva.disabled || this._cva.readonly\"\n [isExpanded]=\"!mobile && isOpen && _suggestions.length > 0\"\n [attr.aria-disabled]=\"this._cva.disabled || this._cva.readonly\"\n [attr.aria-readonly]=\"this._cva.readonly\"\n [glyphAriaLabel]=\"this._cva.ariaLabel || ('platformMultiCombobox.inputGlyphAriaLabel' | fdTranslate)\"\n [iconTitle]=\"addonIconTitle || ('platformMultiCombobox.inputGlyphAriaLabel' | fdTranslate)\"\n (addOnButtonClicked)=\"_addOnClicked($event)\"\n (click)=\"mobile && !isOpen && _onPrimaryButtonClick(false)\"\n (keydown)=\"_navigateByTokens($event)\"\n >\n <fd-tokenizer\n *ngIf=\"_selectedSuggestions\"\n [tokenizerFocusable]=\"false\"\n [compactCollapse]=\"true\"\n #tokenizer\n class=\"fd-multi-combobox-tokenizer-custom\"\n (moreClickedEvent)=\"_moreClicked()\"\n fdMultiAnnouncer\n [multiAnnouncerOptions]=\"_suggestions\"\n >\n <fd-token\n [readOnly]=\"this._cva.disabled\"\n (onCloseClick)=\"_removeToken(token, $event)\"\n *ngFor=\"let token of _selectedSuggestions\"\n >\n {{ token.label }}\n </fd-token>\n\n <input\n #searchInputElement\n fdkAutoComplete\n (onComplete)=\"_onCompleteTerm($event)\"\n [options]=\"_suggestions\"\n [inputText]=\"inputText\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n [ariaLabel]=\"'coreMultiComboBox.multiComboBoxAriaLabel' | fdTranslate\"\n [attr.aria-labelledby]=\"this._cva.ariaLabelledBy\"\n [attr.aria-autocomplete]=\"autoComplete && !mobile ? 'list' : null\"\n [attr.aria-owns]=\"autoComplete && !mobile ? this._cva.id + '-result' : null\"\n [attr.aria-haspopup]=\"autoComplete && !mobile\"\n fd-form-control\n fd-input-group-input\n tabindex=\"0\"\n [id]=\"this._cva.id\"\n [name]=\"this._cva.name\"\n (keydown)=\"_onInputKeydownHandler($event)\"\n [disabled]=\"this._cva.disabled\"\n [(ngModel)]=\"inputText\"\n (ngModelChange)=\"_searchTermChanged()\"\n [placeholder]=\"this._cva.placeholder\"\n (focus)=\"this._cva.onTouched(); tokenizer._showAllTokens()\"\n (blur)=\"!mobile && _onBlur($event); tokenizer._hideTokens()\"\n [attr.aria-expanded]=\"isOpen\"\n [readonly]=\"this._cva.readonly\"\n [attr.aria-readonly]=\"this._cva.readonly\"\n [attr.aria-required]=\"this._cva.required\"\n [displayFn]=\"_displayFn\"\n class=\"fd-tokenizer__input\"\n />\n </fd-tokenizer>\n </fd-input-group>\n\n <fd-form-message\n *ngIf=\"mobile && isOpen ? false : !!this._cva.stateMessage\"\n [type]=\"this._cva.state\"\n [innerHtml]=\"this._cva.stateMessage\"\n ></fd-form-message>\n </fd-form-input-message-group>\n</ng-template>\n\n<ng-template #mobileControlTemplate>\n <fd-input-group\n [id]=\"this._cva.id + '-input-group-container'\"\n class=\"fd-multi-combobox-input-group-custom\"\n [state]=\"this._cva.state\"\n [buttonFocusable]=\"false\"\n [isControl]=\"true\"\n [disabled]=\"this._cva.disabled || this._cva.readonly\"\n [isExpanded]=\"!mobile && isOpen && _suggestions.length > 0\"\n [attr.aria-disabled]=\"this._cva.disabled || this._cva.readonly\"\n [attr.aria-readonly]=\"this._cva.readonly\"\n [glyphAriaLabel]=\"this._cva.ariaLabel\"\n >\n <input\n fdkAutoComplete\n (onComplete)=\"_onCompleteTerm($event)\"\n [options]=\"_suggestions\"\n [inputText]=\"inputText\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n [ariaLabel]=\"'coreMultiComboBox.multiComboBoxAriaLabel' | fdTranslate\"\n [attr.aria-labelledby]=\"this._cva.ariaLabelledBy\"\n [attr.aria-autocomplete]=\"autoComplete && !mobile ? 'list' : null\"\n [attr.aria-owns]=\"autoComplete && !mobile ? this._cva.id + '-result' : null\"\n [attr.aria-haspopup]=\"autoComplete && !mobile\"\n fd-form-control\n fd-input-group-input\n tabindex=\"0\"\n [id]=\"this._cva.id\"\n [name]=\"this._cva.name\"\n (keydown)=\"_onInputKeydownHandler($event)\"\n [disabled]=\"this._cva.disabled\"\n [(ngModel)]=\"inputText\"\n (ngModelChange)=\"_searchTermChanged()\"\n [placeholder]=\"this._cva.placeholder\"\n (focus)=\"this._cva.onTouched()\"\n (blur)=\"!mobile && _onBlur($event)\"\n [attr.aria-expanded]=\"isOpen\"\n [readonly]=\"this._cva.readonly\"\n [attr.aria-readonly]=\"this._cva.readonly\"\n [displayFn]=\"_displayFn\"\n />\n </fd-input-group>\n</ng-template>\n\n<ng-template #listTemplate>\n <ul\n fd-list\n (focusEscapeList)=\"_handleListFocusEscape($event)\"\n [dropdownMode]=\"true\"\n class=\"fd-multi-combobox__list fd-list--multi-input\"\n [id]=\"this._cva.id + '-result'\"\n role=\"listbox\"\n [style.max-height]=\"!mobile && maxHeight\"\n [style.min-width.px]=\"!mobile && minWidth\"\n [style.max-width.px]=\"autoResize && maxWidth\"\n [attr.aria-labelledby]=\"this._cva.id + '-search'\"\n aria-multiselectable=\"true\"\n (keydown.tab)=\"close()\"\n (keydown.shift.tab)=\"close()\"\n >\n <fd-form-message\n *ngIf=\"!!this._cva.stateMessage\"\n [type]=\"this._cva.state\"\n [innerHtml]=\"this._cva.stateMessage\"\n ></fd-form-message>\n <fd-multi-combobox-select-all-toggler\n *ngIf=\"showSelectAll\"\n [selectAllHandler]=\"_handleSelectAllItems\"\n [valueChanges]=\"selectionChange\"\n [selectedItems]=\"_selectedSuggestions\"\n [flatItems]=\"_flatSuggestions\"\n ></fd-multi-combobox-select-all-toggler>\n <ng-content></ng-content>\n <ng-container *ngIf=\"isGroup; else flatList\">\n <ng-container *ngFor=\"let group of _suggestions\">\n <ng-container *ngIf=\"!groupItemTemplate; else groupItemTemplateRenderer\">\n <label fd-list-group-header role=\"group\">\n <span fd-list-title>{{ group.label }}</span>\n </label>\n </ng-container>\n\n <ng-template #groupItemTemplateRenderer>\n <ng-container\n [ngTemplateOutlet]=\"groupItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: { label: group.label } }\"\n ></ng-container>\n </ng-template>\n\n <li\n *ngFor=\"let optionItem of group.children; let i = index\"\n fd-list-item\n role=\"option\"\n [tabindex]=\"0\"\n (click)=\"!mobile && close()\"\n (keydown)=\"_onItemKeyDownHandler($event)\"\n [selected]=\"!!optionItem.selected\"\n >\n <fd-checkbox\n (click)=\"_onOptionCheckboxClicked($event, i)\"\n (ngModelChange)=\"_toggleSelection(optionItem)\"\n [ngModel]=\"optionItem.selected\"\n >\n </fd-checkbox>\n <ng-container\n [ngTemplateOutlet]=\"listItem\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem, index: i }\"\n ></ng-container>\n </li>\n </ng-container>\n </ng-container>\n\n <ng-template #flatList>\n <li\n *ngFor=\"let optionItem of _suggestions; let i = index\"\n fd-list-item\n role=\"option\"\n [tabindex]=\"0\"\n (click)=\"!mobile && _onOptionClicked($event, i)\"\n (keydown)=\"_onItemKeyDownHandler($event)\"\n [selected]=\"!!optionItem.selected\"\n >\n <fd-checkbox\n (click)=\"_onOptionCheckboxClicked($event, i)\"\n (ngModelChange)=\"_toggleSelection(optionItem)\"\n [ngModel]=\"optionItem.selected\"\n >\n </fd-checkbox>\n <ng-container\n [ngTemplateOutlet]=\"listItem\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem, index: i }\"\n ></ng-container>\n </li>\n </ng-template>\n </ul>\n</ng-template>\n\n<ng-template let-optionItem=\"optionItem\" let-index=\"index\" #listItem>\n <ng-container\n *ngIf=\"optionItem.selected && !!selectedItemTemplate\"\n [ngTemplateOutlet]=\"selectedItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: optionItem.value, index: index }\"\n ></ng-container>\n\n <ng-container *ngIf=\"!(optionItem.selected && selectedItemTemplate)\">\n <ng-container\n [ngTemplateOutlet]=\"optionItemSource\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem, index: index }\"\n ></ng-container>\n\n <ng-container\n [ngTemplateOutlet]=\"secondaryTextSource\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem }\"\n ></ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template let-optionItem=\"optionItem\" let-index=\"index\" #optionItemSource>\n <ng-container *ngIf=\"!optionItemTemplate; else optionItemTemplateRenderer\">\n <span\n fd-list-title\n [attr.title]=\"optionItem.label\"\n [innerHTML]=\"optionItem.label | highlight : inputText\"\n ></span>\n </ng-container>\n\n <ng-template #optionItemTemplateRenderer>\n <ng-container\n [ngTemplateOutlet]=\"optionItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: optionItem.value, index: index }\"\n ></ng-container>\n </ng-template>\n</ng-template>\n\n<ng-template let-optionItem=\"optionItem\" #secondaryTextSource>\n <ng-container *ngIf=\"showSecondaryText\">\n <ng-container *ngIf=\"!secondaryItemTemplate; else secondaryItemTemplateRenderer\">\n <span\n [style.text-align]=\"secondaryTextAlignment\"\n fd-list-secondary\n [attr.title]=\"optionItem.secondaryText\"\n [innerHTML]=\"optionItem.secondaryText | highlight : inputText\"\n ></span>\n </ng-container>\n\n <ng-template #secondaryItemTemplateRenderer>\n <ng-container\n [ngTemplateOutlet]=\"secondaryItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: optionItem.value }\"\n ></ng-container>\n </ng-template>\n </ng-container>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { MultiAnnouncerDirective } from './multi-announcer/multi-announcer.directive';\nimport { MultiComboboxComponent } from './multi-combobox.component';\nimport { SelectAllTogglerComponent } from './select-all-toggler/select-all-toggler.component';\n\n@NgModule({\n imports: [MultiComboboxComponent, SelectAllTogglerComponent, MultiAnnouncerDirective],\n exports: [MultiComboboxComponent, SelectAllTogglerComponent, MultiAnnouncerDirective]\n})\nexport class MultiComboboxModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2","i1","i3","i4"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core",
3
- "version": "0.47.0-rc.22",
3
+ "version": "0.47.0-rc.23",
4
4
  "schematics": "./schematics/collection.json",
5
5
  "ng-update": {
6
6
  "migrations": "./schematics/migrations.json"
@@ -23,8 +23,8 @@
23
23
  "@angular/forms": "^16.2.0",
24
24
  "@angular/platform-browser": "^16.2.0",
25
25
  "@angular/router": "^16.2.0",
26
- "@fundamental-ngx/cdk": "0.47.0-rc.22",
27
- "@fundamental-ngx/i18n": "0.47.0-rc.22",
26
+ "@fundamental-ngx/cdk": "0.47.0-rc.23",
27
+ "@fundamental-ngx/i18n": "0.47.0-rc.23",
28
28
  "@sap-theming/theming-base-content": "^11.7.0",
29
29
  "fundamental-styles": "0.32.0-rc.7",
30
30
  "rxjs": "^7.8.0"
@@ -54,21 +54,21 @@ function addExternalLibraries(options) {
54
54
  });
55
55
  }
56
56
  if (!(0, package_utils_1.hasPackage)(tree, '@fundamental-ngx/i18n') ||
57
- (0, package_utils_1.checkPackageVersion)(tree, '@fundamental-ngx/i18n', '0.47.0-rc.22', '<')) {
57
+ (0, package_utils_1.checkPackageVersion)(tree, '@fundamental-ngx/i18n', '0.47.0-rc.23', '<')) {
58
58
  dependencies.push({
59
59
  type: dependencies_1.NodeDependencyType.Default,
60
60
  // Will be replaced with the real version during sync-version script run
61
- version: `0.47.0-rc.22`,
61
+ version: `0.47.0-rc.23`,
62
62
  name: '@fundamental-ngx/i18n',
63
63
  overwrite: true
64
64
  });
65
65
  }
66
66
  if (!(0, package_utils_1.hasPackage)(tree, '@fundamental-ngx/cdk') ||
67
- (0, package_utils_1.checkPackageVersion)(tree, '@fundamental-ngx/cdk', '0.47.0-rc.22', '<')) {
67
+ (0, package_utils_1.checkPackageVersion)(tree, '@fundamental-ngx/cdk', '0.47.0-rc.23', '<')) {
68
68
  dependencies.push({
69
69
  type: dependencies_1.NodeDependencyType.Default,
70
70
  // Will be replaced with the real version during sync-version script run
71
- version: `0.47.0-rc.22`,
71
+ version: `0.47.0-rc.23`,
72
72
  name: '@fundamental-ngx/cdk',
73
73
  overwrite: true
74
74
  });